diff --git a/Liquesce.sln b/Liquesce.sln
index 273cdec..33cfc7a 100644
--- a/Liquesce.sln
+++ b/Liquesce.sln
@@ -7,7 +7,6 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Liquesce_Setup", "Liquesce_
 	ProjectSection(ProjectDependencies) = postProject
 		{74447D1D-F52F-485C-BDEE-66B114A45460} = {74447D1D-F52F-485C-BDEE-66B114A45460}
 		{CFE5DC7B-25FB-45C4-AF18-1963853375E1} = {CFE5DC7B-25FB-45C4-AF18-1963853375E1}
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C} = {A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}
 		{3B495DA8-B86F-4249-B94A-05B6FA01303F} = {3B495DA8-B86F-4249-B94A-05B6FA01303F}
 		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9} = {5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}
 	EndProjectSection
@@ -16,29 +15,78 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiquesceSvc", "LiquesceSvc\
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ThirdParty", "ThirdParty", "{C1ADA293-B55A-4B33-AE5A-6FC40323FC39}"
 	ProjectSection(SolutionItems) = preProject
-		ThirdParty\dokan.dll = ThirdParty\dokan.dll
 		ThirdParty\NLog.dll = ThirdParty\NLog.dll
+		..\..\Amalgam\Phase III\ThirdParty\nunit.framework.dll = ..\..\Amalgam\Phase III\ThirdParty\nunit.framework.dll
+		..\..\Amalgam\Phase III\ThirdParty\nunit.framework.xml = ..\..\Amalgam\Phase III\ThirdParty\nunit.framework.xml
 	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DokanNet", "ThirdParty\DokanNet\DokanNet.csproj", "{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiquesceFacade", "LiquesceFaçade\LiquesceFacade.csproj", "{CFE5DC7B-25FB-45C4-AF18-1963853375E1}"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiquesceTray", "LiquesceTray\LiquesceTray.csproj", "{3B495DA8-B86F-4249-B94A-05B6FA01303F}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiquesceSvcMEF", "LiquesceSvcMEF\LiquesceSvcMEF.csproj", "{E39910A2-C72A-4D3C-BFD0-4356906B86A7}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CBFSWixCA", "ThirdParty\CBFSWixCA\CBFSWixCA.vcxproj", "{2BF998A5-8BED-4975-91C5-7893DD138320}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiquesceTrayMEF", "LiquesceTrayMEF\LiquesceTrayMEF.csproj", "{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiquesceTrayHelper", "LiquesceTrayHelper\LiquesceTrayHelper.csproj", "{F216D80D-2D70-4B3B-8632-813F6C399948}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ServiceMEFs", "ServiceMEFs", "{D840EDCD-7088-423F-9AF3-90C1F12255E8}"
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "TestTheCBFSInstall", "ThirdParty\CBFSWixCA\TestTheCBFSInstall\TestTheCBFSInstall.wixproj", "{3737E08F-FF33-4483-93EB-B71200AF17FA}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FolderMEF", "ServiceMEFs\FolderMEF\FolderMEF.csproj", "{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "7-Zip SFX Maker", "7-Zip SFX Maker", "{5818EFA1-F320-47BD-9075-19145F46E40A}"
+	ProjectSection(SolutionItems) = preProject
+		..\7-Zip SFX Maker\7-ZIP SFX Maker.exe = ..\7-Zip SFX Maker\7-ZIP SFX Maker.exe
+		..\7-Zip SFX Maker\Dialogs.def = ..\7-Zip SFX Maker\Dialogs.def
+		..\7-Zip SFX Maker\Framework.Controls.ProgressBar.dll = ..\7-Zip SFX Maker\Framework.Controls.ProgressBar.dll
+		..\7-Zip SFX Maker\ReadMe.txt = ..\7-Zip SFX Maker\ReadMe.txt
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Config", "Config", "{D98A7BB0-CA45-49A1-9F25-9E69204339CA}"
+	ProjectSection(SolutionItems) = preProject
+		..\7-Zip SFX Maker\Config\Liquesce.xml = ..\7-Zip SFX Maker\Config\Liquesce.xml
+	EndProjectSection
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PriorityMEF", "ServiceMEFs\PriorityMEF\PriorityMEF.csproj", "{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Language", "Language", "{7667ABFF-97F6-4101-AD2A-5EB6C93F9C0B}"
+	ProjectSection(SolutionItems) = preProject
+		..\7-Zip SFX Maker\Language\English.txt = ..\7-Zip SFX Maker\Language\English.txt
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Resources", "Resources", "{81E594E9-4D4A-489F-BCC8-8C7A5CD8EC8E}"
+	ProjectSection(SolutionItems) = preProject
+		..\7-Zip SFX Maker\Resources\01.ico = ..\7-Zip SFX Maker\Resources\01.ico
+		..\7-Zip SFX Maker\Resources\02.ico = ..\7-Zip SFX Maker\Resources\02.ico
+		..\7-Zip SFX Maker\Resources\03.ico = ..\7-Zip SFX Maker\Resources\03.ico
+		..\7-Zip SFX Maker\Resources\04.ico = ..\7-Zip SFX Maker\Resources\04.ico
+		..\7-Zip SFX Maker\Resources\05.ico = ..\7-Zip SFX Maker\Resources\05.ico
+		..\7-Zip SFX Maker\Resources\7zsd.sfx = ..\7-Zip SFX Maker\Resources\7zsd.sfx
+		..\7-Zip SFX Maker\Resources\Dialogs.def = ..\7-Zip SFX Maker\Resources\Dialogs.def
+		..\7-Zip SFX Maker\Resources\GoRC.exe = ..\7-Zip SFX Maker\Resources\GoRC.exe
+		..\7-Zip SFX Maker\Resources\icon.rc = ..\7-Zip SFX Maker\Resources\icon.rc
+		..\7-Zip SFX Maker\Resources\join.exe = ..\7-Zip SFX Maker\Resources\join.exe
+		..\7-Zip SFX Maker\Resources\unins000.dat = ..\7-Zip SFX Maker\Resources\unins000.dat
+		..\7-Zip SFX Maker\Resources\unins000.exe = ..\7-Zip SFX Maker\Resources\unins000.exe
+		..\7-Zip SFX Maker\Resources\upx.exe = ..\7-Zip SFX Maker\Resources\upx.exe
+		..\7-Zip SFX Maker\Resources\Version_History.txt = ..\7-Zip SFX Maker\Resources\Version_History.txt
+		..\7-Zip SFX Maker\Resources\versionInfoTemplate.rc = ..\7-Zip SFX Maker\Resources\versionInfoTemplate.rc
+		..\7-Zip SFX Maker\Resources\windres.exe = ..\7-Zip SFX Maker\Resources\windres.exe
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CBFS", "CBFS", "{A45FE901-B323-48BD-BC0B-69784A7321F2}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "32Bit", "32Bit", "{3A83D9C1-FFB5-4422-ADD5-34545E4E88C7}"
+	ProjectSection(SolutionItems) = preProject
+		ThirdParty\CBFS\32bit\CBFS5Net.dll = ThirdParty\CBFS\32bit\CBFS5Net.dll
+		ThirdParty\CBFS\32bit\msvcp100.dll = ThirdParty\CBFS\32bit\msvcp100.dll
+		ThirdParty\CBFS\32bit\msvcr100.dll = ThirdParty\CBFS\32bit\msvcr100.dll
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "x64", "x64", "{D661BAF6-AD37-44B3-AEF5-4ED5737540F5}"
+	ProjectSection(SolutionItems) = preProject
+		ThirdParty\CBFS\x64\CBFS5Net.dll = ThirdParty\CBFS\x64\CBFS5Net.dll
+		ThirdParty\CBFS\x64\msvcp100.dll = ThirdParty\CBFS\x64\msvcp100.dll
+		ThirdParty\CBFS\x64\msvcr100.dll = ThirdParty\CBFS\x64\msvcr100.dll
+	EndProjectSection
 EndProject
 Global
 	GlobalSection(TeamFoundationVersionControl) = preSolution
-		SccNumberOfProjects = 11
+		SccNumberOfProjects = 9
 		SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
 		SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs08
 		SccLocalPath0 = .
@@ -51,130 +99,158 @@ Global
 		SccProjectUniqueName3 = Liquesce\\Liquesce.csproj
 		SccProjectName3 = Liquesce
 		SccLocalPath3 = Liquesce
-		SccProjectUniqueName4 = ThirdParty\\DokanNet\\DokanNet.csproj
-		SccProjectTopLevelParentUniqueName4 = Liquesce.sln
-		SccProjectName4 = ThirdParty/DokanNet
-		SccLocalPath4 = ThirdParty\\DokanNet
-		SccProjectUniqueName5 = LiquesceFaçade\\LiquesceFacade.csproj
-		SccProjectName5 = LiquesceFaçade
-		SccLocalPath5 = LiquesceFaçade
-		SccProjectUniqueName6 = LiquesceTray\\LiquesceTray.csproj
-		SccProjectName6 = LiquesceTray
-		SccLocalPath6 = LiquesceTray
-		SccProjectUniqueName7 = LiquesceSvcMEF\\LiquesceSvcMEF.csproj
-		SccProjectName7 = LiquesceSvcMEF
-		SccLocalPath7 = LiquesceSvcMEF
-		SccProjectUniqueName8 = LiquesceTrayMEF\\LiquesceTrayMEF.csproj
-		SccProjectName8 = LiquesceTrayMEF
-		SccLocalPath8 = LiquesceTrayMEF
-		SccProjectUniqueName9 = ServiceMEFs\\FolderMEF\\FolderMEF.csproj
-		SccProjectTopLevelParentUniqueName9 = Liquesce.sln
-		SccProjectName9 = ServiceMEFs/FolderMEF
-		SccLocalPath9 = ServiceMEFs\\FolderMEF
-		SccProjectUniqueName10 = ServiceMEFs\\PriorityMEF\\PriorityMEF.csproj
-		SccProjectTopLevelParentUniqueName10 = Liquesce.sln
-		SccProjectName10 = ServiceMEFs/PriorityMEF
-		SccLocalPath10 = ServiceMEFs\\PriorityMEF
+		SccProjectUniqueName4 = LiquesceFaçade\\LiquesceFacade.csproj
+		SccProjectName4 = LiquesceFaçade
+		SccLocalPath4 = LiquesceFaçade
+		SccProjectUniqueName5 = LiquesceTray\\LiquesceTray.csproj
+		SccProjectName5 = LiquesceTray
+		SccLocalPath5 = LiquesceTray
+		SccProjectUniqueName6 = ThirdParty\\CBFSWixCA\\CBFSWixCA.vcxproj
+		SccProjectTopLevelParentUniqueName6 = Liquesce.sln
+		SccProjectName6 = ThirdParty/CBFSWixCA
+		SccLocalPath6 = ThirdParty\\CBFSWixCA
+		SccProjectUniqueName7 = LiquesceTrayHelper\\LiquesceTrayHelper.csproj
+		SccProjectName7 = LiquesceTrayHelper
+		SccLocalPath7 = LiquesceTrayHelper
+		SccProjectUniqueName8 = ThirdParty\\CBFSWixCA\\TestTheCBFSInstall\\TestTheCBFSInstall.wixproj
+		SccProjectTopLevelParentUniqueName8 = Liquesce.sln
+		SccProjectName8 = ThirdParty/CBFSWixCA/TestTheCBFSInstall
+		SccLocalPath8 = ThirdParty\\CBFSWixCA\\TestTheCBFSInstall
 	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
-		Debug|x86 = Debug|x86
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Debug|x86 - Debug = Debug|x86 - Debug
 		Release|Any CPU = Release|Any CPU
-		Release|x86 = Release|x86
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+		Release|x86 - Debug = Release|x86 - Debug
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|x86.ActiveCfg = Debug|x86
-		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|x86.Build.0 = Debug|x86
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|x86 - Debug.ActiveCfg = Debug|x86
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Debug|x86 - Debug.Build.0 = Debug|x86
 		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|Any CPU.Build.0 = Release|Any CPU
-		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|x86.ActiveCfg = Release|x86
-		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|x86.Build.0 = Release|x86
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|Win32.ActiveCfg = Release|Any CPU
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{74447D1D-F52F-485C-BDEE-66B114A45460}.Release|x86 - Debug.Build.0 = Release|x86
 		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Debug|Any CPU.ActiveCfg = Debug|x86
-		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Debug|x86.ActiveCfg = Debug|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Debug|Win32.ActiveCfg = Debug|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Debug|x86 - Debug.ActiveCfg = Debug|x86
 		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|Any CPU.ActiveCfg = Release|x86
-		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|x86.ActiveCfg = Release|x86
-		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|x86.Build.0 = Release|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|Any CPU.Build.0 = Release|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|Mixed Platforms.Build.0 = Release|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|Win32.ActiveCfg = Release|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{EF06E5CB-374E-4E67-9057-785A3B7DAD5A}.Release|x86 - Debug.Build.0 = Release|x86
 		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|x86.ActiveCfg = Debug|x86
-		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|x86.Build.0 = Debug|x86
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|Win32.ActiveCfg = Debug|x64
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|x86 - Debug.ActiveCfg = Debug|x86
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Debug|x86 - Debug.Build.0 = Debug|x86
 		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|Any CPU.Build.0 = Release|Any CPU
-		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|x86.ActiveCfg = Release|x86
-		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|x86.Build.0 = Release|x86
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Debug|x86.ActiveCfg = Debug|x86
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Debug|x86.Build.0 = Debug|x86
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Release|x86.ActiveCfg = Release|x86
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}.Release|x86.Build.0 = Release|x86
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|Win32.ActiveCfg = Release|x64
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{5E5EF4EC-A54C-45A7-970A-68FC4B5057D9}.Release|x86 - Debug.Build.0 = Release|x86
 		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|x86.ActiveCfg = Debug|x86
-		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|x86.Build.0 = Debug|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|Mixed Platforms.Build.0 = Debug|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|Win32.ActiveCfg = Debug|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|x86 - Debug.ActiveCfg = Debug|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Debug|x86 - Debug.Build.0 = Debug|x86
 		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|Any CPU.Build.0 = Release|Any CPU
-		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|x86.ActiveCfg = Release|x86
-		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|x86.Build.0 = Release|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|Win32.ActiveCfg = Release|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{CFE5DC7B-25FB-45C4-AF18-1963853375E1}.Release|x86 - Debug.Build.0 = Release|x86
 		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|x86.ActiveCfg = Debug|x86
-		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|x86.Build.0 = Debug|x86
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|x86 - Debug.ActiveCfg = Debug|x86
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Debug|x86 - Debug.Build.0 = Debug|x86
 		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|x86.ActiveCfg = Release|x86
-		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|x86.Build.0 = Release|x86
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Debug|x86.ActiveCfg = Debug|x86
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Debug|x86.Build.0 = Debug|x86
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Release|Any CPU.Build.0 = Release|Any CPU
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Release|x86.ActiveCfg = Release|x86
-		{E39910A2-C72A-4D3C-BFD0-4356906B86A7}.Release|x86.Build.0 = Release|x86
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Debug|x86.ActiveCfg = Debug|x86
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Debug|x86.Build.0 = Debug|x86
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Release|x86.ActiveCfg = Release|x86
-		{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}.Release|x86.Build.0 = Release|x86
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Debug|x86.ActiveCfg = Debug|x86
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Debug|x86.Build.0 = Debug|x86
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Release|Any CPU.Build.0 = Release|Any CPU
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Release|x86.ActiveCfg = Release|x86
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}.Release|x86.Build.0 = Release|x86
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Debug|x86.ActiveCfg = Debug|x86
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Debug|x86.Build.0 = Debug|x86
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Release|Any CPU.Build.0 = Release|Any CPU
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Release|x86.ActiveCfg = Release|x86
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}.Release|x86.Build.0 = Release|x86
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{3B495DA8-B86F-4249-B94A-05B6FA01303F}.Release|x86 - Debug.Build.0 = Release|x86
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Debug|Win32.ActiveCfg = Debug|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Debug|Win32.Build.0 = Debug|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Debug|x86 - Debug.ActiveCfg = Debug|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|Any CPU.ActiveCfg = Release|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|Any CPU.Build.0 = Release|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|Win32.ActiveCfg = Release|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|Win32.Build.0 = Release|Win32
+		{2BF998A5-8BED-4975-91C5-7893DD138320}.Release|x86 - Debug.ActiveCfg = Release|Win32
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|x86 - Debug.ActiveCfg = Debug|x86
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Debug|x86 - Debug.Build.0 = Debug|x86
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|Win32.ActiveCfg = Release|Any CPU
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{F216D80D-2D70-4B3B-8632-813F6C399948}.Release|x86 - Debug.Build.0 = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Debug|Any CPU.ActiveCfg = Debug|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Debug|Win32.ActiveCfg = Debug|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Debug|x86 - Debug.ActiveCfg = Debug|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|Any CPU.ActiveCfg = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|Mixed Platforms.Build.0 = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|Win32.ActiveCfg = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|Win32.Build.0 = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|x86 - Debug.ActiveCfg = Release|x86
+		{3737E08F-FF33-4483-93EB-B71200AF17FA}.Release|x86 - Debug.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C} = {C1ADA293-B55A-4B33-AE5A-6FC40323FC39}
-		{8D071FB8-5E7B-43F4-81D4-839D2203D6AF} = {D840EDCD-7088-423F-9AF3-90C1F12255E8}
-		{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED} = {D840EDCD-7088-423F-9AF3-90C1F12255E8}
+		{2BF998A5-8BED-4975-91C5-7893DD138320} = {C1ADA293-B55A-4B33-AE5A-6FC40323FC39}
+		{3737E08F-FF33-4483-93EB-B71200AF17FA} = {C1ADA293-B55A-4B33-AE5A-6FC40323FC39}
+		{5818EFA1-F320-47BD-9075-19145F46E40A} = {C1ADA293-B55A-4B33-AE5A-6FC40323FC39}
+		{A45FE901-B323-48BD-BC0B-69784A7321F2} = {C1ADA293-B55A-4B33-AE5A-6FC40323FC39}
+		{D98A7BB0-CA45-49A1-9F25-9E69204339CA} = {5818EFA1-F320-47BD-9075-19145F46E40A}
+		{7667ABFF-97F6-4101-AD2A-5EB6C93F9C0B} = {5818EFA1-F320-47BD-9075-19145F46E40A}
+		{81E594E9-4D4A-489F-BCC8-8C7A5CD8EC8E} = {5818EFA1-F320-47BD-9075-19145F46E40A}
+		{3A83D9C1-FFB5-4422-ADD5-34545E4E88C7} = {A45FE901-B323-48BD-BC0B-69784A7321F2}
+		{D661BAF6-AD37-44B3-AEF5-4ED5737540F5} = {A45FE901-B323-48BD-BC0B-69784A7321F2}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
-		BuildVersion_UseGlobalSettings = False
-		BuildVersion_AssemblyInfoFilename = ..\Liquesce\LiquesceSvc\Properties\AssemblyInfo.cs
+		BuildVersion_UseGlobalSettings = True
+		BuildVersion_AssemblyInfoFilename = LiquesceSvc\Properties\AssemblyInfo.cs
 		BuildVersion_BuildVersioningStyle = YearStamp.MonthStamp.DayStamp.Increment
 	EndGlobalSection
-	GlobalSection(NDepend) = preSolution
-		Project = ".\Liquesce.ndproj"
-	EndGlobalSection
 EndGlobal
diff --git a/Liquesce/AdvancedPropertiesDisplay.cs b/Liquesce/AdvancedPropertiesDisplay.cs
index 25e7c60..9cfcbfb 100644
--- a/Liquesce/AdvancedPropertiesDisplay.cs
+++ b/Liquesce/AdvancedPropertiesDisplay.cs
@@ -1,120 +1,134 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="AdvancedPropertiesDisplay.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.ComponentModel;
+using System.Drawing.Design;
 using LiquesceFacade;
 using NLog;
 
 namespace Liquesce
 {
    // ReSharper disable MemberCanBePrivate.Global
+   // ReSharper disable UnusedMember.Global
    // Needs to be global to allow the propertgrid reflector to the accessors
    public class AdvancedPropertiesDisplay
    {
+      private readonly ConfigDetails cd;
+
       public AdvancedPropertiesDisplay(ConfigDetails cd)
       {
-         if (cd != null)
-         {
-            ThreadCount = cd.ThreadCount;
-            LockTimeoutmSec = cd.LockTimeout;
-            DokanDebugMode = cd.DebugMode;
-            PluginMode = cd.PluginMode;
-            HoldOffMBytes = cd.HoldOffBufferBytes / (1024 * 1024);
-            BufferReadSizeKBytes = cd.BufferReadSize / 1024;
-            ServiceLogLevel = cd.ServiceLogLevel;
-         }
+         this.cd = cd;
       }
-
-      private uint bufferReadSizeKBytes;
-
-      [DescriptionAttribute("The number of KBytes allocated to buffered    file reading (4KB is the OS default!).\rRange 1 <-> 256"),
-      DisplayName("Buffer Read Size")
-      , CategoryAttribute("File")
+      [DescriptionAttribute("The number of MilliSecs to wait before the service attempts to start to 'Load' the mount point.\r" +
+                            "Used to allow USB devices or network to become enabled before committing the mount space.\r" +
+                            "Range 0 <-> 10000000"),
+       DisplayName("Delay Start in MilliSec")
+      , CategoryAttribute("Service")
       ]
-      public uint BufferReadSizeKBytes
+      [TypeConverter(typeof(NumericUpDownTypeConverter))]
+      [Editor(typeof(NumericUpDownTypeEditor), typeof(UITypeEditor)), MinMaxAttribute(0, 10000000, 500)]
+      public uint DelayStartMilliSec
       {
-         get { return bufferReadSizeKBytes; }
-         set
-         {
-            if (value >= 1
-            && value <= 256) bufferReadSizeKBytes = value;
-         }
+         get { return cd.DelayStartMilliSec; }
+         set { cd.DelayStartMilliSec = value; }
       }
 
-      private ulong holdOffMBytes;
 
-      [DescriptionAttribute("Number of free MegaBytes to leave, before attempting to use another drive to write to.\rRange 1 <-> 1024000"),
-      DisplayName("Hold Off Buffer")
-      , CategoryAttribute("File")
+      [DescriptionAttribute("0 is automatic (Number of processing units * 2), use 1 for problem finding scenario's.\rRange 0 <-> 31"),
+       DisplayName("Thread Count")
+      , CategoryAttribute("CBFS")
       ]
-      public ulong HoldOffMBytes
+      [TypeConverter(typeof(NumericUpDownTypeConverter))]
+      [Editor(typeof(NumericUpDownTypeEditor), typeof(UITypeEditor)), MinMaxAttribute(0, 31)]
+      public ushort ThreadCount
       {
-         get { return holdOffMBytes; }
-         set
-         {
-            if (value >= 1
-            && value <= 1024000) holdOffMBytes = value;
-         }
+         get { return cd.ThreadCount; }
+         set { cd.ThreadCount = value; }
       }
 
-      [DescriptionAttribute("Later on will allow Dokan Debug information to be captured into the Service log."),
-      DisplayName("Dokan Debug Mode")
-      , CategoryAttribute("Dokan")
+      [DescriptionAttribute("The amount of information that will be placed into the Log files.\r" +
+                            "Trace means slower performance!\r." +
+                            "Useful for creating bug reports - set Thread Count to 1 as well"),
+       DisplayName("Service Logging Level")
+      , CategoryAttribute("Service")
       ]
-      public bool DokanDebugMode { get; set; }
-
-      private int lockTimeoutmSec;
+      [TypeConverter(typeof(ServiceLogLevelValues))]
+      public string ServiceLogLevel
+      {
+         get { return cd.ServiceLogLevel; }
+         set { cd.ServiceLogLevel = value; }
+      }
 
-      [DescriptionAttribute("Useful if you are getting file overwrites in some applications that perform quick creation deletion / creation of files, and multiple threads - Can be set to -1 for infinite.\rRange -1 <-> 100000"),
-      DisplayName("File Lock Timeout (mSec)")
+      [DescriptionAttribute("Cache the file details. This will improve the speed of file discovery and opening.\r" +
+                            "Range is 0 <-> 65535"),
+       DisplayName("File Detail cache seconds")
       , CategoryAttribute("File")
       ]
-      public int LockTimeoutmSec
+      [TypeConverter(typeof(NumericUpDownTypeConverter))]
+      [Editor(typeof(NumericUpDownTypeEditor), typeof(UITypeEditor)), MinMaxAttribute(UInt16.MaxValue)]
+      public UInt16 CacheLifetimeSeconds
       {
-         get { return lockTimeoutmSec; }
-         set
-         {
-            if (value >= -1
-               && value <= 100000) lockTimeoutmSec = value;
-         }
+         get { return cd.CacheLifetimeSeconds; }
+         set { cd.CacheLifetimeSeconds = value; }
       }
 
-      private ushort threadCount;
-
-      [DescriptionAttribute("0 is automatic, use 1 for problem finding scenario's.\rRange 0 <-> 32"),
-      DisplayName("Thread Count")
-      , CategoryAttribute("Dokan")
+      [DescriptionAttribute("The CBFS has caches that enable missing file details etc to not be routed through the service.\r" +
+         "This enables faster lookup's but has the draw back of never being able to find files that have been copied to the actual source drives.\r"+
+         "e.g. http://www.eldos.com/documentation/cbfs/ref_cl_cbfs_prp_nonexistentfilescacheenabled.html"),
+       DisplayName("Use Internal Driver Caches")
+      , CategoryAttribute("File")
       ]
-      public ushort ThreadCount
+      [TypeConverter(typeof(bool))]
+      public bool UseInternalDriverCaches
       {
-         get { return threadCount; }
-         set
-         {
-            if (value >= 0
-                && value <= 32)
-               threadCount = value;
-         }
+         get { return cd.UseInternalDriverCaches; }
+         set { cd.UseInternalDriverCaches = value; }
       }
 
-      [DescriptionAttribute("The amount of information that will be placed into the Log files (Trace means slower performance!)."),
-      DisplayName("Service Logging Level"),
-      TypeConverter(typeof(ServiceLogLevelValues))
-      , CategoryAttribute("Service")
-      ]
-      public string ServiceLogLevel { get; set; }
-
-
-      [DescriptionAttribute("The allocation strategy how new files or folders are placed on the storage disks:\n" +
-          "folder = try to keep files together on one disk (classic behavior)\n" +
-          "priority = strict one disk after the other method\n" +
-          "balanced = balance the availabel space on all storage disks\n" +
-          "backup = balanced with a \"_backup\" folder to get a secure allocated backup"
-          ),
-      DisplayName("Disk Allocation Mode")
+      [DescriptionAttribute("If true, then this attempts to perform in place renaming.\r" +
+      "If false, then renaming will also follow the priority rules and attempt to move files as if they are created anew.\r" +
+      "e.g. This means that if they exist on the last 2 drives, then via \'Priority\', they would all be moved to the first drive.\r" +
+      "But; there a few applications that perform a move to temporary location _before_ placing into the target (TeraCopy), these apps may produce variable results.\r"
+      ),
+         // TODO: UseInplaceRenaming
+       DisplayName("Use Inplace File Renaming")
       , CategoryAttribute("File")
       ]
-      public String PluginMode { get; set; }
+      [TypeConverter(typeof(bool))]
+      public bool UseInplaceRenaming
+      {
+         get { return cd.UseInplaceRenaming; }
+         set { cd.UseInplaceRenaming = value; }
+      }
    }
+   // ReSharper restore UnusedMember.Global
    // ReSharper restore MemberCanBePrivate.Global
 
+
    public class ServiceLogLevelValues : StringConverter
    {
       public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
@@ -130,7 +144,8 @@ public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
 
       public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
       {
-         return new StandardValuesCollection(new[] { LogLevel.Warn.ToString(), LogLevel.Debug.ToString(), LogLevel.Trace.ToString() });
+         return new StandardValuesCollection(new[] { LogLevel.Fatal.Name, LogLevel.Error.Name, LogLevel.Warn.Name, LogLevel.Info.Name, LogLevel.Debug.Name, LogLevel.Trace.Name });
       }
    }
+
 }
\ No newline at end of file
diff --git a/Liquesce/App.config b/Liquesce/App.config
index 60de718..917fe91 100644
--- a/Liquesce/App.config
+++ b/Liquesce/App.config
@@ -1,21 +1,18 @@
-<?xml version="1.0"?>
+<?xml version="1.0"?>
 <configuration>
    <configSections>
       <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
+      <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+         <section name="Liquesce.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
+         <section name="Liquesce.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
+      </sectionGroup>
    </configSections>
 
    <!-- Stick the namespaces in .. this is supposed to allow the intellisense to work ;-) -->
-   <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-         autoReload="true">
+   <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
       <variable name="LogDir" value="${specialfolder:folder=CommonApplicationData}/Liquesce/Logs"/>
       <targets>
-         <target name="file" xsi:type="File"
-                 layout="${longdate}[${threadid}][${threadname}] ${level:uppercase=true} ${logger}: ${message} ${exception:format=ToString}"
-                 fileName="${LogDir}/Liquesce.log"
-                 archiveFileName="${LogDir}/Liquesce.{#}.log"
-                 archiveAboveSize="1048576"
-                 archiveNumbering="Rolling"
-                 maxArchiveFiles="5">
+         <target name="file" xsi:type="File" layout="${longdate}[${threadid}] ${level:uppercase=true} ${logger}: ${message} ${exception:format=ToString}" fileName="${LogDir}/Liquesce.log" archiveFileName="${LogDir}/Liquesce.{#}.log" archiveAboveSize="1048576" archiveNumbering="Rolling" maxArchiveFiles="5">
          </target>
       </targets>
 
@@ -23,21 +20,25 @@
          <logger name="*" minlevel="Debug" writeTo="file"/>
       </rules>
    </nlog>
-   <system.serviceModel>
-      <client>
-         <endpoint
-           name="LiquesceFacade"
-           address="net.tcp://localhost:41014/LiquesceFacade"
-           binding="netTcpBinding"
-           bindingConfiguration="tcp_Unsecured"
-           contract="LiquesceFacade.ILiquesce" />
-      </client>
-      <bindings>
-         <netTcpBinding>
-            <binding name="tcp_Unsecured">
-               <security mode="None" />
-            </binding>
-         </netTcpBinding>
-      </bindings>
-   </system.serviceModel>
-</configuration>
+   <userSettings>
+      <Liquesce.Properties.Settings>
+         <setting name="WindowLocation" serializeAs="String">
+            <value/>
+         </setting>
+         <setting name="UpdateRequired" serializeAs="String">
+            <value>True</value>
+         </setting>
+         <setting name="TailWindowLocation" serializeAs="String">
+            <value/>
+         </setting>
+      </Liquesce.Properties.Settings>
+      <Liquesce.Settings1>
+         <setting name="WindowLocation" serializeAs="String">
+            <value/>
+         </setting>
+         <setting name="UpdateRequired" serializeAs="String">
+            <value>True</value>
+         </setting>
+      </Liquesce.Settings1>
+   </userSettings>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
diff --git a/Liquesce/ChangeLog.rtf b/Liquesce/ChangeLog.rtf
index 44b8ed9..083d0c8 100644
--- a/Liquesce/ChangeLog.rtf
+++ b/Liquesce/ChangeLog.rtf
@@ -1,47 +1,394 @@
-{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Courier New;}{\f2\fmodern\fprq1\fcharset0 Courier New;}{\f3\fnil Courier New;}}
-{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;}
+{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil Consolas;}{\f3\fmodern\fprq1\fcharset0 Courier New;}{\f4\fnil Courier New;}{\f5\fnil\fcharset0 Consolas;}{\f6\fnil\fcharset0 Tahoma;}}
+{\colortbl ;\red0\green0\blue0;\red0\green0\blue255;\red0\green77\blue187;\red192\green80\blue77;\red255\green0\blue0;\red0\green0\blue139;\red163\green21\blue21;\red0\green128\blue0;}
 {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\cf1\lang2057\ul\b\f0\fs20 Welcome to the \i Liquesce \i0 Changelog\cf0\ulnone\b0\f1\par
 \cf1\f0\par
-Currently this is just a place holder for all the cool stuff that will be happening to this project :-)\par
+Currently this is just a place holder for all the cool stuff that has happened to this project :-)\par
 \par
-Keep an open eye on the \cf2\ul\b{\field{\*\fldinst{HYPERLINK "http://liquesce.codeplex.com/"}}{\fldrslt{\ul\cf2 http://liquesce.codeplex.com/}}}\cf1\ulnone\b0\f0\fs20  site.\par
+Keep an open eye on the \cf0\b{\field{\*\fldinst{HYPERLINK "http://liquesce.codeplex.com/"}}{\fldrslt{\ul\cf2 http://liquesce.codeplex.com/}}}\cf1\b0\f0\fs20  site.\par
 \par
 \cf0\ul\b Some Helpful Information:\ulnone\b0\par
 \ul How to get an install log to send if you have a problem:\ulnone\par
-\pard\sb100\sa100 To obtain a log of an installation use the {\field{\*\fldinst{HYPERLINK "http://support.microsoft.com/kb/227091"}}{\fldrslt{\cf2\ul command line msiexec tool}}}\cf0\ulnone\f0\fs20 :\par
-\f2 msiexec /i Liquesce_Setup.msi /l*v MyLogFile.txt\par
-\f0 and this for uninstall issues\par
-\f2 msiexec /l*v MyLogFile.txt /uninstall Liquesce_Setup.msi\par
+\pard\sb100\sa100 The Log file is now auto generated via the SFX file and will be located in \cf3\f1 %ProgramData%\\Liquesce\\Logs\\Install.log\cf0\f2\fs19\par
+\f0\fs20 For uninstall issues use\par
+\f3 msiexec /l*v MyLogFile.txt /uninstall Liquesce_Setup.msi\par
 \f0 This will install your application and write a verbose log to MyLogFile.txt in the current directory.\par
 \pard\par
 \ul Logs\par
-\ulnone GUI logs will go into \f3\fs19 "\cf2 $\{specialfolder:folder=CommonApplicationData\}/Liquesce/Logs\cf0 "\par
-\f0\fs20 Service logs will go into \f3\fs19 "\cf2 $\{specialfolder:folder=CommonApplicationData\}/LiquesceSvc/Logs\cf0 "\par
+\ulnone GUI logs will go into \f1 "\cf3 %ProgramData%/\cf2\f4\fs19 Liquesce/Logs\cf0 "\par
+\f0\fs20 Service logs will go into \f1 "\cf3 %ProgramData%/\cf2\f4\fs19 LiquesceSvc/Logs\cf0 "\par
 \f0\fs20\par
-\ul\b TODO\par
-\ulnone\b0 - Fix Issues\par
+\ul\b TODO \par
+\cf4\ulnone\b0 - Mgt application\par
+- - \cf0\f2\fs19 IsCBFSVolume\f5  \par
+- - Folder on existing NTFS drive instead of drive letter as a parameter to AddMountingPoint() method\par
+\cf4\f0\fs20 - Usage stats to be reported in Tray\ul\b\par
+\ulnone\b0 - - Event messages\par
+- Change the space usage to be a table with scroll-bars to give better layout options (And sorting etc.)\par
+- Explorer plugin\par
+- Fix Issues\par
+- Performance\par
+\cf5\f6 - - FindFiles - Need a way to make this IEnumerable (Maybe) - \cf0{\field{\*\fldinst{HYPERLINK "https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2385336-optimize-file-system-operations"}}{\fldrslt{\ul\cf2 https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2385336-optimize-file-system-operations}}}\cf5\f6\fs20\par
+\cf4\f0 - - Test Suite (\cf5\f6 WINAFred ) \cf4\f0 of operations\par
+\cf5\f6 - Install advances\par
+- - Use Wix 3.7/8 to add bootstrapper functionality for .Net\par
+- \cf0\f2\fs19 CheckDrop\f5  - \cf6\b\f2 On Add check to make sure that the root (Or this) node have not already been covered.\par
+\cf0\b0\f5 - \f2 ReadConfigDetails\f5  - \cf6\b\f2 Read the values from the config file\par
+\cf0\b0\f5 - \f2 SetAllocationSize\f5  - \cf6\b\f2 Move the file, or return not enough space ??\par
+\cf0\b0\f5 - \f2 CanFileBeDeleted\par
+\cf6\b\f5 - - \f2 Need to find out if this ever get called before IsDirectoryEmtpy\cf0\b0\par
+\f5 - - \cf6\b\f2 Need to check if any of the files are open within a directory.\par
+\cf0\b0\f5 - \f2 Start\f5  - \cf6\b\f2 Search all usages of the DriveLetter and make sure they become MountPoint compatible\par
+\cf4\b0\f0\fs20 - UNC path instead of drive letter as a parameter to AddMountingPoint() method\par
+- Phase ][ Does not allow Teracopy to work - Re-Opened!\par
+\cf0 - Directory Renaming\par
+- - Large drive contents\par
+- Issues with multiple rooted directories, and then deleting them.\par
+\cf4\par
 \par
-\ul\b Issue\ulnone\b0\par
-- Win 7 (64) <-> win 7 (64) Maybe a Dokan bug see ticket {\field{\*\fldinst{HYPERLINK "http://code.google.com/p/dokan/issues/detail?id=168"}}{\fldrslt{\ul\cf2 http://code.google.com/p/dokan/issues/detail?id=168}}}\f0\fs20\par
-\cf1\par
+\cf0\ul\b Done\par
+2014-08-##\par
+\ulnone\b0 - CBFS 5.1.150\par
+- Manifest files upto Windows 8.1 support\par
+- Sort out "IsEmptyDirectory" when di is spread over several sources.\par
+- Sort out usage of Recycle.bin when used with different drive types (And thus different recycle dir names)\par
+\par
+\ul\b\par
+2014-07-##\par
+\ulnone\b0 - Fix initial directory creation\par
+- - Fix empty dir rename\par
+- Handle Drive 1 containg the dir, drive 2 containing the file at a lower point\par
+- - Copying down the dir chain to a non-existing dir whilst inplace is in force.\par
 \par
+\ul\b\par
+2014-07-16\par
+\ulnone\b0 - Fix Use existing folders when in "Folder" mode\par
+- - Test Create file\par
+- - Test rename\par
+- - Test Move file\par
+- - Test Create folder\par
+- - Testing Teracopy\par
+- Fix exception when config file has be manually edited and HoldOfBytes is an out of range value\par
+- Add code for the new feature: \f2\fs19 UseInternalDriverCaches\par
+\f0\fs20 - - Add "Use Internal Driver cache" mode option (default to true)\par
+- Update to CBFS 5.1.149\par
+- - Sporadic BSOD (access violation) when the network mounting points were used. \par
+- - After directory enumeration had finished (the ERROR_NO_MORE_FILES returned) a new enumerate directory request with the same handle (and without the "restart scan" flag) restarted the enumeration. Now in order to make a new enumeration the directory must be reopened.  \par
+- - Possibility of BSOD during directory enumeration when the "enumeration mask" parameter points to user address space.\par
+- Fix: After UAC request the MgtApp would be at the back\par
+- - Test to make sure not too intrusive!\par
+- Add new feature: \f2\fs19 UseInplaceRenaming\par
+\f0\fs20 - File Renaming\par
+- - Sort out problem with rename.\par
+- - Make sure rename uses the file size to allow merging\par
+- - Implement in place renaming\par
+- - Testing File inplace\par
+- Improve performance \par
+- - Use ReaderWriteLockSlim on internal file cache\par
+- - Use SetFilePointer with 0 first to get the position, before always moving for reads / write (Prevent Shlemiel algorithm problem)\par
+- Remove unused References in projects.\par
+- Remove thirdparty FileSystem transaction code (MS are trying to deprecate it anway!)\par
+- Directory Renaming\par
+- - unique folder\par
+- - Spread testing\par
+- - Make sure cache object for all objects in the rename source are removed.\par
+- - Testing directory inplace\par
+\par
+\ul\b\par
+2014-06-##\par
+\ulnone\b0 - Add Latest CBFS 5.1.148 (Supposed to fix these things since 145)\par
+- - [.NET] When a file is renamed OncloseFile callbacks for its handles are called with the zeroed HandleInfo.UserContext. \par
+- - Sporadically occurred BSOD when closing of a file that was opened via SMB share.\par
+- - Possibility of deadlock when several storages are being created at the same time.\par
+- - Sporadically occurred BSOD when the file data cache is used.\par
+- - Setting of the UseFileCreationFlags property also set the ParallelProcessingAllowed property (and vice verse).\par
+- - Sporadically occurred BSOD when the request timeouts are enabled.\par
+- Recompile ".NET Transactional File Manager" to be .Net 4 usage.\par
+\cf5 - Work on the Fix Folder mode usage\cf4\par
+\cf1\par
 \cf0\ul\b Done\par
+2014-03-02\par
+\ulnone\b0 - Add Latest CBFS 5.0.145\par
+- - Change code to handle the new API layouts\par
+- - Need to test this\par
+- Add the code to detect sub dir sharing, and to re-enable when restarting\par
+- - Need to test this\par
+- Start to Add FileId API's for NFS compatibility\par
+- - Need to test this\par
+- Fix Drive select exception; due to fallout from the "IncludeName code that was supposed to have been "backed out"\par
+- Initial display of existing mount details was not filling in the "Expected output" tree\par
+- Tinker with the start sequence to \par
+- - put more into the Threadpool\par
+- - add EventLog Exception catching\par
+- Fix Applicaiton managemenet App Flickering when used on Windows 8.1\par
+- Fix launch of an executeable that requires access permissions for a AntiVirus etc.\par
+\ul\b\par
+2014-01-31\par
+\ulnone\b0 - Work on the Multi-Mount UX\par
+- Complete work on the "Read-Only Source" feature\par
+- - Fix the check box usage.\par
+- Remove work on the "Using Inclusive" feature\par
+- - It was affecting \i too \i0 much code.\par
+- \cf7\f2\fs19 netfx:NativeImage\f5  \cf0\f0\fs20 should now work for "all" platforms not limited to 32bit\par
+- Do not auto start the service, as CBFS always seems to request a restart.\par
+- Add some logging to determine the OS version and CLR version.\par
+- Fix the appearance (And name) of empty ROM drives.\par
+- Fix the Launch then deny of the Mgt App from the Tray.\par
+- Coding standard improvement (e.g. Use brackets after all if's)\par
+- Start to use "CodeMaid" to help with the coding standards.\par
+- Phase ][ "DropZone" window - now appears to work. Tested on both Win2k8 and Win7x64\par
+- Redo logging to determine the OS friendly name\par
+- Fix the "Restart of Service" button - does not work\par
+- Tail window now has colors and better handling when button is clicked (And reclicked!)\par
+- Add the Log ZIPping\par
+- Move to the next release of CBFS 4.140\par
+- - Possibility of BSOD with code 0x44 "MULTIPLE_IRP_COMPLETE_REQUESTS" when network mounting point is used.\par
+\ul\b\par
+2013-12-21\par
+\ulnone\b0 - Make service delay start and rely on PlugnPlay to allow CBFS drivers to start\par
+- Make the SFX produce a log file -> \cf3\f1 %ProgramData%\\Liquesce\\Logs\\Install.log\cf0\f2\fs19\par
+\f0\fs20 - Start to work out why Writes do not work for the 2nd beta.... Not been able to reproduce !\par
+- Fix TeraCopy problem (Due to NoBuffering request from that app !)\par
+- Add the lower (Reduced) logging levels for the default install to enable a speed improvement\par
+- When creating a new folder in the root, It would throw an exception due to security\par
+- Use of the recycle bin\par
+- Install Icon, as the recycler fix means the lack of OS's ram icon\par
+- Some teaking to the level of log output on start-up\par
+- Coding standard improvement (e.g. Use brackets after all if's)\par
+- Add "Landing Zone" UX to the Mgt App.\par
+\par
+\ul\b\par
+2013-11-30\par
+\ulnone\b0 - Building VM's for Test (2k12 doesn't want to play !)\par
+- Raised a few issues from own usage.\par
+- Getting latest CBFS V4 to fix some issues with:\par
+- - Installation of the helper DLLs failed sporadically with error 1155. \par
+- - Memory leak when the NotifyDirectoryChange API was calling inside the CBFS callbacks. \par
+- - Possibility of access violation in the user mode part of CallbackFS in the case of some directory enumeration requests, such as "dir "*\\"". \par
+- Trying to discover which is the best way to get minimum size and best install experience\par
+- Setting up 7-ZIP SFX Maker\par
+- Re-issued\par
+\ul\b\par
+2013-10-22\par
+\cf4\ulnone\b0 - \b Release 1st CBFS implementation\par
+\cf0\b0 - Tested threading\par
+- - Checked notepad, and wordpad, 7z, media, photo viewer\par
+- - Moving files (Into subdirs)\par
+- - Moving directories\par
+- - GetFileSecurity (return exception for FAT32 drives)\par
+- Tested Service Tray\par
+- - Drop Zone\par
+- - Free Disk space\par
+- - Start / Stop monitoring\par
+- - When stopped, relevant icons disabled.\par
+- Mgt App\par
+- -  Re-title application\par
+\cf4 - - \cf0 "Talk" to the config directly - Faster startup\par
+- - Tinker with the splitters to be "More obvious"\par
+- Created a TestTheCBFSInstall project to do just that.\par
+- Fix Installer (32 / 64 bitness)\par
+- - Extract out the different areas into seperate wxs files.\par
+- Set FileSystem Type to be NTFS\par
+\par
+\par
+\ul\b 2013-10-18\par
+\ulnone\b0\f6 - Directory Create\par
+- GetFileInfo\par
+- FileRead\par
+- FileWrite\par
+\f0 - Change SetFileAttributes to only set if things have changed\par
+- Check for "DateTime.MinValue" when converting times for attributes.\par
+- The Read and write locks now span the functions to prevent closure whilst in use.\par
+- Remove "FileAttributes.Offline" whilst in Trace, as this prevent the files from being read\par
+- Implement a "FileName" function to extract out from Paths.\par
+- Add logging for the ProcessId to Name lookup\par
+- - What have I found from this:\par
+- - - Open file is passing the context of the previous File context if it already open via CBFS\par
+- - - The context is not reset if another application is opening the same file\par
+- - - Therefore the CBFS handle used must allow full access\par
+- - - And that means the check for the actual user requested Shared / Access has to be indepenedent to this initial open.\par
+- - - Sharing of the user request has to be tested first before the CBFS handle is created.\par
+- - Implement OpenUnderTheRadarFileStream for the "Global" CBFSHandle\par
+- Add Stream Enumeration\par
+- Wordpad, Notepad, Media Player, Image Preview, 7Zip tests\par
+- GetSecurityInfo (Too Small and then full read)\par
+\par
+\ul\b\par
+2013-10-06\par
+\ulnone\b0 - Sort out VolumeLabel\par
+- VolumeID\par
+- Use the RamDisk\par
+- Set type to "NTFS"\par
+- Use of CBFS Caching (All of them)\par
+- GetSecurity\par
+- Directory Delete\par
+- Directory Open\par
+- Directory Create -  \cf5 Problem\cf0\par
+- File read - \cf5 not firing\cf0\par
+\par
+\ul\b\par
+2013-09-##\par
+\ulnone\b0 - Complete CBFS Integration\par
+- Get the Service compiling\par
+- Remove  aload of code that is no longer applicable\par
+- Service now starts\par
+- Remove "Zombie drive letter" code to deal with development crashes\par
+- Handle file open\par
+- Handle Directory enumeration ( Times, attributes, Size and allocation)\par
+\ul\b\par
+2013-07-##\par
+\ulnone\b0 - Over the year I have been slowly learning how to use the CBFS and implementing test applications\par
+- Move back to using IDE 2010 (Do not like 2012!)\par
+- Use new transaction DLL \cf5\f2\fs19 ChinhDo\f5  1.3\f2\par
+\cf0\f0\fs20 - Branch code to start Phase][\par
+- Move over to using newer CBFS V4\par
+- Remove DokanNet\par
+- New Resharper Usages\par
+- Start to implement the Unit Testing framework.\par
+\ul\b\par
+2012-12-##\par
+\ulnone\b0 - 1st install, does not use a non used drive for demo mapping.\par
+- Sort out the usage of the Folder vs Priority vs space for uTorrent creation\par
+\ul\b\par
+2012-12-11 RC 2\par
+\cf4\ulnone\b0 - Mounting into a folder\par
+\cf0 -- Need to create it as an access point in XP\par
+-- Check Drive exists\par
+-- Create folder if it does not exist\par
+-- Allow drag drop into the mount point\par
+- Start to investigate Mgt app start-up invokes.\par
+- Add "Service not running" text back in\par
+- Modify service exit state to capture when mounting is not successful and force service close with the appropriate error code.\par
+\par
+\ul\b\par
+2012-11-23 RC 1\par
+\ulnone\b0 - Remove FileSharing and will decline any further support for \i Phase I\i0   shares.\par
+- Start to investigate mounting as a folder\par
+\ul\b\par
+2012-06-##\par
+\ulnone\b0 - Add TailForm to the Management application to see the Service log files changing.\par
+\par
+\ul\b 2012-05-29 Test Release\par
+\ulnone\b0 - Add numericUpDown range control to the property Gird\par
+\cf4 - Advanced Settings - File Detail Cache Seconds\par
+\cf0 - Addition of buttons to allow user to perform the workarouns for SMB and EnableOpLocks overrides.\par
+- fix \cf4 Create new files when All the sources have below the Hold-Off area is not handled well.\cf0\par
+- Change default thread value to 0, now that it has been tested.\par
+- unable to reproduce \cf4 Number of Folders not showing up over a share\par
+\cf0 - Fix \cf4 Cannot rename folders with 12-01-beta2 in XP Server\par
+\cf0 - Start to convert project over to using 64 Native API's and Builds\par
+-- Fix compile warnings\par
+-- Start to optimise usage of variables to give the optimising compiler a chance\cf4\par
+\cf0\par
+\ul\b\par
+2012-04-29 (RC2)\par
+\ulnone\b0 - Fix some exceptions thrown when format syntax strings where not done properly\par
+- Fix \cf4 Deleting directories\par
+\cf0 - Solved \cf4 Problems sharing a drive (Hosted on XP)\cf0  (See workaround in Item)\par
+- Solved \cf4 0.6.0 Sharing on Win 7 x64 & x32 Host Locks up XP Client\cf0  (See workaround in Item) \par
+\cf4\f6 - NTFS is case-preserving but case-insensitive in the Win32 namespace\cf8\f2\fs19\par
+\cf0\ul\b\f0\fs20\par
+\par
+2012-01-28 (Release Candidate)\par
+\ulnone\b0 - Testing\par
+- Fix the \cf4 Multiple mounted points from the same drive will increase reported drive space\par
+- The "Re-Focused" release (Alpha4) does not allow files to be edited over a share -  \cf0 solved by\cf4  \cf0{\field{\*\fldinst{HYPERLINK "http://liquesce.codeplex.com/discussions/236580"}}{\fldrslt{\ul\cf2 http://liquesce.codeplex.com/discussions/236580}}}\ul\b\f0\fs20\par
+\ulnone\b0 - Add Window location restore\par
+- Add config file upgrade for user settings\par
+\cf4 - On Windows Server 2003, Dokan 0.6.0 Version is not detected Correctly\par
+- Tested and unable reproduce "Appears to be a 4GB File Limit over a share"\par
+- Tested and closed "Teracopy 2.2 does not copy from Liquesce shares"\par
+- Tested and closed "VLC cannot access File Over Dokan Hosted Share"\cf0\ul\b\par
+\ulnone\b0 - Fix the \cf4 "The TrayHelper GPF's when trying to start a service that is already started"\par
+\par
+\cf0\ul\b\par
+2012-01-04 (Alpha 5)\par
+\ulnone\b0 - Add new warning to the share dialog, indicating that shares my not work.\par
+\cf4 - \cf0 Fix t\cf4 he License warning in the installer needs to change.\par
+\cf0 - Fix the "Features" introduced by the last lot of .Net to Win32 API replacements.\par
+- Sort out the firing of the ShellNotify for file updates for both source and mounted names.\par
+\par
+\ul\b\par
+2011-12-01\par
+\ulnone\b0 - Creating a directory - when that dir name already exists - can make the directory appear twice in explorer\par
+- Rename directory (Folder mode) will not rename all sources of that directory (via a share)\par
+- Remove the Stream usage for File API's\par
+- Removed C# File and now use Native API's for all file access\par
+- Use the Native handle as much as possible to speed up access to those API's\par
+- Use Transaction (And emulation for FAT32) for Directory renames\par
+- Make sure the Files are not actually moved (remain on source drive) during directory rename / move\par
+- Removed unused BufferSize, and LockTieout values\par
+- In XP, the System Volume Information is explorable\par
+- Default startup value needs to be set to Min value\par
+- Detect Drive Format of "FAT" and remove from the selection list\par
+- On initial install, New Drive N shows in Management App\cf4\par
+\cf0 - 0.6.0 Sharing on x64 Host Locks up network XP Host\par
+- Tested and shown to work: Sharing on restart is broken in Win 7x32 Ultimate\par
+\cf4 - \cf0 Fix the \cf4 Messages sent to Application Tray fail for some users and on some OS's\par
+- \cf0 Fix the \cf4 Investigate why New *.rtf does not work in Win 7x64\cf0\par
+- Add NativeFileFind to speed up to remove Win32 -> C# -> FileFind -> Win32 -> Dokan conversions\par
+- Correct usage of the FileTime and the FileAttributes types to ease logging\par
+- Add "Fastest" method to discover if a directory is empty\par
+- Use lowlevel API for FindFullPath (This can be LongPath enabled :-)\par
 \par
+\ul\b\par
+2011-11-17\par
+\ulnone\b0 - Switch to using for the \f2\fs19 GetFileInformationByHandle\f5 () \f0\fs20 for speed (Probably) and direct return of upto date information from the native file system.\par
+- Fix the "Left over" text for the backup in the space display.\par
+- Re-focused the need for security on the GetFileInformation and SetFile operations.\par
+- Add code to inform explorer (And other Apps via OS) that things have changed in the mounted drive [\f2\fs19 SHChangeNotify\f5  API]\f0\fs20 .\par
+- Sort out the code for the file renames in Win 7 and \cf8\f2\fs19 "\cf0{\field{\*\fldinst{HYPERLINK "http://code.google.com/p/dokan/issues/detail?id=238"}}{\fldrslt{\ul\cf2 http://code.google.com/p/dokan/issues/detail?id=238}}}\cf8\f2\fs19 " \par
+\cf0\par
+\ul\b\f0\fs20\par
+2011-10-30\par
+\ulnone\b0 - XP Testing - Network access - Found Problems\par
+- Win7 x64 Testing - Netowrk Access  - Found Problems\par
+- Find the System.exe ID to prevent impersonation of it. - This is to workaround the impersonation of a user coming over the share access\par
+\par
+\ul\b\par
+2011-10-15\par
+\ulnone\b0 - Remove the "Old" client share enabler projects from Source control\par
+- Add GNU header requirements to the cs files\par
+- Created the current Test Document\par
+- Add security impersonation to all the API's\par
+- Add some speed up with some of the functions\par
+- Completely re-write the security API's And test under various account types (SACL_### now works :-)\par
+- Perform testing with Kernel 6.1 OS's\par
+\par
+\ul\b\par
+2011-10-04\par
+\ulnone\b0 - Remove the \f1 .backup\f0  option\par
+- Remove the \f1 .mirror\f0  option\par
+- Fix code from the options removal\par
+- Add the Cache Helper class\par
+- Remove the defunct ShareEnabler code\par
+- Change how file Read and write detect if a context has been passed in (Thanks NightThunder)\par
+- Add some more focused exception messages in MainForm\par
+- Add manifest file to the service to run as high as possible (For FileSecurity API's)\par
+- Implement workaround for \f2\fs19{\field{\*\fldinst{HYPERLINK "http://code.google.com/p/dokan/issues/detail?id=209"}}{\fldrslt{\ul\cf2 http://code.google.com/p/dokan/issues/detail?id=209}}}\f5\fs19  as manifest does not work for share access\f0\fs20\par
+- Fix the tray menu to only have service control when the correct key sequence is held.\par
+\par
+\ul\b\par
+2011-06-01\par
+\ulnone\b0 Merge fixes from Jose:\par
+- Optimisation in fileOpen to minimise use of File.Exists(...)\par
+- Optimisation in MoveFile to keep the files on the same drive (Faster move result)\par
+- Change implementation of GetFileSecurityNative(...)\par
+\par
+\ul\b\par
 2011-04-27\par
 \ulnone\b0 - Add correction for IsDirectory in CreateFile open\par
-- Add in function usage of Set / Get File security (Not Tested)\ul\b\par
+- Add in function usage of Set / Get File security (Not Tested)\par
 \par
+\ul\b\par
 2011-03-09 - Alpha\par
 \ulnone\b0 - SetFileTime fixes\par
 - Add Build / Version number to all the projects and display in the management app \par
 - Allow Start / Stop to occurr on Win 7 and above via UAC Aware helper App\par
 - Prevent multiple trays and management apps from running\par
 - Sort out the drag and drop in the Middle window\par
-\par
 - Investigations of the Directory rename when in "Folder" mode\par
 - Investigations of the "Open with Notepad over Share"\par
 \par
-\par
 \ul\b\par
 2011-02-14\ulnone\b0\par
 Fix the Dokan Proxy.Net call that returns the Volume information to fill in the Preserve ACL's \par
@@ -86,27 +433,25 @@ FreeSpace Form: \par
 added dropzone to the tray app. \par
 you can easily find out on which physical disk a file or folder is placed by liquesce \par
 \par
+\par
 \ul\b 2010-10-26 \ulnone\b0\par
 - Fix the log viewing from inside the management application \par
 - Changed to remove the \'e7 and replace with c in Facade in the Code only. Directory names remain still. \par
 - Awaiting all code before attempting the Dir Renam \par
 - Make the Locks a little tighter around the access to the Dokan raw storage lookup \par
 \par
+\par
 \ul\b 2010-10-10 \par
 \ulnone\b0 - Add in the "Ctrl" key addition to the Tray Application right click \par
 - Added the default Double click handler to the tray \par
 - Fix the Tooltip text for the state changes in the Tray \par
 - Merged changed to allow the order of the mount points via the mouse\par
-\par
 - Add in the "Ctrl" key addition to the Tray Application right click \par
 - Added the default Double click handler to the tray \par
 - Fix the Tooltip text for the state changes in the Tray\par
-\par
 - Fix the usage of the "Builtin" SIDS, so that the share restore uses WellKnownSidType\par
-\par
 - Move the "Get Shares" functionality into a call in the service so that the user does not need to run the Management application with administrative user mode \par
 - Changed the re-creating and retrieval of the shares over to the WMI functions rather than trying to use the .Net Directory ACL\par
-\par
 - Tidy up the exception being thrown (And caught) when a ROM Drive does not contain a disc\par
 \par
 \par
@@ -146,7 +491,6 @@ you can easily find out on which physical disk a file or folder is placed by liq
 - Move the menus around and rename some items\par
 \par
 \par
-\par
 \ul\b 2010-09-19 \ulnone\b0\par
 - Start to add in the information the Application tray will need \par
 - Addition of the NotifyIcon without a winform \par
@@ -154,6 +498,7 @@ you can easily find out on which physical disk a file or folder is placed by liq
 - Potential fix for the startup forgetting settings issue \par
 - Make sure uninstall stops the application tray\par
 \par
+\par
 \ul\b 2010-09-05 \ulnone\b0\par
 - Tested create a folder over a share from Win7 (64) client to win 7 (32) Dokan Host \par
 - Fixed The check for the correct ("Sizeof" version of Dokan = 0.5.3) \par
@@ -163,17 +508,20 @@ you can easily find out on which physical disk a file or folder is placed by liq
 - Made the "File Not found not be reported by an exception \par
 - Do not stop the associated services (But attempt restart if they are not running) \par
 \par
+\par
 \ul\b 2010-08-30 \ulnone\b0\par
 - Fixed the duplicate directories showing up in the GUI Expected area \par
 - Put in a warning that the Shares will be interrupted when the commit action is done. \par
 - Fixed Meta<Browser> adding new Xml files over a share (Tested on XP and win 7) \par
 - Tested Copying to the network share (On Win 7) using Terracopy \par
-- Tested Create of a new directory on Win 7 share \ul\b\par
+- Tested Create of a new directory on Win 7 share \par
+\ul\b\par
 \par
 2010-08-29 \par
 \ulnone\b0 - Fixed the Computer Browser service not being restarted. \par
 - Added Extra logging to try and trace the Notepad Issue on Win 7 (Works in XP !) - Still no luck - So opened a ticket on the Dokan Site \par
-- Now ignores the Synchronized open attribute as FileStreams are always open synchronized ! \ul\b\par
+- Now ignores the Synchronized open attribute as FileStreams are always open synchronized ! \par
+\ul\b\par
 \par
 2010-08-28 \par
 \ulnone\b0 - Fixed creating anew share while the service is running and giving the correct listing contents \par
@@ -182,7 +530,8 @@ you can easily find out on which physical disk a file or folder is placed by liq
 - Test Upgrade installs \par
 - Tested while the service was running \par
 - Fixed the Share browsing \par
-- Fixed when a share is created after the drive is created. \ul\b\par
+- Fixed when a share is created after the drive is created. \par
+\ul\b\par
 \par
 2010-08-27 \par
 \ulnone\b0 - Fixed: Added the code to implement the faster search with pattern \par
@@ -193,7 +542,8 @@ you can easily find out on which physical disk a file or folder is placed by liq
 - Changing volume name is not reflected in the "Expected" until after lose focus \par
 - Stopping the Mounted drive now actually stops the correct drive. \par
 - Start does not return a status, but executes in a separate thread (DokanMount does not return !) \par
-- Send new data to the service. \ul\b\par
+- Send new data to the service. \par
+\ul\b\par
 \par
 2010-08-26 \par
 \ulnone\b0 - Service changed to use WCF \par
diff --git a/Liquesce/CurrentShares.Designer.cs b/Liquesce/CurrentShares.Designer.cs
deleted file mode 100644
index 394fd68..0000000
--- a/Liquesce/CurrentShares.Designer.cs
+++ /dev/null
@@ -1,226 +0,0 @@
-namespace Liquesce
-{
-   partial class CurrentShares
-   {
-      /// <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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
-         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CurrentShares));
-         this.groupBox1 = new System.Windows.Forms.GroupBox();
-         this.label1 = new System.Windows.Forms.Label();
-         this.Store = new System.Windows.Forms.Button();
-         this.groupBox2 = new System.Windows.Forms.GroupBox();
-         this.mountedPoints = new System.Windows.Forms.TextBox();
-         this.progressBar1 = new System.Windows.Forms.ProgressBar();
-         this.dataGridView1 = new System.Windows.Forms.DataGridView();
-         this.buttonSave = new System.Windows.Forms.Button();
-         this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
-         this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn();
-         this.Description = new System.Windows.Forms.DataGridViewTextBoxColumn();
-         this.Credentials = new System.Windows.Forms.DataGridViewTextBoxColumn();
-         this.groupBox1.SuspendLayout();
-         this.groupBox2.SuspendLayout();
-         ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
-         this.SuspendLayout();
-         // 
-         // groupBox1
-         // 
-         this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                     | System.Windows.Forms.AnchorStyles.Right)));
-         this.groupBox1.Controls.Add(this.label1);
-         this.groupBox1.Location = new System.Drawing.Point(15, 5);
-         this.groupBox1.Name = "groupBox1";
-         this.groupBox1.Size = new System.Drawing.Size(378, 78);
-         this.groupBox1.TabIndex = 0;
-         this.groupBox1.TabStop = false;
-         this.groupBox1.Text = "Notes :";
-         // 
-         // label1
-         // 
-         this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
-         this.label1.Location = new System.Drawing.Point(3, 18);
-         this.label1.Name = "label1";
-         this.label1.Size = new System.Drawing.Size(372, 57);
-         this.label1.TabIndex = 0;
-         this.label1.Text = "The current active \"Mount Points\" owned by Liquesce will need to be renabled afte" +
-             "r the service has been started. Therefore you will need to confirm that they are" +
-             " have been found correctly.";
-         // 
-         // Store
-         // 
-         this.Store.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-         this.Store.Location = new System.Drawing.Point(237, 366);
-         this.Store.Name = "Store";
-         this.Store.Size = new System.Drawing.Size(75, 23);
-         this.Store.TabIndex = 1;
-         this.Store.Text = "&Refresh";
-         this.toolTip1.SetToolTip(this.Store, "Setup the shares first and then press refresh");
-         this.Store.UseVisualStyleBackColor = true;
-         this.Store.Click += new System.EventHandler(this.Store_Click);
-         // 
-         // groupBox2
-         // 
-         this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                     | System.Windows.Forms.AnchorStyles.Right)));
-         this.groupBox2.Controls.Add(this.mountedPoints);
-         this.groupBox2.Location = new System.Drawing.Point(15, 89);
-         this.groupBox2.Name = "groupBox2";
-         this.groupBox2.Size = new System.Drawing.Size(380, 53);
-         this.groupBox2.TabIndex = 2;
-         this.groupBox2.TabStop = false;
-         this.groupBox2.Text = "Mounted Points :";
-         // 
-         // mountedPoints
-         // 
-         this.mountedPoints.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                     | System.Windows.Forms.AnchorStyles.Right)));
-         this.mountedPoints.Location = new System.Drawing.Point(8, 22);
-         this.mountedPoints.Name = "mountedPoints";
-         this.mountedPoints.ReadOnly = true;
-         this.mountedPoints.Size = new System.Drawing.Size(366, 22);
-         this.mountedPoints.TabIndex = 0;
-         this.toolTip1.SetToolTip(this.mountedPoints, "Current drive matching pattern to search for the shares and creadentials");
-         // 
-         // progressBar1
-         // 
-         this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-                     | System.Windows.Forms.AnchorStyles.Right)));
-         this.progressBar1.Location = new System.Drawing.Point(13, 366);
-         this.progressBar1.Name = "progressBar1";
-         this.progressBar1.Size = new System.Drawing.Size(218, 23);
-         this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
-         this.progressBar1.TabIndex = 4;
-         // 
-         // dataGridView1
-         // 
-         this.dataGridView1.AllowUserToAddRows = false;
-         this.dataGridView1.AllowUserToDeleteRows = false;
-         this.dataGridView1.AllowUserToOrderColumns = true;
-         dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.ControlLight;
-         this.dataGridView1.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
-         this.dataGridView1.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.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
-         this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
-            this.Source,
-            this.Description,
-            this.Credentials});
-         this.dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
-         this.dataGridView1.Location = new System.Drawing.Point(13, 148);
-         this.dataGridView1.MultiSelect = false;
-         this.dataGridView1.Name = "dataGridView1";
-         this.dataGridView1.ReadOnly = true;
-         this.dataGridView1.RowHeadersVisible = false;
-         this.dataGridView1.ShowEditingIcon = false;
-         this.dataGridView1.Size = new System.Drawing.Size(380, 212);
-         this.dataGridView1.TabIndex = 5;
-         this.toolTip1.SetToolTip(this.dataGridView1, "Any settings seen here will be the one used in the share restore operation");
-         // 
-         // buttonSave
-         // 
-         this.buttonSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-         this.buttonSave.DialogResult = System.Windows.Forms.DialogResult.OK;
-         this.buttonSave.Location = new System.Drawing.Point(318, 366);
-         this.buttonSave.Name = "buttonSave";
-         this.buttonSave.Size = new System.Drawing.Size(75, 23);
-         this.buttonSave.TabIndex = 6;
-         this.buttonSave.Text = "&Save";
-         this.toolTip1.SetToolTip(this.buttonSave, "The Settings above will be stored - ready to be sent to the server");
-         this.buttonSave.UseVisualStyleBackColor = true;
-         this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
-         // 
-         // Source
-         // 
-         this.Source.Frozen = true;
-         this.Source.HeaderText = "Source Path";
-         this.Source.Name = "Source";
-         this.Source.ReadOnly = true;
-         // 
-         // Description
-         // 
-         this.Description.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
-         this.Description.HeaderText = "Name : Description";
-         this.Description.MinimumWidth = 124;
-         this.Description.Name = "Description";
-         this.Description.ReadOnly = true;
-         this.Description.Width = 124;
-         // 
-         // Credentials
-         // 
-         this.Credentials.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
-         this.Credentials.HeaderText = "User : Credentials";
-         this.Credentials.MinimumWidth = 116;
-         this.Credentials.Name = "Credentials";
-         this.Credentials.ReadOnly = true;
-         this.Credentials.Width = 116;
-         // 
-         // CurrentShares
-         // 
-         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
-         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-         this.ClientSize = new System.Drawing.Size(405, 402);
-         this.Controls.Add(this.buttonSave);
-         this.Controls.Add(this.dataGridView1);
-         this.Controls.Add(this.progressBar1);
-         this.Controls.Add(this.groupBox2);
-         this.Controls.Add(this.Store);
-         this.Controls.Add(this.groupBox1);
-         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-         this.MaximizeBox = false;
-         this.MinimizeBox = false;
-         this.MinimumSize = new System.Drawing.Size(413, 429);
-         this.Name = "CurrentShares";
-         this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
-         this.Text = "Current Shares";
-         this.Shown += new System.EventHandler(this.CurrentShares_Shown);
-         this.groupBox1.ResumeLayout(false);
-         this.groupBox2.ResumeLayout(false);
-         this.groupBox2.PerformLayout();
-         ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
-         this.ResumeLayout(false);
-
-      }
-
-      #endregion
-
-      private System.Windows.Forms.GroupBox groupBox1;
-      private System.Windows.Forms.Label label1;
-      private System.Windows.Forms.Button Store;
-      private System.Windows.Forms.GroupBox groupBox2;
-      private System.Windows.Forms.TextBox mountedPoints;
-      private System.Windows.Forms.ProgressBar progressBar1;
-      private System.Windows.Forms.DataGridView dataGridView1;
-      private System.Windows.Forms.Button buttonSave;
-      private System.Windows.Forms.ToolTip toolTip1;
-      private System.Windows.Forms.DataGridViewTextBoxColumn Source;
-      private System.Windows.Forms.DataGridViewTextBoxColumn Description;
-      private System.Windows.Forms.DataGridViewTextBoxColumn Credentials;
-   }
-}
\ No newline at end of file
diff --git a/Liquesce/CurrentShares.cs b/Liquesce/CurrentShares.cs
deleted file mode 100644
index 2439c98..0000000
--- a/Liquesce/CurrentShares.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.ServiceModel;
-using System.Text;
-using System.Windows.Forms;
-using LiquesceFacade;
-
-namespace Liquesce
-{
-   public partial class CurrentShares : Form
-   {
-      private ConfigDetails shareDetails;
-      List<LanManShareDetails> lmsd;
-
-      public CurrentShares()
-      {
-         InitializeComponent();
-      }
-
-      public ConfigDetails ShareDetails
-      {
-         get { return shareDetails; }
-         set { shareDetails = value; }
-      }
-
-      private void CurrentShares_Shown(object sender, EventArgs e)
-      {
-         if (shareDetails == null)
-            Close();
-         else
-         {
-            FindShares();
-         }
-      }
-
-      private void Store_Click(object sender, EventArgs e)
-      {
-         FindShares();
-      }
-
-      private void FindShares()
-      {
-         dataGridView1.Rows.Clear();
-         Enabled = false;
-         UseWaitCursor = true;
-         mountedPoints.Text = shareDetails.VolumeLabel + " (" + shareDetails.DriveLetter + ")";
-         ChannelFactory<ILiquesce> factory = new ChannelFactory<ILiquesce>("LiquesceFacade");
-         ILiquesce remoteIF = factory.CreateChannel();
-         lmsd = remoteIF.GetPossibleShares();
-
-         foreach (string[] row in lmsd.SelectMany(share =>
-                                                  share.UserAccessRules.Select(fsare => new string[]
-                                                                                         {
-                                                                                            share.Path, 
-                                                                                            share.Name + " : " + share.Description, 
-                                                                                            GetAceInformation(fsare)
-                                                                                         })))
-         {
-            dataGridView1.Rows.Add(row);
-         }
-         Enabled = true;
-         UseWaitCursor = false;
-         progressBar1.Style = ProgressBarStyle.Continuous;
-         progressBar1.Value = 0;
-      }
-
-      #region Thread Stuff
-      private void findSharesWorker_DoWork(object sender, DoWorkEventArgs e)
-      {
-         BackgroundWorker worker = sender as BackgroundWorker;
-         if (worker == null)
-            return;
-
-      }
-
-
-      private string GetAceInformation(UserAccessRuleExport fsare)
-      {
-         StringBuilder info = new StringBuilder(fsare.DomainUserIdentity);
-         info.Append(" : ").Append(fsare.AccessMask.ToString());
-         return info.ToString();
-      }
-
-      #endregion
-
-      private void buttonSave_Click(object sender, EventArgs e)
-      {
-         shareDetails.SharesToRestore = lmsd;
-      }
-
-   }
-}
diff --git a/Liquesce/CurrentShares.resx b/Liquesce/CurrentShares.resx
deleted file mode 100644
index f3519d7..0000000
--- a/Liquesce/CurrentShares.resx
+++ /dev/null
@@ -1,430 +0,0 @@
-<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>157, 17</value>
-  </metadata>
-  <metadata name="Source.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <metadata name="Description.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <metadata name="Credentials.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>True</value>
-  </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
-        IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Q3W1NRjv7y634R/eOpgVU3/bFlK/25b
-        TP9/cV3/m5d8/3VzYf9HOy3/Ujom/1g/Kv9rW0n/cW5m/3Ftav+DeHH/jYB4/5CEff+gmJT/vru9/8zM
-        0P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp60XY19b/sa2h/5+d
-        jP9fWU3/QjEh/1c/KP90Y0n/nJh8/4B/av9ORDX/Tjci/2pYQ/+anY7/q7qz/2lrZP9fTkD/cVxJ/25Y
-        Rf9uWEb/oZiT/8TDxf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnq
-        7TzY19fotLGp/7Syof+YloT/ZF5O/19RPv+HfWL/n5yA/5OTfP9oZVb/WVBC/4uLff+zwrj/mqql/15Z
-        T/9SPCn/W0It/1pCLP9gSTX/o5yY/8bFyP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADW1NVKysfE/7Owof+yr5v/qKWN/6Geg/+gnoH/oZ+D/6Sli/+nrJb/qbKi/7C/
-        s/+6zMX/f4qH/1FGOP9WPij/WUAp/1lAKf9uXEz/r6up/8jIzP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAOvq6yjr6uq/zMrKv8C8uL/NyMTSzMnE/7e0p/+4taL/rauS/6Sihv+hn4T/p6WM/7Gx
-        m/+1uqf/tsGx/7nKv/+90sv/c3x3/0k8LP9ZQin/XEUs/15IMP+Cdmr/tLGw/8PCw/8AAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAANDOzjXNy83/sK6w/3Zxb/91amH/r6ig/8bFvf+zsqX/ioh7/2tp
-        XP91c2L/jox2/6WmkP+1u6v/xM/G/8vZ1v/H29r/qsDB/2ZsaP9jW07/i4p+/5yoo/9eYV7/XU5A/2tY
-        Rf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfExTXMysv/3d3h/9TU1v/Gxsf/0tHQ/8C/
-        u/98e3b/VlVQ/4uKef+fnYP/npyB/56gif+psaH/t8e//8fZ2P/V5eb/zOPk/6/GyP+twsL/u9LT/7vS
-        0/9ueHf/aFtP/3VhT/8nEwkSAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAA
-        ACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAI2toZkO9urbK09HQ/+Dg
-        4f/g4OH/z9DQ/4KCgf9XV1X/rauh/7Gvm/+Qjnf/bGtY/2BjVf9yenH/k6Oe/7XNy//K4uH/2Onp/83i
-        4f/A2Nf/tcvJ/4eRi/9gVUL/XUgv/19KL//AXwbhxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48Rh
-        B+PEYQfjxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48Rh
-        B+PGezfp0s/O/9PR0P/f3t//qqqr/1FRU/+ampn/xMO3/6mnkf+ZmYP/h4x9/1RbVf8+REL/aHRz/5Sp
-        qf+1zs3/z+Li/9Dg4P+6zs3/fYaB/1xQP/9fSjH/YUsy/2JMM//BYAfmzGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/Nbg//z5lj/83Jx//Ix8b/dnZ4/19fYf/Kysn/tbSr/8wAN//MZmb/oqed/56s
-        qf9WYGL/MDY5/2d0dv+arK3/tcfH/8fT1f+2xMP/W15Z/09ALv9iTDX/Yk01/2RPOP/BYAfmzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//Pz8v/j4eH/0c3J/9XQyf+yr6r/WVhY/4eGh//Ew8H/zGZm/8wA
-        N//MADf/zAA3/52knv+FkZH/NDo8/0NJSv+FkZD/o7Ct/7rEwv+vubX/ZGdk/0xCNP9ZRzH/YE00/2RP
-        Nv/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/x8O//29jU/9HLwP/Sy77/0su+/9PMwP+gnJP/S0lH/5ya
-        lf+mo53/zGZm/8wAN//MADf/zAA3/8wAN/+Jjov/S09P/zEyM/9scG7/k5eS/6eppP+dn5n/hIV9/3Vz
-        av9qZlz/T0lA/1FDMP/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/u7ez/ycS//9DIt//Qx7f/0Me3/87F
-        tf+WkYb/RkNB/5+bkv+XlY3/zGZm/8wAN//MADf/zAA3/8wAN/+Agn7/UFBP/zAwMf9lZGH/jYuF/5mX
-        kf+OioP/fXlw/3h0af94c2n/XVlS/1BFNv/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/w8O//09DM/8K5
-        qv/Hvqz/y8Gu/83Dr/+akoT/SEVB/52YjP+dnpL/zGZm/8wAN//MADf/zAA3/8xmZv+Jk4//V1ta/0FC
-        Q/+BhIL/p6qn/6qtqf+ZnJb/hoiA/4B/dP99eGv/bGRV/3FkUv/BYAfmzGYA//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/8/Pz/+bl5v/Y1dT/x8G5/8vBrf+mn4//U1FM/46Khf+qqJ7/VFZP/8wAN/83OjL/Oj02/2t0
-        cP+LmJj/VFpc/2Jnaf+stLX/xc7O/7vGxP+ptbH/bHBq/2BWQ/9rWj//a1g+/2tYPv/BYAfmzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/4+Db/8W8rf+5sqX/bGhk/25tbf/Ozcz/h4eH/ygn
-        Jv8VFRT/PEA9/4SSkP95hYf/XF9j/5ujpv/O2tz/0t/g/8LS0v+uv7//YmVf/1tNOv9uXEL/bl1D/29f
-        Rv/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/y8vH/39zY/8zFuf/TzcL/m5iS/1RU
-        VP++vr7/3NzZ/7Sypf+WlYH/mZuK/4iNhv98f3//rbOz/9vl5v/i7u//1ufn/8Xb2v+0ysn/cHh0/11X
-        SP9zaVL/eW9W/31yXP/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//Ly8f/g3dn/083E/9jS
-        yf/a1s//xsTA/3l5eP93d3n/5OTl/+fm4v/b2dH/zczD/8bGv//U1tD/4+jl/+fv7v/h7u7/z+Xl/8Tf
-        3v/C29r/sMXE/3N9ev9mZVj/fnln/4aBbf/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//X19P/09PP/8vLx/+7u7f/q6un/5+fm/9rZ
-        1v/OyML/19LM/9PQzP/Qz83/2tnb/8PExv99fYD/g4KF/9fX2f/r6ur/6efl/+bl4f/l5uT/5ejn/9zk
-        5P/L3dv/wdra/7jR0v+71dX/wdvc/7jQ0v9rd3b/e392/5OViP/BYAfmzGYA//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//T08//y8vH/7+/u/+rq6f/l5eT/19fW/8fH
-        xv+zs7L/oaGg/6Kgn//JxsP/w8K+/6+zrv+ts6//yszN/9zc3//FxMX/j46N/4GBgP+uraz/2NjW/+Tk
-        4f/e39n/z9LK/7/Kwf+7zsf/prq4/5CfnP+hsa3/tszK/6q/wP+BjIv/kJiR/56mnf/BYAfmzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9fX0//Pz8v/u7u3/6Ojn/+Dg3//U1NP/vLy7/5qamv98fHz/ampq/359
-        ff+dm5v/vLa2/7Kurv+qjW3/l5SU/5qamP/Lysr/v7++/72+vP/ExMP/19bW/9XV1P/U1M//x8a7/7Ox
-        of+fnYj/mpiA/6Sjh/+oqI3/q6+Y/7G6qf+2xbn/e4eC/4CLh/+puLH/rLu1/6q5tP+9xcH/yryr/MnM
-        ycTBYAfmzGYA//b29f/29vX/9fX0//Ly8f/t7ez/4+Pi/9vb2v/Hx8b/o6Oi/39/fv9mZmb/eXh4/5uZ
-        mf+7tbX/qqam/5GNjf9/fX3/dHR0/3Nzc/91dXX/hI+H/118aP9JYVL/W1tb/4GBgf+mpqb/3dzd/9XV
-        1P/Ozcf/vr2z/7Kwn/+rqZL/o6GF/6Cegf+ioYf/pqmT/6yzof+zvrH/go2H/3V/fP+ZpKD/o7Cq/6Ow
-        qv+4wL3/w4JC9AcDARTAXwfnzGYA//X19P/x8fD/7Ozr/97e3f++vr3/m5ua/3Z2dv91dHT/mpaW/7Sv
-        r/+joJ//j4uL/3Vycv9hYmD/XV1d/19fX/9hYWH/YmFh/2JiYv9jY2P/M8xm/wCZAP8AZgD/QEBA/3d3
-        dv+ioqL/1dTV/9PSz/+zsq3/hoeB/46Qh/+eno3/oqCF/46Mc/97fG3/jI+F/6Komv+uuKj/nqqg/2x0
-        cP96f3v/k5mU/5OZlP+Znpn/u4ZS9mRiYSHAXwfozGYA//T08//v7+7/xMTE/5eXl/+TkpP/rqmp/7m0
-        tP+alJT/cG1t/09PT/9LS0v/SUlJ/0hISP9HR0f/R0dH/0dGRv9HR0f/R0dH/0hIR/9JSEn/M8xm/wCZ
-        AP8AZgD/OTk5/3Jycv+enp7/0M/N/8XEv/+Ukoz/c3Jr/4SDe/+Rj4D/oZ6E/4B+Z/9mZVv/fHt0/42O
-        g/+jqZr/rLeq/3R6df+BgX7/oqKd/6Cgm/+fnpn/zczL/728vFjAXwfozGYA//Dw7/+SkpL/uLS0/8C4
-        uP+GgID/VlRU/z4+Pv84ODj/NDQ0/zExMf8tLSz/Kior/ykpKv8pKSn/Kikp/yopKv8rKyv/LCws/y0t
-        Lf8vLy//M8xm/wCZAP8AZgD/R0ZG/318fP+urq//zMvM/6mnpv+Hg4L/hIB9/4yIhP+alor/oJ2E/3l3
-        ZP9eWlL/c2xl/3ZvZ/+GhHn/iYuC/4B+ev+Mh4T/lY+L/5WPjP+ppKP/2M7I/sC+wFDAXwfozGYA/8XD
-        wv+4tbX/sq2t/3x8fP9lZ2X/T09P/zAwMP8bGhr/FBUV/xMTE/8PEA//Dw8P/xEQEP8SEhL/ExMT/xUV
-        Ff8XFxf/GRkZ/xwbHP8dHh7/bJt7/zuXW/8AZgD/bGpr/5CPj/+/v7//pqam/5OTk/+FhYX/f39//6qq
-        q//V1M3/p6SP/4J+bv90bmf/hn52/4J6cv9/dm7/qaSg/+Hg3//y8fH/8vLx//Pz8v/OoIr/zn0w8gcD
-        ARTAXwfozGYA/8C6uv+Ylpb/gICA/3t7e/95eXj/a2tq/0dHRv8lJCT/GxkZ/xQUFP8PEA//Dg4O/w4O
-        Dv8ODg7/Dg4O/w4ODv8ODg7/EBAQ/xISEv8TExP/ExMT/3SPfP96g3v/i4mK/6urq//Y2Nj/yMjI/7a2
-        tv+ioqL/kJCQ/46Oj/+0s7L/1dPP/8vKxv/Mysr/0c/P/9LPz//T0ND/2tfX/+7u7f/19fT/9vb1//b2
-        9f+ZMwD/xGEC7wcDARTAXwfozGYA/8fAwP+Uk5P/e3t7/2pqav9oaGj/ZmZm/2VjZf9ZWFj/QUFB/ygo
-        KP8eHR3/ExMT/w8PDv8ODg//Dg8O/w4ODv8ODg7/Dg4O/w8PD/8aGhr/Dw8P/5eal/+TlJP/oaCh/8PD
-        w//c3Nz/29vb/9PT0//FxcX/s7Oz/56env+Ojo7/hYWF/4SEhP+BgYH/bW1t/3Fxcf+Ojo3/uLi3/9ra
-        2f/s7Ov/9PTz//b29f+ZMwD/xGEC7wcDARTAXwfozGYA/8jAwP+Dg4P/amlp/1dXV/9WVlb/VVVV/1VV
-        Vf9VVFT/VVRU/1BRT/9FRET/NTY2/ycmKP8aGhr/FxYW/y4tLP9JR0j/W1la/2FgYP9kZGT/n5+f/6am
-        pv+trq7/tra2/8rKy//f3+H/3Nzd/+fn6v/a2tr/0NDQ/8DAwP+tra3/mpqa/4yMjP+Ghob/g4OD/3Z2
-        dv9ubm3/fHx8/6WlpP/Pz87/6Ojo//Ly8f+ZMwD/xGEC7wcDARTAXwfozGYA/8jAwP+BgYH/W1tb/0tL
-        Sv9LS0v/S0tL/0tLS/9LS0v/S0pL/1JQUP9bWlr/ZGFh/2ZjZP9wbW3/fXp6/358fP+Ih4j/nJ2d/66v
-        r//CwsP/vLy9/76+v/+7vLz/tra2/7W1tv+5ubn/wMDA/8zMzP/W1tb/2tra/9fX1//LzMz/u7u7/6io
-        qP+Wlpb/i4uL/4iIiP+BgYH/c3Ny/3d3d/+goKD/0tLR/+jo6P+ZMwD/xGEC7wcDARTAXwfozGYA/8jA
-        wP+CgoL/bWxs/09PT/9ZWFj/ZmZm/3FwcP+AfoD/hoWE/4SBgf98fHv/goKC/42Ojv+ysrT/w8TF/9nb
-        3P/j5OX/3N3e/9PV1//P0NH/y8rK/8jGxv/DwcH/vby7/7m4t/+3trX/trW0/7e3tv++vr3/ysnJ/9TV
-        1f/Z2dn/1dXV/8jIyP+2trb/oKCg/5GRkf+Li4v/ioqK/39/f/+GhoX/vr69/9/f3v+ZMwD/xGEC7wcD
-        ARTAXwfozGYA/8jAwP+kpKT/lpaW/5KSkv+MjIz/lZWW/5mZmv+xsrL/yMnK/8/Q0f/j5eb/8fP0//Hz
-        9P/p7e//5OXn/9nc3v/T09T/0M/P/9LPzv/V0s//4tzZ/+Hc2P/c19P/083J/8jDv/+/u7f/ubSy/7Ow
-        rv+urKv/r62s/7a2tf/ExMT/0tLS/9jY2P/S0tL/wsLC/66urv+cnJz/lpaW/5KSkv+Ojo7/u7u6/+Li
-        4f+ZMwD/xGEC7wgEAhTEYQnwzGYA/9/f3//BwcD/rq6u/7Kysv/R0tP/8fHx/+jp7P/y9vf/9/n7//b5
-        +//z9Pj/7vDy/+bo7P/Y2dz/x8XF/8fCwP/Ry8f/29fT/+Ld2//k4d3/4N3b/9za2P/X1dT/09DP/83M
-        yv/Jx8T/w8C//767uv+3tLL/q6il/56dmf+amJf/paOj/769vf/Y2dn/2tra/8/Pz//AwMD/sbGx/6am
-        pv+bm5r/xMTD/+/v7v+ZMwD/xWID9AkEAhTJYwv3zGYA//b29f/29vX/5eXk/8jIyP+6urn/vb69/8LD
-        w//V19j/4uTm/+rr7f/n6er/3t3d/+He3f/q6Of/8e/v//Hx8f/v7+//6urr/+fn5//k5OT/4OHh/9zd
-        3f/Z2dn/1tbW/9PT0//Q0dD/zs7O/8zMzP/Kysr/xsbG/7++vf+vrq3/mpmY/5STkv+4uLj/1NTV/9zc
-        3P/Z2dn/0NDQ/7+/v/+mpqX/ysrJ//X19P+ZMwD/zGYA/wkEAhTJYwv3zGYA//b29f/29vX/9vb1//b2
-        9f/t7ez/2dnY/76+vv+8vbz/wcHC/8vMzv/Y2dr/5eXm//Hx8v/4+Pj/+Pn4//j4+P/39vb/9PT0//Ly
-        8v/v7+//7Ozs/+np6f/m5ub/4uLi/9/f3//b3Nv/2NfX/9XV1f/S0tL/z8/P/83Nzf/Ky8r/wMDA/6+u
-        r/+ysrP/v7/A/8vLy//W1tb/3N3d/8vLy/+srKv/0tLR//b29f+ZMwD/zGYA/wkEAhTIYwv1zGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//T08//o6Of/zMzL/7m5uP/DxMT/xsfH/8/Pz//e3t7/7u7u//f3
-        9//6+vr/+fn5//n5+f/39/f/9vb2//T09P/x8vL/7+/v/+zr6//o5+f/5OPj/+Dg3//c3dz/2NjY/9TU
-        1f/Q0NH/y8vL/8TFxv+/wMH/vr+//72+vv+/v7//x8fH/72/v/+2uLj/5+fm//b29f+ZMwD/zGYA/wkE
-        AhTHYwr0zGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9fX0//Ly8f/g4N//yMjH/8PD
-        wv/IyMj/x8fH/87Pz//f39//8/T1//f4+f/z9PT/7+/w/+zs7P/o6Oj/5OXl/+fo6P/r7Oz/5+fn/+Lj
-        5P/e3+D/29zd/9bX2P/P0NH/x8fI/76+v/+4ubn/tba2/7Kysv+zs7P/u7u7/8nKyv/Y2dj/9PTz//b2
-        9f+ZMwD/zGYA/wkEAhTHYgryzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/19fT/8vLx/+rq6f/a2tn/yMjH/8LCwf/Gxsb/wcHA/9DR0v/S09X/tLW3/4yOj/93eHn/f4GB/6Ol
-        pv/X2dr/3t/h/9HS1P/HyMn/wMHB/7q6u/+2trb/tre2/76+vf/Kysr/19fW/87Ozf/Kysn/0dHQ/97e
-        3f/s7Ov/9vb1//b29f+ZMwD/zGYA/wkEAhTHYgryzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/7+/v/+jo5//c3Nv/4ODf/8nJyf+7u7r/t7i4/7a3
-        t/+2trb/trW1/7W1tf+1trb/tLS0/7a2tv+/wMD/zM3M/9PT0v/U1NT/1tbV/9vb2//j4+L/6urp/+/v
-        7v/x8fD/8vLx//T08//29vX/9vb1//b29f+ZMwD/zGYA/wkEAhTHYgryzGYA//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/8fHw/+Xl
-        5P/T09L/yMjH/72+vf+3t7b/urq5/8HBwP/IyMj/2dnY/9zc2//h4eD/5+fm/+3t7P/y8vH/9PTz//X1
-        9P/19fT/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f+ZMwD/zGYA/wkEAhTHYgryzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/x8fD/6urp/+Hh4P/e3t3/4ODf/+Tk4//q6un/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f+ZMwD/zGYA/wkE
-        AhTHYgryzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f+ZMwD/zGYA/wkEAhTGYgryzGYA/9RzQ//Uc0P/1HND/9RzQ//Uc0P/1HND/9RzQv/Uc0L/1HNC/9Rz
-        Qv/Uc0L/1HNC/9RzQv/Uc0L/1HNC/9RzQv/Uc0L/1HJB/9RyQf/UckH/1HJB/9RyQf/UckH/1HJB/9Ry
-        Qf/UckH/1HJB/9RyQf/UckH/1HJB/9RyQf/UckH/1HJB/9RyQf/UckH/1HJB/9RyQf/TckH/03JB/9Ny
-        Qf/TcUD/03A//9NwP/+ZMwD/zGYA/wkEAhTHYgryzGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP+ZMwD/zGYA/wkEAhTJYwvzmTMA/5kzAP+ZMwD/mTMA/5kz
-        AP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kz
-        AP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kz
-        AP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/zGYA/wsFAhTKZAv02IBU89iA
-        VPHXf1Pv135S7dd9UOrWe07n1nlL5NV4SuHVdkfd1HVF2tRzQtbTcUDS0m48z9JtOsvRajbI0Gg0xNBn
-        MsHPZC+/zmMuvMtiLrrJYS25yGEtt8dgLbbGYC21xmAttcVfLLTGYC21xmAttcdgLbbIYS23yWEtucti
-        LrvOYy69z2QvyNFrOMzQZzP0v1wr8MpiLunPZC/nxF8s8dFqNuzSbz3swV0r+dFqN/HSbjz1zGYA/ygT
-        CQzGYgTRyGMF1chjBtXIYwXVyGMF1chjBdXIYwXVyGMF1MdjBdTHYwXUx2MF1MdjBdPHYwXTx2MF08dj
-        BdPHYwXTxmIF08ZiBdLGYgXSxmIF0sZiBNLGYgTSxmIE0sZiBNLGYgTSxmIE0sZiBNLGYgTSxmIE0sZi
-        BNLGYgTSxmIE0sZiBNLGYgXSxmIF08ZjBdPGYgXVxmIF1MZiBdTHYwXUx2MF1cdjBdXHYwXVxmIF1cdj
-        BdXGYgXVxGIDzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////AAADc/f///8AAANz9////wAAA3P3////gAADc/f//
-        /gAAANz9///+AAAA3P3///4AAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA
-        3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAA
-        AAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA
-        3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAA
-        AAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA
-        3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAAdz9////////3P0oAAAAIAAAAEAA
-        AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6uwVzcvJs5yYj+9fUkf/Y08+/4Z6
-        Yv+EgWz/Szws/1lCLf99eGr/dXVv/3ttY/+EdGn/m5GL/8LAwv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjp7CrLycb1r6ye/3Zw
-        YP9bTDn/ioFm/5KReP9cU0T/cWlY/6ezqf92eXH/WkQy/2FJNf95Z1n/uba2/wAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvq6wnc29tAxcLAQNDN
-        y6W7uK7/sK2Y/6Shh/+hn4P/pqaM/6yyn/+xvrH/pbWv/11YTf9YQCj/WkIq/4h8cv+/vb//AAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2tjZIM3L
-        zOqcmZfqn5eQ9b67sv+qqJj/hYNy/4mHcv+iooz/uL+w/8PQyf+1yMb/cHVw/2hdTP+DgXP/b2pj/4N3
-        a/8VCgQIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA
-        AAyGhIQqzcvL89jY2v/Pz8//t7e1/3Bva/+Linv/lZN7/4qLdv+dqJz/uczJ/9Dk5P/A1tf/tcvL/67C
-        wf9nZFr/aldE/4lEBp6CQASjgkAEo4JABKOCQASjgkAEo4JABKOCQASjgkAEo4JABKOCQASjgkAEo4JA
-        BKOCQASjgkAEo5pXG6rIpYXp1dPT/9HR0v99fX7/lpaR/7Gvnf+Ojnr/ZGle/1xlYf+RpKP/w9nZ/9Dh
-        4f+tv73/dnht/19MNP9gSjH/xGIE7tWGNv/allH/2pZR/9qWUf/allH/2pZR/9qWUf/allH/2pZR/9qW
-        Uf/allH/2pZR/9qWUf/allH/2ZVR/9KbZf/PwLH/pKOi/2xsbf/EuLX/xjNW/8JSYv+jlpf/VF1f/01W
-        WP+crKz/vMnJ/5egnf9TSz7/X0s0/2NONv/EYgTu6Maj//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1/+3s6//e29X/1dDH/9PMwv+JhoD/fXx5/7mVkv/MIkb/zAA3/8Ek
-        Tf9wd3b/Oz4//4CHhP+mq6f/lZiT/21qYf9fVUf/Vkg1/8RiBO7oxqP/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/4+Hf/8vEuP/NxLP/zcSz/3x3bv+BfXX/qoeB/8wi
-        Rv/MADf/zBZB/3J2c/8/P0D/e3t4/5ublv+LioL/fHlv/3FsYv9dU0X/xGIE7ujGo//29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/w7+7/3tzY/8/JwP/KwbD/hoB1/3x4
-        cv+XjIP/sR5B/2knNP+AV1r/eIKB/1ZaXP+nrq3/t7+9/5Sblf9tal3/b2FL/2xcRf/EYgTu6Maj//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/7ezq/9DJ
-        vv+qpJr/bGtp/7y7u/9wb2v/SUlC/3d/ev95gIL/naSm/9Th4v/I2dn/l6Wj/19ZS/9wYUj/c2RM/8Ri
-        BO7oxqP/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//T0
-        8//g3dn/1M/G/83Jwv+FhIL/qqqr/9nY1P/BwLT/tLWt/7/Cv//d5OP/3Ovr/8jg3/+xx8b/e4R+/3Br
-        Wf+AeWX/xGIE7ujGo//29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9fX0//T08//y8vH/7e3s/+Pj
-        4v/V1dT/ysnH/83JxP/KyMP/ycrJ/87O0f+Qj5H/qaiq/9rZ2P/k4+D/4eLf/9bd2v/B1dL/r8XE/7bN
-        zP+2zs//d4F9/4+Uif/EYgTu6Maj//b29f/29vX/9fX0//T08//v7+7/6eno/9ra2f+/v7//n5+e/56d
-        nf+6uLf/vbm5/6aZiv+bmpn/x8XE/7u8uf/DxcP/1dXW/8bFwf+op53/p6aW/7W0ov+5uqf/tr2u/6i4
-        r/+Gk5D/qbmz/6u8uf+tsar+ubqy5MRhBO/nxaP/8/Py/+3t7P/X19b/v7++/6enpv+VlJP/fHt6/4mH
-        h/+YlZX/hYOD/3Jxcf9tbW3/bYBz/0yPV/87XT//b29u/7a2tv/W1dX/vLu1/6enmv+lo4z/nJp//5eY
-        g/+kqpn/pK+j/3qEf/+TnZj/naii/7OkjfxZQi1ixGEE7+bEov/l5eT/urq5/6Ohov+koaD/iISE/3Vy
-        cv9lZGT/WllZ/09PT/9OTk7/T09P/1BQT/9Helj/Eaoi/xNXE/9gYGD/sK+v/8zLyP+SkIr/goJ6/5mX
-        hP+OjHP/c3Np/42Phf+mr6H/g4uE/4iKhv+cnpn/q6Wc/qyln4LEYQTw2riV/6akpP+tqKj/bWtq/0JB
-        Qf8sLCz/Jycn/yIiIv8hICH/ISEh/yIiIv8kJCT/JiYm/zJaP/8kpDj/G18b/3Nycv+3t7j/q6qq/4WC
-        gf+PjIr/qaaY/4iGcv9sZl7/eXJq/4mGfP+cmpb/sKyp/7Swrf+/qJj9nZCHe8RhBPDFoH3/nJqa/4KB
-        gf9sbWz/SkpK/x4dHf8VFRX/Dg8O/w4ODv8PDw//EBAQ/xEREf8UFBT/HyQh/1B2Xf9he2H/lpaW/8nJ
-        yf+wsLD/k5OT/5OTk//Bv7r/ubau/7Guq/+3s7D/vbi2/9/d3P/09PP/9PTz/7RdJPpHJQZdxGEE8Mii
-        gP+GhYX/aWlp/2FhYf9fX1//UlFR/zs7O/8mJib/GRkZ/xEREv8WFhX/IyMj/ykpKf82Njb/fX59/5+g
-        oP+7u7v/3Nzd/9ra2//Gxsb/r6+v/5SUlP+IiIj/fX19/3Nzc/+Ojo3/vLy7/+bm5v/z8/L/p0IA+kYi
-        AV3EYQTwyaKA/3Z2dv9UVFT/Tk5O/05OTv9OTU7/UE9P/1NSUv9SUFD/VVNT/2BeXv95eHn/j4+Q/6en
-        qP+0tLX/tra2/7q6uv/Gxsf/0dHR/9fX1//R0dH/u7u7/6SkpP+NjY3/hISE/3l5eP+AgID/vb29/+Xl
-        5P+nQgD6RiIBXcRhBPDJooD/h4aG/2xsbP9tbW3/e3t7/5STlP+cm5v/oaGh/6utrf/HyMr/1dfY/9vc
-        3f/U1NX/0dDP/9HOzf/JxsT/wL27/7i2tP+2tLP/u7q5/8fHxv/S0tL/z8/P/7i4uP+goKD/j4+P/4iI
-        iP+ampn/1NTT/6dCAPpGIgFdxWIF89Ovjf+xsbH/pqam/8LCw//Pz9H/4OLj/+jq7P/u7/L/6+3w/9na
-        3P/OzMz/08/N/9rX1f/f3Nn/3tvY/9bT0f/Nysj/w8C+/7y4t/+xrqz/qKak/6uqqv/Av7//1NXV/8jI
-        yP+wsLD/oqKi/6SkpP/c3Nv/p0IA+0cjAl7KZAf66Maj//Ly8f/d3d3/ycnI/8LDwv/Q0dL/3N3f/+Hi
-        4//k4uL/8O/u//Pz8v/w8PD/6+vr/+bm5v/h4uL/3Nzc/9jY2P/S09L/z8/P/8vLy//FxcT/srGw/6Cf
-        nv+9vb7/09PT/9bW1v/IyMj/tLSz/+fn5v+qRAD/SiQBYslkB/noxqP/9vb1//b29f/w8O//5eXk/9PT
-        0//CwsL/zM3N/9fX1//q6ur/9fX1//j4+P/29vb/8/Pz//Hx8f/s7Oz/6Ojo/+Lh4f/d3dz/19fX/9LS
-        0//LzMz/wMDB/7u8vf/AwcH/ycnJ/8XGxv/BwsL/7u7t/6pEAP9KJAFiyGMG9+jGo//29vX/9vb1//b2
-        9f/29vX/9fX0//T08//h4eD/0tLR/8vLy//Jycn/2tra/+fo6f/j5OX/0dHS/8LDw//Lzc3/5OXl/97f
-        4P/U1db/zs/Q/8TFxv+/v7//vr+//729vP+9vbz/y8vL/+bm5f/19fT/qkQA/0okAWLIYwb26Maj//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//X19P/y8vH/6Ojn/93d3P/V1dT/zs/O/76/v/+sra7/oaKi/6ur
-        q//AwcL/wMDB/8PExP/Jysn/ysrK/8/Pzv/d3dz/4+Pi/+Xl5P/q6un/8/Py//b29f+qRAD/SiQBYshj
-        BvboxqP/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//T08//t7ez/2dnY/8zM
-        y//ExMP/ysrJ/9jY1//k5OP/6eno/+7u7f/z8/L/9fX0//X19P/29vX/9vb1//b29f/29vX/9vb1/6pE
-        AP9KJAFiyGMG9ujGo//29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/z8/L/8PDv/+7u7f/v7+7/8/Py//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/qkQA/0okAWLIYwb2z2sd/9FuLP/Rbiz/0W4s/9FuLP/Rbiz/0W4s/9FuLP/Rbiz/0W4s/9Fu
-        LP/Rbiv/0W4r/9FuK//Rbiv/0W4r/9FuK//Rbiv/0W4r/9FuK//Rbiv/0W4r/9FuK//Rbiv/0W4r/9Bu
-        K//Qbiv/0G0q/9BsKv+qRAD/SiQBYr5YB/eqRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pE
-        AP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pE
-        AP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP9KJQFizGkZ6dJ2OejSdTjm0nQ35NFyNeDQcTPd0G8w2c9u
-        LtbOayvSzmkoz81nJcvMZSPHy2MgxcpiIMLHYR/BxmAfwMZgH7/FYB6+xmAfv8ZgH7/HYR/AyGEfwsti
-        IMfMZiXNyGIh6cZgH+TJYiDjymUj5cpmJufKZCPpzGgc7HU6BVXGYgRGyGMFR8hjBUfIYwVHyGMFR8dj
-        BUfHYwVHx2MFRsdjBUbHYwVGxmIFRsZiBUbGYgVGxmIERsZiBEbGYgRGxmIERsZiBEbGYgRGxmIERsZi
-        BEbGYgRGxmIFRsZiBUbGYgVHxmIFR8djBUfHYwVHxmIFR8ZiBUfFYgRGxGIDF///gAD//4AA//4AAP/+
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABgA
-        AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OBtpKGX8ltOQf9uW0b/i4hw/008Kv9xY1H/fYB5/3ho
-        XP+Dc2f/u7i5/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AADd3N1cubar/5WSfv+Jgmn/nZyC/4SEdP+qtqv/cnRs/1c/Kf9gSTX/uLW1/wAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3dzcF83LzN+el5Pkvrqy/6imlf+Jh3L/oqKL/7nB
-        sv/C1M7/c3lz/2hbSP92cWb/j4Z+/xMJBA0AAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAA
-        ABIAAAASZmRjJ87MzPLW1tf/uLi3/3V0b/+amYP/goJt/5mlm//G29r/yN3d/7fNzf+EjIX/ZlM//8Rh
-        BerIYwPxyGMD8chjA/HIYwPxyGMD8chjA/HIYwPxyGMD8chjA/HIYwPxyGMD8c2UXfrRz8//dHR1/7e2
-        sf+2aWz/ho6G/0tTVP+Spab/xtfX/5Kdmv9bSTT/Ykw0/8ZjA/L29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/09PP/5ePe/9bRyf++ubH/cXBu/8CMiv/MADf/wClQ/2Nqaf9ZX17/pa2p/42R
-        i/9hWEr/WUo2/8ZjA/L29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/y8vH/y8W7/8zD
-        sv+yqpv/cm5o/7N/ev/MADf/zBlC/2xwbf9VVlX/nZ6Z/4qJgv97d2z/YllL/8ZjA/L29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/8fHw/93a1v+7s6P/bmxo/5SUkP9QHSj/WWBc/211
-        d/+dpqj/xdHR/4mSjv9lVj//bFtB/8ZjA/L29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9fX0/+He2f/UzsT/i4qH/729vf/Dwbb/ra6k/7i8uf/h7Oz/y+Hh/6W4tv9qaFv/fnZh/8Zj
-        A/L29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/8fHw/+jo5//U1NP/wcC+/8zIw/+/wb3/0NHT/5WU
-        lf+8u7v/4uLf/93f2//I1tH/q8HA/7TLyv+TpKT/j5SL/8ZjA/L29vX/9PTz/+7u7f/g4N//urq5/5ub
-        m/+bmZn/iIaG/5OQkP+RiID/hI6G/4uRjf+qqqn/19fW/8nJwf+rqZb/oJ6D/6aoj/+xvK3/fIeD/6Sx
-        rP+wu7f/l4NtssZiA/Py8vH/ycnI/6alpP+PjIz/g4CA/3Fvb/9ZWFj/UlJS/1RUVP9VVVX/GbIz/x5R
-        Hv+Kior/z87M/5CPif+QkIP/lJJ4/3p6cP+gpZf/ipOL/4yOiv+anZj/qpyOnMZiA/S/vr7/qaWl/2Ri
-        Yv8wMDD/IyMj/x0dHf8dHR3/Hx4e/yEhIf8lJSX/NqVP/yxfLP+enp7/q6qq/4OBgP+pp6H/kI15/3Js
-        Zf9/eHD/pKOe/8G+vP+/sar/m4NulcZiA/SsqKj/eHh4/2xsbP9KSUn/JiUl/xMTE/8ODg7/Dg4O/w4O
-        Dv8TExP/S1JN/46Qjv/IyMj/y8vL/6qqqv+bm5v/qqmn/6Khof+pp6f/1tXV//Ly8f/HlHr/ZTIBgsZi
-        A/SloaH/WVlZ/1BQUP9QT0//UE9P/05NTf9FRET/UE5O/3Jxcf+NjY3/r6+w/7W1tf/Fxcb/09PU/9bW
-        1v/DxMT/oqKi/4qKiv97e3v/goKC/8rKyf/DkHb/ZTIBgsZiA/Stqan/eXh4/3h3eP+Ojo//qKeo/7S1
-        tf/GyMn/1tjZ/9jY2f/S0dH/1dLQ/8vIxv+9u7j/trSy/7m4t//Jysn/0dHR/7q6uv+ZmZn/jIyM/6Oj
-        ov+8iW//ZTIBgslkBfnj4+L/w8PD/87Ozv/c3t//7vDy/+nq7P/i4eP/3NnZ/+He3f/k4uD/3t3c/9bV
-        1P/Ozcz/xsXE/7y7uf+pqKb/pKOi/8/P0P/R0dH/ubm5/7Ozsv/Fknj/aDQBh8pkBfr29vX/9vb1/+zs
-        6//V1dX/xMTE/9HS0v/l5eX/9fX1//f39//09PT/7+/v/+rq6v/j4+P/3Nvb/9XV1f/Oz8//v7/A/7u8
-        vP/Hx8f/ysvL/8bHxv/HlHr/ajUBislkBfn29vX/9vb1//b29f/29vX/9PTz/+Pj4v/T09P/x8jH/9bW
-        1v/j5OX/xsfI/7Cxsf/T1NX/3t7g/9DR0f/Fxcb/vr6+/8PEw/+/v77/zM3M/+vr6v/HlHr/ajUBislk
-        Bfj29vX/9vb1//b29f/29vX/9vb1//b29f/19fT/8PDw/+jo5//Pz87/vL28/7e3tv+8vbz/x8fH/9TV
-        1P/h4eD/5ubl/+7u7f/z8/L/9PTz//b29f/HlHr/ajUBislkBfj29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/09PP/7e3s/+rq6f/u7u3/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/HlHr/ajUBislkBfjQbCH/0Gwh/9BsIf/QbCH/0Gwh/9BsIf/QbCH/0Gwh/9BsIP/QbCD/0Gwg/9Bs
-        IP/QbCD/0Gwg/9BsIP/QbCD/0Gwg/9BsIP/PbCD/z2wg/89rH/+0Tw//ajUBisFeGva4WSn4uFgo9bdW
-        JvK3VSTvtlMh7LVRH+i1TxzktE0Z4bNLF96xShbcsEkW269JFtqvSRbar0kW2rBKFtyyShfetE0Z5LBK
-        F/iySxf0sUsY97FMGvm1Txz5cjkCiMdiBGrIYwVqyGMFashjBWrHYwVqx2MFasdjBWrHYwVqxmIFacZi
-        BWnGYgRpxmIEacZiBGnGYgRpxmIEacZiBGnGYgRpxmIFasZiBWrGYgVqx2MFasZiBWrGYgVqxGIDM//4
-        AEH/+ABB/+AAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA
-        AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrq7BC5tq/lZVdI/4mD
-        a/9cTz3/hIZ9/25cTf+knJf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3c3Aq8ubmVurav5qGf
-        iv+dnIP/tsCy/4qTjf9nWEX/joeA/2czBFVhMANXYTADV2EwA1dhMANXYTADV2EwA1d/VC1h0Me/97W1
-        tf+Rj4X/hIVy/5Gfmv/J3d3/obGu/2RUQf/RhDj36MWj/+jFo//oxaP/6MWj/+jFo//oxaP/4LyY/9K+
-        qP+GhIL/xGh5/71DX/9TWlv/n6qo/3t7dP9eTTn/1pRU9/X19f/19fX/9fX1//X19f/19fX/9fX1/9/c
-        1//NxLb/gHty/69VY/+gJUH/YGRk/52gnv+Cgnn/al9O/9aUVPf19fX/9fX1//X19f/19fX/9fX1//X1
-        9f/19fT/3NjS/5qXkv+sq6n/jY+H/6yzs//Q4eH/iZKN/3VqVP/WlFT39fX1//X19P/x8fD/4eHg/8jI
-        yP/S0ND/uLSv/8bEwf/Mzc3/qqmm/8fGvP/JzsP/p7m1/7DEwv+boJn41ZNT9+Dg3/+3trX/joyM/3Fw
-        b/9vbW3/YF9f/0SNUf9HYUj/wsHA/56dlf+amID/j5GC/5Kbkv+Vm5b/mYx9t8mGR/ecmpr/WVlY/yIh
-        If8YGBj/GBgY/xwcHP8xZj3/YXhh/7e2t/+OjYz/q6ic/5OOif+wran/09HP/5ZvUrTGgUL3bm5u/1dX
-        V/9LSkr/OTg4/zc2Nv9VVVX/hISE/7Kzs//T09T/x8fH/5+fn/+AgID/kZGQ/9/f3v92MgGryYVG+JKS
-        kv+enp//vr6//8nKzP/R0dL/19bV/9jV0//LyMb/u7m3/7e1tP/Dw8P/vb29/5qamv+8vLv/dzIBrNiV
-        Vfzv7+7/2NjY/9DR0f/a2tr/8PDw//Ly8v/r6+v/4uLi/9jY2P/Ozs7/t7e3/8PDxP/Ly8v/09PS/3o0
-        ALHYlFX79fX1//X19f/19fT/5ubl/9bW1v/Z2dn/yMjJ/7a3t//R0dL/zMzN/8fHx//Pz8//1tbV//Hx
-        8P96NACx2JRV+/X19f/19fX/9fX1//X19f/19fX/8/Py/+Li4f/b29r/6eno//Hx8P/19fT/9fX0//X1
-        9f/19fX/ejQAscBaCvu9WRb/vVkW/71ZFv+9WRb/vVkW/71ZFf+9WRX/vVkV/71ZFf+9WRX/vVkV/71Z
-        Ff+9WRX/vVgV/3o0ALHNbCCXz3Arls5uKJPNaySPzGggi8tlHIjJYhmFx2EYg8VgGILGYBiCx2EYhMpk
-        G4jHYRmWyWMalsllHZipVQ9n/wCsQf4ArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA
-        rEEAAKxBAACsQQAArEEAAKxBAACsQQ==
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/Liquesce/DragDropItem.cs b/Liquesce/DragDropItem.cs
index 2eb5d0c..6ad2962 100644
--- a/Liquesce/DragDropItem.cs
+++ b/Liquesce/DragDropItem.cs
@@ -1,4 +1,29 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="DragDropItem.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+using System;
 
 namespace Liquesce
 {
@@ -11,14 +36,18 @@ public enum SourceType
          Drive,
          Merge
       }
-      public DragDropItem(string name, SourceType source)
+      public DragDropItem(string name, SourceType source, bool asReadOnly)
       {
          Name = name;
          Source = source;
+         AsReadOnly = asReadOnly;
       }
 
+
       public string Name { get; private set; }
       public SourceType Source { get; private set; }
+      public bool AsReadOnly { get; private set; }
+
    }
 
 }
diff --git a/Liquesce/ExpectedDetailResult.cs b/Liquesce/ExpectedDetailResult.cs
index 695e2d2..4bc2a1f 100644
--- a/Liquesce/ExpectedDetailResult.cs
+++ b/Liquesce/ExpectedDetailResult.cs
@@ -1,4 +1,29 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ExpectedDetailResult.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+using System;
 
 namespace Liquesce
 {
diff --git a/Liquesce/ExtractIcon.cs b/Liquesce/ExtractIcon.cs
index f67cf34..84d1a27 100644
--- a/Liquesce/ExtractIcon.cs
+++ b/Liquesce/ExtractIcon.cs
@@ -1,11 +1,37 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ExtractIcon.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.Drawing;
 using System.IO;
 using System.Runtime.InteropServices;
 
 namespace Liquesce
 {
-   internal class ExtractIcon
+   internal static class ExtractIcon
    {
       /// <summary>
       /// Get the icon used for folders.
@@ -72,7 +98,27 @@ public static Icon GetIconForFilename( string fileName, bool small )
          if (shinfo.hIcon == IntPtr.Zero)
             return null;
 
-         return Icon.FromHandle(shinfo.hIcon);
+         Icon icon = Icon.FromHandle(shinfo.hIcon).Clone() as Icon;
+         // You MUST use DestroyIcon function after extracting the icon, as per http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfileinfo.asp
+         // Otherwise, you will encounter "OutOfMemory" exception if you add a large number of icons to the  ImageList, like 3000+
+
+         DestroyIcon(shinfo.hIcon);
+         return icon;
+      }
+
+      const string ShellIconsLib = @"C:\WINDOWS\System32\shell32.dll";
+      private const int Floppy = 6;
+      private const int Hard = 8;
+      private const int Net = 9;
+      public const int CD = 11;
+      private const int RAM = 12;
+      private const int Unknown = 53;
+      static public Icon GetIcon(int index)
+      {
+         IntPtr Hicon = ExtractShellIcon(IntPtr.Zero, ShellIconsLib, index);
+         Icon icon = Icon.FromHandle(Hicon).Clone() as Icon;
+         DestroyIcon(Hicon);
+         return icon;
       }
 
  
@@ -91,7 +137,10 @@ private static extern IntPtr SHGetFileInfo( string pszPath,
       uint cbSizeFileInfo,
       uint uFlags );
 
-      [StructLayout( LayoutKind.Sequential )]
+      [DllImport("user32")]
+      public static extern int DestroyIcon(IntPtr hIcon);
+
+      [StructLayout(LayoutKind.Sequential, Pack = 4)]
       private struct SHFILEINFO
       {
          public IntPtr hIcon;
@@ -102,6 +151,10 @@ private struct SHFILEINFO
          [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 80 )]
          public string szTypeName;
       };
+
+      [DllImport("shell32.dll", EntryPoint = "ExtractIcon")]
+      extern static IntPtr ExtractShellIcon( IntPtr hInst, string lpszExeFileName, int nIconIndex);
+
       // ReSharper restore InconsistentNaming
       // ReSharper restore InconsistentNaming
       #endregion
diff --git a/Liquesce/GridAdvancedSettings.Designer.cs b/Liquesce/GridAdvancedSettings.Designer.cs
deleted file mode 100644
index 9578d1d..0000000
--- a/Liquesce/GridAdvancedSettings.Designer.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-namespace Liquesce
-{
-   partial class GridAdvancedSettings
-   {
-      /// <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()
-      {
-          System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GridAdvancedSettings));
-          this.button1 = new System.Windows.Forms.Button();
-          this.label3 = new System.Windows.Forms.Label();
-          this.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
-          this.SuspendLayout();
-          // 
-          // button1
-          // 
-          this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-          this.button1.DialogResult = System.Windows.Forms.DialogResult.OK;
-          this.button1.Location = new System.Drawing.Point(427, 377);
-          this.button1.Name = "button1";
-          this.button1.Size = new System.Drawing.Size(75, 23);
-          this.button1.TabIndex = 15;
-          this.button1.Text = "Save Changes";
-          this.button1.UseVisualStyleBackColor = true;
-          this.button1.Click += new System.EventHandler(this.button1_Click);
-          // 
-          // label3
-          // 
-          this.label3.AutoSize = true;
-          this.label3.Location = new System.Drawing.Point(193, 48);
-          this.label3.Name = "label3";
-          this.label3.Size = new System.Drawing.Size(22, 14);
-          this.label3.TabIndex = 4;
-          this.label3.Text = "ms";
-          // 
-          // propertyGrid1
-          // 
-          this.propertyGrid1.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.propertyGrid1.Location = new System.Drawing.Point(0, 0);
-          this.propertyGrid1.Name = "propertyGrid1";
-          this.propertyGrid1.Size = new System.Drawing.Size(526, 373);
-          this.propertyGrid1.TabIndex = 16;
-          // 
-          // GridAdvancedSettings
-          // 
-          this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
-          this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-          this.ClientSize = new System.Drawing.Size(534, 400);
-          this.Controls.Add(this.propertyGrid1);
-          this.Controls.Add(this.button1);
-          this.Controls.Add(this.label3);
-          this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-          this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-          this.MaximizeBox = false;
-          this.MinimizeBox = false;
-          this.MinimumSize = new System.Drawing.Size(373, 310);
-          this.Name = "GridAdvancedSettings";
-          this.Text = "AdvancedSettings";
-          this.Load += new System.EventHandler(this.GridAdvancedSettings_Load);
-          this.ResumeLayout(false);
-          this.PerformLayout();
-
-      }
-
-      #endregion
-
-      private System.Windows.Forms.Label label3;
-      private System.Windows.Forms.Button button1;
-      private System.Windows.Forms.PropertyGrid propertyGrid1;
-   }
-}
\ No newline at end of file
diff --git a/Liquesce/GridAdvancedSettings.cs b/Liquesce/GridAdvancedSettings.cs
deleted file mode 100644
index ee660bd..0000000
--- a/Liquesce/GridAdvancedSettings.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using System;
-using System.Windows.Forms;
-using LiquesceFacade;
-
-namespace Liquesce
-{
-   public partial class GridAdvancedSettings : Form
-   {
-      private AdvancedPropertiesDisplay apd;
-
-      public GridAdvancedSettings()
-      {
-         InitializeComponent();
-      }
-
-      private void GridAdvancedSettings_Load(object sender, EventArgs e)
-      {
-         Utils.ResizeDescriptionArea(ref propertyGrid1, 6); // okay for most
-      }
-
-
-      private ConfigDetails cd;
-      public ConfigDetails AdvancedConfigDetails
-      {
-         get { return cd; }
-         set
-         {
-            cd = value;
-            apd = new AdvancedPropertiesDisplay(cd);
-            propertyGrid1.SelectedObject = apd;
-         }
-      }
-
-      private void button1_Click(object sender, System.EventArgs e)
-      {
-         if (cd != null)
-         {
-            cd.ThreadCount = apd.ThreadCount;
-            cd.LockTimeout = apd.LockTimeoutmSec;
-            cd.DebugMode = apd.DokanDebugMode;
-            cd.PluginMode = apd.PluginMode;
-            cd.HoldOffBufferBytes = (apd.HoldOffMBytes * (1024 * 1024));
-            cd.BufferReadSize = (apd.BufferReadSizeKBytes * 1024);
-            cd.ServiceLogLevel = apd.ServiceLogLevel;
-         }
-      }
-
-   }
-}
diff --git a/Liquesce/GridAdvancedSettings.resx b/Liquesce/GridAdvancedSettings.resx
deleted file mode 100644
index f877985..0000000
--- a/Liquesce/GridAdvancedSettings.resx
+++ /dev/null
@@ -1,418 +0,0 @@
-<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
-        IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Q3W1NRjv7y634R/eOpgVU3/bFlK/25b
-        TP9/cV3/m5d8/3VzYf9HOy3/Ujom/1g/Kv9rW0n/cW5m/3Ftav+DeHH/jYB4/5CEff+gmJT/vru9/8zM
-        0P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnp60XY19b/sa2h/5+d
-        jP9fWU3/QjEh/1c/KP90Y0n/nJh8/4B/av9ORDX/Tjci/2pYQ/+anY7/q7qz/2lrZP9fTkD/cVxJ/25Y
-        Rf9uWEb/oZiT/8TDxf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOnq
-        7TzY19fotLGp/7Syof+YloT/ZF5O/19RPv+HfWL/n5yA/5OTfP9oZVb/WVBC/4uLff+zwrj/mqql/15Z
-        T/9SPCn/W0It/1pCLP9gSTX/o5yY/8bFyP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAADW1NVKysfE/7Owof+yr5v/qKWN/6Geg/+gnoH/oZ+D/6Sli/+nrJb/qbKi/7C/
-        s/+6zMX/f4qH/1FGOP9WPij/WUAp/1lAKf9uXEz/r6up/8jIzP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAOvq6yjr6uq/zMrKv8C8uL/NyMTSzMnE/7e0p/+4taL/rauS/6Sihv+hn4T/p6WM/7Gx
-        m/+1uqf/tsGx/7nKv/+90sv/c3x3/0k8LP9ZQin/XEUs/15IMP+Cdmr/tLGw/8PCw/8AAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAANDOzjXNy83/sK6w/3Zxb/91amH/r6ig/8bFvf+zsqX/ioh7/2tp
-        XP91c2L/jox2/6WmkP+1u6v/xM/G/8vZ1v/H29r/qsDB/2ZsaP9jW07/i4p+/5yoo/9eYV7/XU5A/2tY
-        Rf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMfExTXMysv/3d3h/9TU1v/Gxsf/0tHQ/8C/
-        u/98e3b/VlVQ/4uKef+fnYP/npyB/56gif+psaH/t8e//8fZ2P/V5eb/zOPk/6/GyP+twsL/u9LT/7vS
-        0/9ueHf/aFtP/3VhT/8nEwkSAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAA
-        ACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAIwAAACMAAAAjAAAAI2toZkO9urbK09HQ/+Dg
-        4f/g4OH/z9DQ/4KCgf9XV1X/rauh/7Gvm/+Qjnf/bGtY/2BjVf9yenH/k6Oe/7XNy//K4uH/2Onp/83i
-        4f/A2Nf/tcvJ/4eRi/9gVUL/XUgv/19KL//AXwbhxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48Rh
-        B+PEYQfjxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48RhB+PEYQfjxGEH48Rh
-        B+PGezfp0s/O/9PR0P/f3t//qqqr/1FRU/+ampn/xMO3/6mnkf+ZmYP/h4x9/1RbVf8+REL/aHRz/5Sp
-        qf+1zs3/z+Li/9Dg4P+6zs3/fYaB/1xQP/9fSjH/YUsy/2JMM//BYAfmzGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/Nbg//z5lj/83Jx//Ix8b/dnZ4/19fYf/Kysn/tbSr/8wAN//MZmb/oqed/56s
-        qf9WYGL/MDY5/2d0dv+arK3/tcfH/8fT1f+2xMP/W15Z/09ALv9iTDX/Yk01/2RPOP/BYAfmzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//Pz8v/j4eH/0c3J/9XQyf+yr6r/WVhY/4eGh//Ew8H/zGZm/8wA
-        N//MADf/zAA3/52knv+FkZH/NDo8/0NJSv+FkZD/o7Ct/7rEwv+vubX/ZGdk/0xCNP9ZRzH/YE00/2RP
-        Nv/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/x8O//29jU/9HLwP/Sy77/0su+/9PMwP+gnJP/S0lH/5ya
-        lf+mo53/zGZm/8wAN//MADf/zAA3/8wAN/+Jjov/S09P/zEyM/9scG7/k5eS/6eppP+dn5n/hIV9/3Vz
-        av9qZlz/T0lA/1FDMP/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/u7ez/ycS//9DIt//Qx7f/0Me3/87F
-        tf+WkYb/RkNB/5+bkv+XlY3/zGZm/8wAN//MADf/zAA3/8wAN/+Agn7/UFBP/zAwMf9lZGH/jYuF/5mX
-        kf+OioP/fXlw/3h0af94c2n/XVlS/1BFNv/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/w8O//09DM/8K5
-        qv/Hvqz/y8Gu/83Dr/+akoT/SEVB/52YjP+dnpL/zGZm/8wAN//MADf/zAA3/8xmZv+Jk4//V1ta/0FC
-        Q/+BhIL/p6qn/6qtqf+ZnJb/hoiA/4B/dP99eGv/bGRV/3FkUv/BYAfmzGYA//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/8/Pz/+bl5v/Y1dT/x8G5/8vBrf+mn4//U1FM/46Khf+qqJ7/VFZP/8wAN/83OjL/Oj02/2t0
-        cP+LmJj/VFpc/2Jnaf+stLX/xc7O/7vGxP+ptbH/bHBq/2BWQ/9rWj//a1g+/2tYPv/BYAfmzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/4+Db/8W8rf+5sqX/bGhk/25tbf/Ozcz/h4eH/ygn
-        Jv8VFRT/PEA9/4SSkP95hYf/XF9j/5ujpv/O2tz/0t/g/8LS0v+uv7//YmVf/1tNOv9uXEL/bl1D/29f
-        Rv/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/y8vH/39zY/8zFuf/TzcL/m5iS/1RU
-        VP++vr7/3NzZ/7Sypf+WlYH/mZuK/4iNhv98f3//rbOz/9vl5v/i7u//1ufn/8Xb2v+0ysn/cHh0/11X
-        SP9zaVL/eW9W/31yXP/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//Ly8f/g3dn/083E/9jS
-        yf/a1s//xsTA/3l5eP93d3n/5OTl/+fm4v/b2dH/zczD/8bGv//U1tD/4+jl/+fv7v/h7u7/z+Xl/8Tf
-        3v/C29r/sMXE/3N9ev9mZVj/fnln/4aBbf/BYAfmzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//X19P/09PP/8vLx/+7u7f/q6un/5+fm/9rZ
-        1v/OyML/19LM/9PQzP/Qz83/2tnb/8PExv99fYD/g4KF/9fX2f/r6ur/6efl/+bl4f/l5uT/5ejn/9zk
-        5P/L3dv/wdra/7jR0v+71dX/wdvc/7jQ0v9rd3b/e392/5OViP/BYAfmzGYA//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//T08//y8vH/7+/u/+rq6f/l5eT/19fW/8fH
-        xv+zs7L/oaGg/6Kgn//JxsP/w8K+/6+zrv+ts6//yszN/9zc3//FxMX/j46N/4GBgP+uraz/2NjW/+Tk
-        4f/e39n/z9LK/7/Kwf+7zsf/prq4/5CfnP+hsa3/tszK/6q/wP+BjIv/kJiR/56mnf/BYAfmzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9fX0//Pz8v/u7u3/6Ojn/+Dg3//U1NP/vLy7/5qamv98fHz/ampq/359
-        ff+dm5v/vLa2/7Kurv+qjW3/l5SU/5qamP/Lysr/v7++/72+vP/ExMP/19bW/9XV1P/U1M//x8a7/7Ox
-        of+fnYj/mpiA/6Sjh/+oqI3/q6+Y/7G6qf+2xbn/e4eC/4CLh/+puLH/rLu1/6q5tP+9xcH/yryr/MnM
-        ycTBYAfmzGYA//b29f/29vX/9fX0//Ly8f/t7ez/4+Pi/9vb2v/Hx8b/o6Oi/39/fv9mZmb/eXh4/5uZ
-        mf+7tbX/qqam/5GNjf9/fX3/dHR0/3Nzc/91dXX/hI+H/118aP9JYVL/W1tb/4GBgf+mpqb/3dzd/9XV
-        1P/Ozcf/vr2z/7Kwn/+rqZL/o6GF/6Cegf+ioYf/pqmT/6yzof+zvrH/go2H/3V/fP+ZpKD/o7Cq/6Ow
-        qv+4wL3/w4JC9AcDARTAXwfnzGYA//X19P/x8fD/7Ozr/97e3f++vr3/m5ua/3Z2dv91dHT/mpaW/7Sv
-        r/+joJ//j4uL/3Vycv9hYmD/XV1d/19fX/9hYWH/YmFh/2JiYv9jY2P/M8xm/wCZAP8AZgD/QEBA/3d3
-        dv+ioqL/1dTV/9PSz/+zsq3/hoeB/46Qh/+eno3/oqCF/46Mc/97fG3/jI+F/6Komv+uuKj/nqqg/2x0
-        cP96f3v/k5mU/5OZlP+Znpn/u4ZS9mRiYSHAXwfozGYA//T08//v7+7/xMTE/5eXl/+TkpP/rqmp/7m0
-        tP+alJT/cG1t/09PT/9LS0v/SUlJ/0hISP9HR0f/R0dH/0dGRv9HR0f/R0dH/0hIR/9JSEn/M8xm/wCZ
-        AP8AZgD/OTk5/3Jycv+enp7/0M/N/8XEv/+Ukoz/c3Jr/4SDe/+Rj4D/oZ6E/4B+Z/9mZVv/fHt0/42O
-        g/+jqZr/rLeq/3R6df+BgX7/oqKd/6Cgm/+fnpn/zczL/728vFjAXwfozGYA//Dw7/+SkpL/uLS0/8C4
-        uP+GgID/VlRU/z4+Pv84ODj/NDQ0/zExMf8tLSz/Kior/ykpKv8pKSn/Kikp/yopKv8rKyv/LCws/y0t
-        Lf8vLy//M8xm/wCZAP8AZgD/R0ZG/318fP+urq//zMvM/6mnpv+Hg4L/hIB9/4yIhP+alor/oJ2E/3l3
-        ZP9eWlL/c2xl/3ZvZ/+GhHn/iYuC/4B+ev+Mh4T/lY+L/5WPjP+ppKP/2M7I/sC+wFDAXwfozGYA/8XD
-        wv+4tbX/sq2t/3x8fP9lZ2X/T09P/zAwMP8bGhr/FBUV/xMTE/8PEA//Dw8P/xEQEP8SEhL/ExMT/xUV
-        Ff8XFxf/GRkZ/xwbHP8dHh7/bJt7/zuXW/8AZgD/bGpr/5CPj/+/v7//pqam/5OTk/+FhYX/f39//6qq
-        q//V1M3/p6SP/4J+bv90bmf/hn52/4J6cv9/dm7/qaSg/+Hg3//y8fH/8vLx//Pz8v/OoIr/zn0w8gcD
-        ARTAXwfozGYA/8C6uv+Ylpb/gICA/3t7e/95eXj/a2tq/0dHRv8lJCT/GxkZ/xQUFP8PEA//Dg4O/w4O
-        Dv8ODg7/Dg4O/w4ODv8ODg7/EBAQ/xISEv8TExP/ExMT/3SPfP96g3v/i4mK/6urq//Y2Nj/yMjI/7a2
-        tv+ioqL/kJCQ/46Oj/+0s7L/1dPP/8vKxv/Mysr/0c/P/9LPz//T0ND/2tfX/+7u7f/19fT/9vb1//b2
-        9f+ZMwD/xGEC7wcDARTAXwfozGYA/8fAwP+Uk5P/e3t7/2pqav9oaGj/ZmZm/2VjZf9ZWFj/QUFB/ygo
-        KP8eHR3/ExMT/w8PDv8ODg//Dg8O/w4ODv8ODg7/Dg4O/w8PD/8aGhr/Dw8P/5eal/+TlJP/oaCh/8PD
-        w//c3Nz/29vb/9PT0//FxcX/s7Oz/56env+Ojo7/hYWF/4SEhP+BgYH/bW1t/3Fxcf+Ojo3/uLi3/9ra
-        2f/s7Ov/9PTz//b29f+ZMwD/xGEC7wcDARTAXwfozGYA/8jAwP+Dg4P/amlp/1dXV/9WVlb/VVVV/1VV
-        Vf9VVFT/VVRU/1BRT/9FRET/NTY2/ycmKP8aGhr/FxYW/y4tLP9JR0j/W1la/2FgYP9kZGT/n5+f/6am
-        pv+trq7/tra2/8rKy//f3+H/3Nzd/+fn6v/a2tr/0NDQ/8DAwP+tra3/mpqa/4yMjP+Ghob/g4OD/3Z2
-        dv9ubm3/fHx8/6WlpP/Pz87/6Ojo//Ly8f+ZMwD/xGEC7wcDARTAXwfozGYA/8jAwP+BgYH/W1tb/0tL
-        Sv9LS0v/S0tL/0tLS/9LS0v/S0pL/1JQUP9bWlr/ZGFh/2ZjZP9wbW3/fXp6/358fP+Ih4j/nJ2d/66v
-        r//CwsP/vLy9/76+v/+7vLz/tra2/7W1tv+5ubn/wMDA/8zMzP/W1tb/2tra/9fX1//LzMz/u7u7/6io
-        qP+Wlpb/i4uL/4iIiP+BgYH/c3Ny/3d3d/+goKD/0tLR/+jo6P+ZMwD/xGEC7wcDARTAXwfozGYA/8jA
-        wP+CgoL/bWxs/09PT/9ZWFj/ZmZm/3FwcP+AfoD/hoWE/4SBgf98fHv/goKC/42Ojv+ysrT/w8TF/9nb
-        3P/j5OX/3N3e/9PV1//P0NH/y8rK/8jGxv/DwcH/vby7/7m4t/+3trX/trW0/7e3tv++vr3/ysnJ/9TV
-        1f/Z2dn/1dXV/8jIyP+2trb/oKCg/5GRkf+Li4v/ioqK/39/f/+GhoX/vr69/9/f3v+ZMwD/xGEC7wcD
-        ARTAXwfozGYA/8jAwP+kpKT/lpaW/5KSkv+MjIz/lZWW/5mZmv+xsrL/yMnK/8/Q0f/j5eb/8fP0//Hz
-        9P/p7e//5OXn/9nc3v/T09T/0M/P/9LPzv/V0s//4tzZ/+Hc2P/c19P/083J/8jDv/+/u7f/ubSy/7Ow
-        rv+urKv/r62s/7a2tf/ExMT/0tLS/9jY2P/S0tL/wsLC/66urv+cnJz/lpaW/5KSkv+Ojo7/u7u6/+Li
-        4f+ZMwD/xGEC7wgEAhTEYQnwzGYA/9/f3//BwcD/rq6u/7Kysv/R0tP/8fHx/+jp7P/y9vf/9/n7//b5
-        +//z9Pj/7vDy/+bo7P/Y2dz/x8XF/8fCwP/Ry8f/29fT/+Ld2//k4d3/4N3b/9za2P/X1dT/09DP/83M
-        yv/Jx8T/w8C//767uv+3tLL/q6il/56dmf+amJf/paOj/769vf/Y2dn/2tra/8/Pz//AwMD/sbGx/6am
-        pv+bm5r/xMTD/+/v7v+ZMwD/xWID9AkEAhTJYwv3zGYA//b29f/29vX/5eXk/8jIyP+6urn/vb69/8LD
-        w//V19j/4uTm/+rr7f/n6er/3t3d/+He3f/q6Of/8e/v//Hx8f/v7+//6urr/+fn5//k5OT/4OHh/9zd
-        3f/Z2dn/1tbW/9PT0//Q0dD/zs7O/8zMzP/Kysr/xsbG/7++vf+vrq3/mpmY/5STkv+4uLj/1NTV/9zc
-        3P/Z2dn/0NDQ/7+/v/+mpqX/ysrJ//X19P+ZMwD/zGYA/wkEAhTJYwv3zGYA//b29f/29vX/9vb1//b2
-        9f/t7ez/2dnY/76+vv+8vbz/wcHC/8vMzv/Y2dr/5eXm//Hx8v/4+Pj/+Pn4//j4+P/39vb/9PT0//Ly
-        8v/v7+//7Ozs/+np6f/m5ub/4uLi/9/f3//b3Nv/2NfX/9XV1f/S0tL/z8/P/83Nzf/Ky8r/wMDA/6+u
-        r/+ysrP/v7/A/8vLy//W1tb/3N3d/8vLy/+srKv/0tLR//b29f+ZMwD/zGYA/wkEAhTIYwv1zGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//T08//o6Of/zMzL/7m5uP/DxMT/xsfH/8/Pz//e3t7/7u7u//f3
-        9//6+vr/+fn5//n5+f/39/f/9vb2//T09P/x8vL/7+/v/+zr6//o5+f/5OPj/+Dg3//c3dz/2NjY/9TU
-        1f/Q0NH/y8vL/8TFxv+/wMH/vr+//72+vv+/v7//x8fH/72/v/+2uLj/5+fm//b29f+ZMwD/zGYA/wkE
-        AhTHYwr0zGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9fX0//Ly8f/g4N//yMjH/8PD
-        wv/IyMj/x8fH/87Pz//f39//8/T1//f4+f/z9PT/7+/w/+zs7P/o6Oj/5OXl/+fo6P/r7Oz/5+fn/+Lj
-        5P/e3+D/29zd/9bX2P/P0NH/x8fI/76+v/+4ubn/tba2/7Kysv+zs7P/u7u7/8nKyv/Y2dj/9PTz//b2
-        9f+ZMwD/zGYA/wkEAhTHYgryzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/19fT/8vLx/+rq6f/a2tn/yMjH/8LCwf/Gxsb/wcHA/9DR0v/S09X/tLW3/4yOj/93eHn/f4GB/6Ol
-        pv/X2dr/3t/h/9HS1P/HyMn/wMHB/7q6u/+2trb/tre2/76+vf/Kysr/19fW/87Ozf/Kysn/0dHQ/97e
-        3f/s7Ov/9vb1//b29f+ZMwD/zGYA/wkEAhTHYgryzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/7+/v/+jo5//c3Nv/4ODf/8nJyf+7u7r/t7i4/7a3
-        t/+2trb/trW1/7W1tf+1trb/tLS0/7a2tv+/wMD/zM3M/9PT0v/U1NT/1tbV/9vb2//j4+L/6urp/+/v
-        7v/x8fD/8vLx//T08//29vX/9vb1//b29f+ZMwD/zGYA/wkEAhTHYgryzGYA//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/8fHw/+Xl
-        5P/T09L/yMjH/72+vf+3t7b/urq5/8HBwP/IyMj/2dnY/9zc2//h4eD/5+fm/+3t7P/y8vH/9PTz//X1
-        9P/19fT/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f+ZMwD/zGYA/wkEAhTHYgryzGYA//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/x8fD/6urp/+Hh4P/e3t3/4ODf/+Tk4//q6un/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f+ZMwD/zGYA/wkE
-        AhTHYgryzGYA//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f+ZMwD/zGYA/wkEAhTGYgryzGYA/9RzQ//Uc0P/1HND/9RzQ//Uc0P/1HND/9RzQv/Uc0L/1HNC/9Rz
-        Qv/Uc0L/1HNC/9RzQv/Uc0L/1HNC/9RzQv/Uc0L/1HJB/9RyQf/UckH/1HJB/9RyQf/UckH/1HJB/9Ry
-        Qf/UckH/1HJB/9RyQf/UckH/1HJB/9RyQf/UckH/1HJB/9RyQf/UckH/1HJB/9RyQf/TckH/03JB/9Ny
-        Qf/TcUD/03A//9NwP/+ZMwD/zGYA/wkEAhTHYgryzGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xm
-        AP/MZgD/zGYA/8xmAP/MZgD/zGYA/8xmAP+ZMwD/zGYA/wkEAhTJYwvzmTMA/5kzAP+ZMwD/mTMA/5kz
-        AP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kz
-        AP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kz
-        AP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/mTMA/5kzAP+ZMwD/zGYA/wsFAhTKZAv02IBU89iA
-        VPHXf1Pv135S7dd9UOrWe07n1nlL5NV4SuHVdkfd1HVF2tRzQtbTcUDS0m48z9JtOsvRajbI0Gg0xNBn
-        MsHPZC+/zmMuvMtiLrrJYS25yGEtt8dgLbbGYC21xmAttcVfLLTGYC21xmAttcdgLbbIYS23yWEtucti
-        LrvOYy69z2QvyNFrOMzQZzP0v1wr8MpiLunPZC/nxF8s8dFqNuzSbz3swV0r+dFqN/HSbjz1zGYA/ygT
-        CQzGYgTRyGMF1chjBtXIYwXVyGMF1chjBdXIYwXVyGMF1MdjBdTHYwXUx2MF1MdjBdPHYwXTx2MF08dj
-        BdPHYwXTxmIF08ZiBdLGYgXSxmIF0sZiBNLGYgTSxmIE0sZiBNLGYgTSxmIE0sZiBNLGYgTSxmIE0sZi
-        BNLGYgTSxmIE0sZiBNLGYgXSxmIF08ZjBdPGYgXVxmIF1MZiBdTHYwXUx2MF1cdjBdXHYwXVxmIF1cdj
-        BdXGYgXVxGIDzQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////AAADc/f///8AAANz9////wAAA3P3////gAADc/f//
-        /gAAANz9///+AAAA3P3///4AAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA
-        3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAA
-        AAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA
-        3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAA
-        AAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA
-        3P0AAAAAAADc/QAAAAAAANz9AAAAAAAA3P0AAAAAAADc/QAAAAAAAdz9////////3P0oAAAAIAAAAEAA
-        AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq6uwVzcvJs5yYj+9fUkf/Y08+/4Z6
-        Yv+EgWz/Szws/1lCLf99eGr/dXVv/3ttY/+EdGn/m5GL/8LAwv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOjp7CrLycb1r6ye/3Zw
-        YP9bTDn/ioFm/5KReP9cU0T/cWlY/6ezqf92eXH/WkQy/2FJNf95Z1n/uba2/wAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvq6wnc29tAxcLAQNDN
-        y6W7uK7/sK2Y/6Shh/+hn4P/pqaM/6yyn/+xvrH/pbWv/11YTf9YQCj/WkIq/4h8cv+/vb//AAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2tjZIM3L
-        zOqcmZfqn5eQ9b67sv+qqJj/hYNy/4mHcv+iooz/uL+w/8PQyf+1yMb/cHVw/2hdTP+DgXP/b2pj/4N3
-        a/8VCgQIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAA
-        AAyGhIQqzcvL89jY2v/Pz8//t7e1/3Bva/+Linv/lZN7/4qLdv+dqJz/uczJ/9Dk5P/A1tf/tcvL/67C
-        wf9nZFr/aldE/4lEBp6CQASjgkAEo4JABKOCQASjgkAEo4JABKOCQASjgkAEo4JABKOCQASjgkAEo4JA
-        BKOCQASjgkAEo5pXG6rIpYXp1dPT/9HR0v99fX7/lpaR/7Gvnf+Ojnr/ZGle/1xlYf+RpKP/w9nZ/9Dh
-        4f+tv73/dnht/19MNP9gSjH/xGIE7tWGNv/allH/2pZR/9qWUf/allH/2pZR/9qWUf/allH/2pZR/9qW
-        Uf/allH/2pZR/9qWUf/allH/2ZVR/9KbZf/PwLH/pKOi/2xsbf/EuLX/xjNW/8JSYv+jlpf/VF1f/01W
-        WP+crKz/vMnJ/5egnf9TSz7/X0s0/2NONv/EYgTu6Maj//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1/+3s6//e29X/1dDH/9PMwv+JhoD/fXx5/7mVkv/MIkb/zAA3/8Ek
-        Tf9wd3b/Oz4//4CHhP+mq6f/lZiT/21qYf9fVUf/Vkg1/8RiBO7oxqP/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/4+Hf/8vEuP/NxLP/zcSz/3x3bv+BfXX/qoeB/8wi
-        Rv/MADf/zBZB/3J2c/8/P0D/e3t4/5ublv+LioL/fHlv/3FsYv9dU0X/xGIE7ujGo//29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/w7+7/3tzY/8/JwP/KwbD/hoB1/3x4
-        cv+XjIP/sR5B/2knNP+AV1r/eIKB/1ZaXP+nrq3/t7+9/5Sblf9tal3/b2FL/2xcRf/EYgTu6Maj//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/7ezq/9DJ
-        vv+qpJr/bGtp/7y7u/9wb2v/SUlC/3d/ev95gIL/naSm/9Th4v/I2dn/l6Wj/19ZS/9wYUj/c2RM/8Ri
-        BO7oxqP/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//T0
-        8//g3dn/1M/G/83Jwv+FhIL/qqqr/9nY1P/BwLT/tLWt/7/Cv//d5OP/3Ovr/8jg3/+xx8b/e4R+/3Br
-        Wf+AeWX/xGIE7ujGo//29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9fX0//T08//y8vH/7e3s/+Pj
-        4v/V1dT/ysnH/83JxP/KyMP/ycrJ/87O0f+Qj5H/qaiq/9rZ2P/k4+D/4eLf/9bd2v/B1dL/r8XE/7bN
-        zP+2zs//d4F9/4+Uif/EYgTu6Maj//b29f/29vX/9fX0//T08//v7+7/6eno/9ra2f+/v7//n5+e/56d
-        nf+6uLf/vbm5/6aZiv+bmpn/x8XE/7u8uf/DxcP/1dXW/8bFwf+op53/p6aW/7W0ov+5uqf/tr2u/6i4
-        r/+Gk5D/qbmz/6u8uf+tsar+ubqy5MRhBO/nxaP/8/Py/+3t7P/X19b/v7++/6enpv+VlJP/fHt6/4mH
-        h/+YlZX/hYOD/3Jxcf9tbW3/bYBz/0yPV/87XT//b29u/7a2tv/W1dX/vLu1/6enmv+lo4z/nJp//5eY
-        g/+kqpn/pK+j/3qEf/+TnZj/naii/7OkjfxZQi1ixGEE7+bEov/l5eT/urq5/6Ohov+koaD/iISE/3Vy
-        cv9lZGT/WllZ/09PT/9OTk7/T09P/1BQT/9Helj/Eaoi/xNXE/9gYGD/sK+v/8zLyP+SkIr/goJ6/5mX
-        hP+OjHP/c3Np/42Phf+mr6H/g4uE/4iKhv+cnpn/q6Wc/qyln4LEYQTw2riV/6akpP+tqKj/bWtq/0JB
-        Qf8sLCz/Jycn/yIiIv8hICH/ISEh/yIiIv8kJCT/JiYm/zJaP/8kpDj/G18b/3Nycv+3t7j/q6qq/4WC
-        gf+PjIr/qaaY/4iGcv9sZl7/eXJq/4mGfP+cmpb/sKyp/7Swrf+/qJj9nZCHe8RhBPDFoH3/nJqa/4KB
-        gf9sbWz/SkpK/x4dHf8VFRX/Dg8O/w4ODv8PDw//EBAQ/xEREf8UFBT/HyQh/1B2Xf9he2H/lpaW/8nJ
-        yf+wsLD/k5OT/5OTk//Bv7r/ubau/7Guq/+3s7D/vbi2/9/d3P/09PP/9PTz/7RdJPpHJQZdxGEE8Mii
-        gP+GhYX/aWlp/2FhYf9fX1//UlFR/zs7O/8mJib/GRkZ/xEREv8WFhX/IyMj/ykpKf82Njb/fX59/5+g
-        oP+7u7v/3Nzd/9ra2//Gxsb/r6+v/5SUlP+IiIj/fX19/3Nzc/+Ojo3/vLy7/+bm5v/z8/L/p0IA+kYi
-        AV3EYQTwyaKA/3Z2dv9UVFT/Tk5O/05OTv9OTU7/UE9P/1NSUv9SUFD/VVNT/2BeXv95eHn/j4+Q/6en
-        qP+0tLX/tra2/7q6uv/Gxsf/0dHR/9fX1//R0dH/u7u7/6SkpP+NjY3/hISE/3l5eP+AgID/vb29/+Xl
-        5P+nQgD6RiIBXcRhBPDJooD/h4aG/2xsbP9tbW3/e3t7/5STlP+cm5v/oaGh/6utrf/HyMr/1dfY/9vc
-        3f/U1NX/0dDP/9HOzf/JxsT/wL27/7i2tP+2tLP/u7q5/8fHxv/S0tL/z8/P/7i4uP+goKD/j4+P/4iI
-        iP+ampn/1NTT/6dCAPpGIgFdxWIF89Ovjf+xsbH/pqam/8LCw//Pz9H/4OLj/+jq7P/u7/L/6+3w/9na
-        3P/OzMz/08/N/9rX1f/f3Nn/3tvY/9bT0f/Nysj/w8C+/7y4t/+xrqz/qKak/6uqqv/Av7//1NXV/8jI
-        yP+wsLD/oqKi/6SkpP/c3Nv/p0IA+0cjAl7KZAf66Maj//Ly8f/d3d3/ycnI/8LDwv/Q0dL/3N3f/+Hi
-        4//k4uL/8O/u//Pz8v/w8PD/6+vr/+bm5v/h4uL/3Nzc/9jY2P/S09L/z8/P/8vLy//FxcT/srGw/6Cf
-        nv+9vb7/09PT/9bW1v/IyMj/tLSz/+fn5v+qRAD/SiQBYslkB/noxqP/9vb1//b29f/w8O//5eXk/9PT
-        0//CwsL/zM3N/9fX1//q6ur/9fX1//j4+P/29vb/8/Pz//Hx8f/s7Oz/6Ojo/+Lh4f/d3dz/19fX/9LS
-        0//LzMz/wMDB/7u8vf/AwcH/ycnJ/8XGxv/BwsL/7u7t/6pEAP9KJAFiyGMG9+jGo//29vX/9vb1//b2
-        9f/29vX/9fX0//T08//h4eD/0tLR/8vLy//Jycn/2tra/+fo6f/j5OX/0dHS/8LDw//Lzc3/5OXl/97f
-        4P/U1db/zs/Q/8TFxv+/v7//vr+//729vP+9vbz/y8vL/+bm5f/19fT/qkQA/0okAWLIYwb26Maj//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//X19P/y8vH/6Ojn/93d3P/V1dT/zs/O/76/v/+sra7/oaKi/6ur
-        q//AwcL/wMDB/8PExP/Jysn/ysrK/8/Pzv/d3dz/4+Pi/+Xl5P/q6un/8/Py//b29f+qRAD/SiQBYshj
-        BvboxqP/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//T08//t7ez/2dnY/8zM
-        y//ExMP/ysrJ/9jY1//k5OP/6eno/+7u7f/z8/L/9fX0//X19P/29vX/9vb1//b29f/29vX/9vb1/6pE
-        AP9KJAFiyGMG9ujGo//29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/z8/L/8PDv/+7u7f/v7+7/8/Py//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/qkQA/0okAWLIYwb2z2sd/9FuLP/Rbiz/0W4s/9FuLP/Rbiz/0W4s/9FuLP/Rbiz/0W4s/9Fu
-        LP/Rbiv/0W4r/9FuK//Rbiv/0W4r/9FuK//Rbiv/0W4r/9FuK//Rbiv/0W4r/9FuK//Rbiv/0W4r/9Bu
-        K//Qbiv/0G0q/9BsKv+qRAD/SiQBYr5YB/eqRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pE
-        AP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pE
-        AP+qRAD/qkQA/6pEAP+qRAD/qkQA/6pEAP9KJQFizGkZ6dJ2OejSdTjm0nQ35NFyNeDQcTPd0G8w2c9u
-        LtbOayvSzmkoz81nJcvMZSPHy2MgxcpiIMLHYR/BxmAfwMZgH7/FYB6+xmAfv8ZgH7/HYR/AyGEfwsti
-        IMfMZiXNyGIh6cZgH+TJYiDjymUj5cpmJufKZCPpzGgc7HU6BVXGYgRGyGMFR8hjBUfIYwVHyGMFR8dj
-        BUfHYwVHx2MFRsdjBUbHYwVGxmIFRsZiBUbGYgVGxmIERsZiBEbGYgRGxmIERsZiBEbGYgRGxmIERsZi
-        BEbGYgRGxmIFRsZiBUbGYgVHxmIFR8djBUfHYwVHxmIFR8ZiBUfFYgRGxGIDF///gAD//4AA//4AAP/+
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABgA
-        AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4OBtpKGX8ltOQf9uW0b/i4hw/008Kv9xY1H/fYB5/3ho
-        XP+Dc2f/u7i5/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-        AADd3N1cubar/5WSfv+Jgmn/nZyC/4SEdP+qtqv/cnRs/1c/Kf9gSTX/uLW1/wAAAAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3dzcF83LzN+el5Pkvrqy/6imlf+Jh3L/oqKL/7nB
-        sv/C1M7/c3lz/2hbSP92cWb/j4Z+/xMJBA0AAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAA
-        ABIAAAASZmRjJ87MzPLW1tf/uLi3/3V0b/+amYP/goJt/5mlm//G29r/yN3d/7fNzf+EjIX/ZlM//8Rh
-        BerIYwPxyGMD8chjA/HIYwPxyGMD8chjA/HIYwPxyGMD8chjA/HIYwPxyGMD8c2UXfrRz8//dHR1/7e2
-        sf+2aWz/ho6G/0tTVP+Spab/xtfX/5Kdmv9bSTT/Ykw0/8ZjA/L29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/09PP/5ePe/9bRyf++ubH/cXBu/8CMiv/MADf/wClQ/2Nqaf9ZX17/pa2p/42R
-        i/9hWEr/WUo2/8ZjA/L29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/y8vH/y8W7/8zD
-        sv+yqpv/cm5o/7N/ev/MADf/zBlC/2xwbf9VVlX/nZ6Z/4qJgv97d2z/YllL/8ZjA/L29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/8fHw/93a1v+7s6P/bmxo/5SUkP9QHSj/WWBc/211
-        d/+dpqj/xdHR/4mSjv9lVj//bFtB/8ZjA/L29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9fX0/+He2f/UzsT/i4qH/729vf/Dwbb/ra6k/7i8uf/h7Oz/y+Hh/6W4tv9qaFv/fnZh/8Zj
-        A/L29vX/9vb1//b29f/29vX/9vb1//b29f/09PP/8fHw/+jo5//U1NP/wcC+/8zIw/+/wb3/0NHT/5WU
-        lf+8u7v/4uLf/93f2//I1tH/q8HA/7TLyv+TpKT/j5SL/8ZjA/L29vX/9PTz/+7u7f/g4N//urq5/5ub
-        m/+bmZn/iIaG/5OQkP+RiID/hI6G/4uRjf+qqqn/19fW/8nJwf+rqZb/oJ6D/6aoj/+xvK3/fIeD/6Sx
-        rP+wu7f/l4NtssZiA/Py8vH/ycnI/6alpP+PjIz/g4CA/3Fvb/9ZWFj/UlJS/1RUVP9VVVX/GbIz/x5R
-        Hv+Kior/z87M/5CPif+QkIP/lJJ4/3p6cP+gpZf/ipOL/4yOiv+anZj/qpyOnMZiA/S/vr7/qaWl/2Ri
-        Yv8wMDD/IyMj/x0dHf8dHR3/Hx4e/yEhIf8lJSX/NqVP/yxfLP+enp7/q6qq/4OBgP+pp6H/kI15/3Js
-        Zf9/eHD/pKOe/8G+vP+/sar/m4NulcZiA/SsqKj/eHh4/2xsbP9KSUn/JiUl/xMTE/8ODg7/Dg4O/w4O
-        Dv8TExP/S1JN/46Qjv/IyMj/y8vL/6qqqv+bm5v/qqmn/6Khof+pp6f/1tXV//Ly8f/HlHr/ZTIBgsZi
-        A/SloaH/WVlZ/1BQUP9QT0//UE9P/05NTf9FRET/UE5O/3Jxcf+NjY3/r6+w/7W1tf/Fxcb/09PU/9bW
-        1v/DxMT/oqKi/4qKiv97e3v/goKC/8rKyf/DkHb/ZTIBgsZiA/Stqan/eXh4/3h3eP+Ojo//qKeo/7S1
-        tf/GyMn/1tjZ/9jY2f/S0dH/1dLQ/8vIxv+9u7j/trSy/7m4t//Jysn/0dHR/7q6uv+ZmZn/jIyM/6Oj
-        ov+8iW//ZTIBgslkBfnj4+L/w8PD/87Ozv/c3t//7vDy/+nq7P/i4eP/3NnZ/+He3f/k4uD/3t3c/9bV
-        1P/Ozcz/xsXE/7y7uf+pqKb/pKOi/8/P0P/R0dH/ubm5/7Ozsv/Fknj/aDQBh8pkBfr29vX/9vb1/+zs
-        6//V1dX/xMTE/9HS0v/l5eX/9fX1//f39//09PT/7+/v/+rq6v/j4+P/3Nvb/9XV1f/Oz8//v7/A/7u8
-        vP/Hx8f/ysvL/8bHxv/HlHr/ajUBislkBfn29vX/9vb1//b29f/29vX/9PTz/+Pj4v/T09P/x8jH/9bW
-        1v/j5OX/xsfI/7Cxsf/T1NX/3t7g/9DR0f/Fxcb/vr6+/8PEw/+/v77/zM3M/+vr6v/HlHr/ajUBislk
-        Bfj29vX/9vb1//b29f/29vX/9vb1//b29f/19fT/8PDw/+jo5//Pz87/vL28/7e3tv+8vbz/x8fH/9TV
-        1P/h4eD/5ubl/+7u7f/z8/L/9PTz//b29f/HlHr/ajUBislkBfj29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/29vX/9vb1//b29f/09PP/7e3s/+rq6f/u7u3/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb1//b2
-        9f/HlHr/ajUBislkBfjQbCH/0Gwh/9BsIf/QbCH/0Gwh/9BsIf/QbCH/0Gwh/9BsIP/QbCD/0Gwg/9Bs
-        IP/QbCD/0Gwg/9BsIP/QbCD/0Gwg/9BsIP/PbCD/z2wg/89rH/+0Tw//ajUBisFeGva4WSn4uFgo9bdW
-        JvK3VSTvtlMh7LVRH+i1TxzktE0Z4bNLF96xShbcsEkW269JFtqvSRbar0kW2rBKFtyyShfetE0Z5LBK
-        F/iySxf0sUsY97FMGvm1Txz5cjkCiMdiBGrIYwVqyGMFashjBWrHYwVqx2MFasdjBWrHYwVqxmIFacZi
-        BWnGYgRpxmIEacZiBGnGYgRpxmIEacZiBGnGYgRpxmIFasZiBWrGYgVqx2MFasZiBWrGYgVqxGIDM//4
-        AEH/+ABB/+AAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQQAA
-        AEEAAABBAAAAQQAAAEEAAABBAAAAQQAAAEEAAABBAAAAQSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
-        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrq7BC5tq/lZVdI/4mD
-        a/9cTz3/hIZ9/25cTf+knJf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN3c3Aq8ubmVurav5qGf
-        iv+dnIP/tsCy/4qTjf9nWEX/joeA/2czBFVhMANXYTADV2EwA1dhMANXYTADV2EwA1d/VC1h0Me/97W1
-        tf+Rj4X/hIVy/5Gfmv/J3d3/obGu/2RUQf/RhDj36MWj/+jFo//oxaP/6MWj/+jFo//oxaP/4LyY/9K+
-        qP+GhIL/xGh5/71DX/9TWlv/n6qo/3t7dP9eTTn/1pRU9/X19f/19fX/9fX1//X19f/19fX/9fX1/9/c
-        1//NxLb/gHty/69VY/+gJUH/YGRk/52gnv+Cgnn/al9O/9aUVPf19fX/9fX1//X19f/19fX/9fX1//X1
-        9f/19fT/3NjS/5qXkv+sq6n/jY+H/6yzs//Q4eH/iZKN/3VqVP/WlFT39fX1//X19P/x8fD/4eHg/8jI
-        yP/S0ND/uLSv/8bEwf/Mzc3/qqmm/8fGvP/JzsP/p7m1/7DEwv+boJn41ZNT9+Dg3/+3trX/joyM/3Fw
-        b/9vbW3/YF9f/0SNUf9HYUj/wsHA/56dlf+amID/j5GC/5Kbkv+Vm5b/mYx9t8mGR/ecmpr/WVlY/yIh
-        If8YGBj/GBgY/xwcHP8xZj3/YXhh/7e2t/+OjYz/q6ic/5OOif+wran/09HP/5ZvUrTGgUL3bm5u/1dX
-        V/9LSkr/OTg4/zc2Nv9VVVX/hISE/7Kzs//T09T/x8fH/5+fn/+AgID/kZGQ/9/f3v92MgGryYVG+JKS
-        kv+enp//vr6//8nKzP/R0dL/19bV/9jV0//LyMb/u7m3/7e1tP/Dw8P/vb29/5qamv+8vLv/dzIBrNiV
-        Vfzv7+7/2NjY/9DR0f/a2tr/8PDw//Ly8v/r6+v/4uLi/9jY2P/Ozs7/t7e3/8PDxP/Ly8v/09PS/3o0
-        ALHYlFX79fX1//X19f/19fT/5ubl/9bW1v/Z2dn/yMjJ/7a3t//R0dL/zMzN/8fHx//Pz8//1tbV//Hx
-        8P96NACx2JRV+/X19f/19fX/9fX1//X19f/19fX/8/Py/+Li4f/b29r/6eno//Hx8P/19fT/9fX0//X1
-        9f/19fX/ejQAscBaCvu9WRb/vVkW/71ZFv+9WRb/vVkW/71ZFf+9WRX/vVkV/71ZFf+9WRX/vVkV/71Z
-        Ff+9WRX/vVgV/3o0ALHNbCCXz3Arls5uKJPNaySPzGggi8tlHIjJYhmFx2EYg8VgGILGYBiCx2EYhMpk
-        G4jHYRmWyWMalsllHZipVQ9n/wCsQf4ArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA
-        rEEAAKxBAACsQQAArEEAAKxBAACsQQ==
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/Liquesce/Liquesce.csproj b/Liquesce/Liquesce.csproj
index 6fa48cb..212d1d3 100644
--- a/Liquesce/Liquesce.csproj
+++ b/Liquesce/Liquesce.csproj
@@ -11,7 +11,8 @@
     <RootNamespace>Liquesce</RootNamespace>
     <AssemblyName>Liquesce</AssemblyName>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
     <SccProjectName>SAK</SccProjectName>
     <SccLocalPath>SAK</SccLocalPath>
@@ -88,62 +89,140 @@
     <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
     <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
   </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationManifest>app.manifest</ApplicationManifest>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="NLog">
       <HintPath>..\ThirdParty\NLog.dll</HintPath>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.DirectoryServices" />
     <Reference Include="System.Drawing" />
-    <Reference Include="System.ServiceModel" />
     <Reference Include="System.ServiceProcess" />
     <Reference Include="System.Windows.Forms" />
-    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase" />
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="AdvancedPropertiesDisplay.cs" />
-    <Compile Include="CurrentShares.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="CurrentShares.Designer.cs">
-      <DependentUpon>CurrentShares.cs</DependentUpon>
+    <Compile Include="..\LiquesceTray\WindowLocation.cs">
+      <Link>Shared\WindowLocation.cs</Link>
     </Compile>
-    <Compile Include="GridAdvancedSettings.cs">
+    <Compile Include="AdvancedPropertiesDisplay.cs" />
+    <Compile Include="TabMainForm.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Include="GridAdvancedSettings.Designer.cs">
-      <DependentUpon>GridAdvancedSettings.cs</DependentUpon>
+    <Compile Include="TabMainForm.Designer.cs">
+      <DependentUpon>TabMainForm.cs</DependentUpon>
     </Compile>
     <Compile Include="LogDisplay.cs" />
     <Compile Include="DragDropItem.cs" />
     <Compile Include="ExpectedDetailResult.cs" />
     <Compile Include="ExtractIcon.cs" />
-    <Compile Include="MainForm.cs">
-      <SubType>Form</SubType>
+    <Compile Include="Mounting\Edit.cs">
+      <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="MainForm.Designer.cs">
-      <DependentUpon>MainForm.cs</DependentUpon>
+    <Compile Include="Mounting\Edit.Designer.cs">
+      <DependentUpon>Edit.cs</DependentUpon>
     </Compile>
+    <Compile Include="Shared\FlickerFreeRichEditTextBox.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Shared\NumericUpDownTypeEditor.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="Shared\CommandLinkButton.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Shared\SplitContainerEx.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Tabs\ITab.cs" />
+    <Compile Include="Tabs\Logging.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Tabs\Logging.Designer.cs">
+      <DependentUpon>Logging.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Tabs\MountingPoints.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Tabs\MountingPoints.Designer.cs">
+      <DependentUpon>MountingPoints.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Tabs\Service.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Tabs\Service.Designer.cs">
+      <DependentUpon>Service.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Tabs\Welcome.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Tabs\Welcome.Designer.cs">
+      <DependentUpon>Welcome.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Tabs\CurrentShares.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Tabs\CurrentShares.Designer.cs">
+      <DependentUpon>CurrentShares.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TailForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="TailForm.Designer.cs">
+      <DependentUpon>TailForm.cs</DependentUpon>
+    </Compile>
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />
+    <None Include="app.manifest" />
     <None Include="ChangeLog.rtf" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <None Include="Tabs\CurrentShares.rtf" />
+    <None Include="Tabs\Welcome.rtf" />
   </ItemGroup>
   <ItemGroup>
-    <EmbeddedResource Include="CurrentShares.resx">
-      <DependentUpon>CurrentShares.cs</DependentUpon>
+    <EmbeddedResource Include="TabMainForm.resx">
+      <DependentUpon>TabMainForm.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="GridAdvancedSettings.resx">
-      <DependentUpon>GridAdvancedSettings.cs</DependentUpon>
+    <EmbeddedResource Include="Mounting\Edit.resx">
+      <DependentUpon>Edit.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="MainForm.resx">
-      <DependentUpon>MainForm.cs</DependentUpon>
-      <SubType>Designer</SubType>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Tabs\Logging.resx">
+      <DependentUpon>Logging.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Tabs\MountingPoints.resx">
+      <DependentUpon>MountingPoints.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Tabs\Service.resx">
+      <DependentUpon>Service.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Tabs\Welcome.resx">
+      <DependentUpon>Welcome.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Tabs\CurrentShares.resx">
+      <DependentUpon>CurrentShares.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TailForm.resx">
+      <DependentUpon>TailForm.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
@@ -174,15 +253,34 @@
       <Name>LiquesceFacade</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup />
+  <ItemGroup>
+    <COMReference Include="IMAPI2">
+      <Guid>{2735412F-7F64-5B0F-8F00-5D77AFBE261E}</Guid>
+      <VersionMajor>1</VersionMajor>
+      <VersionMinor>0</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>tlbimp</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+  </ItemGroup>
   <ItemGroup>
     <Content Include="Liquesce.ico" />
     <Content Include="Resources\Liquesce.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-Kontact.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-K-ppp.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-Nfs-unmount.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-Nfs-mount.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-K-cm-system.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-3floppy-mount.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-Log.ico" />
+    <None Include="Resources\Mart-Glaze-Log.ico" />
+    <None Include="Resources\Umut-Pulat-Tulliana-2-K-color-edit.ico" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
     <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UseGlobalSettings="False" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
+      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UseGlobalSettings="True" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
     </VisualStudio>
   </ProjectExtensions>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
diff --git a/Liquesce/LogDisplay.cs b/Liquesce/LogDisplay.cs
index dcf97d2..de8d054 100644
--- a/Liquesce/LogDisplay.cs
+++ b/Liquesce/LogDisplay.cs
@@ -1,41 +1,77 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LogDisplay.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2013 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
 using System;
 using System.Diagnostics;
 using System.IO;
-using System.Runtime.InteropServices;
 using System.Windows.Forms;
 using NLog;
 
 namespace Liquesce
 {
    /// <summary>
-   /// 
+   ///
    /// </summary>
    static public class DisplayLog
    {
       static private readonly Logger Log = LogManager.GetCurrentClassLogger();
 
+      public static string FindLogLocation(string logLocation)
+      {
+         return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
+                              logLocation);
+      }
+
+      static public string FindLogLocationViaOpen(string logLocation)
+      {
+         OpenFileDialog openFileDialog = new OpenFileDialog
+         {
+            Filter = "Log files (*.log)|*.log|Archive logs (*.*)|*.*",
+            FileName = "*.log",
+            FilterIndex = 2,
+            Title = "Select name to view contents",
+            InitialDirectory = FindLogLocation(logLocation)
+         };
+
+         return (openFileDialog.ShowDialog() == DialogResult.OK) ? openFileDialog.FileName : string.Empty;
+      }
+
       /// <summary>
-      /// 
+      ///
       /// </summary>
       static public void LogDisplay(string logLocation)
       {
          try
          {
-            OpenFileDialog openFileDialog = new OpenFileDialog
-                                               {
-                                                  InitialDirectory =
-                                                     Path.Combine(
-                                                        Environment.GetFolderPath(
-                                                           Environment.SpecialFolder.CommonApplicationData), logLocation),
-                                                  Filter = "Log files (*.log)|*.log|Archive logs (*.*)|*.*",
-                                                  FileName = "*.log",
-                                                  FilterIndex = 2,
-                                                  Title = "Select name to view contents"
-                                               };
-
-            if (openFileDialog.ShowDialog() == DialogResult.OK)
+            logLocation = FindLogLocationViaOpen(logLocation);
+            if (!string.IsNullOrEmpty(logLocation))
             {
-               Process word = Process.Start("Wordpad.exe", '"' + openFileDialog.FileName + '"');
+               Process word = Process.Start("Wordpad.exe", '"' + logLocation + '"');
                if (word != null)
                {
                   word.WaitForInputIdle();
diff --git a/Liquesce/MainForm.cs b/Liquesce/MainForm.cs
deleted file mode 100644
index b3b1024..0000000
--- a/Liquesce/MainForm.cs
+++ /dev/null
@@ -1,756 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.ServiceModel;
-using System.ServiceProcess;
-using System.Threading;
-using System.Windows.Forms;
-using LiquesceFacade;
-using NLog;
-
-namespace Liquesce
-{
-   public sealed partial class MainForm : Form
-   {
-      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-      private ConfigDetails cd = new ConfigDetails();
-      private bool isClosing;
-
-      public MainForm()
-      {
-         // Force use of Segou UI Font in Vista and above
-         // But this makes a mess of the layouts when they are autoscaled !!!
-         //if (SystemFonts.MessageBoxFont.Size >= 9)
-         //   Font = SystemFonts.MessageBoxFont;
-
-         InitializeComponent();
-         Icon icon = ExtractIcon.GetIconForFilename(Environment.GetFolderPath(Environment.SpecialFolder.MyComputer), true);
-         imageListUnits.Images.Add("MyComputer", icon.ToBitmap());
-         versionNumberToolStripMenuItem.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString();
-      }
-
-      private void MainForm_Shown(object sender, EventArgs e)
-      {
-         Enabled = false;
-         UseWaitCursor = true;
-         StartTree();
-         PopulatePoolSettings();
-         ServiceControllerStatus serviceStatus = ServiceControllerStatus.Stopped;
-         try
-         {
-            serviceStatus = serviceController1.Status;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("Service is probably not installed", ex);
-         }
-         if (serviceStatus != ServiceControllerStatus.Running)
-         {
-            currentSharesToolStripMenuItem.ToolTipText = commitToolStripMenuItem.ToolTipText = "Service is not running";
-            currentSharesToolStripMenuItem.Enabled = commitToolStripMenuItem.Enabled = false;
-         }
-         else
-         {
-            try
-            {
-               currentSharesToolStripMenuItem.Enabled = commitToolStripMenuItem.Enabled = true;
-               ChannelFactory<ILiquesce> factory = new ChannelFactory<ILiquesce>("LiquesceFacade");
-               ILiquesce remoteIF = factory.CreateChannel();
-               cd = remoteIF.ConfigDetails;
-            }
-            catch (Exception ex)
-            {
-               Log.ErrorException("Unable to attach to the service, even tho it is running", ex);
-               UseWaitCursor = false;
-               Enabled = true;
-               MessageBox.Show(this, ex.Message, "Has the firewall blocked the communications ?", MessageBoxButtons.OK,
-                               MessageBoxIcon.Stop);
-            }
-         }
-         InitialiseWith();
-         UseWaitCursor = false;
-         Enabled = true;
-      }
-
-      private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
-      {
-         isClosing = true;
-         FillExpectedLayoutWorker.CancelAsync();
-      }
-
-      private bool IsClosing
-      {
-         get { return isClosing; }
-      }
-
-      private void InitialiseWith()
-      {
-         if (!String.IsNullOrWhiteSpace(cd.DriveLetter))
-         {
-            // Add the drive letter back in as this would already have been removed
-            MountPoint.Items.Add(cd.DriveLetter);
-            MountPoint.Text = cd.DriveLetter;
-            if (cd.SourceLocations != null)
-               foreach (TreeNode tn in cd.SourceLocations.Select(sourceLocation => new TreeNode
-                                                                                      {
-                                                                                         Text = sourceLocation,
-                                                                                         ImageKey = sourceLocation,
-                                                                                         SelectedImageKey = sourceLocation,
-                                                                                         Name = sourceLocation
-                                                                                      }))
-               {
-                  mergeList.Nodes.Add(tn);
-               }
-            VolumeLabel.Text = cd.VolumeLabel;
-            RestartExpectedOutput();
-         }
-      }
-
-      private void PopulatePoolSettings()
-      {
-         string[] drives = Environment.GetLogicalDrives();
-         foreach (string dr in drives)
-         {
-            MountPoint.Items.Remove(dr.Remove(1));
-         }
-         MountPoint.Text = "N";
-      }
-
-      #region Methods to populate and drill down in the tree
-      // Code stolen from the http://frwingui.codeplex.com project
-      private void StartTree()
-      {
-         TreeNode tvwRoot;
-         // Code taken and adapted from http://msdn.microsoft.com/en-us/library/bb513869.aspx
-         try
-         {
-            Enabled = false;
-            UseWaitCursor = true;
-            driveAndDirTreeView.Nodes.Clear();
-
-            Log.Debug("Create the root node.");
-            tvwRoot = new TreeNode
-                         {
-                            Text = Environment.MachineName,
-                            ImageKey = "MyComputer",
-                            SelectedImageKey = "MyComputer"
-                         };
-            driveAndDirTreeView.Nodes.Add(tvwRoot);
-            Log.Debug("Now we need to add any children to the root node.");
-
-            Log.Debug("Start with drives if you have to search the entire computer.");
-            string[] drives = Environment.GetLogicalDrives();
-            foreach (string dr in drives)
-            {
-               Log.Debug(dr);
-               DriveInfo di = new DriveInfo(dr);
-
-               FillInDirectoryType(tvwRoot, di);
-            }
-
-            tvwRoot.Expand();
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("StartTree Threw: ", ex);
-         }
-         finally
-         {
-            Enabled = true;
-            UseWaitCursor = false;
-         }
-      }
-
-      private void FillInDirectoryType(TreeNode parentNode, DriveInfo di)
-      {
-         if (di != null)
-         {
-            if (((di.DriveType == DriveType.Fixed)
-                  || (di.DriveType == DriveType.Network)
-                  )
-               && (di.DriveFormat == "DOKAN")
-               )
-            {
-               Log.Info("Removing the existing DOKAN drive as this would cause confusion ! [{0}]", di.Name);
-               return;
-            }
-            SafelyAddIcon(di.Name);
-            string label;
-            try
-            {
-               label = (di.IsReady && !String.IsNullOrWhiteSpace(di.VolumeLabel)) ? di.VolumeLabel : di.DriveType.ToString();
-            }
-            catch
-            {
-               // The above throws a wobble e.g. if the CD_Rom does not have a disk in it
-               label = di.DriveType.ToString();
-            }
-            label += " (" + di.Name + ")";
-            TreeNode thisNode = new TreeNode
-                                   {
-                                      Text = label,
-                                      ImageKey = di.Name,
-                                      SelectedImageKey = di.Name,
-                                      Tag = di.RootDirectory
-                                   };
-            if (di.IsReady)
-               thisNode.Nodes.Add("DummyNode");
-            parentNode.Nodes.Add(thisNode);
-         }
-      }
-
-      private void WalkNextTreeLevel(TreeNode parentNode)
-      {
-         try
-         {
-            DirectoryInfo root = parentNode.Tag as DirectoryInfo;
-            if (root != null)
-            {
-               Log.Debug("// Find all the subdirectories under this directory.");
-               DirectoryInfo[] subDirs = root.GetDirectories();
-               // if (subDirs != null) // Apperently always true
-               {
-                  foreach (DirectoryInfo dirInfo in subDirs)
-                  {
-                     // Recursive call for each subdirectory.
-                     SafelyAddIcon(dirInfo.FullName);
-                     TreeNode tvwChild = new TreeNode
-                                            {
-                                               Text = dirInfo.Name,
-                                               ImageKey = dirInfo.FullName,
-                                               SelectedImageKey = dirInfo.FullName,
-                                               Tag = dirInfo
-                                            };
-
-                     Log.Debug("If this is a folder item and has children then add a place holder node.");
-                     try
-                     {
-                        DirectoryInfo[] subChildDirs = dirInfo.GetDirectories();
-                        if (/*(subChildDirs != null) // Apperently always true
-                            &&*/ (subChildDirs.Length > 0)
-                           )
-                           tvwChild.Nodes.Add("DummyNode");
-                     }
-                     catch (UnauthorizedAccessException uaex)
-                     {
-                        Log.InfoException("No Access to subdirs in " + tvwChild.Text, uaex);
-                     }
-                     parentNode.Nodes.Add(tvwChild);
-                  }
-               }
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("RecurseAddChildren has thrown:", ex);
-         }
-      }
-
-      private void driveAndDirTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
-      {
-         Enabled = false;
-         UseWaitCursor = true;
-         try
-         {
-            Log.Debug("Remove the placeholder node.");
-            DirectoryInfo root = e.Node.Tag as DirectoryInfo;
-            if (root != null)
-            {
-               e.Node.Nodes.Clear();
-               WalkNextTreeLevel(e.Node);
-            }
-            e.Cancel = false;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("BeforeExpand has thrown: ", ex);
-         }
-         finally
-         {
-            Enabled = true;
-            UseWaitCursor = false;
-         }
-      }
-      #endregion
-
-      #region DragAndDrop over to the merge list
-      private void driveAndDirTreeView_MouseDown(object sender, MouseEventArgs e)
-      {
-         if (e.Button == MouseButtons.Left)
-         {
-            // Get the node underneath the mouse.
-            TreeNode selected = driveAndDirTreeView.GetNodeAt(e.X, e.Y);
-            driveAndDirTreeView.SelectedNode = selected;
-
-            // Start the drag-and-drop operation with a cloned copy of the node.
-            if (selected != null)
-            {
-               DragDropItem ud = new DragDropItem(GetSelectedNodesPath(selected), DragDropItem.SourceType.Drive);
-               if (!String.IsNullOrEmpty(ud.Name))
-                  driveAndDirTreeView.DoDragDrop(ud, DragDropEffects.All);
-            }
-         }
-      }
-
-      private void mergeList_DragOver(object sender, DragEventArgs e)
-      {
-         // Drag and drop denied by default.
-         e.Effect = DragDropEffects.None;
-
-         // Is it a valid format?
-         DragDropItem ud = e.Data.GetData(typeof(DragDropItem)) as DragDropItem;
-         if (ud != null)
-         {
-            //we only ever want an entry in 1x in the list.  Remove any duplicates, so you can reorder from the filesystem treeview
-            TreeNode[] nodes = mergeList.Nodes.Find(ud.Name, false);
-            if (ud.Source == DragDropItem.SourceType.Drive)
-            {
-               if (nodes.Length < 1)
-                  e.Effect = DragDropEffects.Copy;
-            }
-            else
-            {
-               e.Effect = DragDropEffects.Copy;
-            }
-         }
-      }
-
-      private void mergeList_DragDrop(object sender, DragEventArgs e)
-      {
-         // Is it a valid format?
-         DragDropItem ud = e.Data.GetData(typeof(DragDropItem)) as DragDropItem;
-         if (ud != null)
-         {
-            Point newPoint = mergeList.PointToClient(new Point(e.X, e.Y));
-            TreeNode selected = mergeList.GetNodeAt(newPoint.X, newPoint.Y);
-            CheckDrop(mergeList, ud, selected);
-         }
-      }
-
-      private string GetSelectedNodesPath(TreeNode selected)
-      {
-         DirectoryInfo shNode = selected.Tag as DirectoryInfo;
-         Log.Debug("Now we need to add any children to the root node.");
-         string newPath = shNode != null ? shNode.FullName : selected.FullPath;
-         return newPath;
-      }
-
-      private void CheckDrop(TreeView targetTree, DragDropItem newPath, TreeNode selected)
-      {
-         // TODO: On Add check to make sure that the root (Or this) node have not already been covered.
-         if (!String.IsNullOrEmpty(newPath.Name))
-         {
-            TreeNode tn = new TreeNode
-            {
-               Text = newPath.Name,
-               ImageKey = newPath.Name,
-               SelectedImageKey = newPath.Name,
-               Name = newPath.Name
-            };
-
-            //no node below?  stick this at the bottom of the list, else put in before the one your over.
-            int index = (selected == null) ? targetTree.Nodes.Count - 1 : selected.Index;
-            //we only ever want an entry in 1x in the list.  Remove any duplicates, so you can reorder from the filesystem treeview
-            TreeNode[] nodes = targetTree.Nodes.Find(newPath.Name, false);
-            if (nodes.Length > 0)
-            {
-               if (nodes[0].Index < index)
-               {
-                  targetTree.Nodes.Insert(index + 1, tn);
-                  nodes[0].Remove();
-               }
-               else if (nodes[0].Index > index)
-               {
-                  targetTree.Nodes.Insert(index, tn);
-                  nodes[0].Remove();
-               }
-            }
-            else if (newPath.Source == DragDropItem.SourceType.Drive)
-            {
-               targetTree.Nodes.Insert(index, tn);
-            }
-            targetTree.SelectedNode = tn;
-            RestartExpectedOutput();
-         }
-      }
-
-      private void mergeListContextMenuItem_Click(object sender, EventArgs e)
-      {
-         mergeList.SelectedNode.Remove();
-         RestartExpectedOutput();
-      }
-
-      //right click menu for deleting items from mergelist
-      private void mergeList_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
-      {
-         if (e.Button == MouseButtons.Right)
-         {
-            mergeList.SelectedNode = e.Node;
-
-            if (mergeList.SelectedNode != null)
-            {
-               mergeList.ContextMenuStrip.Show(mergeList, e.Location);
-            }
-         }
-      }
-
-      //enable dragging for mergelist
-      private void mergeList_MouseDown(object sender, MouseEventArgs e)
-      {
-         if (e.Button == MouseButtons.Left)
-         {
-            // Get the node underneath the mouse.
-            TreeNode selected = mergeList.GetNodeAt(e.X, e.Y);
-            mergeList.SelectedNode = selected;
-
-            // Start the drag-and-drop operation with a cloned copy of the node.
-            if (selected != null)
-            {
-               DragDropItem ud = new DragDropItem(selected.Text, DragDropItem.SourceType.Merge);
-               mergeList.DoDragDrop(ud, DragDropEffects.All);
-            }
-         }
-      }
-
-      private void mergeList_KeyUp(object sender, KeyEventArgs e)
-      {
-         if (e.KeyCode != Keys.Delete)
-            return;
-         // Get the node underneath the mouse.
-         TreeNode selected = mergeList.SelectedNode;
-
-         if (selected != null)
-         {
-            mergeList.SelectedNode = null;
-            mergeList.Nodes.Remove(selected);
-            e.Handled = true;
-            RestartExpectedOutput();
-         }
-      }
-
-      #endregion
-
-      private void RestartExpectedOutput()
-      {
-         if (IsClosing)
-            return;
-         FillExpectedLayoutWorker.CancelAsync();
-         while (FillExpectedLayoutWorker.IsBusy)
-         {
-            Thread.Sleep(500);
-            Application.DoEvents();
-         }
-         ConfigDetails configDetails = new ConfigDetails
-                               {
-                                  DriveLetter = MountPoint.Text,
-                                  VolumeLabel = VolumeLabel.Text,
-                                  SourceLocations = new List<string>(mergeList.Nodes.Count)
-                               };
-         // if (mergeList.Nodes != null) // Apperently always true
-         foreach (TreeNode node in mergeList.Nodes)
-         {
-            configDetails.SourceLocations.Add(node.Text);
-         }
-         FillExpectedLayoutWorker.RunWorkerAsync(configDetails);
-      }
-
-
-      private void FillExpectedLayoutWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
-      {
-         SetProgressBarStyle(ProgressBarStyle.Continuous);
-      }
-
-      private void FillExpectedLayoutWorker_DoWork(object sender, DoWorkEventArgs e)
-      {
-         SetProgressBarStyle(ProgressBarStyle.Marquee);
-         ClearExpectedList();
-         ConfigDetails configDetails = e.Argument as ConfigDetails;
-         BackgroundWorker worker = sender as BackgroundWorker;
-         if ((configDetails == null)
-            || (worker == null)
-            )
-         {
-            Log.Error("Worker, or auguments are null, exiting.");
-            return;
-         }
-         TreeNode root = new TreeNode(configDetails.VolumeLabel + " (" + configDetails.DriveLetter + ")");
-         AddExpectedNode(null, root);
-         if (worker.CancellationPending
-            || IsClosing)
-            return;
-         WalkExpectedNextTreeLevel(root, configDetails.SourceLocations);
-      }
-
-
-      private void AddFiles(List<string> sourceLocations, string directoryPath, List<ExpectedDetailResult> allFiles)
-      {
-         try
-         {
-            DirectoryInfo dirInfo = new DirectoryInfo(directoryPath);
-            if (dirInfo.Exists)
-            {
-               FileSystemInfo[] fileSystemInfos = dirInfo.GetFileSystemInfos();
-               allFiles.AddRange(fileSystemInfos.Select(info2 => new ExpectedDetailResult
-                                                                    {
-                                                                       DisplayName = TrimAndAdd(sourceLocations, info2.FullName),
-                                                                       ActualFileLocation = info2.FullName
-                                                                    }));
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("AddFiles threw: ", ex);
-         }
-      }
-
-      private string TrimAndAdd(List<string> sourceLocations, string fullFilePath)
-      {
-         int index = sourceLocations.FindIndex(fullFilePath.StartsWith);
-         if (index >= 0)
-         {
-            string key = fullFilePath.Remove(0, sourceLocations[index].Length);
-            return key;
-         }
-         throw new ArgumentException("Unable to find BelongTo Path: " + fullFilePath, fullFilePath);
-      }
-
-
-      private delegate void AddExpecteddNodeCallBack(TreeNode parent, TreeNode child);
-      private void AddExpectedNode(TreeNode parent, TreeNode child)
-      {
-         if (expectedTreeView.InvokeRequired)
-         {
-            AddExpecteddNodeCallBack d = AddExpectedNode;
-            Invoke(d, new object[] { parent, child });
-         }
-         else
-         {
-            if (parent == null)
-               expectedTreeView.Nodes.Add(child);
-            else
-            {
-               parent.Nodes.Add(child);
-            }
-         }
-      }
-
-      delegate void SetProgressBarStyleCallback(ProgressBarStyle style);
-      private void SetProgressBarStyle(ProgressBarStyle style)
-      {
-         // InvokeRequired required compares the thread ID of the
-         // calling thread to the thread ID of the creating thread.
-         // If these threads are different, it returns true.
-         if (progressBar1.InvokeRequired)
-         {
-            SetProgressBarStyleCallback d = SetProgressBarStyle;
-            Invoke(d, new object[] { style });
-         }
-         else
-         {
-            progressBar1.Style = style;
-            expectedTreeView.Enabled = (style != ProgressBarStyle.Marquee);
-            UseWaitCursor = !Enabled;
-         }
-      }
-
-      private delegate void ClearExpectedListCallBack();
-      private void ClearExpectedList()
-      {
-         if (expectedTreeView.InvokeRequired)
-         {
-            ClearExpectedListCallBack d = ClearExpectedList;
-            Invoke(d);
-         }
-         else
-         {
-            expectedTreeView.Nodes.Clear();
-         }
-      }
-
-      private void expectedTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
-      {
-         try
-         {
-            SetProgressBarStyle(ProgressBarStyle.Marquee);
-            Log.Debug("Remove the placeholder node.");
-            string root = e.Node.Tag as string;
-            if (!String.IsNullOrEmpty(root))
-            {
-               e.Node.Nodes.Clear();
-               List<string> sourceLocations = new List<string>(mergeList.Nodes.Count);
-               sourceLocations.AddRange(from TreeNode node in mergeList.Nodes select node.Text);
-               WalkExpectedNextTreeLevel(e.Node, sourceLocations, root);
-            }
-            e.Cancel = false;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("BeforeExpand has thrown: ", ex);
-         }
-         finally
-         {
-            SetProgressBarStyle(ProgressBarStyle.Continuous);
-         }
-      }
-
-      private void WalkExpectedNextTreeLevel(TreeNode parent, List<string> sourceLocations)
-      {
-         WalkExpectedNextTreeLevel(parent, sourceLocations, String.Empty);
-      }
-
-      private void WalkExpectedNextTreeLevel(TreeNode parent, List<string> sourceLocations, string expectedStartLocation)
-      {
-         List<ExpectedDetailResult> allFiles = new List<ExpectedDetailResult>();
-         if (sourceLocations != null)
-            sourceLocations.ForEach(str2 => AddFiles(sourceLocations, str2 + expectedStartLocation, allFiles));
-         allFiles.Sort();
-         Log.Debug("Should now have a huge list of filePaths");
-         AddNextExpectedLevel(allFiles, parent);
-      }
-
-      private void AddNextExpectedLevel(List<ExpectedDetailResult> allFiles, TreeNode parent)
-      {
-         if (allFiles != null)
-            foreach (ExpectedDetailResult kvp in allFiles)
-            {
-               if (IsClosing)
-                  return;
-               if (Directory.Exists(kvp.ActualFileLocation))
-               {
-                  // This is a Dir, so make a new child
-                  string label = kvp.DisplayName;
-                  int index = kvp.DisplayName.LastIndexOf(Path.DirectorySeparatorChar);
-                  if (index > 0)
-                     label = kvp.DisplayName.Substring(index + 1);
-                  bool found = parent.Nodes.Cast<TreeNode>().Any(node => node.Text == label);
-                  if (!found)
-                  {
-                     TreeNode child = new TreeNode
-                                         {
-                                            Text = label,
-                                            Tag = kvp.DisplayName,
-                                            ToolTipText = kvp.ActualFileLocation
-                                         };
-                     child.Nodes.Add("DummyNode");
-                     AddExpectedNode(parent, child);
-                  }
-               }
-               else
-               {
-                  AddFileNodeCallBack d = AddFileNode;
-                  Invoke(d, new object[] { kvp, parent });
-               }
-            }
-      }
-
-      private delegate void AddFileNodeCallBack(ExpectedDetailResult kvp, TreeNode parent);
-
-      private void AddFileNode(ExpectedDetailResult kvp, TreeNode parent)
-      {
-         SafelyAddIcon(kvp.ActualFileLocation);
-         TreeNode child = new TreeNode
-                             {
-                                Text = Path.GetFileName(kvp.DisplayName),
-                                ImageKey = kvp.ActualFileLocation,
-                                ToolTipText = kvp.ActualFileLocation
-                             };
-         AddExpectedNode(parent, child);
-      }
-
-      private void SafelyAddIcon(string fullFileName)
-      {
-         try
-         {
-            if (!imageListUnits.Images.ContainsKey(fullFileName))
-            {
-               imageListUnits.Images.Add(fullFileName, ExtractIcon.GetIconForFilename(fullFileName, true).ToBitmap());
-            }
-         }
-         catch { }
-      }
-
-      private void commitToolStripMenuItem_Click(object sender, EventArgs e)
-      {
-         try
-         {
-            if (DialogResult.Yes == MessageBox.Show(this, "Performing this action will \"Remove the Mounted drive(s)\" on this machine.\n All open files will be forceably closed by this.\nDo you wish to continue ?", "Caution..", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
-            {
-               SetProgressBarStyle(ProgressBarStyle.Marquee);
-               cd.DriveLetter = MountPoint.Text;
-               cd.VolumeLabel = VolumeLabel.Text;
-               cd.SourceLocations = new List<string>(mergeList.Nodes.Count);
-               // if (mergeList.Nodes != null) // Apperently always true
-               foreach (TreeNode node in mergeList.Nodes)
-               {
-                  cd.SourceLocations.Add(node.Text);
-               }
-
-               ChannelFactory<ILiquesce> factory = new ChannelFactory<ILiquesce>("LiquesceFacade");
-               ILiquesce remoteIF = factory.CreateChannel();
-               Log.Info("Didn't go bang so stop");
-               remoteIF.Stop();
-               Log.Info("Send the new details");
-               remoteIF.ConfigDetails = cd;
-               Log.Info("Now start, may need a small sleep to allow things to settle");
-               Thread.Sleep(2500);
-               remoteIF.Start();
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("Unable to attach to the service, even tho it is running", ex);
-            MessageBox.Show(this, ex.Message, "Has the firewall blocked the communications ?", MessageBoxButtons.OK,
-                            MessageBoxIcon.Stop);
-         }
-         finally
-         {
-            SetProgressBarStyle(ProgressBarStyle.Continuous);
-         }
-      }
-
-      private void MountPoint_TextChanged(object sender, EventArgs e)
-      {
-         RestartExpectedOutput();
-      }
-
-      private void VolumeLabel_Validated(object sender, EventArgs e)
-      {
-         RestartExpectedOutput();
-      }
-
-      private void refreshExpectedToolStripMenuItem_Click(object sender, EventArgs e)
-      {
-         RestartExpectedOutput();
-      }
-
-      private void userLogViewToolStripMenuItem_Click(object sender, EventArgs e)
-      {
-         DisplayLog.LogDisplay(@"Liquesce\Logs");
-      }
-
-      private void serviceLogViewToolStripMenuItem_Click(object sender, EventArgs e)
-      {
-         DisplayLog.LogDisplay(@"LiquesceSvc\Logs");
-
-      }
-
-      private void globalConfigSettingsToolStripMenuItem_Click(object sender, EventArgs e)
-      {
-         GridAdvancedSettings advancedSettings = new GridAdvancedSettings { AdvancedConfigDetails = cd };
-         if (advancedSettings.ShowDialog(this) == DialogResult.OK)
-            cd = advancedSettings.AdvancedConfigDetails;
-      }
-
-      private void currentSharesToolStripMenuItem_Click(object sender, EventArgs e)
-      {
-         CurrentShares shareSettings = new CurrentShares { ShareDetails = cd };
-         if (shareSettings.ShowDialog(this) == DialogResult.OK)
-            cd = shareSettings.ShareDetails;
-      }
-
-   }
-}
diff --git a/Liquesce/MainForm.Designer.cs b/Liquesce/Mounting/Edit.Designer.cs
similarity index 52%
rename from Liquesce/MainForm.Designer.cs
rename to Liquesce/Mounting/Edit.Designer.cs
index 5c6df03..9649dff 100644
--- a/Liquesce/MainForm.Designer.cs
+++ b/Liquesce/Mounting/Edit.Designer.cs
@@ -1,13 +1,13 @@
-namespace Liquesce
+namespace Liquesce.Mounting
 {
-   sealed partial class MainForm
+   partial class Edit
    {
-      /// <summary>
+      /// <summary> 
       /// Required designer variable.
       /// </summary>
       private System.ComponentModel.IContainer components = null;
 
-      /// <summary>
+      /// <summary> 
       /// Clean up any resources being used.
       /// </summary>
       /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
@@ -20,48 +20,57 @@ protected override void Dispose(bool disposing)
          base.Dispose(disposing);
       }
 
-      #region Windows Form Designer generated code
+      #region Component Designer generated code
 
-      /// <summary>
-      /// Required method for Designer support - do not modify
+      /// <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));
-         this.splitContainer1 = new System.Windows.Forms.SplitContainer();
-         this.driveAndDirTreeView = new System.Windows.Forms.TreeView();
+         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Edit));
          this.imageListUnits = new System.Windows.Forms.ImageList(this.components);
-         this.label1 = new System.Windows.Forms.Label();
-         this.splitContainer2 = new System.Windows.Forms.SplitContainer();
-         this.splitContainer3 = new System.Windows.Forms.SplitContainer();
-         this.mergeList = new System.Windows.Forms.TreeView();
          this.mergeListContext = new System.Windows.Forms.ContextMenuStrip(this.components);
          this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.refreshExpected = new System.Windows.Forms.ContextMenuStrip(this.components);
+         this.refreshExpectedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.mergeListContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+         this.driveAndDirTreeView = new System.Windows.Forms.TreeView();
+         this.mergeList = new System.Windows.Forms.DataGridView();
+         this.groupBox4 = new System.Windows.Forms.GroupBox();
+         this.cmbAllocationMode = new System.Windows.Forms.ComboBox();
+         this.groupBox3 = new System.Windows.Forms.GroupBox();
+         this.numHoldOffBytes = new System.Windows.Forms.NumericUpDown();
          this.groupBox1 = new System.Windows.Forms.GroupBox();
          this.VolumeLabel = new System.Windows.Forms.TextBox();
-         this.MountPoint = new System.Windows.Forms.ComboBox();
+         this.groupBox2 = new System.Windows.Forms.GroupBox();
+         this.txtFolder = new System.Windows.Forms.TextBox();
+         this.lblFolder = new System.Windows.Forms.Label();
          this.label5 = new System.Windows.Forms.Label();
-         this.label2 = new System.Windows.Forms.Label();
+         this.MountPoint = new System.Windows.Forms.ComboBox();
          this.expectedTreeView = new System.Windows.Forms.TreeView();
-         this.refreshExpected = new System.Windows.Forms.ContextMenuStrip(this.components);
-         this.refreshExpectedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
          this.label3 = new System.Windows.Forms.Label();
-         this.progressBar1 = new System.Windows.Forms.ProgressBar();
-         this.mergeListContextMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.menuStrip1 = new System.Windows.Forms.MenuStrip();
-         this.commitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.logsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.serviceLogViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.userLogViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.advancedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.globalConfigSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.currentSharesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
          this.FillExpectedLayoutWorker = new System.ComponentModel.BackgroundWorker();
-         this.serviceController1 = new System.ServiceProcess.ServiceController();
-         this.versionNumberToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);
+         this.splitContainer1 = new Liquesce.SplitContainerEx();
+         this.label1 = new System.Windows.Forms.Label();
+         this.splitContainer2 = new Liquesce.SplitContainerEx();
+         this.splitContainer3 = new Liquesce.SplitContainerEx();
+         this.label2 = new System.Windows.Forms.Label();
+         this.progressBar1 = new System.Windows.Forms.ProgressBar();
+         this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn();
+         this.AsReadOnly = new System.Windows.Forms.DataGridViewCheckBoxColumn();
+         this.mergeListContext.SuspendLayout();
+         this.refreshExpected.SuspendLayout();
+         ((System.ComponentModel.ISupportInitialize)(this.mergeList)).BeginInit();
+         this.groupBox4.SuspendLayout();
+         this.groupBox3.SuspendLayout();
+         ((System.ComponentModel.ISupportInitialize)(this.numHoldOffBytes)).BeginInit();
+         this.groupBox1.SuspendLayout();
+         this.groupBox2.SuspendLayout();
+         ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).BeginInit();
          ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
          this.splitContainer1.Panel1.SuspendLayout();
          this.splitContainer1.Panel2.SuspendLayout();
@@ -74,30 +83,51 @@ private void InitializeComponent()
          this.splitContainer3.Panel1.SuspendLayout();
          this.splitContainer3.Panel2.SuspendLayout();
          this.splitContainer3.SuspendLayout();
-         this.mergeListContext.SuspendLayout();
-         this.groupBox1.SuspendLayout();
-         this.refreshExpected.SuspendLayout();
-         this.menuStrip1.SuspendLayout();
          this.SuspendLayout();
          // 
-         // splitContainer1
+         // imageListUnits
          // 
-         this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
-         this.splitContainer1.Location = new System.Drawing.Point(0, 24);
-         this.splitContainer1.Name = "splitContainer1";
+         this.imageListUnits.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
+         this.imageListUnits.ImageSize = new System.Drawing.Size(18, 18);
+         this.imageListUnits.TransparentColor = System.Drawing.Color.Transparent;
          // 
-         // splitContainer1.Panel1
+         // mergeListContext
          // 
-         this.splitContainer1.Panel1.Controls.Add(this.driveAndDirTreeView);
-         this.splitContainer1.Panel1.Controls.Add(this.label1);
+         this.mergeListContext.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.mergeListContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.deleteToolStripMenuItem});
+         this.mergeListContext.Name = "mergeListContext";
+         this.mergeListContext.Size = new System.Drawing.Size(135, 26);
+         this.mergeListContext.Click += new System.EventHandler(this.mergeListContextMenuItem_Click);
          // 
-         // splitContainer1.Panel2
+         // deleteToolStripMenuItem
          // 
-         this.splitContainer1.Panel2.Controls.Add(this.splitContainer2);
-         this.splitContainer1.Size = new System.Drawing.Size(770, 465);
-         this.splitContainer1.SplitterDistance = 256;
-         this.splitContainer1.SplitterWidth = 5;
-         this.splitContainer1.TabIndex = 0;
+         this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
+         this.deleteToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete;
+         this.deleteToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
+         this.deleteToolStripMenuItem.Text = "&Delete";
+         this.deleteToolStripMenuItem.ToolTipText = "Delete the current selected item.";
+         // 
+         // refreshExpected
+         // 
+         this.refreshExpected.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.refreshExpected.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.refreshExpectedToolStripMenuItem});
+         this.refreshExpected.Name = "refreshExpected";
+         this.refreshExpected.Size = new System.Drawing.Size(192, 26);
+         // 
+         // refreshExpectedToolStripMenuItem
+         // 
+         this.refreshExpectedToolStripMenuItem.Name = "refreshExpectedToolStripMenuItem";
+         this.refreshExpectedToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F5;
+         this.refreshExpectedToolStripMenuItem.Size = new System.Drawing.Size(191, 22);
+         this.refreshExpectedToolStripMenuItem.Text = "&Refresh Expected";
+         this.refreshExpectedToolStripMenuItem.Click += new System.EventHandler(this.refreshExpectedToolStripMenuItem_Click);
+         // 
+         // mergeListContextMenuItem
+         // 
+         this.mergeListContextMenuItem.Name = "mergeListContextMenuItem";
+         this.mergeListContextMenuItem.Size = new System.Drawing.Size(32, 19);
          // 
          // driveAndDirTreeView
          // 
@@ -108,137 +138,200 @@ private void InitializeComponent()
          this.driveAndDirTreeView.Location = new System.Drawing.Point(0, 17);
          this.driveAndDirTreeView.Name = "driveAndDirTreeView";
          this.driveAndDirTreeView.SelectedImageIndex = 0;
-         this.driveAndDirTreeView.Size = new System.Drawing.Size(256, 448);
-         this.driveAndDirTreeView.TabIndex = 0;
+         this.driveAndDirTreeView.Size = new System.Drawing.Size(198, 458);
+         this.driveAndDirTreeView.TabIndex = 1;
          this.toolTip1.SetToolTip(this.driveAndDirTreeView, "Drag from here and drop in the middle");
          this.driveAndDirTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.driveAndDirTreeView_BeforeExpand);
          this.driveAndDirTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.driveAndDirTreeView_MouseDown);
          // 
-         // imageListUnits
-         // 
-         this.imageListUnits.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
-         this.imageListUnits.ImageSize = new System.Drawing.Size(16, 16);
-         this.imageListUnits.TransparentColor = System.Drawing.Color.Transparent;
-         // 
-         // label1
-         // 
-         this.label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
-         this.label1.Dock = System.Windows.Forms.DockStyle.Top;
-         this.label1.Location = new System.Drawing.Point(0, 0);
-         this.label1.Name = "label1";
-         this.label1.Size = new System.Drawing.Size(256, 17);
-         this.label1.TabIndex = 1;
-         this.label1.Text = "This file system:-";
-         // 
-         // splitContainer2
-         // 
-         this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
-         this.splitContainer2.Location = new System.Drawing.Point(0, 0);
-         this.splitContainer2.Name = "splitContainer2";
-         // 
-         // splitContainer2.Panel1
-         // 
-         this.splitContainer2.Panel1.Controls.Add(this.splitContainer3);
-         this.splitContainer2.Panel1.Controls.Add(this.label2);
-         // 
-         // splitContainer2.Panel2
-         // 
-         this.splitContainer2.Panel2.Controls.Add(this.expectedTreeView);
-         this.splitContainer2.Panel2.Controls.Add(this.label3);
-         this.splitContainer2.Panel2.Controls.Add(this.progressBar1);
-         this.splitContainer2.Size = new System.Drawing.Size(509, 465);
-         this.splitContainer2.SplitterDistance = 247;
-         this.splitContainer2.SplitterWidth = 5;
-         this.splitContainer2.TabIndex = 0;
-         // 
-         // splitContainer3
-         // 
-         this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill;
-         this.splitContainer3.Location = new System.Drawing.Point(0, 17);
-         this.splitContainer3.Name = "splitContainer3";
-         this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal;
-         // 
-         // splitContainer3.Panel1
-         // 
-         this.splitContainer3.Panel1.Controls.Add(this.mergeList);
-         // 
-         // splitContainer3.Panel2
-         // 
-         this.splitContainer3.Panel2.Controls.Add(this.groupBox1);
-         this.splitContainer3.Panel2.Controls.Add(this.MountPoint);
-         this.splitContainer3.Panel2.Controls.Add(this.label5);
-         this.splitContainer3.Size = new System.Drawing.Size(247, 448);
-         this.splitContainer3.SplitterDistance = 365;
-         this.splitContainer3.TabIndex = 7;
-         // 
          // mergeList
          // 
          this.mergeList.AllowDrop = true;
+         this.mergeList.AllowUserToAddRows = false;
+         this.mergeList.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
+         this.mergeList.BackgroundColor = System.Drawing.SystemColors.Window;
+         this.mergeList.BorderStyle = System.Windows.Forms.BorderStyle.None;
+         this.mergeList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+         this.mergeList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.Source,
+            this.AsReadOnly});
          this.mergeList.ContextMenuStrip = this.mergeListContext;
          this.mergeList.Dock = System.Windows.Forms.DockStyle.Fill;
-         this.mergeList.FullRowSelect = true;
-         this.mergeList.ImageIndex = 0;
-         this.mergeList.ImageList = this.imageListUnits;
-         this.mergeList.ItemHeight = 14;
          this.mergeList.Location = new System.Drawing.Point(0, 0);
+         this.mergeList.MultiSelect = false;
          this.mergeList.Name = "mergeList";
-         this.mergeList.SelectedImageIndex = 0;
-         this.mergeList.Size = new System.Drawing.Size(247, 365);
-         this.mergeList.TabIndex = 3;
-         this.toolTip1.SetToolTip(this.mergeList, "Drop the Entries here");
-         this.mergeList.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.mergeList_NodeMouseClick);
-         this.mergeList.DragDrop += new System.Windows.Forms.DragEventHandler(this.mergeList_DragDrop);
-         this.mergeList.DragOver += new System.Windows.Forms.DragEventHandler(this.mergeList_DragOver);
+         this.mergeList.RowHeadersVisible = false;
+         this.mergeList.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
+         this.mergeList.Size = new System.Drawing.Size(181, 246);
+         this.mergeList.TabIndex = 1;
+         this.toolTip1.SetToolTip(this.mergeList, "Use mouse to change order and drop new items.");
+         this.mergeList.CellMouseDown += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.mergeList_MouseCellDown);
+         this.mergeList.DragDrop += new System.Windows.Forms.DragEventHandler(this.dataGridView1_DragDrop);
+         this.mergeList.DragOver += new System.Windows.Forms.DragEventHandler(this.dataGridView1_DragOver);
          this.mergeList.KeyUp += new System.Windows.Forms.KeyEventHandler(this.mergeList_KeyUp);
-         this.mergeList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.mergeList_MouseDown);
-         // 
-         // mergeListContext
-         // 
-         this.mergeListContext.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.mergeListContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.deleteToolStripMenuItem});
-         this.mergeListContext.Name = "mergeListContext";
-         this.mergeListContext.Size = new System.Drawing.Size(147, 26);
-         this.mergeListContext.Click += new System.EventHandler(this.mergeListContextMenuItem_Click);
-         // 
-         // deleteToolStripMenuItem
-         // 
-         this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
-         this.deleteToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete;
-         this.deleteToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
-         this.deleteToolStripMenuItem.Text = "&Delete";
-         this.deleteToolStripMenuItem.ToolTipText = "Delete the current selected item.";
+         this.mergeList.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dataGridView1_MouseDown);
+         // 
+         // groupBox4
+         // 
+         this.groupBox4.Controls.Add(this.cmbAllocationMode);
+         this.groupBox4.Dock = System.Windows.Forms.DockStyle.Bottom;
+         this.groupBox4.Location = new System.Drawing.Point(0, 128);
+         this.groupBox4.Margin = new System.Windows.Forms.Padding(0);
+         this.groupBox4.Name = "groupBox4";
+         this.groupBox4.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0);
+         this.groupBox4.Size = new System.Drawing.Size(181, 40);
+         this.groupBox4.TabIndex = 3;
+         this.groupBox4.TabStop = false;
+         this.groupBox4.Text = "File &Allocation Mode:";
+         this.toolTip1.SetToolTip(this.groupBox4, resources.GetString("groupBox4.ToolTip"));
+         // 
+         // cmbAllocationMode
+         // 
+         this.cmbAllocationMode.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+         this.cmbAllocationMode.FormattingEnabled = true;
+         this.cmbAllocationMode.Items.AddRange(new object[] {
+            "Folder",
+            "Priority",
+            "Balanced"});
+         this.cmbAllocationMode.Location = new System.Drawing.Point(7, 14);
+         this.cmbAllocationMode.Name = "cmbAllocationMode";
+         this.cmbAllocationMode.Size = new System.Drawing.Size(168, 22);
+         this.cmbAllocationMode.TabIndex = 0;
+         this.toolTip1.SetToolTip(this.cmbAllocationMode, resources.GetString("cmbAllocationMode.ToolTip"));
+         this.cmbAllocationMode.SelectedValueChanged += new System.EventHandler(this.cmbAllocationMode_SelectedValueChanged);
+         // 
+         // groupBox3
+         // 
+         this.groupBox3.Controls.Add(this.numHoldOffBytes);
+         this.groupBox3.Dock = System.Windows.Forms.DockStyle.Bottom;
+         this.groupBox3.Location = new System.Drawing.Point(0, 168);
+         this.groupBox3.Margin = new System.Windows.Forms.Padding(0);
+         this.groupBox3.Name = "groupBox3";
+         this.groupBox3.Padding = new System.Windows.Forms.Padding(0, 2, 0, 0);
+         this.groupBox3.Size = new System.Drawing.Size(181, 38);
+         this.groupBox3.TabIndex = 2;
+         this.groupBox3.TabStop = false;
+         this.groupBox3.Text = "Hold &Off Size (MBytes):";
+         this.toolTip1.SetToolTip(this.groupBox3, "Number of free MegaBytes to leave, before attempting to use another drive to writ" +
+        "e to.\r\nUsed in Priority and Folder modes.\r\n\r\n");
+         // 
+         // numHoldOffBytes
+         // 
+         this.numHoldOffBytes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+         this.numHoldOffBytes.Increment = new decimal(new int[] {
+            1024,
+            0,
+            0,
+            0});
+         this.numHoldOffBytes.Location = new System.Drawing.Point(7, 14);
+         this.numHoldOffBytes.Maximum = new decimal(new int[] {
+            1024000,
+            0,
+            0,
+            0});
+         this.numHoldOffBytes.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+         this.numHoldOffBytes.Name = "numHoldOffBytes";
+         this.numHoldOffBytes.Size = new System.Drawing.Size(167, 22);
+         this.numHoldOffBytes.TabIndex = 0;
+         this.numHoldOffBytes.ThousandsSeparator = true;
+         this.toolTip1.SetToolTip(this.numHoldOffBytes, "Number of free MegaBytes to leave, before attempting to use another drive to writ" +
+        "e to.\r\nUsed in Priority and Folder modes.");
+         this.numHoldOffBytes.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
          // 
          // groupBox1
          // 
-         this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-                     | System.Windows.Forms.AnchorStyles.Right)));
          this.groupBox1.Controls.Add(this.VolumeLabel);
-         this.groupBox1.Location = new System.Drawing.Point(2, 35);
+         this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+         this.groupBox1.Location = new System.Drawing.Point(0, 79);
          this.groupBox1.Margin = new System.Windows.Forms.Padding(0);
          this.groupBox1.Name = "groupBox1";
-         this.groupBox1.Size = new System.Drawing.Size(247, 44);
-         this.groupBox1.TabIndex = 4;
+         this.groupBox1.Size = new System.Drawing.Size(181, 44);
+         this.groupBox1.TabIndex = 1;
          this.groupBox1.TabStop = false;
          this.groupBox1.Text = "&Volume Label :";
+         this.toolTip1.SetToolTip(this.groupBox1, "Label that will be visible in Windows explorer");
          // 
          // VolumeLabel
          // 
+         this.VolumeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
          this.VolumeLabel.Location = new System.Drawing.Point(7, 18);
          this.VolumeLabel.MaxLength = 32;
          this.VolumeLabel.Name = "VolumeLabel";
-         this.VolumeLabel.Size = new System.Drawing.Size(234, 22);
+         this.VolumeLabel.Size = new System.Drawing.Size(168, 22);
          this.VolumeLabel.TabIndex = 0;
          this.toolTip1.SetToolTip(this.VolumeLabel, "Label that will be visible in Windows explorer");
          this.VolumeLabel.Validated += new System.EventHandler(this.VolumeLabel_Validated);
          // 
+         // groupBox2
+         // 
+         this.groupBox2.Controls.Add(this.txtFolder);
+         this.groupBox2.Controls.Add(this.lblFolder);
+         this.groupBox2.Controls.Add(this.label5);
+         this.groupBox2.Controls.Add(this.MountPoint);
+         this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top;
+         this.groupBox2.Location = new System.Drawing.Point(0, 0);
+         this.groupBox2.Name = "groupBox2";
+         this.groupBox2.Size = new System.Drawing.Size(181, 79);
+         this.groupBox2.TabIndex = 0;
+         this.groupBox2.TabStop = false;
+         this.groupBox2.Text = "Drive Mounting:";
+         this.toolTip1.SetToolTip(this.groupBox2, "Either via Letter or Folder");
+         // 
+         // txtFolder
+         // 
+         this.txtFolder.AllowDrop = true;
+         this.txtFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+         this.txtFolder.Location = new System.Drawing.Point(56, 49);
+         this.txtFolder.Name = "txtFolder";
+         this.txtFolder.Size = new System.Drawing.Size(118, 22);
+         this.txtFolder.TabIndex = 3;
+         this.toolTip1.SetToolTip(this.txtFolder, "NTFS folder mount point.\r\nWill override the above \"Drive Letter\".");
+         this.txtFolder.TextChanged += new System.EventHandler(this.txtFolder_TextChanged);
+         this.txtFolder.DragDrop += new System.Windows.Forms.DragEventHandler(this.txtFolder_DragDrop);
+         this.txtFolder.DragOver += new System.Windows.Forms.DragEventHandler(this.txtFolder_DragOver);
+         // 
+         // lblFolder
+         // 
+         this.lblFolder.AutoSize = true;
+         this.lblFolder.Location = new System.Drawing.Point(7, 52);
+         this.lblFolder.Name = "lblFolder";
+         this.lblFolder.Size = new System.Drawing.Size(44, 14);
+         this.lblFolder.TabIndex = 2;
+         this.lblFolder.Text = "&Folder:";
+         this.toolTip1.SetToolTip(this.lblFolder, "NTFS folder mount point.\r\nWill override the above \"Drive Letter\".");
+         // 
+         // label5
+         // 
+         this.label5.AutoSize = true;
+         this.label5.Location = new System.Drawing.Point(6, 24);
+         this.label5.Name = "label5";
+         this.label5.Size = new System.Drawing.Size(45, 14);
+         this.label5.TabIndex = 0;
+         this.label5.Text = "&Letter:";
+         this.toolTip1.SetToolTip(this.label5, "Drive letter to be used for the new volume");
+         // 
          // MountPoint
          // 
-         this.MountPoint.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                     | System.Windows.Forms.AnchorStyles.Right)));
+         this.MountPoint.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
          this.MountPoint.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
          this.MountPoint.FormattingEnabled = true;
          this.MountPoint.Items.AddRange(new object[] {
+            "A",
+            "B",
+            "C",
             "D",
             "E",
             "F",
@@ -262,33 +355,14 @@ private void InitializeComponent()
             "X",
             "Y",
             "Z"});
-         this.MountPoint.Location = new System.Drawing.Point(87, 6);
+         this.MountPoint.Location = new System.Drawing.Point(57, 21);
          this.MountPoint.Name = "MountPoint";
-         this.MountPoint.Size = new System.Drawing.Size(154, 22);
+         this.MountPoint.Size = new System.Drawing.Size(118, 22);
          this.MountPoint.Sorted = true;
-         this.MountPoint.TabIndex = 3;
+         this.MountPoint.TabIndex = 1;
          this.toolTip1.SetToolTip(this.MountPoint, "Drive letter to be used for the new volume");
          this.MountPoint.TextChanged += new System.EventHandler(this.MountPoint_TextChanged);
          // 
-         // label5
-         // 
-         this.label5.AutoSize = true;
-         this.label5.Location = new System.Drawing.Point(4, 9);
-         this.label5.Name = "label5";
-         this.label5.Size = new System.Drawing.Size(77, 14);
-         this.label5.TabIndex = 2;
-         this.label5.Text = "Drive &Mount:";
-         // 
-         // label2
-         // 
-         this.label2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
-         this.label2.Dock = System.Windows.Forms.DockStyle.Top;
-         this.label2.Location = new System.Drawing.Point(0, 0);
-         this.label2.Name = "label2";
-         this.label2.Size = new System.Drawing.Size(247, 17);
-         this.label2.TabIndex = 2;
-         this.label2.Text = "Merge points:-";
-         // 
          // expectedTreeView
          // 
          this.expectedTreeView.ContextMenuStrip = this.refreshExpected;
@@ -300,170 +374,168 @@ private void InitializeComponent()
          this.expectedTreeView.Name = "expectedTreeView";
          this.expectedTreeView.SelectedImageIndex = 0;
          this.expectedTreeView.ShowNodeToolTips = true;
-         this.expectedTreeView.Size = new System.Drawing.Size(257, 425);
-         this.expectedTreeView.TabIndex = 0;
+         this.expectedTreeView.Size = new System.Drawing.Size(213, 435);
+         this.expectedTreeView.TabIndex = 1;
          this.toolTip1.SetToolTip(this.expectedTreeView, "Expand to see if any duplicates have been found");
          this.expectedTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.expectedTreeView_BeforeExpand);
          // 
-         // refreshExpected
-         // 
-         this.refreshExpected.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.refreshExpected.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.refreshExpectedToolStripMenuItem});
-         this.refreshExpected.Name = "refreshExpected";
-         this.refreshExpected.Size = new System.Drawing.Size(204, 26);
-         // 
-         // refreshExpectedToolStripMenuItem
-         // 
-         this.refreshExpectedToolStripMenuItem.Name = "refreshExpectedToolStripMenuItem";
-         this.refreshExpectedToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F5;
-         this.refreshExpectedToolStripMenuItem.Size = new System.Drawing.Size(203, 22);
-         this.refreshExpectedToolStripMenuItem.Text = "&Refresh Expected";
-         this.refreshExpectedToolStripMenuItem.Click += new System.EventHandler(this.refreshExpectedToolStripMenuItem_Click);
-         // 
          // label3
          // 
          this.label3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
          this.label3.Dock = System.Windows.Forms.DockStyle.Top;
          this.label3.Location = new System.Drawing.Point(0, 0);
          this.label3.Name = "label3";
-         this.label3.Size = new System.Drawing.Size(257, 17);
-         this.label3.TabIndex = 2;
-         this.label3.Text = "Expected layout :-";
+         this.label3.Size = new System.Drawing.Size(213, 17);
+         this.label3.TabIndex = 0;
+         this.label3.Text = "&Merged layout :-";
+         this.toolTip1.SetToolTip(this.label3, "Look for duplicates to avoid collisions later on");
+         // 
+         // FillExpectedLayoutWorker
+         // 
+         this.FillExpectedLayoutWorker.WorkerReportsProgress = true;
+         this.FillExpectedLayoutWorker.WorkerSupportsCancellation = true;
+         this.FillExpectedLayoutWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.FillExpectedLayoutWorker_DoWork);
+         this.FillExpectedLayoutWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.FillExpectedLayoutWorker_RunWorkerCompleted);
+         // 
+         // errorProvider1
+         // 
+         this.errorProvider1.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.AlwaysBlink;
+         this.errorProvider1.ContainerControl = this;
+         // 
+         // splitContainer1
+         // 
+         this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+         this.splitContainer1.Name = "splitContainer1";
+         // 
+         // splitContainer1.Panel1
+         // 
+         this.splitContainer1.Panel1.Controls.Add(this.driveAndDirTreeView);
+         this.splitContainer1.Panel1.Controls.Add(this.label1);
+         // 
+         // splitContainer1.Panel2
+         // 
+         this.splitContainer1.Panel2.Controls.Add(this.splitContainer2);
+         this.splitContainer1.Size = new System.Drawing.Size(600, 475);
+         this.splitContainer1.SplitterDistance = 198;
+         this.splitContainer1.SplitterWidth = 4;
+         this.splitContainer1.TabIndex = 0;
+         // 
+         // label1
+         // 
+         this.label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+         this.label1.Dock = System.Windows.Forms.DockStyle.Top;
+         this.label1.Location = new System.Drawing.Point(0, 0);
+         this.label1.Name = "label1";
+         this.label1.Size = new System.Drawing.Size(198, 17);
+         this.label1.TabIndex = 0;
+         this.label1.Text = "&Host file system:-";
+         // 
+         // splitContainer2
+         // 
+         this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.splitContainer2.Location = new System.Drawing.Point(0, 0);
+         this.splitContainer2.Name = "splitContainer2";
+         // 
+         // splitContainer2.Panel1
+         // 
+         this.splitContainer2.Panel1.Controls.Add(this.splitContainer3);
+         this.splitContainer2.Panel1.Controls.Add(this.label2);
+         // 
+         // splitContainer2.Panel2
+         // 
+         this.splitContainer2.Panel2.Controls.Add(this.expectedTreeView);
+         this.splitContainer2.Panel2.Controls.Add(this.label3);
+         this.splitContainer2.Panel2.Controls.Add(this.progressBar1);
+         this.splitContainer2.Size = new System.Drawing.Size(398, 475);
+         this.splitContainer2.SplitterDistance = 181;
+         this.splitContainer2.SplitterWidth = 4;
+         this.splitContainer2.TabIndex = 0;
+         // 
+         // splitContainer3
+         // 
+         this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.splitContainer3.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+         this.splitContainer3.Location = new System.Drawing.Point(0, 17);
+         this.splitContainer3.Name = "splitContainer3";
+         this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal;
+         // 
+         // splitContainer3.Panel1
+         // 
+         this.splitContainer3.Panel1.Controls.Add(this.mergeList);
+         // 
+         // splitContainer3.Panel2
+         // 
+         this.splitContainer3.Panel2.Controls.Add(this.groupBox4);
+         this.splitContainer3.Panel2.Controls.Add(this.groupBox3);
+         this.splitContainer3.Panel2.Controls.Add(this.groupBox1);
+         this.splitContainer3.Panel2.Controls.Add(this.groupBox2);
+         this.splitContainer3.Panel2.Padding = new System.Windows.Forms.Padding(0, 0, 0, 2);
+         this.splitContainer3.Size = new System.Drawing.Size(181, 458);
+         this.splitContainer3.SplitterDistance = 246;
+         this.splitContainer3.SplitterWidth = 4;
+         this.splitContainer3.TabIndex = 7;
+         // 
+         // label2
+         // 
+         this.label2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+         this.label2.Dock = System.Windows.Forms.DockStyle.Top;
+         this.label2.Location = new System.Drawing.Point(0, 0);
+         this.label2.Name = "label2";
+         this.label2.Size = new System.Drawing.Size(181, 17);
+         this.label2.TabIndex = 0;
+         this.label2.Text = "&Source folders:-";
          // 
          // progressBar1
          // 
          this.progressBar1.Dock = System.Windows.Forms.DockStyle.Bottom;
          this.progressBar1.ForeColor = System.Drawing.Color.LawnGreen;
-         this.progressBar1.Location = new System.Drawing.Point(0, 442);
+         this.progressBar1.Location = new System.Drawing.Point(0, 452);
          this.progressBar1.Name = "progressBar1";
-         this.progressBar1.Size = new System.Drawing.Size(257, 23);
+         this.progressBar1.Size = new System.Drawing.Size(213, 23);
          this.progressBar1.Step = 5;
          this.progressBar1.TabIndex = 4;
          // 
-         // mergeListContextMenuItem
+         // Source
          // 
-         this.mergeListContextMenuItem.Name = "mergeListContextMenuItem";
-         this.mergeListContextMenuItem.Size = new System.Drawing.Size(32, 19);
+         this.Source.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+         this.Source.FillWeight = 60F;
+         this.Source.HeaderText = "Source";
+         this.Source.Name = "Source";
+         this.Source.ReadOnly = true;
+         this.Source.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
          // 
-         // menuStrip1
-         // 
-         this.menuStrip1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.commitToolStripMenuItem,
-            this.logsToolStripMenuItem,
-            this.advancedToolStripMenuItem,
-            this.versionNumberToolStripMenuItem});
-         this.menuStrip1.Location = new System.Drawing.Point(0, 0);
-         this.menuStrip1.Name = "menuStrip1";
-         this.menuStrip1.ShowItemToolTips = true;
-         this.menuStrip1.Size = new System.Drawing.Size(770, 24);
-         this.menuStrip1.TabIndex = 5;
-         this.menuStrip1.Text = "menuStrip1";
-         // 
-         // commitToolStripMenuItem
-         // 
-         this.commitToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
-         this.commitToolStripMenuItem.Enabled = false;
-         this.commitToolStripMenuItem.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.commitToolStripMenuItem.Name = "commitToolStripMenuItem";
-         this.commitToolStripMenuItem.Size = new System.Drawing.Size(123, 20);
-         this.commitToolStripMenuItem.Text = "&Send Configuration";
-         this.commitToolStripMenuItem.ToolTipText = "Send / Commit the stored information to the service";
-         this.commitToolStripMenuItem.Click += new System.EventHandler(this.commitToolStripMenuItem_Click);
-         // 
-         // logsToolStripMenuItem
-         // 
-         this.logsToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
-         this.logsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.serviceLogViewToolStripMenuItem,
-            this.userLogViewToolStripMenuItem});
-         this.logsToolStripMenuItem.Name = "logsToolStripMenuItem";
-         this.logsToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
-         this.logsToolStripMenuItem.Text = "&Logs";
-         // 
-         // serviceLogViewToolStripMenuItem
-         // 
-         this.serviceLogViewToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
-         this.serviceLogViewToolStripMenuItem.Name = "serviceLogViewToolStripMenuItem";
-         this.serviceLogViewToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
-         this.serviceLogViewToolStripMenuItem.Text = "&Service Log View...";
-         this.serviceLogViewToolStripMenuItem.Click += new System.EventHandler(this.serviceLogViewToolStripMenuItem_Click);
-         // 
-         // userLogViewToolStripMenuItem
-         // 
-         this.userLogViewToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
-         this.userLogViewToolStripMenuItem.Name = "userLogViewToolStripMenuItem";
-         this.userLogViewToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
-         this.userLogViewToolStripMenuItem.Text = "&User Log View...";
-         this.userLogViewToolStripMenuItem.Click += new System.EventHandler(this.userLogViewToolStripMenuItem_Click);
-         // 
-         // advancedToolStripMenuItem
-         // 
-         this.advancedToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
-         this.advancedToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.globalConfigSettingsToolStripMenuItem,
-            this.currentSharesToolStripMenuItem});
-         this.advancedToolStripMenuItem.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem";
-         this.advancedToolStripMenuItem.Size = new System.Drawing.Size(73, 20);
-         this.advancedToolStripMenuItem.Text = "&Advanced";
-         this.advancedToolStripMenuItem.ToolTipText = "Advanced options to aid in fault finding and optimisation";
-         // 
-         // globalConfigSettingsToolStripMenuItem
-         // 
-         this.globalConfigSettingsToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
-         this.globalConfigSettingsToolStripMenuItem.Name = "globalConfigSettingsToolStripMenuItem";
-         this.globalConfigSettingsToolStripMenuItem.Size = new System.Drawing.Size(217, 22);
-         this.globalConfigSettingsToolStripMenuItem.Text = "&Global Config Settings...";
-         this.globalConfigSettingsToolStripMenuItem.ToolTipText = "Access to the settings that control access to the OS and the Dokan Driver";
-         this.globalConfigSettingsToolStripMenuItem.Click += new System.EventHandler(this.globalConfigSettingsToolStripMenuItem_Click);
-         // 
-         // currentSharesToolStripMenuItem
-         // 
-         this.currentSharesToolStripMenuItem.Enabled = false;
-         this.currentSharesToolStripMenuItem.Name = "currentSharesToolStripMenuItem";
-         this.currentSharesToolStripMenuItem.Size = new System.Drawing.Size(217, 22);
-         this.currentSharesToolStripMenuItem.Text = "&Current Shares...";
-         this.currentSharesToolStripMenuItem.ToolTipText = "Requires this to be running at the administrator level";
-         this.currentSharesToolStripMenuItem.Click += new System.EventHandler(this.currentSharesToolStripMenuItem_Click);
+         // AsReadOnly
          // 
-         // FillExpectedLayoutWorker
+         this.AsReadOnly.FillWeight = 20F;
+         this.AsReadOnly.HeaderText = "Read Only";
+         this.AsReadOnly.Name = "AsReadOnly";
+         this.AsReadOnly.ReadOnly = true;
+         this.AsReadOnly.ToolTipText = "The files will return the read-only attribute and will not be allowed to change.\n" +
+    "The source free space will not be included, if set.";
          // 
-         this.FillExpectedLayoutWorker.WorkerReportsProgress = true;
-         this.FillExpectedLayoutWorker.WorkerSupportsCancellation = true;
-         this.FillExpectedLayoutWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.FillExpectedLayoutWorker_DoWork);
-         this.FillExpectedLayoutWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.FillExpectedLayoutWorker_RunWorkerCompleted);
+         // Edit
          // 
-         // serviceController1
-         // 
-         this.serviceController1.MachineName = "127.0.0.1";
-         this.serviceController1.ServiceName = "LiquesceSvc";
-         // 
-         // versionNumberToolStripMenuItem
-         // 
-         this.versionNumberToolStripMenuItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
-         this.versionNumberToolStripMenuItem.Enabled = false;
-         this.versionNumberToolStripMenuItem.Name = "versionNumberToolStripMenuItem";
-         this.versionNumberToolStripMenuItem.Size = new System.Drawing.Size(106, 20);
-         this.versionNumberToolStripMenuItem.Text = "Version Number";
-         this.versionNumberToolStripMenuItem.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
-         // 
-         // MainForm
-         // 
-         this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
-         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
-         this.ClientSize = new System.Drawing.Size(770, 489);
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
          this.Controls.Add(this.splitContainer1);
-         this.Controls.Add(this.menuStrip1);
+         this.DoubleBuffered = true;
          this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-         this.MainMenuStrip = this.menuStrip1;
-         this.MinimumSize = new System.Drawing.Size(778, 516);
-         this.Name = "MainForm";
-         this.Text = "Liquesce Mount Management";
-         this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
-         this.Shown += new System.EventHandler(this.MainForm_Shown);
+         this.Name = "Edit";
+         this.Size = new System.Drawing.Size(600, 475);
+         this.Load += new System.EventHandler(this.Edit_Load);
+         this.Leave += new System.EventHandler(this.Edit_Leave);
+         this.mergeListContext.ResumeLayout(false);
+         this.refreshExpected.ResumeLayout(false);
+         ((System.ComponentModel.ISupportInitialize)(this.mergeList)).EndInit();
+         this.groupBox4.ResumeLayout(false);
+         this.groupBox3.ResumeLayout(false);
+         ((System.ComponentModel.ISupportInitialize)(this.numHoldOffBytes)).EndInit();
+         this.groupBox1.ResumeLayout(false);
+         this.groupBox1.PerformLayout();
+         this.groupBox2.ResumeLayout(false);
+         this.groupBox2.PerformLayout();
+         ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).EndInit();
          this.splitContainer1.Panel1.ResumeLayout(false);
          this.splitContainer1.Panel2.ResumeLayout(false);
          ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
@@ -474,53 +546,45 @@ private void InitializeComponent()
          this.splitContainer2.ResumeLayout(false);
          this.splitContainer3.Panel1.ResumeLayout(false);
          this.splitContainer3.Panel2.ResumeLayout(false);
-         this.splitContainer3.Panel2.PerformLayout();
          ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit();
          this.splitContainer3.ResumeLayout(false);
-         this.mergeListContext.ResumeLayout(false);
-         this.groupBox1.ResumeLayout(false);
-         this.groupBox1.PerformLayout();
-         this.refreshExpected.ResumeLayout(false);
-         this.menuStrip1.ResumeLayout(false);
-         this.menuStrip1.PerformLayout();
          this.ResumeLayout(false);
-         this.PerformLayout();
 
       }
 
       #endregion
 
-      private System.Windows.Forms.SplitContainer splitContainer1;
+      private SplitContainerEx splitContainer1;
       private System.Windows.Forms.TreeView driveAndDirTreeView;
       private System.Windows.Forms.ToolTip toolTip1;
       private System.Windows.Forms.Label label1;
-      private System.Windows.Forms.SplitContainer splitContainer2;
-      private System.Windows.Forms.TreeView mergeList;
+      private SplitContainerEx splitContainer2;
       private System.Windows.Forms.ProgressBar progressBar1;
       private System.Windows.Forms.Label label2;
-      private System.Windows.Forms.MenuStrip menuStrip1;
-      private System.Windows.Forms.ToolStripMenuItem commitToolStripMenuItem;
       private System.Windows.Forms.TreeView expectedTreeView;
       private System.Windows.Forms.Label label3;
       private System.ComponentModel.BackgroundWorker FillExpectedLayoutWorker;
       private System.Windows.Forms.ComboBox MountPoint;
-      private System.Windows.Forms.Label label5;
       private System.Windows.Forms.GroupBox groupBox1;
       private System.Windows.Forms.TextBox VolumeLabel;
-      private System.Windows.Forms.ToolStripMenuItem advancedToolStripMenuItem;
       private System.Windows.Forms.ImageList imageListUnits;
-      private System.ServiceProcess.ServiceController serviceController1;
       private System.Windows.Forms.ContextMenuStrip mergeListContext;
       private System.Windows.Forms.ToolStripMenuItem mergeListContextMenuItem;
       private System.Windows.Forms.ContextMenuStrip refreshExpected;
       private System.Windows.Forms.ToolStripMenuItem refreshExpectedToolStripMenuItem;
-      private System.Windows.Forms.SplitContainer splitContainer3;
-      private System.Windows.Forms.ToolStripMenuItem globalConfigSettingsToolStripMenuItem;
-      private System.Windows.Forms.ToolStripMenuItem logsToolStripMenuItem;
-      private System.Windows.Forms.ToolStripMenuItem serviceLogViewToolStripMenuItem;
-      private System.Windows.Forms.ToolStripMenuItem userLogViewToolStripMenuItem;
-      private System.Windows.Forms.ToolStripMenuItem currentSharesToolStripMenuItem;
+      private SplitContainerEx splitContainer3;
       private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem;
-      private System.Windows.Forms.ToolStripMenuItem versionNumberToolStripMenuItem;
+      private System.Windows.Forms.GroupBox groupBox2;
+      private System.Windows.Forms.TextBox txtFolder;
+      private System.Windows.Forms.Label lblFolder;
+      private System.Windows.Forms.Label label5;
+      private System.Windows.Forms.ErrorProvider errorProvider1;
+      private System.Windows.Forms.DataGridView mergeList;
+      private System.Windows.Forms.GroupBox groupBox3;
+      private System.Windows.Forms.NumericUpDown numHoldOffBytes;
+      private System.Windows.Forms.GroupBox groupBox4;
+      private System.Windows.Forms.ComboBox cmbAllocationMode;
+      private System.Windows.Forms.DataGridViewTextBoxColumn Source;
+      private System.Windows.Forms.DataGridViewCheckBoxColumn AsReadOnly;
    }
 }
\ No newline at end of file
diff --git a/Liquesce/Mounting/Edit.cs b/Liquesce/Mounting/Edit.cs
new file mode 100644
index 0000000..cc5e56f
--- /dev/null
+++ b/Liquesce/Mounting/Edit.cs
@@ -0,0 +1,921 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Edit.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+using IMAPI2;
+using Liquesce.Tabs;
+using LiquesceFacade;
+using NLog;
+
+namespace Liquesce.Mounting
+{
+   public partial class Edit : UserControl, ITab
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+      private bool isClosing;
+
+      public Edit()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+
+         Icon icon = ExtractIcon.GetIconForFilename(Environment.GetFolderPath(Environment.SpecialFolder.MyComputer), true);
+         imageListUnits.Images.Add("MyComputer", icon.ToBitmap());
+      }
+
+      public ConfigDetails cd
+      {
+         set
+         {
+            cd1 = value;
+            PopulatePoolSettings();
+            Restart();
+         }
+         private get { return cd1; }
+      }
+
+      private void Restart()
+      {
+         UseWaitCursor = true;
+         InitialiseWith();
+         UseWaitCursor = false;
+      }
+
+      private bool IsClosing
+      {
+         get { return isClosing; }
+      }
+
+      private void InitialiseWith()
+      {
+         MountDetail mt = cd.MountDetails[currentIndex];
+         if (!String.IsNullOrWhiteSpace(mt.DriveLetter))
+         {
+            // Add the drive letter back in as this may already have been removed
+            if (!MountPoint.Items.Contains(mt.DriveLetter))
+            {
+               MountPoint.Items.Add(mt.DriveLetter);
+            }
+            MountPoint.Text = mt.DriveLetter;
+            if (mt.DriveLetter.Length > 1)
+            {
+               txtFolder.Text = mt.DriveLetter;
+            }
+         }
+         mergeList.Rows.Clear();
+         if (mt.SourceLocations != null)
+         {
+            foreach (SourceLocation tn in mt.SourceLocations)
+            {
+               mergeList.Rows.Add(new object[] { tn.SourcePath, tn.UseIsReadOnly });
+            }
+         }
+         VolumeLabel.Text = mt.VolumeLabel;
+         AllocationMode = mt.AllocationMode;
+         HoldOffMBytes = mt.HoldOffBufferBytes;
+         RestartExpectedOutput();
+      }
+
+      private void PopulatePoolSettings()
+      {
+         DriveInfo[] drives = DriveInfo.GetDrives();
+         foreach (DriveInfo dr in drives)
+         {
+            MountPoint.Items.Remove(dr.RootDirectory.Name.Remove(1));
+         }
+      }
+
+      #region Methods to populate and drill down in the tree
+      // Code stolen from the http://frwingui.codeplex.com project
+      private void StartTree()
+      {
+         // Code taken and adapted from http://msdn.microsoft.com/en-us/library/bb513869.aspx
+         try
+         {
+            Enabled = false;
+            UseWaitCursor = true;
+            driveAndDirTreeView.Nodes.Clear();
+
+            Log.Debug("Create the root node.");
+            TreeNode tvwRoot = new TreeNode
+            {
+               Text = Environment.MachineName,
+               ImageKey = "MyComputer",
+               SelectedImageKey = "MyComputer"
+            };
+            driveAndDirTreeView.Nodes.Add(tvwRoot);
+            Log.Debug("Now we need to add any children to the root node.");
+
+            Log.Debug("Start with drives if you have to search the entire computer.");
+            DriveInfo[] drives = DriveInfo.GetDrives();
+            foreach (DriveInfo dr in drives)
+            {
+               Log.Debug(dr);
+               FillInDirectoryType(tvwRoot, dr);
+            }
+
+            tvwRoot.Expand();
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("StartTree Threw: ", ex);
+         }
+         finally
+         {
+            Enabled = true;
+            UseWaitCursor = false;
+         }
+      }
+
+      private void FillInDirectoryType(TreeNode parentNode, DriveInfo di)
+      {
+         if (di != null)
+         {
+            string label;
+            string di_DriveFormat = "Unknown Format";
+            try
+            {
+               di_DriveFormat = di.DriveFormat;
+               if (di_DriveFormat.ToUpper() == "FAT")
+               {
+                  Log.Warn("Removing FAT formated drive type, as this causes ACL Failures [{0}]", di.Name);
+                  return;
+               }
+               if (di.VolumeLabel == "Liquesce")
+               {
+                  Log.Warn("Removing the existing CBFS drive as this would cause confusion ! [{0}]",
+                     di.Name);
+                  return;
+               }
+               label = (di.IsReady && !String.IsNullOrWhiteSpace(di.VolumeLabel)) ? di.VolumeLabel : di_DriveFormat;
+            }
+            catch (IOException ioex)
+            {
+               Log.Warn("Handle situation when there is no disc in CDRom", ioex);
+               label = di.DriveType.ToString();
+               if (di.DriveType == DriveType.CDRom)
+               {
+                  // Handle situation when there is no disc in "CDRom", which could be any "##-Rom type"
+                  try
+                  {
+                     MsftDiscMaster2 discMaster = new MsftDiscMaster2();
+                     if (discMaster.IsSupportedEnvironment)
+                     {
+                        MsftDiscRecorder2 discRecorder2 = new MsftDiscRecorder2();
+                        foreach (string id in discMaster)
+                        {
+                           discRecorder2.InitializeDiscRecorder(id);
+                           if (discRecorder2.VolumePathNames.Cast<string>().Any(volumePathName => di.Name == volumePathName))
+                           {
+                              label = discRecorder2.ProductId.Trim();
+                           }
+                        }
+                     }
+                  }
+                  catch { }
+               }
+            }
+            catch
+            {
+               // The above throws a wobble e.g. if the CD_Rom does not have a disk in it
+               label = di_DriveFormat;
+            }
+            SafelyAddIcon(di.Name);
+            label += " (" + di.Name + ")";
+            TreeNode thisNode = new TreeNode
+            {
+               Text = label,
+               ImageKey = di.Name,
+               SelectedImageKey = di.Name,
+               Tag = di.RootDirectory
+            };
+            if (di.IsReady)
+            {
+               thisNode.Nodes.Add("DummyNode");
+            }
+            parentNode.Nodes.Add(thisNode);
+         }
+      }
+
+      private void WalkNextTreeLevel(TreeNode parentNode)
+      {
+         try
+         {
+            DirectoryInfo root = parentNode.Tag as DirectoryInfo;
+            if (root != null)
+            {
+               Log.Debug("// Find all the subdirectories under this directory.");
+               DirectoryInfo[] subDirs = root.GetDirectories();
+               // if (subDirs != null) // Apperently always true
+               {
+                  foreach (DirectoryInfo dirInfo in subDirs)
+                  {
+                     // Recursive call for each subdirectory.
+                     SafelyAddIcon(dirInfo.FullName);
+                     TreeNode tvwChild = new TreeNode
+                     {
+                        Text = dirInfo.Name,
+                        ImageKey = dirInfo.FullName,
+                        SelectedImageKey = dirInfo.FullName,
+                        Tag = dirInfo
+                     };
+
+                     Log.Debug("If this is a folder item and has children then add a place holder node.");
+                     try
+                     {
+                        DirectoryInfo[] subChildDirs = dirInfo.GetDirectories();
+                        if (/*(subChildDirs != null) // Apperently always true
+                            &&*/ (subChildDirs.Length > 0)
+                           )
+                           tvwChild.Nodes.Add("DummyNode");
+                     }
+                     catch (UnauthorizedAccessException uaex)
+                     {
+                        Log.InfoException("No Access to subdirs in " + tvwChild.Text, uaex);
+                     }
+                     parentNode.Nodes.Add(tvwChild);
+                  }
+               }
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("RecurseAddChildren has thrown:", ex);
+         }
+      }
+
+      private void driveAndDirTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
+      {
+         Enabled = false;
+         UseWaitCursor = true;
+         try
+         {
+            Log.Debug("driveAndDirTreeView_BeforeExpand");
+            DirectoryInfo root = e.Node.Tag as DirectoryInfo;
+            if (root != null)
+            {
+               e.Node.Nodes.Clear();
+               WalkNextTreeLevel(e.Node);
+            }
+            e.Cancel = false;
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("BeforeExpand has thrown: ", ex);
+         }
+         finally
+         {
+            Enabled = true;
+            UseWaitCursor = false;
+         }
+      }
+      #endregion
+
+      #region DragAndDrop over to the merge list
+      private void driveAndDirTreeView_MouseDown(object sender, MouseEventArgs e)
+      {
+         if (e.Button == MouseButtons.Left)
+         {
+            // Get the node underneath the mouse.
+            TreeNode selected = driveAndDirTreeView.GetNodeAt(e.X, e.Y);
+            driveAndDirTreeView.SelectedNode = selected;
+
+            // Start the drag-and-drop operation with a cloned copy of the node.
+            if (selected != null)
+            {
+               DragDropItem ud = new DragDropItem(GetSelectedNodesPath(selected), DragDropItem.SourceType.Drive, false);
+               if (!String.IsNullOrEmpty(ud.Name))
+                  driveAndDirTreeView.DoDragDrop(ud, DragDropEffects.All);
+            }
+         }
+      }
+
+      private string GetSelectedNodesPath(TreeNode selected)
+      {
+         DirectoryInfo shNode = selected.Tag as DirectoryInfo;
+         Log.Debug("Now we need to add any children to the root node.");
+         string newPath = shNode != null ? shNode.FullName : selected.FullPath;
+         return newPath;
+      }
+
+      private void CheckDrop(DragDropItem newPath, int target, int mouseOffset)
+      {
+         // TODO: On Add check to make sure that the root (Or this) node have not already been covered.
+         if (!String.IsNullOrEmpty(newPath.Name))
+         {
+            Object[] tn = { newPath.Name, newPath.AsReadOnly };
+
+            //we only ever want an entry in 1x in the list.  Remove any duplicates, so you can reorder from the filesystem treeview
+            int internalMoveIndex = -1;
+            foreach (DataGridViewRow row in mergeList.Rows)
+            {
+               if (row.Cells[0].Value.ToString().Equals(newPath.Name))
+               {
+                  internalMoveIndex = row.Index;
+                  break;
+               }
+            }
+            int index = 0;
+            if (internalMoveIndex > -1)
+            {
+               // no node below?  stick this at the Top of the list.
+               if (target == -1)
+               {
+                  index = 0;
+                  if (mouseOffset > mergeList.Rows[0].Height)
+                  {
+                     index = mergeList.RowCount - 1;
+                  }
+               }
+               else
+               {
+                  index = target;
+               }
+               if (internalMoveIndex < index)
+               {
+                  mergeList.Rows.Insert(index + 1, tn);
+                  mergeList.Rows.RemoveAt(internalMoveIndex);
+               }
+               else if (internalMoveIndex > index)
+               {
+                  mergeList.Rows.RemoveAt(internalMoveIndex);
+                  mergeList.Rows.Insert(index, tn);
+               }
+            }
+            else if (newPath.Source == DragDropItem.SourceType.Drive)
+            {
+               //no node below?  stick this at the bottom of the list, else put in before the one your over.
+               if (target == -1)
+               {
+                  index = 0;
+                  if ((mergeList.RowCount > 0)
+                     && (mouseOffset > mergeList.Rows[0].Height)
+                     )
+                  {
+                     index = mergeList.RowCount;
+                  }
+               }
+               else
+               {
+                  index = target;
+               }
+               mergeList.Rows.Insert(index, tn);
+            }
+            mergeList.Rows[index].Selected = true;
+            RestartExpectedOutput();
+         }
+      }
+
+      #endregion
+
+      private void RestartExpectedOutput()
+      {
+         if (!HasLoaded)
+         {
+            return;
+         }
+         if (IsClosing)
+         {
+            return;
+         }
+         FillExpectedLayoutWorker.CancelAsync();
+         while (FillExpectedLayoutWorker.IsBusy)
+         {
+            Thread.Sleep(500);
+            Application.DoEvents();
+         }
+         MountDetail mt = new MountDetail
+         {
+            DriveLetter = string.IsNullOrWhiteSpace(txtFolder.Text) ? MountPoint.Text : txtFolder.Text,
+            VolumeLabel = VolumeLabel.Text,
+            SourceLocations = (from DataGridViewRow tn in mergeList.Rows
+                               select new SourceLocation(tn.Cells[0].Value.ToString(), (bool)tn.Cells[1].Value))
+                              .ToList(),
+         };
+         FillExpectedLayoutWorker.RunWorkerAsync(mt);
+      }
+
+      private void FillExpectedLayoutWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
+      {
+         SetProgressBarStyle(ProgressBarStyle.Continuous);
+      }
+
+      private void FillExpectedLayoutWorker_DoWork(object sender, DoWorkEventArgs e)
+      {
+         SetProgressBarStyle(ProgressBarStyle.Marquee);
+         ClearExpectedList();
+         MountDetail mt = e.Argument as MountDetail;
+         BackgroundWorker worker = sender as BackgroundWorker;
+         if ((mt == null)
+            || (worker == null)
+            )
+         {
+            Log.Error("Worker, or auguments are null, exiting.");
+            return;
+         }
+         TreeNode root = new TreeNode(string.Format("{0} ({1})", mt.VolumeLabel, mt.DriveLetter));
+         AddExpectedNode(null, root);
+         if (worker.CancellationPending
+            || IsClosing)
+         {
+            return;
+         }
+         WalkExpectedNextTreeLevel(root, mt.SourceLocations);
+      }
+
+      private void AddFiles(IEnumerable<SourceLocation> sourceLocations, string directoryPath, List<ExpectedDetailResult> allFiles)
+      {
+         try
+         {
+            DirectoryInfo dirInfo = new DirectoryInfo(directoryPath);
+            if (dirInfo.Exists)
+            {
+               FileSystemInfo[] fileSystemInfos = dirInfo.GetFileSystemInfos();
+               allFiles.AddRange(fileSystemInfos.Select(info2 => new ExpectedDetailResult
+               {
+                  DisplayName = TrimAndAdd(sourceLocations, info2.FullName),
+                  ActualFileLocation = info2.FullName
+               }));
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("AddFiles threw: ", ex);
+         }
+      }
+
+      private string TrimAndAdd(IEnumerable<SourceLocation> sourceLocations, string fullFilePath)
+      {
+         foreach (string key in from location
+                                   in sourceLocations
+                                where fullFilePath.StartsWith(location.SourcePath)
+                                select fullFilePath.Remove(0, location.SourcePath.Length)
+                   )
+         {
+            return key;
+         }
+         throw new ArgumentException("Unable to find BelongTo Path: " + fullFilePath, fullFilePath);
+      }
+
+      private delegate void AddExpecteddNodeCallBack(TreeNode parent, TreeNode child);
+      private void AddExpectedNode(TreeNode parent, TreeNode child)
+      {
+         if (expectedTreeView.InvokeRequired)
+         {
+            AddExpecteddNodeCallBack d = AddExpectedNode;
+            BeginInvoke(d, new object[] { parent, child });
+         }
+         else
+         {
+            if (parent == null)
+            {
+               expectedTreeView.Nodes.Add(child);
+            }
+            else
+            {
+               parent.Nodes.Add(child);
+            }
+         }
+      }
+
+      delegate void SetProgressBarStyleCallback(ProgressBarStyle style);
+      private void SetProgressBarStyle(ProgressBarStyle style)
+      {
+         // InvokeRequired required compares the thread ID of the
+         // calling thread to the thread ID of the creating thread.
+         // If these threads are different, it returns true.
+         if (progressBar1.InvokeRequired)
+         {
+            SetProgressBarStyleCallback d = SetProgressBarStyle;
+            BeginInvoke(d, new object[] { style });
+         }
+         else
+         {
+            progressBar1.Style = style;
+            expectedTreeView.Enabled = (style != ProgressBarStyle.Marquee);
+            UseWaitCursor = !Enabled;
+         }
+      }
+
+      private delegate void ClearExpectedListCallBack();
+      private void ClearExpectedList()
+      {
+         if (expectedTreeView.InvokeRequired)
+         {
+            ClearExpectedListCallBack d = ClearExpectedList;
+            BeginInvoke(d);
+         }
+         else
+         {
+            expectedTreeView.Nodes.Clear();
+         }
+      }
+
+      private void expectedTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
+      {
+         try
+         {
+            SetProgressBarStyle(ProgressBarStyle.Marquee);
+            Log.Debug("expectedTreeView_BeforeExpand");
+            string root = e.Node.Tag as string;
+            if (!String.IsNullOrEmpty(root))
+            {
+               e.Node.Nodes.Clear();
+               List<SourceLocation> sourceLocations = new List<SourceLocation>(mergeList.RowCount);
+               sourceLocations.AddRange(from DataGridViewRow tn in mergeList.Rows select new SourceLocation(tn.Cells[0].Value.ToString(), (bool)tn.Cells[1].Value));
+               WalkExpectedNextTreeLevel(e.Node, sourceLocations, root);
+            }
+            e.Cancel = false;
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("BeforeExpand has thrown: ", ex);
+         }
+         finally
+         {
+            SetProgressBarStyle(ProgressBarStyle.Continuous);
+         }
+      }
+
+      private void WalkExpectedNextTreeLevel(TreeNode parent, List<SourceLocation> sourceLocations)
+      {
+         WalkExpectedNextTreeLevel(parent, sourceLocations, String.Empty);
+      }
+
+      private void WalkExpectedNextTreeLevel(TreeNode parent, List<SourceLocation> sourceLocations, string expectedStartLocation)
+      {
+         List<ExpectedDetailResult> allFiles = new List<ExpectedDetailResult>();
+         if (sourceLocations != null)
+         {
+            sourceLocations.ForEach(str2 => AddFiles(sourceLocations, str2.SourcePath + expectedStartLocation, allFiles));
+         }
+         allFiles.Sort();
+         Log.Debug("Should now have a huge list of filePaths");
+         AddNextExpectedLevel(allFiles, parent);
+      }
+
+      private void AddNextExpectedLevel(IEnumerable<ExpectedDetailResult> allFiles, TreeNode parent)
+      {
+         if (allFiles != null)
+         {
+            foreach (ExpectedDetailResult kvp in allFiles)
+            {
+               if (IsClosing)
+               {
+                  return;
+               }
+               if (Directory.Exists(kvp.ActualFileLocation))
+               {
+                  // This is a Dir, so make a new child
+                  string label = kvp.DisplayName;
+                  int index = kvp.DisplayName.LastIndexOf(Path.DirectorySeparatorChar);
+                  if (index > 0)
+                  {
+                     label = kvp.DisplayName.Substring(index + 1);
+                  }
+                  bool found = parent.Nodes.Cast<TreeNode>().Any(node => node.Text == label);
+                  if (!found)
+                  {
+                     TreeNode child = new TreeNode
+                     {
+                        Text = label,
+                        Tag = kvp.DisplayName,
+                        ToolTipText = kvp.ActualFileLocation
+                     };
+                     child.Nodes.Add("DummyNode");
+                     AddExpectedNode(parent, child);
+                  }
+               }
+               else
+               {
+                  AddFileNodeCallBack d = AddFileNode;
+                  BeginInvoke(d, new object[] { kvp, parent });
+               }
+            }
+         }
+      }
+
+      private delegate void AddFileNodeCallBack(ExpectedDetailResult kvp, TreeNode parent);
+
+      private void AddFileNode(ExpectedDetailResult kvp, TreeNode parent)
+      {
+         SafelyAddIcon(kvp.ActualFileLocation);
+         TreeNode child = new TreeNode
+         {
+            Text = Path.GetFileName(kvp.DisplayName),
+            ImageKey = kvp.ActualFileLocation,
+            ToolTipText = kvp.ActualFileLocation
+         };
+         AddExpectedNode(parent, child);
+      }
+
+      private void SafelyAddIcon(string fullFileName)
+      {
+         try
+         {
+            if (!imageListUnits.Images.ContainsKey(fullFileName))
+            {
+               imageListUnits.Images.Add(fullFileName, ExtractIcon.GetIconForFilename(fullFileName, true).ToBitmap());
+            }
+         }
+         catch { }
+      }
+
+      private void SafelyAddIcon(string fullFileName, int iconIndex)
+      {
+         try
+         {
+            if (!imageListUnits.Images.ContainsKey(fullFileName))
+            {
+               imageListUnits.Images.Add(fullFileName, ExtractIcon.GetIconForFilename(fullFileName, true).ToBitmap());
+               //imageListUnits.Images.Add(fullFileName, ExtractIcon.GetIcon(iconIndex).ToBitmap());
+            }
+         }
+         catch { }
+      }
+
+      private void MountPoint_TextChanged(object sender, EventArgs e)
+      {
+         txtFolder.Text = (MountPoint.Text.Length > 1) ? MountPoint.Text : string.Empty;
+         RestartExpectedOutput();
+      }
+
+      private void VolumeLabel_Validated(object sender, EventArgs e)
+      {
+         RestartExpectedOutput();
+      }
+
+      private void refreshExpectedToolStripMenuItem_Click(object sender, EventArgs e)
+      {
+         RestartExpectedOutput();
+      }
+
+      private void txtFolder_DragDrop(object sender, DragEventArgs e)
+      {
+         // Is it a valid format?
+         DragDropItem ud = e.Data.GetData(typeof(DragDropItem)) as DragDropItem;
+         if (ud != null)
+         {
+            txtFolder.Text = ud.Name;
+         }
+      }
+
+      private void txtFolder_DragOver(object sender, DragEventArgs e)
+      {
+         // Drag and drop denied by default.
+         e.Effect = DragDropEffects.None;
+
+         // Is it a valid format?
+         DragDropItem ud = e.Data.GetData(typeof(DragDropItem)) as DragDropItem;
+         if (ud != null)
+         {
+            e.Effect = DragDropEffects.Copy;
+         }
+      }
+
+      private readonly List<string> hardDrives = (from dr in Environment.GetLogicalDrives()
+                                                  let di = new DriveInfo(dr)
+                                                  where di.DriveType == DriveType.Fixed
+                                                  select dr).ToList();
+
+      private ConfigDetails cd1;
+
+      private void txtFolder_TextChanged(object sender, EventArgs e)
+      {
+         string error = string.Empty;
+         try
+         {
+            if (!string.IsNullOrWhiteSpace(txtFolder.Text))
+            {
+               DirectoryInfo dir = new DirectoryInfo(txtFolder.Text);
+               if (!hardDrives.Contains(dir.Root.Name.ToUpperInvariant()))
+               {
+                  error = @"Drive does not exist";
+               }
+               else if (!dir.Exists)
+               {
+                  error = string.Empty;
+               }
+               else if (!MountPoint.Items.Contains(txtFolder.Text) // may already be mounted
+                  && dir.EnumerateFileSystemInfos().Any()
+                  )
+               {
+                  error = @"Directory is not empty";
+               }
+            }
+         }
+         catch (Exception ex)
+         {
+            error = ex.Message;
+         }
+         errorProvider1.SetError(lblFolder, error);
+      }
+
+      private void Edit_Load(object sender, EventArgs e)
+      {
+         HasLoaded = true;
+         StartTree();
+         RestartExpectedOutput();
+      }
+
+      private void Edit_Leave(object sender, EventArgs e)
+      {
+         isClosing = true;
+         FillExpectedLayoutWorker.CancelAsync();
+         MountDetail mt = new MountDetail
+         {
+            DriveLetter = string.IsNullOrWhiteSpace(txtFolder.Text) ? MountPoint.Text : txtFolder.Text,
+            VolumeLabel = VolumeLabel.Text,
+            SourceLocations = (from DataGridViewRow tn in mergeList.Rows
+                               select new SourceLocation(tn.Cells[0].Value.ToString(), (bool)tn.Cells[1].Value))
+                              .ToList(),
+            HoldOffBufferBytes = HoldOffMBytes,
+            AllocationMode = AllocationMode
+         };
+         cd.MountDetails[currentIndex] = mt;
+      }
+
+      private void dataGridView1_DragDrop(object sender, DragEventArgs e)
+      {
+         // Is it a valid format?
+         DragDropItem ud = e.Data.GetData(typeof(DragDropItem)) as DragDropItem;
+         if (ud != null)
+         {
+            Point newPoint = mergeList.PointToClient(new Point(e.X, e.Y));
+            DataGridView.HitTestInfo hti = mergeList.HitTest(newPoint.X, newPoint.Y);
+            CheckDrop(ud, hti.RowIndex, newPoint.Y);
+         }
+      }
+
+      private void dataGridView1_DragOver(object sender, DragEventArgs e)
+      {
+         // Drag and drop denied by default.
+         e.Effect = DragDropEffects.None;
+
+         // Is it a valid format?
+         DragDropItem ud = e.Data.GetData(typeof(DragDropItem)) as DragDropItem;
+         if (ud != null)
+         {
+            //we only ever want an entry in 1x in the list.  Remove any duplicates, so you can reorder from the filesystem treeview
+            if (ud.Source == DragDropItem.SourceType.Drive)
+            {
+               bool found = mergeList.Rows.Cast<DataGridViewRow>().Any(row => row.Cells[0].Value.ToString() == ud.Name);
+               if (!found)
+               {
+                  e.Effect = DragDropEffects.Copy;
+               }
+            }
+            else
+            {
+               e.Effect = DragDropEffects.Copy;
+            }
+         }
+      }
+
+      private void mergeListContextMenuItem_Click(object sender, EventArgs e)
+      {
+         foreach (DataGridViewRow item in mergeList.SelectedRows)
+         {
+            mergeList.Rows.RemoveAt(item.Index);
+         }
+         RestartExpectedOutput();
+      }
+
+      private void mergeList_MouseCellDown(object sender, DataGridViewCellMouseEventArgs e)
+      {
+         DataGridViewCheckBoxCell cell = mergeList.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewCheckBoxCell;
+         if (cell != null)
+         {
+            bool b = (bool)cell.Value;
+            cell.Value = !b;
+         }
+      }
+
+
+      private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
+      {
+         DataGridView.HitTestInfo hti = mergeList.HitTest(e.X, e.Y);
+         mergeList.ClearSelection();
+         if (hti.RowIndex < 0)
+         {
+            return;
+         }
+         DataGridViewRow row = mergeList.Rows[hti.RowIndex];
+         row.Selected = true;
+
+         //right click menu for deleting items from mergelist
+         switch (e.Button)
+         {
+         case MouseButtons.Right:
+            mergeList.ContextMenuStrip.Show(mergeList, e.Location);
+            break;
+         case MouseButtons.Left:
+            {
+            // Get the node underneath the mouse.
+            // Start the drag-and-drop operation with a cloned copy of the node.
+            DragDropItem ud = new DragDropItem(row.Cells[0].Value.ToString(), DragDropItem.SourceType.Merge, (bool)row.Cells[1].Value);
+            mergeList.DoDragDrop(ud, DragDropEffects.All);
+            }
+            break;
+         }
+      }
+
+      private void mergeList_KeyUp(object sender, KeyEventArgs e)
+      {
+         if (e.KeyCode != Keys.Delete)
+         {
+            return;
+         }
+         foreach (DataGridViewRow item in mergeList.SelectedRows)
+         {
+            mergeList.Rows.RemoveAt(item.Index);
+         }
+         RestartExpectedOutput();
+      }
+
+      private int currentIndex;
+      private bool HasLoaded;
+
+      public void SelectedIndex(int selectedIndex)
+      {
+         currentIndex = selectedIndex;
+         Restart();
+      }
+
+      private MountDetail.AllocationModes AllocationMode
+      {
+         get
+         {
+            Enum.TryParse(cmbAllocationMode.Text, out cd.MountDetails[currentIndex].AllocationMode);
+            return cd.MountDetails[currentIndex].AllocationMode;
+         }
+         set
+         {
+            try
+            {
+               cmbAllocationMode.Text = value.ToString();
+            }
+            catch (Exception ex)
+            {
+               Log.ErrorException("AllocationMode", ex);
+            }
+         }
+      }
+
+      private ulong HoldOffMBytes
+      {
+         get
+         {
+            cd.MountDetails[currentIndex].HoldOffBufferBytes = (ulong)(numHoldOffBytes.Value * (1024 * 1024));
+            return cd.MountDetails[currentIndex].HoldOffBufferBytes;
+         }
+         set
+         {
+            try
+            {
+               numHoldOffBytes.Value = value / (decimal)(1024 * 1024);
+            }
+            catch (Exception ex)
+            {
+               Log.ErrorException("HoldOffMBytes", ex);
+            }
+         }
+      }
+
+      private void cmbAllocationMode_SelectedValueChanged(object sender, EventArgs e)
+      {
+         numHoldOffBytes.Enabled = (cmbAllocationMode.Text != "Balanced");
+      }
+
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/Mounting/Edit.resx b/Liquesce/Mounting/Edit.resx
new file mode 100644
index 0000000..ea4ea08
--- /dev/null
+++ b/Liquesce/Mounting/Edit.resx
@@ -0,0 +1,157 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageListUnits.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>436, 17</value>
+  </metadata>
+  <metadata name="mergeListContext.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>567, 17</value>
+  </metadata>
+  <metadata name="refreshExpected.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>714, 17</value>
+  </metadata>
+  <metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="Source.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="AsReadOnly.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <data name="cmbAllocationMode.ToolTip" xml:space="preserve">
+    <value>The allocation strategy applied to new files or folders on how they are placed on the storage disks:
+Folder = try to keep files together on one disk (classic behavior).
+Priority = strict one disk after the other method.
+Balanced = balance the available space on all storage disks; Whichever disc has the most space will be used.</value>
+  </data>
+  <data name="groupBox4.ToolTip" xml:space="preserve">
+    <value>The allocation strategy applied to new files or folders on how they are placed on the storage disks:
+Folder = try to keep files together on one disk (classic behavior).
+Priority = strict one disk after the other method.
+Balanced = balance the available space on all storage disks; Whichever disc has the most space will be used.
+</value>
+  </data>
+  <metadata name="FillExpectedLayoutWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>114, 17</value>
+  </metadata>
+  <metadata name="errorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>306, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Program.cs b/Liquesce/Program.cs
index e3961ec..ce7353b 100644
--- a/Liquesce/Program.cs
+++ b/Liquesce/Program.cs
@@ -1,21 +1,49 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Program.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion Copyright (C)
+
+using System;
 using System.IO;
 using System.Reflection;
 using System.Threading;
 using System.Windows.Forms;
+
 using NLog;
 
 namespace Liquesce
 {
-   static class Program
+   internal static class Program
    {
-      
       private static readonly Logger Log = LogManager.GetLogger("Program");
+
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
-      static void Main()
+      private static void Main()
       {
          try
          {
@@ -53,13 +81,16 @@ private static void CheckAndRunSingleApp()
       {
          string MutexName = string.Format("{0} [{1}]", Path.GetFileName(Application.ExecutablePath), Environment.UserName);
          bool GrantedOwnership;
+         // ReSharper disable once UnusedVariable
          using (Mutex AppUserMutex = new Mutex(true, MutexName, out GrantedOwnership))
          {
             if (GrantedOwnership)
             {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
-               Application.Run(new MainForm());
+               Application.DoEvents();
+
+               Application.Run(new TabMainForm());
             }
             else
             {
@@ -88,4 +119,4 @@ private static void logUnhandledException(object sender, UnhandledExceptionEvent
          }
       }
    }
-}
+}
\ No newline at end of file
diff --git a/Liquesce/Properties/AssemblyInfo.cs b/Liquesce/Properties/AssemblyInfo.cs
index 45a87df..335b1c7 100644
--- a/Liquesce/Properties/AssemblyInfo.cs
+++ b/Liquesce/Properties/AssemblyInfo.cs
@@ -1,4 +1,30 @@
-using System.Reflection;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="AssemblyInfo.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System.Reflection;
 using System.Runtime.InteropServices;
 
 // General Information about an assembly is controlled through the following 
@@ -9,7 +35,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("Smurf-IV")]
 [assembly: AssemblyProduct("Liquesce")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 2010")]
+[assembly: AssemblyCopyright("Copyright © Simon Coghlan (Aka Smurf-IV) 2010 - 2012")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -31,5 +57,5 @@
 // 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("2011.4.27.640")]
-[assembly: AssemblyFileVersion("2011.4.27.640")]
+[assembly: AssemblyVersion("14.8.1242.19")]
+[assembly: AssemblyFileVersion("14.8.1242.19")]
diff --git a/Liquesce/Properties/Resources.Designer.cs b/Liquesce/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..9cd600c
--- /dev/null
+++ b/Liquesce/Properties/Resources.Designer.cs
@@ -0,0 +1,153 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18408
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Liquesce.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("Liquesce.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 resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Mart_Glaze_Log {
+            get {
+                object obj = ResourceManager.GetObject("Mart-Glaze-Log", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_3floppy_mount {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-3floppy-mount", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_K_cm_system {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-K-cm-system", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_K_color_edit {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-K-color-edit", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_K_ppp {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-K-ppp", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_Kontact {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-Kontact", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_Log {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-Log", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_Nfs_mount {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-Nfs-mount", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized resource of type System.Drawing.Bitmap.
+        /// </summary>
+        internal static System.Drawing.Bitmap Umut_Pulat_Tulliana_2_Nfs_unmount {
+            get {
+                object obj = ResourceManager.GetObject("Umut-Pulat-Tulliana-2-Nfs-unmount", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
diff --git a/Liquesce/Properties/Resources.resx b/Liquesce/Properties/Resources.resx
new file mode 100644
index 0000000..a381d9b
--- /dev/null
+++ b/Liquesce/Properties/Resources.resx
@@ -0,0 +1,148 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Mart-Glaze-Log" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Mart-Glaze-Log.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-K-color-edit" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-K-color-edit.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-K-cm-system" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-K-cm-system.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-K-ppp" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-K-ppp.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-3floppy-mount" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-3floppy-mount.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-Log" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-Log.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-Nfs-mount" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-Nfs-mount.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-Nfs-unmount" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-Nfs-unmount.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Umut-Pulat-Tulliana-2-Kontact" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Umut-Pulat-Tulliana-2-Kontact.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Properties/Settings.Designer.cs b/Liquesce/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..406ff0d
--- /dev/null
+++ b/Liquesce/Properties/Settings.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18408
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Liquesce.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.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string WindowLocation {
+            get {
+                return ((string)(this["WindowLocation"]));
+            }
+            set {
+                this["WindowLocation"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("True")]
+        public bool UpdateRequired {
+            get {
+                return ((bool)(this["UpdateRequired"]));
+            }
+            set {
+                this["UpdateRequired"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string TailWindowLocation {
+            get {
+                return ((string)(this["TailWindowLocation"]));
+            }
+            set {
+                this["TailWindowLocation"] = value;
+            }
+        }
+    }
+}
diff --git a/Liquesce/Properties/Settings.settings b/Liquesce/Properties/Settings.settings
new file mode 100644
index 0000000..0195d32
--- /dev/null
+++ b/Liquesce/Properties/Settings.settings
@@ -0,0 +1,15 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Liquesce.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="WindowLocation" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="UpdateRequired" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">True</Value>
+    </Setting>
+    <Setting Name="TailWindowLocation" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+  </Settings>
+</SettingsFile>
\ No newline at end of file
diff --git a/Liquesce/Resources/Mart-Glaze-Log.ico b/Liquesce/Resources/Mart-Glaze-Log.ico
new file mode 100644
index 0000000..37902ae
Binary files /dev/null and b/Liquesce/Resources/Mart-Glaze-Log.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-3floppy-mount.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-3floppy-mount.ico
new file mode 100644
index 0000000..da33d22
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-3floppy-mount.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-cm-system.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-cm-system.ico
new file mode 100644
index 0000000..2328636
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-cm-system.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-color-edit.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-color-edit.ico
new file mode 100644
index 0000000..b6e9ab8
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-color-edit.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-ppp.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-ppp.ico
new file mode 100644
index 0000000..9eacd8f
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-K-ppp.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-Kontact.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Kontact.ico
new file mode 100644
index 0000000..d522b2a
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Kontact.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-Log.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Log.ico
new file mode 100644
index 0000000..85b05dc
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Log.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-Nfs-mount.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Nfs-mount.ico
new file mode 100644
index 0000000..8b4edae
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Nfs-mount.ico differ
diff --git a/Liquesce/Resources/Umut-Pulat-Tulliana-2-Nfs-unmount.ico b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Nfs-unmount.ico
new file mode 100644
index 0000000..f1b3a5b
Binary files /dev/null and b/Liquesce/Resources/Umut-Pulat-Tulliana-2-Nfs-unmount.ico differ
diff --git a/Liquesce/Shared/CommandLinkButton.cs b/Liquesce/Shared/CommandLinkButton.cs
new file mode 100644
index 0000000..3e1e0cb
--- /dev/null
+++ b/Liquesce/Shared/CommandLinkButton.cs
@@ -0,0 +1,685 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+using System.Windows.Forms;
+
+// These are like this to prevent resharper trying to remove the calls that are used by the designer via reflection
+// ReSharper disable UnusedMember.Global
+// ReSharper disable MemberCanBePrivate.Global
+//
+namespace Shared
+{
+   /// <summary>
+   /// Implements a .NET version of the new Vista Command Link style buttons.
+   /// Allows the user to specify an image, headline item text and subscript text.<br/>
+   /// Provides focus and mouse over highlighting.
+   /// </summary>
+   [ToolboxBitmap(typeof(Button))]
+   public sealed class CommandLinkButton : Button
+   {
+      /// <summary>
+      /// Constructs a new command link button.
+      /// </summary>
+      public CommandLinkButton()
+      {
+         ImageAlign = ContentAlignment.MiddleLeft;
+         base.TextAlign = ContentAlignment.MiddleLeft;
+         Width = 375;
+         Height = 65;
+         base.Font = new Font("Tahoma", 14.25f);
+         SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+         showUnderLine = SystemInformation.MenuAccessKeysUnderlined;
+         ChangeUICues += btnChangeUICues;
+      }
+
+      bool showUnderLine = false;
+      private void btnChangeUICues(object sender, UICuesEventArgs uiCuesEventArgs)
+      {
+         if ( uiCuesEventArgs.ChangeKeyboard )
+            showUnderLine = uiCuesEventArgs.ShowKeyboard;
+      }
+
+      protected override void OnHandleCreated(EventArgs e)
+      {
+         base.OnHandleCreated(e);
+         if (DesignMode)
+            showUnderLine = true;
+      }
+      private Image grayImage;
+      /// <summary>
+      /// Overrides the default button font to a more suitable headline font.
+      /// </summary>
+      [DefaultValue(typeof(Font), "Tahoma, 14.25pt")]
+      public override Font Font
+      {
+         get
+         {
+            return base.Font;
+         }
+         set
+         {
+            base.Font = value;
+            Refresh();
+         }
+      }
+
+      private enum State
+      {
+         Normal,
+         Hover,
+         Pushed,
+         Disabled
+      }
+      private State state = State.Normal;
+
+      /// <summary>
+      /// Implements the custom drawing for the button.
+      /// </summary>
+      /// <param name="paintEvent">The paint event args.</param>
+      protected override void OnPaint(PaintEventArgs paintEvent)
+      {
+         GraphicsPath gp = CreateOutlinePath(paintEvent.Graphics);
+         if (state == State.Disabled)
+         {
+            using (Brush b = new SolidBrush(Color.FromArgb(128, BackColor)))
+            {
+               paintEvent.Graphics.FillRectangle(b, ClientRectangle);
+            }
+         }
+         else
+         {
+            DrawHighlight(paintEvent.Graphics, gp);
+         }
+         using (Pen p = new Pen(Enabled ? highlightColor : Color.FromArgb(128, Color.FromKnownColor(KnownColor.GrayText)),
+                              Enabled ? hightlightWidth : 0.1f))
+         {
+            paintEvent.Graphics.DrawPath(p, gp);
+         }
+
+// ReSharper disable RedundantCast
+// This cast is done to enable Mono to package this
+         int offset = (state == State.Pushed) ? (int)buttonDepress : 0;
+// ReSharper restore RedundantCast
+
+         RectangleF available = new RectangleF(ClientRectangle.Location, ClientRectangle.Size);
+         // Draw the image...
+         Image drawImage = GetDrawImage();
+         if (drawImage != null)
+         {
+            // Figure out where to stick the image.
+            RectangleF imageRect = GetAlignedRectangle(available, drawImage.Size, ImageAlign);
+            float imageAndMargins = imageRect.Width + (2f * imageMargin);
+            switch (ImageAlign)
+            {
+               case ContentAlignment.BottomLeft:
+               case ContentAlignment.MiddleLeft:
+               case ContentAlignment.TopLeft:
+                  available.Width -= imageAndMargins;
+                  available.Offset(imageAndMargins, 0f);
+                  imageRect.Offset(imageMargin, 0f);
+                  break;
+               case ContentAlignment.BottomRight:
+               case ContentAlignment.MiddleRight:
+               case ContentAlignment.TopRight:
+                  available.Width -= imageAndMargins;
+                  imageRect.Offset(-imageMargin, 0f);
+                  break;
+            }
+            if (offset != 0)
+               imageRect.Offset(offset, offset);
+            paintEvent.Graphics.DrawImage(drawImage, imageRect);
+         }
+
+         // Now fill in the text
+         {
+            Size headlineSize = TextRenderer.MeasureText(paintEvent.Graphics, Text, Font);
+            Size subscriptSize = TextRenderer.MeasureText(paintEvent.Graphics, subscript, subscriptFont);
+            Size combined = new Size(Math.Max(headlineSize.Width, subscriptSize.Width),
+                                     headlineSize.Height + subscriptSize.Height + textGap);
+
+            Rectangle textRect = Rectangle.Round(GetAlignedRectangle(available, combined, TextAlign));
+            // Draw the headline text...
+            if (offset != 0)
+               textRect.Offset(offset, offset);
+            TextFormatFlags tf = TextFormatFlags.WordEllipsis;
+            if (!showUnderLine)
+               tf |= TextFormatFlags.HidePrefix;
+            Color textColor = Enabled ? ForeColor : Color.FromKnownColor(KnownColor.GrayText);
+
+            TextRenderer.DrawText(paintEvent.Graphics, Text, Font,
+                                  new Rectangle(textRect.X, textRect.Y, textRect.Width, headlineSize.Height),
+                                  textColor, Color.Transparent, tf);
+            // Draw the subscript text...
+            TextRenderer.DrawText(paintEvent.Graphics, subscript, subscriptFont,
+                                  new Rectangle(textRect.X, textRect.Y + headlineSize.Height + textGap, textRect.Width, subscriptSize.Height),
+                                  textColor, Color.Transparent, TextFormatFlags.WordEllipsis);
+         }
+
+      }
+      private void DrawHighlight(Graphics graphics, GraphicsPath hp)
+      {
+         if (Enabled
+            && useHighlighFill
+            )
+         {
+            byte alpha = highlightFillAlphaNormal;
+            switch (state)
+            {
+               case State.Normal:
+                  alpha = Focused ? highlightFillAlpha : highlightFillAlphaNormal;
+                  break;
+               case State.Hover:
+                  alpha = Focused ? byte.MaxValue : highlightFillAlphaMouse;
+                  break;
+               case State.Pushed:
+                  alpha = highlightFillAlpha;
+                  break;
+               case State.Disabled:
+                  break;
+               default:
+                  throw new ArgumentOutOfRangeException();
+            }
+            using (Brush b = new LinearGradientBrush(ClientRectangle, BackColor, Color.FromArgb(alpha, highlightColor), 90f))
+            {
+               graphics.FillPath(b, hp);
+            }
+         }
+      }
+
+      private GraphicsPath CreateOutlinePath(Graphics graphics)
+      {
+         using (Brush b = new SolidBrush(BackColor))
+         {
+            graphics.FillRectangle(b, ClientRectangle);
+         }
+         float top = hightlightWidth / 2f;
+         //float topInset = top + rounding;
+         float bottom = Height - top;
+         float bottomInset = bottom - rounding;
+         float left = top;
+         //float leftInset = left + rounding;
+         float right = Width - left;
+         float rightInset = right - rounding;
+
+         GraphicsPath gp = new GraphicsPath(FillMode.Winding);
+         // Top
+         gp.AddArc(rightInset, top, rounding, rounding, 270f, 90f);
+         // Right
+         gp.AddArc(rightInset, bottomInset, rounding, rounding, 0f, 90f);
+         // Bottom
+         gp.AddArc(left, bottomInset, rounding, rounding, 90f, 90f);
+         // Left
+         gp.AddArc(left, top, rounding, rounding, 180f, 90f);
+         // Add the lines...
+         gp.CloseFigure();
+         return gp;
+      }
+
+      private sbyte buttonDepress = 2;
+
+      [Category("Command Appearance")]
+      [Browsable(true)]
+      [DefaultValue(2)]
+      [Description("The amount the text and image move diagonally when pressed")]
+      public sbyte ButtonDepress
+      {
+         get
+         {
+            return buttonDepress;
+         }
+         set
+         {
+            buttonDepress = value;
+         }
+      }
+
+      [Category("Command Appearance")]
+      [Browsable(true)]
+      [DefaultValue(null)]
+      public new Image Image
+      {
+         get
+         {
+            return base.Image;
+         }
+         set
+         {
+            //Clean up
+            if (grayImage != null)
+               grayImage.Dispose();
+
+            grayImage = value != null ? GetGrayscale(value) : null;
+            base.Image = value;
+            Refresh();
+         }
+      }
+
+      /// <summary>
+      /// Taken from code @ http://www.bobpowell.net/grayscale.htm
+      /// </summary>
+      /// <param name="original"></param>
+      /// <returns></returns>
+      private static Bitmap GetGrayscale(Image original)
+      {
+         //Set up the drawing surface
+         Bitmap grayscale = new Bitmap(original.Width, original.Height);
+         using (Graphics g = Graphics.FromImage(grayscale))
+         {
+            // Grayscale Color Matrix
+            // Gilles Khouzams colour corrected grayscale shear
+            ColorMatrix colorMatrix = new ColorMatrix(new[]
+                                                         {
+                                                            new[] {0.3f, 0.3f, 0.3f, 0, 0},
+                                                            new[] {0.59f, 0.59f, 0.59f, 0, 0},
+                                                            new[] {0.11f, 0.11f, 0.11f, 0, 0},
+                                                            new float[] {0, 0, 0, 1, 0, 0},
+                                                            new float[] {0, 0, 0, 0, 1, 0},
+                                                            new float[] {0, 0, 0, 0, 0, 1}
+                                                         });
+            //Create attributes
+            ImageAttributes att = new ImageAttributes();
+            att.SetColorMatrix(colorMatrix);
+
+            //Draw the image with the new attributes
+            g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height), 0, 0, original.Width,
+                        original.Height, GraphicsUnit.Pixel, att);
+
+         }
+         return grayscale;
+      }
+
+      /// <summary>
+      /// Calculates the rectangle to be use for the specified alignment.
+      /// </summary>
+      /// <param name="bounds">The outer bounding rectangle.</param>
+      /// <param name="desiredSize">The desired size of the inner rectangle.</param>
+      /// <param name="alignment">The content alignement.</param>
+      /// <returns>The rectangle positioned for the content alignment.</returns>
+      private static RectangleF GetAlignedRectangle(RectangleF bounds, SizeF desiredSize, ContentAlignment alignment)
+      {
+
+         SizeF size = new SizeF(Math.Min(bounds.Width, desiredSize.Width),
+            Math.Min(bounds.Height, desiredSize.Height));
+         switch (alignment)
+         {
+            // Left aligned items
+            case ContentAlignment.MiddleLeft:
+               return new RectangleF(bounds.Left, bounds.Top + ((bounds.Height - size.Height) / 2f),
+                  size.Width, size.Height);
+
+            case ContentAlignment.BottomLeft:
+               return new RectangleF(bounds.Left, bounds.Bottom - size.Height,
+                  size.Width, size.Height);
+
+            // Center aligned items
+            case ContentAlignment.TopCenter:
+               return new RectangleF(bounds.Left + ((bounds.Width - size.Width) / 2f),
+                  bounds.Top,
+                  size.Width, size.Height);
+
+            case ContentAlignment.MiddleCenter:
+               return new RectangleF(bounds.Left + ((bounds.Width - size.Width) / 2f),
+                  bounds.Top + ((bounds.Height - size.Height) / 2f),
+                  size.Width, size.Height);
+
+            case ContentAlignment.BottomCenter:
+               return new RectangleF(bounds.Left + ((bounds.Width - size.Width) / 2f),
+                  bounds.Bottom - size.Height,
+                  size.Width, size.Height);
+
+            // Right aligned items
+            case ContentAlignment.TopRight:
+               return new RectangleF(bounds.Right - size.Width,
+                  bounds.Top,
+                  size.Width, size.Height);
+
+            case ContentAlignment.MiddleRight:
+               return new RectangleF(bounds.Right - size.Width,
+                  bounds.Top + ((bounds.Height - size.Height) / 2f),
+                  size.Width, size.Height);
+
+            case ContentAlignment.BottomRight:
+               return new RectangleF(bounds.Right - size.Width,
+                  bounds.Bottom - size.Height,
+                  size.Width, size.Height);
+         }
+         // Top Left alignment.
+         return new RectangleF(bounds.Location, size);
+      }
+
+      /// <summary>
+      /// Gets the image to be drawn, the image can be specified via the Image property or
+      /// by using an image list.
+      /// </summary>
+      /// <returns>The image to be drawn or null for no image.</returns>
+      private Image GetDrawImage()
+      {
+         Image image = Image;
+         if (image == null && ImageList != null)
+         {
+            image = !string.IsNullOrEmpty(ImageKey) ? ImageList.Images[ImageKey] : ImageList.Images[ImageIndex];
+         }
+         if ((image != null)
+            && (grayImage == null)
+            )
+         {
+            grayImage = GetGrayscale(image);
+         }
+         return Enabled ? image : grayImage;
+      }
+
+      protected override void Dispose(bool disposing)
+      {
+         if (disposing)
+         {
+            if (grayImage != null)
+            {
+               grayImage.Dispose();
+               grayImage = null;
+            }
+         }
+         base.Dispose(disposing);
+      }
+
+      /// <summary>
+      /// Tracks the event to support mouse over highlighting.
+      /// </summary>
+      /// <param name="e">The event arguments.</param>
+      protected override void OnMouseEnter(EventArgs e)
+      {
+         if (Enabled)
+            state = State.Hover;
+         Refresh();
+         base.OnMouseEnter(e);
+      }
+
+      /// <summary>
+      /// Tracks the event to support mouse over highlighting.
+      /// </summary>
+      /// <param name="e">The event arguments.</param>
+      protected override void OnMouseLeave(EventArgs e)
+      {
+         if (Enabled)
+            state = State.Normal;
+         Refresh();
+         base.OnMouseLeave(e);
+      }
+
+      protected override void OnMouseDown(MouseEventArgs e)
+      {
+         if (Enabled)
+            state = State.Pushed;
+         Refresh();
+
+         base.OnMouseDown(e);
+      }
+
+
+      protected override void OnMouseUp(MouseEventArgs e)
+      {
+         if (Enabled)
+         {
+            state = RectangleToScreen(ClientRectangle).Contains(Cursor.Position) ? State.Hover : State.Normal;
+         }
+         Refresh();
+
+         base.OnMouseUp(e);
+      }
+
+      protected override void OnEnabledChanged(EventArgs e)
+      {
+         state = Enabled ? State.Normal : State.Disabled;
+
+         Refresh();
+
+         base.OnEnabledChanged(e);
+      }
+
+
+      #region Properties
+
+      private string subscript;
+
+      /// <summary>
+      /// Gets and sets the text to be displayed in the subscript area.
+      /// </summary>
+      [Category("Appearance")]
+      [DefaultValue("Describe the command executed here")]
+      [Description("The text to display as the subscript.")]
+      public string Subscript
+      {
+         get { return subscript; }
+         set
+         {
+            if (subscript != value)
+            {
+               subscript = value;
+               Refresh();
+            }
+         }
+      }
+
+      private Font subscriptFont = new Font("Tahoma", 8f);
+
+      /// <summary>
+      /// Gets and sets the font to use for the subscript text.
+      /// </summary>
+      [Category("Appearance")]
+      [DefaultValue(typeof(Font), "Tahoma, 8pt")]
+      [Description("The font to use for the subscript.")]
+      public Font SubscriptFont
+      {
+         get { return subscriptFont; }
+         set
+         {
+            if (subscriptFont != value)
+            {
+               subscriptFont = value;
+               Refresh();
+            }
+         }
+      }
+
+      private int textGap = 3;
+
+      /// <summary>
+      /// Gets and sets the gap between the headline and subscript text blocks.
+      /// </summary>
+      [DefaultValue(3)]
+      [Category("Appearance")]
+      [Description("Specifies the gap between the headline and subscript text.")]
+      public int TextGap
+      {
+         get { return textGap; }
+         set
+         {
+            if (value < 0)
+               throw new ArgumentException("Cannot be negative.", "TextGap");
+            if (textGap != value)
+            {
+               textGap = value;
+               Refresh();
+            }
+         }
+      }
+
+      private float imageMargin = 4f;
+
+      /// <summary>
+      /// Gets and sets the left and right margin used for the image.
+      /// </summary>
+      [DefaultValue(4f)]
+      [Category("Appearance")]
+      [Description("Specifies the margin at each side of the image.")]
+      public float ImageMargin
+      {
+         get { return imageMargin; }
+         set
+         {
+            if (value < 0f)
+               throw new ArgumentException("Cannot be negative.", "ImageMargin");
+            if (imageMargin != value)
+            {
+               imageMargin = value;
+               Refresh();
+            }
+         }
+      }
+
+      private Color highlightColor = Color.FromKnownColor(KnownColor.GradientActiveCaption);
+
+      /// <summary>
+      /// Gets and sets the color used for the highlight.
+      /// </summary>
+      [Category("Highlight")]
+      [Description("The color to use for the highlight.")]
+      [DefaultValue(typeof(Color), "GradientActiveCaption")]
+      public Color HighlightColor
+      {
+         get { return highlightColor; }
+         set
+         {
+            if (highlightColor != value)
+            {
+               highlightColor = value;
+               Refresh();
+            }
+         }
+      }
+
+      private float hightlightWidth = 2f;
+
+      /// <summary>
+      /// Gets and sets the width of the highlight.
+      /// </summary>
+      [Category("Highlight")]
+      [Description("The width of the highlight line.")]
+      public float HighlightWidth
+      {
+         get { return hightlightWidth; }
+         set
+         {
+            if (value < 0f)
+               throw new ArgumentException("Cannot be negative.", "HighlightWidth");
+            if (hightlightWidth != value)
+            {
+               hightlightWidth = value;
+               Refresh();
+            }
+         }
+      }
+
+      private float rounding = 10f;
+
+      /// <summary>
+      /// Gets and sets the rounding factor controlling how round the corners of the highlight are.
+      /// </summary>
+      [Category("Highlight")]
+      [Description("Controls how round the corners of the highlight are.")]
+      public float Rounding
+      {
+         get { return rounding; }
+         set
+         {
+            if (rounding != value)
+            {
+               rounding = value;
+               Refresh();
+            }
+         }
+      }
+
+      private bool useHighlighFill = true;
+
+      /// <summary>
+      /// Gets and sets whether the interior background colour of the control will be blended with the highlight
+      /// color when the highlight is shown.
+      /// </summary>
+      [Category("Highlight")]
+      [Description("When true the interior background of the control will be blended with the highlight color.")]
+      [DefaultValue(true)]
+      public bool UseHighlighFill
+      {
+         get { return useHighlighFill; }
+         set
+         {
+            if (useHighlighFill != value)
+            {
+               useHighlighFill = value;
+               Refresh();
+            }
+         }
+      }
+
+      private byte highlightFillAlphaNormal = 50;
+
+      /// <summary>
+      /// Gets and sets the maximum value of the alpha channel used when the control is being drawn normally.
+      /// </summary>
+      [Category("Highlight")]
+      [DefaultValue(50)]
+      [Description("Sets the maximum alpha value to use for the graduated normal fill.")]
+      public byte HighlightFillAlphaNormal
+      {
+         get { return highlightFillAlphaNormal; }
+         set
+         {
+            if (highlightFillAlphaNormal != value)
+            {
+               highlightFillAlphaNormal = value;
+               Refresh();
+            }
+         }
+      }
+
+
+      private byte highlightFillAlpha = 200;
+
+      /// <summary>
+      /// Gets and sets the maximum value of the alpha channel used when the control is focus highlighted.
+      /// </summary>
+      [Category("Highlight")]
+      [DefaultValue(200)]
+      [Description("Sets the maximum alpha value to use for the graduated highlight fill.")]
+      public byte HighlightFillAlpha
+      {
+         get { return highlightFillAlpha; }
+         set
+         {
+            if (highlightFillAlpha != value)
+            {
+               highlightFillAlpha = value;
+               Refresh();
+            }
+         }
+      }
+
+      private byte highlightFillAlphaMouse = 100;
+
+      /// <summary>
+      /// Gets and sets the maximum value of the alpha channel used when the control is mouse highlighted.
+      /// </summary>
+      [Category("Highlight")]
+      [DefaultValue(100)]
+      [Description("Sets the maximum alpha value to use for the graduated highlight fill when the the mouse is over the control.")]
+      public byte HighlightFillAlphaMouse
+      {
+         get { return highlightFillAlphaMouse; }
+         set
+         {
+            if (highlightFillAlphaMouse != value)
+            {
+               highlightFillAlphaMouse = value;
+               Refresh();
+            }
+         }
+      }
+
+      #endregion
+
+   }
+}
+// ReSharper restore UnusedMember.Global
+// ReSharper restore MemberCanBePrivate.Global
diff --git a/Liquesce/Shared/FlickerFreeRichEditTextBox.cs b/Liquesce/Shared/FlickerFreeRichEditTextBox.cs
new file mode 100644
index 0000000..07f3c4f
--- /dev/null
+++ b/Liquesce/Shared/FlickerFreeRichEditTextBox.cs
@@ -0,0 +1,35 @@
+// Taken from
+// http://www.c-sharpcorner.com/UploadFile/mgold/ColorSyntaxEditor12012005235814PM/ColorSyntaxEditor.aspx
+
+using System;
+using System.Windows.Forms;
+
+namespace Shared
+{
+   /// <summary>
+   /// Summary description for FlickerFreeRichEditTextBox - Subclasses the RichTextBox to allow control over flicker
+   /// </summary>
+   public class FlickerFreeRichEditTextBox : RichTextBox
+   {
+      const short WM_PAINT = 0x00f;
+      public FlickerFreeRichEditTextBox()
+      {
+      }
+      public bool _Paint = true;
+      protected override void WndProc(ref System.Windows.Forms.Message m)
+      {
+         // Code courtesy of Mark Mihevc
+         // sometimes we want to eat the paint message so we don't have to see all the
+         // flicker from when we select the text to change the color.
+         if (m.Msg == WM_PAINT)
+         {
+            if (_Paint)
+               base.WndProc(ref m); // if we decided to paint this control, just call the RichTextBox WndProc
+            else
+               m.Result = IntPtr.Zero; // not painting, must set this to IntPtr.Zero if not painting therwise serious problems.
+         }
+         else
+            base.WndProc(ref m); // message other than WM_PAINT, jsut do what you normally do.
+      }
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/Shared/NumericUpDownTypeEditor.cs b/Liquesce/Shared/NumericUpDownTypeEditor.cs
new file mode 100644
index 0000000..182b65e
--- /dev/null
+++ b/Liquesce/Shared/NumericUpDownTypeEditor.cs
@@ -0,0 +1,208 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="NumericUpDownTypeEditor.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// 
+//  </copyright>
+//  <summary>
+//  Url: http://liquesce.wordpress.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+//  Inspiration from the following sources:
+//    http://social.msdn.microsoft.com/Forums/da-DK/netfxbcl/thread/370ce9d3-fc44-4cdc-9c76-dd913c9b572f
+//    http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/afcd4dd5-5538-433b-8cac-78c081ee16b6
+//    http://social.msdn.microsoft.com/Forums/en/winforms/thread/b9325e61-767b-43c8-96a2-e0caef2cecad
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Design;
+using System.Globalization;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+
+namespace Liquesce
+{
+   /// <summary>
+   /// Range modification for direct edit override
+   /// </summary>
+   public class NumericUpDownTypeConverter : TypeConverter 
+   {
+      public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
+      {
+         // Attempt to do them all
+         return true;
+      }
+
+
+      public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
+      {
+         try
+         {
+            string Value;
+            if (!(value is string))
+            {
+               Value = Convert.ChangeType(value, context.PropertyDescriptor.PropertyType).ToString();
+            }
+            else
+               Value = value as string;
+            decimal decVal;
+            if (!decimal.TryParse(Value, out decVal))
+               decVal = decimal.One;
+            MinMaxAttribute attr = (MinMaxAttribute)context.PropertyDescriptor.Attributes[typeof(MinMaxAttribute)];
+            if (attr != null)
+            {
+               decVal = attr.PutInRange(decVal);
+            }
+            return Convert.ChangeType(decVal, context.PropertyDescriptor.PropertyType);
+         }
+         catch
+         {
+            return base.ConvertFrom(context, culture, value);
+         }
+      }
+
+      public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
+      {
+         try
+         {
+            return destinationType == typeof(string) 
+               ? Convert.ChangeType(value, context.PropertyDescriptor.PropertyType).ToString() 
+               : Convert.ChangeType(value, destinationType);
+         }
+         catch { }
+         return base.ConvertTo(context, culture, value, destinationType);
+      }
+   }
+
+   // ReSharper disable MemberCanBePrivate.Global
+   /// <summary>
+   /// Attribute to allow ranges to be added to the numeric updowner
+   /// </summary>
+   [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
+   public class MinMaxAttribute : Attribute
+   {
+      public decimal Min { get; private set; }
+      public decimal Max { get; private set; }
+      public decimal Increment { get; private set; }
+      public int DecimalPlaces { get; private set; }
+
+      /// <summary>
+      /// Use to make a simple UInt16 max. Starts at 0, increment = 1
+      /// </summary>
+      /// <param name="max"></param>
+      public MinMaxAttribute(UInt16 max)
+         : this((decimal)UInt16.MinValue, max)
+      {
+      }
+
+      /// <summary>
+      /// Use to make a simple integer (or default conversion) based range.
+      /// default inclrement is 1
+      /// </summary>
+      /// <param name="min"></param>
+      /// <param name="max"></param>
+      /// <param name="increment"></param>
+      public MinMaxAttribute(int min, int max, int increment = 1)
+         : this((decimal)min, max, increment)
+      {
+      }
+
+      /// <summary>
+      /// Set the Min, Max, increment, and decimal places to be used.
+      /// </summary>
+      /// <param name="min"></param>
+      /// <param name="max"></param>
+      /// <param name="increment"></param>
+      /// <param name="decimalPlaces"></param>
+      public MinMaxAttribute(decimal min, decimal max, decimal increment = decimal.One, int decimalPlaces = 0)
+      {
+         Min = min;
+         Max = max;
+         Increment = increment;
+         DecimalPlaces = decimalPlaces;
+      }
+
+      /// <summary>
+      /// Validation function to check if the value is withtin the range (inclusive)
+      /// </summary>
+      /// <param name="value"></param>
+      /// <returns></returns>
+      public bool IsInRange(object value)
+      {
+         decimal checkedValue = (decimal)Convert.ChangeType(value, typeof(decimal));
+         return ((checkedValue <= Max)
+            && (checkedValue >= Min)
+            );
+      }
+
+      /// <summary>
+      /// Takes the value and adjusts if it is out of bounds.
+      /// </summary>
+      /// <param name="value"></param>
+      /// <returns></returns>
+      public decimal PutInRange(object value)
+      {
+         decimal checkedValue = (decimal)Convert.ChangeType(value, typeof(decimal));
+         if (checkedValue > Max)
+            checkedValue = Max;
+         else if (checkedValue < Min)
+            checkedValue = Min;
+         return checkedValue;
+      }
+   }
+   // ReSharper restore MemberCanBePrivate.Global
+
+
+   public class NumericUpDownTypeEditor : UITypeEditor
+   {
+      public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
+      {
+         if (context == null || context.Instance == null)
+            return base.GetEditStyle(context);
+         return context.PropertyDescriptor.IsReadOnly ? UITypeEditorEditStyle.None : UITypeEditorEditStyle.DropDown;
+      }
+
+      public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+      {
+         try
+         {
+            if (context == null || context.Instance == null || provider == null)
+               return value;
+            
+            //use IWindowsFormsEditorService object to display a control in the dropdown area  
+            IWindowsFormsEditorService frmsvr = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
+            if (frmsvr == null)
+               return value;
+
+            MinMaxAttribute attr = (MinMaxAttribute)context.PropertyDescriptor.Attributes[typeof(MinMaxAttribute)];
+            if (attr != null)
+            {
+               NumericUpDown nmr = new NumericUpDown
+                                      {
+                                         Size = new Size(60, 120),
+                                         Minimum = attr.Min,
+                                         Maximum = attr.Max,
+                                         Increment = attr.Increment,
+                                         DecimalPlaces = attr.DecimalPlaces,
+                                         Value = attr.PutInRange(value)
+                                      };
+               frmsvr.DropDownControl(nmr);
+               context.OnComponentChanged();
+               return Convert.ChangeType(nmr.Value, context.PropertyDescriptor.PropertyType);
+            }
+         }
+         catch { }
+         return value;
+      }
+   }
+}
diff --git a/Liquesce/Shared/SplitContainerEx.cs b/Liquesce/Shared/SplitContainerEx.cs
new file mode 100644
index 0000000..f03ae6d
--- /dev/null
+++ b/Liquesce/Shared/SplitContainerEx.cs
@@ -0,0 +1,86 @@
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace Liquesce
+{
+   /// <summary>
+   /// Draw dots, bar, and remove focus after drag
+   /// </summary>
+   public class SplitContainerEx : SplitContainer
+   {
+      /// <summary>Determines the thickness of the splitter.</summary>
+      [DefaultValue(typeof(int), "5"), Description("Determines the thickness of the splitter.")]
+      public virtual new int SplitterWidth
+      {
+         get { return base.SplitterWidth; }
+         set
+         {
+            if (value < 5)
+               value = 5;
+
+            base.SplitterWidth = value;
+         }
+      }
+
+      private bool _painting;
+      public override bool Focused
+      {
+         get { return _painting ? false : base.Focused; }
+      }
+
+      protected override void OnPaint(PaintEventArgs e)
+      {
+         _painting = true;
+
+         try
+         {
+            base.OnPaint(e);
+            // ControlPaint.DrawGrabHandle(e.Graphics, SplitterRectangle, true, Enabled);
+
+            //paint the three dots'
+            Point[] points = new Point[4];
+            int w = Width;
+            int h = Height;
+            int d = SplitterDistance;
+            int sW = SplitterWidth;
+            int sWC = (sW / 2);
+
+            if (Orientation == Orientation.Horizontal)
+            {
+               e.Graphics.DrawLine(SystemPens.ControlLightLight, 0, d + sWC-1, w, d + sWC-1);
+               //e.Graphics.DrawLine(SystemPens.Control, 0, d + (sW / 2), w, d + (sW / 2));
+               e.Graphics.DrawLine(SystemPens.ControlDark, 0, d + sWC+1, w, d + sWC+1);
+               points[0] = new Point((w / 2) - 15, d + sWC);
+               points[1] = new Point(points[0].X + 10, points[0].Y);
+               points[2] = new Point(points[0].X + 20, points[0].Y);
+               points[3] = new Point(points[0].X + 30, points[0].Y);
+            }
+            else
+            {
+               e.Graphics.DrawLine(SystemPens.ControlLightLight, d + sWC-1, 0, d + sWC-1, h);
+               //e.Graphics.DrawLine(SystemPens.ControlDark, d + (sW / 2), 0, d + (sW / 2), h);
+               e.Graphics.DrawLine(SystemPens.ControlDark, d + sWC+1, 0, d + sWC+1, h);
+               points[0] = new Point(d + sWC, (h / 2) - 15);
+               points[1] = new Point(points[0].X, points[0].Y + 10);
+               points[2] = new Point(points[0].X, points[0].Y + 20);
+               points[3] = new Point(points[0].X, points[0].Y + 30);
+            }
+
+            foreach (Point p in points)
+            {
+               p.Offset(-2, -2);
+               e.Graphics.FillEllipse(SystemBrushes.ControlDark, new Rectangle(p, new Size(3, 3)));
+
+               p.Offset(1, 1);
+               e.Graphics.FillEllipse(SystemBrushes.ControlLight, new Rectangle(p, new Size(3, 3)));
+            }
+         }
+         finally
+         {
+            _painting = false;
+         }
+      }
+
+   }
+}
diff --git a/Liquesce/TabMainForm.Designer.cs b/Liquesce/TabMainForm.Designer.cs
new file mode 100644
index 0000000..5b988d1
--- /dev/null
+++ b/Liquesce/TabMainForm.Designer.cs
@@ -0,0 +1,213 @@
+namespace Liquesce
+{
+   partial class TabMainForm
+   {
+      /// <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()
+      {
+         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TabMainForm));
+         this.tabControl1 = new System.Windows.Forms.TabControl();
+         this.tabWelcome = new System.Windows.Forms.TabPage();
+         this.welcome1 = new Liquesce.Tabs.Welcome();
+         this.tabLogging = new System.Windows.Forms.TabPage();
+         this.logging1 = new Liquesce.Tabs.Logging();
+         this.tabMounting = new System.Windows.Forms.TabPage();
+         this.mountingPoints1 = new Liquesce.Tabs.MountingPoints();
+         this.tabSharing = new System.Windows.Forms.TabPage();
+         this.currentShares1 = new Liquesce.Tabs.CurrentShares();
+         this.tabService = new System.Windows.Forms.TabPage();
+         this.service1 = new Liquesce.Tabs.Service();
+         this.tabControl1.SuspendLayout();
+         this.tabWelcome.SuspendLayout();
+         this.tabLogging.SuspendLayout();
+         this.tabMounting.SuspendLayout();
+         this.tabSharing.SuspendLayout();
+         this.tabService.SuspendLayout();
+         this.SuspendLayout();
+         // 
+         // tabControl1
+         // 
+         this.tabControl1.Alignment = System.Windows.Forms.TabAlignment.Left;
+         this.tabControl1.Controls.Add(this.tabWelcome);
+         this.tabControl1.Controls.Add(this.tabLogging);
+         this.tabControl1.Controls.Add(this.tabMounting);
+         this.tabControl1.Controls.Add(this.tabSharing);
+         this.tabControl1.Controls.Add(this.tabService);
+         this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.tabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
+         this.tabControl1.ItemSize = new System.Drawing.Size(25, 150);
+         this.tabControl1.Location = new System.Drawing.Point(3, 3);
+         this.tabControl1.Multiline = true;
+         this.tabControl1.Name = "tabControl1";
+         this.tabControl1.SelectedIndex = 0;
+         this.tabControl1.Size = new System.Drawing.Size(764, 483);
+         this.tabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
+         this.tabControl1.TabIndex = 0;
+         this.tabControl1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabControl1_DrawItem);
+         // 
+         // tabWelcome
+         // 
+         this.tabWelcome.BackColor = System.Drawing.SystemColors.Control;
+         this.tabWelcome.Controls.Add(this.welcome1);
+         this.tabWelcome.Location = new System.Drawing.Point(154, 4);
+         this.tabWelcome.Name = "tabWelcome";
+         this.tabWelcome.Padding = new System.Windows.Forms.Padding(3);
+         this.tabWelcome.Size = new System.Drawing.Size(606, 475);
+         this.tabWelcome.TabIndex = 0;
+         this.tabWelcome.Text = "Welcome";
+         // 
+         // welcome1
+         // 
+         this.welcome1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.welcome1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.welcome1.Location = new System.Drawing.Point(3, 3);
+         this.welcome1.Name = "welcome1";
+         this.welcome1.Padding = new System.Windows.Forms.Padding(3);
+         this.welcome1.Size = new System.Drawing.Size(600, 469);
+         this.welcome1.TabIndex = 0;
+         // 
+         // tabLogging
+         // 
+         this.tabLogging.BackColor = System.Drawing.SystemColors.Control;
+         this.tabLogging.Controls.Add(this.logging1);
+         this.tabLogging.Location = new System.Drawing.Point(154, 4);
+         this.tabLogging.Name = "tabLogging";
+         this.tabLogging.Padding = new System.Windows.Forms.Padding(3);
+         this.tabLogging.Size = new System.Drawing.Size(606, 475);
+         this.tabLogging.TabIndex = 1;
+         this.tabLogging.Text = "Logging";
+         // 
+         // logging1
+         // 
+         this.logging1.BackColor = System.Drawing.SystemColors.Control;
+         this.logging1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.logging1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.logging1.Location = new System.Drawing.Point(3, 3);
+         this.logging1.Name = "logging1";
+         this.logging1.Padding = new System.Windows.Forms.Padding(3);
+         this.logging1.Size = new System.Drawing.Size(600, 469);
+         this.logging1.TabIndex = 0;
+         // 
+         // tabMounting
+         // 
+         this.tabMounting.BackColor = System.Drawing.SystemColors.Control;
+         this.tabMounting.Controls.Add(this.mountingPoints1);
+         this.tabMounting.Location = new System.Drawing.Point(154, 4);
+         this.tabMounting.Name = "tabMounting";
+         this.tabMounting.Size = new System.Drawing.Size(606, 475);
+         this.tabMounting.TabIndex = 2;
+         this.tabMounting.Text = "Mounting Point";
+         // 
+         // mountingPoints1
+         // 
+         this.mountingPoints1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.mountingPoints1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.mountingPoints1.Location = new System.Drawing.Point(0, 0);
+         this.mountingPoints1.Name = "mountingPoints1";
+         this.mountingPoints1.Padding = new System.Windows.Forms.Padding(3);
+         this.mountingPoints1.Size = new System.Drawing.Size(606, 475);
+         this.mountingPoints1.TabIndex = 0;
+         // 
+         // tabSharing
+         // 
+         this.tabSharing.BackColor = System.Drawing.SystemColors.Control;
+         this.tabSharing.Controls.Add(this.currentShares1);
+         this.tabSharing.Location = new System.Drawing.Point(154, 4);
+         this.tabSharing.Name = "tabSharing";
+         this.tabSharing.Padding = new System.Windows.Forms.Padding(3);
+         this.tabSharing.Size = new System.Drawing.Size(606, 475);
+         this.tabSharing.TabIndex = 4;
+         this.tabSharing.Text = "Sharing Control";
+         // 
+         // currentShares1
+         // 
+         this.currentShares1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.currentShares1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.currentShares1.Location = new System.Drawing.Point(3, 3);
+         this.currentShares1.Name = "currentShares1";
+         this.currentShares1.Size = new System.Drawing.Size(600, 469);
+         this.currentShares1.TabIndex = 0;
+         // 
+         // tabService
+         // 
+         this.tabService.BackColor = System.Drawing.SystemColors.Control;
+         this.tabService.Controls.Add(this.service1);
+         this.tabService.Location = new System.Drawing.Point(154, 4);
+         this.tabService.Name = "tabService";
+         this.tabService.Size = new System.Drawing.Size(606, 475);
+         this.tabService.TabIndex = 3;
+         this.tabService.Text = "Service Settings";
+         // 
+         // service1
+         // 
+         this.service1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.service1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.service1.Location = new System.Drawing.Point(0, 0);
+         this.service1.Name = "service1";
+         this.service1.Padding = new System.Windows.Forms.Padding(3);
+         this.service1.Size = new System.Drawing.Size(606, 475);
+         this.service1.TabIndex = 0;
+         // 
+         // TabMainForm
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.ClientSize = new System.Drawing.Size(770, 489);
+         this.Controls.Add(this.tabControl1);
+         this.DoubleBuffered = true;
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+         this.MinimumSize = new System.Drawing.Size(778, 516);
+         this.Name = "TabMainForm";
+         this.Padding = new System.Windows.Forms.Padding(3);
+         this.Text = "Liquesce ][ Mount Manager";
+         this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LandingZone_FormClosing);
+         this.Shown += new System.EventHandler(this.TabMainForm_Shown);
+         this.tabControl1.ResumeLayout(false);
+         this.tabWelcome.ResumeLayout(false);
+         this.tabLogging.ResumeLayout(false);
+         this.tabMounting.ResumeLayout(false);
+         this.tabSharing.ResumeLayout(false);
+         this.tabService.ResumeLayout(false);
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private System.Windows.Forms.TabControl tabControl1;
+      private System.Windows.Forms.TabPage tabWelcome;
+      private System.Windows.Forms.TabPage tabLogging;
+      private Tabs.Welcome welcome1;
+      private Tabs.Logging logging1;
+      private System.Windows.Forms.TabPage tabMounting;
+      private Tabs.MountingPoints mountingPoints1;
+      private System.Windows.Forms.TabPage tabService;
+      private Tabs.Service service1;
+      private System.Windows.Forms.TabPage tabSharing;
+      private Tabs.CurrentShares currentShares1;
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/TabMainForm.cs b/Liquesce/TabMainForm.cs
new file mode 100644
index 0000000..0abe5d1
--- /dev/null
+++ b/Liquesce/TabMainForm.cs
@@ -0,0 +1,128 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="TabMainForm.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion Copyright (C)
+
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Windows.Forms;
+
+using Liquesce.Tabs;
+using LiquesceFacade;
+using LiquesceTray;
+
+namespace Liquesce
+{
+   public partial class TabMainForm : Form
+   {
+      private readonly ConfigDetails cd = new ConfigDetails();
+
+      public TabMainForm()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+         ResizeRedraw = true;
+
+         if (Properties.Settings.Default.UpdateRequired)
+         {
+            // Thanks go to http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/12/09/246.aspx
+            Properties.Settings.Default.Upgrade();
+            Properties.Settings.Default.UpdateRequired = false;
+            Properties.Settings.Default.Save();
+         }
+         WindowLocation.GeometryFromString(Properties.Settings.Default.WindowLocation, this);
+         new DealWithTheCfgChanging().ReadConfigDetails(ref cd);
+         foreach (TabPage control in tabControl1.TabPages)
+         {
+            foreach (ITab tab in control.Controls.OfType<ITab>())
+            {
+               tab.cd = cd;
+               break;
+            }
+         }
+      }
+
+      // Stop the Tab control from flickering during resize !
+      protected override CreateParams CreateParams
+      {
+         get
+         {
+            CreateParams cp = base.CreateParams;
+            cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
+            cp.ExStyle |= 0x00080000;  // Turn on WS_EX_LAYERED
+            cp.Style &= ~0x02000000;  // Turn off WS_CLIPCHILDREN
+            return cp;
+         }
+      }
+
+      private readonly StringFormat stringFormat = new StringFormat
+      {
+         Alignment = StringAlignment.Center,
+         LineAlignment = StringAlignment.Center
+      };
+
+      private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
+      {
+         string tabName = tabControl1.TabPages[e.Index].Text;
+         //Find if it is selected, this one will be hightlighted...
+         if (e.Index == tabControl1.SelectedIndex)
+         {
+            e.Graphics.FillRectangle(SystemBrushes.GradientActiveCaption, e.Bounds);
+         }
+         e.Graphics.DrawString(tabName, Font, SystemBrushes.ControlText, tabControl1.GetTabRect(e.Index), stringFormat);
+         DrawTabPageBorder(tabControl1.SelectedIndex, SystemBrushes.GradientActiveCaption, e.Graphics);
+      }
+
+      private const int highlightWidth = 2;
+
+      private void DrawTabPageBorder(int index, Brush findHighlightColor, Graphics graphics)
+      {
+         graphics.SmoothingMode = SmoothingMode.HighQuality;
+         Rectangle pageBounds = tabControl1.TabPages[index].Bounds;
+         if (highlightWidth > 1)
+         {
+            pageBounds.Inflate(highlightWidth - 1, highlightWidth - 1);
+         }
+         using (Pen borderPen = new Pen(findHighlightColor, highlightWidth))
+         {
+            graphics.DrawRectangle(borderPen, pageBounds);
+         }
+      }
+
+      private void LandingZone_FormClosing(object sender, FormClosingEventArgs e)
+      {
+         // persist our geometry string.
+         Properties.Settings.Default.WindowLocation = WindowLocation.GeometryToString(this);
+         Properties.Settings.Default.Save();
+      }
+
+      private void TabMainForm_Shown(object sender, System.EventArgs e)
+      {
+         BringToFront();
+         Activate();
+      }
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/TabMainForm.resx b/Liquesce/TabMainForm.resx
new file mode 100644
index 0000000..8728586
--- /dev/null
+++ b/Liquesce/TabMainForm.resx
@@ -0,0 +1,418 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
+        IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEBBAEBAQQAAAABAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAQEEAQEBBAAAAAEAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEBBAEBAQQAAAABAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgIGBAQEDwwMDCEYFxc2KCgnVB8fH1gJCQkpAAAABQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgYEBAQPDAwMIRgXFzYoKCdUHx8fWAkJ
+        CSkAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgIGBAQEDwwMDCEYFxc2KCgnVB8f
+        H1gJCQkpAAAABQAAAAAAAAAAAAAAAAAAAAApKSkDBQUFDw8PDygcGxtIKysra0VERJpbWlq9cnJx4Glo
+        ad45OTmcCwsLNgEBAQwAAAAAAAAAAAAAAAAAAAAAAAAAACkpKQMFBQUPDw8PKBwbG0grKytrRUREmlta
+        Wr1ycnHgaWhp3jk5OZwLCws2AQEBDAAAAAAAAAAAAAAAAAAAAAApKSkDBQUFDw8PDygcGxtIKysra0VE
+        RJpbWlq9cnJx4Gload45OTmcCwsLNgEBAQwAAAAAAAAAAAAAAAAgHx8qMTAwZzk4OJxDQUHETEtL31dW
+        VvVcXF38X19f/nh3eP53d3fvPT09pBQUFE4CAgIRAAAAAAAAAAAAAAAAAAAAACAfHyoxMDBnOTg4nENB
+        QcRMS0vfV1ZW9VxcXfxfX1/+eHd4/nd3d+89PT2kFBQUTgICAhEAAAAAAAAAAAAAAAAgHx8qMTAwZzk4
+        OJxDQUHETEtL31dWVvVcXF38X19f/nh3eP53d3fvPT09pBQUFE4CAgIRAAAAAAAAAABnZGSWY2Ji2z08
+        PPErKyr7KSkp/S0tLf41NTb+R0hH/oaGhv6mpqb+e3t78FFRUb4aGhpaAwMDFAAAAAIAAAAAAAAAAGdk
+        ZJZjYmLbPTw88SsrKvspKSn9LS0t/jU1Nv5HSEf+hoaG/qampv57e3vwUVFRvhoaGloDAwMUAAAAAgAA
+        AABnZGSWY2Ji2z08PPErKyr7KSkp/S0tLf41NTb+R0hH/oaGhv6mpqb+e3t78FFRUb4aGhpaAwMDFAAA
+        AAKSj4/nZGRj/UZFRf4xMDH/Li4v/kJCQv9bWlr+fH18/q2trf7Ix8f+ra2t/o6OjvhcXFzIISEhZgMD
+        AxYAAAAAAAAAAJKPj+dkZGP9RkVF/jEwMf8uLi/+QkJC/1taWv58fXz+ra2t/sjHx/6tra3+jo6O+Fxc
+        XMghISFmAwMDFgAAAACSj4/nZGRj/UZFRf4xMDH/Li4v/kJCQv9bWlr+fH18/q2trf7Ix8f+ra2t/o6O
+        jvhcXFzIISEhZgMDAxaIhYXVcnJy9X5+f/2CgYL/iYiJ/qCfn/+ysbH+v769/r++vf7DwsH+w8LC/rS0
+        tP6am5v5ZmZmyRYWFkAAAAAAAAAAAIiFhdVycnL1fn5//YKBgv+JiIn+oJ+f/7Kxsf6/vr3+v769/sPC
+        wf7DwsL+tLS0/pqbm/lmZmbJFhYWQAAAAACIhYXVcnJy9X5+f/2CgYL/iYiJ/qCfn/+ysbH+v769/r++
+        vf7DwsH+w8LC/rS0tP6am5v5ZmZmyRYWFkBdW1tzfn5/s6qsrdzIycr40tHR/dzc2//e3dz+2tnX/s3M
+        yv7EwsL+vby7/rq6uv69vr7+oqKi7CwsLFAAAAAAAAAAAF1bW3N+fn+zqqyt3MjJyvjLrIH+xo4//8aO
+        P//Gjj//xo4//8aOP//Co3f/urq6/r2+vv6ioqLsLCwsUAAAAABdW1tzfn5/s6qsrdzIycr40tHR/dzc
+        2//e3dz+2tnX/s3Myv7EwsL+vby7/rq6uv69vr7+oqKi7CwsLFAZGRkXPDw9O2pqa26bm5ypycjJ1+jo
+        5/3t7u3+5+fm/t7d3f7W1tb+ycnI/rq7u/2/wMD6tLS02zU1NT0AAAAAAAAAABkZGRc8PD07amprbpub
+        nKnAhjf/4q9Z/+W8ev/juXn/4Ld3/960df/Gjj//uru7/b/AwPq0tLTbNTU1PQAAAAAZGRkXPDw9O2pq
+        a26bm5ypnsuh6SCzLv8csCf/Hq0n/63Wr/7W1tb+ycnI/rq7u/2/wMD6tLS02zU1NT0AAAAABwcHAxER
+        EQ8qKiopaWlpV5iYmJ7JysvXwcHC88HCwvTIyMjqs7Ozy5GRkbOBgYGOWltbZRwcHBYAAAAAAAAAAAAA
+        AAAHBwcDERERDyoqKinAhjf/25Ua/9eQGP/Tihb/zoUT/+G3d//Gjj//kZGRs4GBgY5aW1tlHBwcFgAA
+        AAAAAAAABwcHAxEREQ8qKiopcrh2tT/NWv8gwTn/N75E/5XImfrIyMjqs7Ozy5GRkbOBgYGOWltbZRwc
+        HBYAAAAAAAAAAAAAAAAAAAAAAAAAACIiIhpVVVZYZ2dojmtra41fX19uR0dHRywsLC4sLCwNAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/4Jsf/9uVG//XkBn/04sW/+O6ef/Gjj//LCwsLiws
+        LA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc8x6j0/WbP4izEf/PcpW/3Gvdc1fX19uR0dHRyws
+        LC4sLCwNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgFGxsbGR8fHxgPDw8IAgICAQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/5aIm/9+aHf/clhz/15EZ/+a+
+        e//Gjj//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcsd2dXLId49yyHePNrU+zmbdgv9E2Wn/UdVt/zaz
+        P9Nwx3eTdM16j3PMenUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/6aov/+Of
+        IP/gmx//3Jcc/+nBff/Gjj//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIK0u+VzZef9u3on+euKU/3/o
+        nf5g4YT/aOCH/lPWbv9BzFr+OMJJ/xmtI/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADAhjf/7LA3/+ajIv/joCL/4Jwf/+vEfv/Gjj//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK0q/zfT
+        Wv9B2Gf/X+KD/3LmlP9155b/ZuOK/0vccf8t0VP/KchH/x2yK/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAADAhjf/8LZB/+qoJf/npST/5KEi/+3HgP/Gjj//AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAFqkj+TfJUv9Azl3+VNZx/2/jjv5y55P/jOqo/nvhlP9o3IT+U9Zw/x60LvkAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/8rpI/+2tLP/qqCX/6KUk//DJgf/Gjj//AAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAcsZ2dXLGdo9yxnaPNK06zkzTav9X4Hz/fuKW/zWvO85zyHePc8p4j3TN
+        enUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/871M/++zN//tqyb/66gm//LM
+        gv/Gjj//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcsZ2jznLVf411Fz/Z9yC/nLG
+        do8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/9L5L//K5
+        Qv/urSj/7awo//TOhP/Gjj//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcsZ2jzDF
+        Sf8szU7/TtNr/3LGdo8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADAhjf/871K//K8Sf/wsC3/764o//XQhf/Gjj//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAcsZ2dROnH/kYqyb/G6so+XLGdnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAADAhjf/8rtI//K8S//xtTb/8K8o//bRhf/Gjj//AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAhjf/77hH//C6Sv/xuED/8LAo//bShv/Gjj//AAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAuXwtjLl8Lf+5fC3/uXwt/7l8Lf/Ahjf/6rNF/+22R//wuUj/8LEv//bS
+        hf/Gjj//xo4//8aOP//Gjj//xo4//8aOP4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApWYW/+KjOv/XnTj/26E6/9+mPf/gqT//5a5C/+my
+        RP/st0j/7rQ7//bRhf/20ob/+NOG//nThf/40oX/+tOE/7l+L/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr3AiaKVmFv/ZnTf/05o3/9ee
+        Of/bozz/4Kg//+StQv/pskX/7LVE/+2tKv/vryn/8LAq//CwKv/ysSn/uX4v/7FxImcAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAADKFn
+        H3GlZhb/1Zo2/9OZN//WnTn/26I7/9+nPv/krEL/6LJG/+quNP/sqyb/7q8p//CwKv+5fi//pGkgbwAA
+        AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABQAAAAkAAAANAAAAEwAA
+        ABoAAAAuAAAAQwIAAWB1UCS5pWYW/9GXNf/SmTf/1p05/9qhO//fpz7/5KxC/+evQP/oqCb/66wn/7l+
+        L/9xSBahAAAAMwAAABsAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABwAAAAsAAAAQAAAAFwAA
+        ACwAAABKAAAAYiMkJIV4d3fcnpyc+7y2tv+yrq7/qo1t/6VmFv/PlTT/0pk2/9WcOf/ZoTv/3qY+/+Ot
+        Q//lqTT/uX4v/5F3V/9CQkLlAAAAiwAAAEgAAAApAAAAEQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAABwAAAA4AAAATAAAAIQAA
+        AEAAAABeISEihnFwcNacmZn7u7W1/6qmpv+RjY3/f319/3R0dP9zc3P/dXV1/491Vf+lZhb/zpQ0/9GY
+        Nv/VnDn/2aA6/96lPv+zdif/noRk/4ODg/+IiIj/Z2dn/hcXF7oAAABkAAAANgAAABkAAAAHAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAcAAAAPAAAAKAAA
+        AEIREBBpXV1drpqWlve0r6//o6Cf/4+Li/91cnL/YWJg/11dXf9fX1//YWFh/2JhYf9iYmL/Y2Nj/2Nj
+        Y/+DaUn/pWYW/82UNP/RmDb/1Zw4/7N2J/+Qdlf/hYWF/3R0dP99fX3/ioqK/39/f/9FRUXmAAAAjQAA
+        AEYAAAAkAAAADwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAA
+        AB1eXl5ti4mLuK+qqv65tLT/mpSU/3Btbf9PT0//S0tL/0lJSf9ISEj/R0dH/0dHR/9HRkb/R0dH/0dH
+        R/9ISEf/SUhJ/0tLS/9LS0v/dFo8/6VmFv/NkzT/s3Yn/3ZcPP99fHz/oKCg/4GBgf90dHT/dXV1/4KC
+        gv+Kior/cHBw/yEhIcQAAABmAAAANgAAABwAAAAIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAISEhTrm1tfjAuLj/hoCA/1ZUVP8+Pj7/ODg4/zQ0NP8xMTH/LS0s/yoqK/8pKSr/KSkp/yop
+        Kf8qKSr/Kysr/ywsLP8tLS3/Ly8v/zEyMv8zMzP/NDQ0/2dNLf+oahv/aU8v/z8+P/97enr/y83N/56e
+        nv+Li4v/fHx8/3V1df98fHz/ioqK/4GBgf9LS0voAAAAkgAAAEgAAAAoAAAADgAAAAMAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAC4s7Niu7e35rKtrf98fHz/ZWdl/09PT/8wMDD/Gxoa/xQVFf8TExP/DxAP/w8P
+        D/8REBD/EhIS/xMTE/8VFRX/FxcX/xkZGf8cGxz/HR4e/x8gH/8iIiL/IiIi/yQkJP8kJCT/JiYm/0RD
+        Q/+SkpL/4+Pj/8LCwv+urq7/mZmZ/4aGhv96enr/eHh4/4ODg/+Li4v/cHBw/iAgIMIAAABlAAAAMQAA
+        ABgAAAAHAAAAAQAAAAAAAAAAAAAAAAAAAADAurrpmJaW+oCAgP97e3v/eXl4/2trav9HR0b/JSQk/xsZ
+        Gf8UFBT/DxAP/w4ODv8ODg7/Dg4O/w4ODv8ODg7/Dg4O/xAQEP8SEhL/ExMT/xMTE/8XFxf/GRkZ/yco
+        J/8/QT//VlVV/2lpaP/c3Nz/6enp/9nZ2f/Nzc3/vLy8/6ioqP+Tk5P/goKC/3p6ev9+fn7/i4uL/4WF
+        hf9KSkrmAAAAiAAAAEIAAAAjAAAADQAAAAMAAAAAAAAAAAAAAADJwcHjlJOT/3t7e/9qamr/aGho/2Zm
+        Zv9lY2X/WVhY/0FBQf8oKCj/Hh0d/xMTE/8PDw7/Dg4P/w4PDv8ODg7/Dg4O/w4ODv8PDw//Ghoa/zw7
+        O/9ZV1f/aWlp/3p6ef+Ki4n/lpeX/8DAwv/U1NT/3Nzc/+fn5//j4+P/19fX/8rKyv+6urr/pKSk/4+P
+        j/+AgID/fX19/4aGhv+NjY3/bW1t/B8fH74AAABpAAAAMwAAABkAAAAHAAAAAAAAAADJwcHmg4OD/2pp
+        af9XV1f/VlZW/1VVVf9VVVX/VVRU/1VUVP9QUU//RURE/zU2Nv8nJij/Ghoa/xcWFv8uLSz/SUdI/1tZ
+        Wv9hYGD/ZGRk/3h4eP+YmJj/rKys/7W1tf/IyMr/wMDA/7u7u/+5ubn/vLy8/83Nzf/i4uL/6Ojo/+Li
+        4v/V1dX/yMjI/7S0tP+enp7/i4uL/39/f/+BgYH/j4+P/4uLi/9UVFTvAAAAlgAAAEcAAAAjAAAACwAA
+        AALJwcHmgYGB/1tbW/9LS0r/S0tL/0tLS/9LS0v/S0tL/0tKS/9SUFD/W1pa/2RhYf9mY2T/cG1t/316
+        ev9+fHz/iIeI/5ydnf+ur6//wsLD/9LT1P/Q0dH/yMrK/8TExf+/wMD/tLS0/66urv+zs7P/ubm6/7m5
+        uf++vr7/0dHR/+Tk5P/n5+f/39/f/9HR0f/CwsL/r6+v/5qamv+IiIj/gICA/4mJif+RkZH/fHx8/x0d
+        HboAAABIAAAAJAAAAA3JwcHjgoKC/21sbP9PT0//WVhY/2ZmZv9xcHD/gH6A/4aFhP+EgYH/fHx7/4KC
+        gv+Njo7/srK0/8PExf/Z29z/4+Tl/9zd3v/T1df/z9DR/8jKy//ExMX/w8PE/8DAwv++vr7/vby9/7m6
+        uv+3t7n/tbW1/7S0tP+zs7T/tbW1/76+vv/T09P/5OXl/+Xl5f/b29v/zs7O/729vf+oqKj/kpKS/4WF
+        hf+Ghob/l5eX/5CQkP8AAAB3AAAALQAAABnLwsKjpKSk7JaWlv+SkpL/jIyM/5WVlv+ZmZr/sbKy/8jJ
+        yv/P0NH/4+Xm//Hz9P/x8/T/6e3v/+Tl5//Z3N7/09PU/9DPz//Sz87/1dLP/9zX0//j3Nj/7OTe/+/o
+        4v/v5+L/6N/Z/9nQy//Kwrz/wLu0/7qzsP+yrqv/q6im/6ilpP+rqqr/ubm5/9PU1P/l5eX/4+Pj/9fX
+        1//IyMj/tbW1/6CgoP+NjY3/jY2N/7Gxsf8zMzOcAAAAHAAAABcAAAAAvr6+b66urviysrL+0dLT//Hx
+        8f/o6ez/8vb3//f5+//2+fv/8/T4/+7w8v/m6Oz/2Nnc/8fFxf/HwsD/0cvH/9vX0//i3dv/5OHd/+Th
+        3v/j397/4d7c/97c2f/Z2Nf/19TT/9HPzv/Ny8j/ysfE/8TAv/+/vLr/t7Oy/62qpv+cmZT/jIqG/4yK
+        if+mpaX/0dHR/+Xm5v/i4uL/1NTU/8XFxf+zs7P/oaGh/7Ozs/9cXFyvAAAABQAAAAoAAAAAAAAAAMPD
+        wwK1tbVitLS0ya6urvyztLT/y83O//Dy9P/z9vj/8vT3/+/x8//e39//zcrI/9vY1P/s6Of/8O/v//Dw
+        8P/t7u7/6Ojp/+Xl5f/i4uL/3t/f/9zc3P/Y2Nn/1dXV/9PT0//Q0dH/zs/P/83Nzf/Ly8v/ysrK/8fI
+        yP/Dw8L/urm3/6Ggn/9+fXz/hYWD/729vf/d3t7/5ubm/97e3v/R0dH/wsLC/8vLy/9qamquAAAAAAAA
+        AAMAAAAAAAAAAAAAAAAAAAAAAAAAALu7uw21tbV5srKz1qutrf6+v8D/3d7h//Hz9v/x8vL/9/b3//v7
+        +//7+/v/+fr5//j49//29PT/8vLy//Dw8P/u7u3/6enp/+fn5//k5OT/4eHh/97e3v/Z29v/19jX/9TU
+        1P/S0tL/z8/P/83Nzf/Ly8v/ysvK/8vLy/+8vL3/lZSV/6urq/+/v8D/z8/P/+Hh4f/l5eX/3Nzc/+bm
+        5v9dXV2cAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tBuysrKMsbGx4a2t
+        rfzExcX95+fn//v7+//7+/v/+/v7//v7+//7+/v/+vr6//j4+P/29vb/8/Pz//Hx8f/u7+//7Ozs/+jo
+        6P/l5eX/4+Lj/9/e3//c3Nz/2dnZ/9XV1f/T09P/0dHR/9DPz//Ozs7/wMDC/7y9vf+7vLz/u7y8/8DA
+        wP/S0tL/5OXl//Hx8f8pJSVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAK6urh+wsLCWrq+v66+vr/rOzs//7u7u//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7
+        +//6+vr/+fn5//f49//y8vL/7u7u/+zp6f/m5ub/5OTj/9/h4f/c3Nz/19fX/9HR0v/Kysv/xcfI/8XF
+        x//ExcX/wMLC/7u7u/+zs7P6rq6u6qiqqtVJX18RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK2trTSvr6+rra2t9rO0tPfR0dL/7/Dy//f5
+        +v/29/j/6Onp/+fn6P/l5ub/3Nzd/9XX1//k5eb/7e7u/+fn6P/j5OX/3+Hi/9zd3v/Z29z/1dfX/87P
+        z//Dw8T/uLi4+q+vr/Gqqqruqamp9ampqfWoqKjMqampmqqqqmaqqqoDAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8BAAAAAK2t
+        rU2urq69q6ur+bm6uvjX2Nn/wMLF/4GDhf9WV1j/Tk5P/1dXWP+TlZf/3N7f/+Hj5P/P0NL7wMLD9Le3
+        t+yvr7Dqq6ur86qqqv6pqandqKiorKmpqXiqqqpFqqqqGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAqqqqCa2trWGurq7Rr6+w9r6+vvnHx8f6yMfH+MXFxfm4uLj/qqqq/6qq
+        qt2qqqrdqqqqsaqqqoKqqqpUqqqqJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqSaqqqoCqqqqwqqqqsKqq
+        qquqqqqCqqqqYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////s/fw//h/+H+z9wB/gD+AP7P0AD4AHgAfs/QAH
+        gAOAA+z9AAGAAIAA7P0AAYAAgADs/QABgACAAOz9AAGAAIAA7P0AAYAAgADs/YABwADAAOz9+Af4A/gD
+        7P38H/gPwAfs/f//+A/AB+z9///4D8AH7P3///gPwAfs/f//+A/AB+z9///4D/g/7P3///gP+D/s/f//
+        +A/4P+z9///4D///7P3///gP///s/f//AAB//+z9//8AAH//7P1//wAAf//s/X/wAAB//+z9v4AAAB//
+        7P34AAAAD//s/cAAAAAH/+z9AAAAAAH/7P0AAAAAAH/s/YAAAAAAP+z9AAAAAAAP7P0AAAAAAAfs/QAA
+        AAAAA+z9AAAAAAAA7P0AAAAAAADs/QAAAAAAAOz9AAAAAAAA7P2AAAAAAADs/cAAAAAAAuz9+AAAAAAC
+        7P3/AAAAAAPs/f/gAAAAA+z9//wAAAAD7P3//oAAAH/s/b//4AAf/+z9///8B///7P0oAAAAIAAAAEAA
+        AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaWVkBAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlXVQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAXFtbAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFZVVQYpKCgSNTQ0Kzg3
+        Nzs+PT0Ta2trAQAAAAAAAAAAAAAAAAAAAAAAAAAAaGJaAyUkIg4vLSsfOTg1OisqKCZpY1sCAAAAAAAA
+        AAAAAAAAAAAAAAAAAABQUU8GJycnEjU0NCs5ODg7Pj8+E2xwbAEAAAAAAAAAADs7OxkZGRlDLSwsfERD
+        Q6tgYGDabWxt6T09PZgODg40WFhYAwAAAAAAAAAAXFdQChYWFjclJCRlPTw8nlVVVclsbGzpWFhYyBQU
+        FEc1MCoPAAAAAAAAAAA7PDcZGRkZQy0sLHxEQ0OrYGBg2m1sbek9PT2YDg4ONFhjWQMAAAAAUE5OiENC
+        QskzMzLsODg4+EZGR/1wcHD+hoaG7UpKSq0YGBgwVVRSBQAAAABaVlJMSklJvzU1NOI2Njb1Pz9A/F9g
+        X/6Pj4/6WFhYwiAgIF5BPjIJAAAAAFBOTohDQkLJMzMy7Dg4OPhGRkf9cHBw/oaGhu1KSkqtGRoZMFhn
+        WgWCgH/pXl1d/ExLTP5aWlr+gIB//qiop/7Av7/+o6Oj+11eXr0YGBhFAAAAAIWAe5ZjY2L7UE9Q/lNT
+        U/5wb2/+nZ2c/r+/vv6rq6v8fn5+4ygoKGZOVEAMgoB/6V5dXfxMS0z+Wlpa/oCAf/6oqKf+wL+//qOj
+        o/tdXl69GBgYRXBubqWQkZLds7O0+8PCwv7Pzs3+y8rI/sLAwP66urn+paam80dHR3wAAAAAb2lkYoWF
+        htOpqqvztpt3/r2XY/7Dnmn+xJ5p/r6wnf6ztLT8ampqrlhhSRhwbm6lkJGS3bOztPvDwsL+z87N/svK
+        yP7CwMD+urq5/qWmpvNHR0d8Ojo6F0xMTEGGhoeNwcHAzd7f3/TW1tb6zMzL87Ozs+ejpKTKT09PWwAA
+        AABQSDoKUk1FNWdnaG7KkDv/4KtS/9yoV//dsGv/vZhj9qurq9pyc3OHXWdLED1GOBdMT0xBfo9/nEy+
+        WfEgtC7/eseA/czMy/Ozs7Pno6Skyk9PT1sAAAAAXFxcA2NjYxJWVlY4fn+AkYaHh696enqLV1dXYlNT
+        UzBdWlcQAAAAAAAAAACAa0cCcF5ACsqMLv/blRv/1IwX/9ypV/+deEPISkpKQ3JxUBhxfVQCAAAAAFV0
+        UwNbjGE9V85s3SnHRv9nvHDnenp6i1dXV2JRXlMwV3tdEAAAAAAAAAAAAAAAAAAAAABmZmYHPT09EEtK
+        SgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzJAy/+KeIf/blhz/4rBb/7mMRaoAAAAAAAAAAAAA
+        AABupWE1ZMhvrWTLccJj13rzUdpz/kjHW+tgyGy1WMRhpwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOkzb/56Un/+CdIP/mtV3/vY9FqgAA
+        AAAAAAAAAAAAAGClUlQ2x1H+WNx5/nHlkv5r5I3+Vtx4/jHMUP4htzL9AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCWO//srjD/56Qj/+u7
+        Yf/DkkSqAAAAAAAAAAAAAAAAcK1YREPAU9VOymPgWtZ2+XPlkv5v2ITzZ9R72UbDVdEAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0Jg9/++0
+        O//rqSX/7r9i/8WTQaoAAAAAAAAAAAAAAACLsmANeLdnLGe7aFZJyF7gT9py/mPIb8JiwG4vZMJxKQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADRmD3/8rtG/+6tKf/yw2X/yJQ/qgAAAAAAAAAAAAAAAAAAAAAAAAAAbrtmLD++TtUtw0f+YMVqrQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAANCXPP/yu0n/8LEv//PFZv/Hkz6qAAAAAAAAAAAAAAAAAAAAAAAAAABqtFsNT7FPRECz
+        SlRSv181AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AACcdTgPsYA1SLuHNlXAjDlVz5Y8/+63SP/wtTr/9MZn/8WQPsbClT5VvJhAVbOZQzsAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAJVtNUjGiC3yzZI0/9GWN//boz7/6bJE/+22Qv/zx2v/5rtu/+e8bf/nu23/y5ZH5QAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAABmVj4BdlkwGpRdGKLLjy//1Zs3/9uiO//hqT//6LFE/+uvNf/urij/768p/9CS
+        Ku+qdi1zAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAEVCPwIpJiIFHBkUCh8bExAYFA0mJBYHVJViH9/IjC7/1Js4/9qhO//iqkD/564+/+qq
+        Jv/WmCv/bUcXlzMoEyRJQysDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AABQT08BOjo6BC8uLgoPDw8YAwMDMBwcHFc3NjaKSklJpYaEhO6em5v+m5OM/5tzQf/Giy3/0pk3/9mg
+        O//fqD//yJA1/5h8Wf9HR0fZEBAQhAAAADI3MycQcGpXAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AABhYGABWllZBBsaGhEICAgqHBsbXVlXV6Z3dXTNgH196IF+fv55eHf/bm1t/2loaP9oaGj/bmlh/5ps
+        MP/Fii3/05o3/8iNMv+Welj/f3x5/39/f/5nZ2fvHh4eoQAAAEonJB8UUUxGBAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAF5cXApCQUFNgn9/ro6Ki+6IhIT/ZWNj/0NDQ/8/Pz//PT09/z09Pf89PD3/PT09/z8/
+        P/9BQUH/TEY//39YJv+zeyv/dVk2/42MjP+Wlpb/enp6/3t7e/+BgYH/U1NT5BAQEH0AAAA4FRUUDlNT
+        UgIAAAAAAAAAAAAAAAAAAAAAl5OTZ6WhoeSHhYT/W1pa/y8vL/8gICD/Gxsb/xgYGP8ZGBn/Ghoa/xwc
+        HP8eHh7/IiEi/yQlJP8nJyf/NC4n/0k4I/9APDn/paWl/8LCwv+cnJz/hYWF/3t7e/+AgID/Z2dn7Scn
+        J64AAABCFhYWF2RkZAMAAAAAAAAAAAAAAAC0r6/thoWF/XR0dP9sbGz/SEdH/ywrK/8YGBj/ERER/w4O
+        Dv8ODg7/Dg4O/w4ODv8SEhL/HBwc/y8uLv89Pj3/Xl9e/319ff/d3d3/4ODg/8/Pz/+5ubn/mZmZ/4WF
+        hf+BgYH/hYWF/0xMTNkTExOBAAAALy8vLw9paWkBAAAAALOuru14d3f/XFxc/1tbW/9ZWFj/UVBQ/z8/
+        Pv8uLi7/HBsc/xQUFP8pKCj/PTw8/0dHR/9bW1v/iYiI/52dnf+ys7P/ubm5/8PDw//Q0ND/4uLi/9zc
+        3P/Gxsb/rq6u/4+Pj/+Dg4P/hISE/nBwcPAlJSWoAAAATCUlJRNWVlYDsaur7Wtra/9NTUz/UlJS/1lY
+        Wf9eXV3/Y2Jh/2tpaf95d3j/j42O/5+fn/+trq7/vr/A/8vMzf/Ky8v/w8TF/7y8vP+zs7P/tbW2/7e3
+        t/++vr//0tLS/+Dg4P/a2tr/xMTE/6ysrP+Ojo7/h4eH/4qKiv9ZWVngAAAARwAAABi5tLTLjY2N+nt7
+        e/+BgYL/kpKT/6ysrP+5ubr/yMnK/9LU1f/Y2dv/2Nrc/9XV1f/S0dD/1NLQ/9rV0v/f2tb/3dfT/9LM
+        yP/BvLj/ubWy/7Gurf+vraz/vb29/9PT0//f39//0tLS/7a2tv+dnZ3/jIyM/56env8WFhZrAAAAG5KR
+        kRikpKSHubq61dTU1Pjb3d7/7/Hz//T2+f/v8fT/3t/h/8/Ozf/W0c//39zZ/+Xi4f/k4uD/4d/e/97c
+        2//X1tb/09HR/83Lyf/IxsX/wb69/7i2tP+kop//lZSS/6Oiof/Nzc3/3t7e/9HR0f+3t7f/tra2/2tr
+        a3VHR0cGAAAAAAAAAACZmZksrKysVLa2t7q/wcH11tjZ/+zu8P/q6ur/7ezr//b19P/19fX/8fDx/+3t
+        7f/o6Oj/5OTk/9/f3//b29v/1dbW/9LS0v/Ozs7/y8zM/8fHxv+/v77/n5+f/6Wlpf/Nzc7/3Nzc/9ra
+        2v/Z2dn/bm5ubIODgwEAAAAAAAAAAAAAAAAAAAAAAAAAAKioqAyurq5wra2tqMTFxeTd3d377+/v//n5
+        +f/6+vr/+fn5//f39//09PT/8fHx/+7u7v/o6Oj/5OPj/97e3v/Z2tr/1dXV/9HQ0f/Jycr/v8DB/72+
+        vv+9vr7/y8vL+9bX1/NSVlYuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2trYGvLy8O7Oz
+        s2i8vLzXyMjI+eXl5v/29/j/9PX1/+3u7v/p6ur/4uPj/+rq6//q6er/4uPk/97f4P/Y2dr/0dLS/8LC
+        w/24uLn3srKy9a+vr/irq6vOqaqqmIyRkQUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAADGxcUitra2jLGysrzExcbzoaOk/Hp6e/16eXr8rq+w/83Oz/e/wMHqtLW1z6ys
+        rLWvr6+rsLCwiK+vr1uurq4ksLCwBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU1NQBycnJFr+/wFqvr6+bs7OzyLOzs8atra2kubm5Y76+
+        vkS8vLwwu7u7F8DAwAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPv/f+/A+B8DAGAMAQAg
+        BAAAIAAAACAAAAAgAACAMAIA8fwcA//8HAP//BwD//wcA//8Hw///B8P/8AD///AA///gAP//AAB/8AA
+        AH8AAAA/AAAADwAAAAcAAAABAAAAAAAAAAAAAAAAAAAAAMAAAAD4AAAB/gAAAf/gAA//8AD/KAAAABgA
+        AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF1cXAFcW1sBAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxZVgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX15eAgAA
+        AAAAAAAAAAAAAFBPTwRDQkIeIB8fTUNCQokyMjJ+Ojo6EQAAAAAAAAAAAAAAADo3Mw4tKykyMTAwa0hI
+        SJouLCpAUk1EAwAAAAAAAAAAODo2DiwtLDIxMDBrSEhImi4wLkBUWlQDAAAAAEZFRYA5ODfTPj09801O
+        Tv2Ghob6R0dHqCMjIx8AAAAAWVVPMEJBQbM4ODfmRUVF+2lpaf51dXXgICAgXVZSQwVYWE4wQkFBszg4
+        N+ZFRUX7aWlp/nV1deAgICBdVWJWBXx6eutdXV3+ZmVm/pKRkf69vbz+rKys/F9fX7w+OzYVgHpyb2Zm
+        ZvtaWVr+e3t7/qmpqP6+vr3+jo6O7SgoKGF/gnNvZmZm+1pZWv57e3v+qamo/r6+vf6Ojo7tKCgoYUxL
+        TF6dnp+619fX9OPi4f7R0M/+vr6+/bS1te9STkgjWVNJInN0dY67pYfn1KFU/9OjW//LnFr/vLy8/G1t
+        bZVXXkoic3R1jrTAtuF9x4P+nMqd/sjHxv68vLz8bW1tlQAAAABJSUkOZmZmQ5GRkqyUlZW2bW1tfF1d
+        XUBgWlEFAAAAAG5dPwSQbDmJ25Ub/9KKFv/Uo1v/WlpaX2FhSR4AAAAAVHBQBFyQYVs0zFH+Xr9q8YiI
+        iJpaWlpfU25XHgAAAAAAAAAAAAAAAGRkZAdKSUkIAAAAAAAAAAAAAAAAAAAAAAAAAAC0hkN/5KEk/9uW
+        HP/Wpl3/AAAAAAAAAAAAAAAAWMVlv2TPdNZi34P+UM9o81fIZcdYtGJbAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/jUJ/66wv/+OgIf/ZqV//AAAAAAAAAAAAAAAAKLw+/U3X
+        bv5y5ZL+buKN/kTSY/5Gt1R+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADGkD1/8LU9/+qoJf/brGD/AAAAAAAAAAAAAAAAeLtrQWC7Y3tE1GX+Y8xy1mfCcUdlw3MdAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIkDh/8rxI/+6tKf/drmH/AAAAAAAA
+        AAAAAAAAAAAAAG++aUEhuTf9U8JfvwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAADEjjp/8LpJ//CzMf/er2L/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvoAq4smNM//OlDj/6bJE/+61
+        Pv/qwHP/37Bi/9+wYf+piz9iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAABuWz0CfU8VecmNLv/WnTn/36c+/+ixRP/srSv/768p/8KFKduXfD4aAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZFRAIiISAHERAPFAAAADMmJiZqV1RUp518
+        Ve3Fii3/1Zw4/96mPv/lqzf/u4c3/ywiFpEAAAAlXVc+BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBf
+        XwFBQEAGFBMTHxsbG1JTUVGlcW9v1ouIiP59e3v/bWxs/2tra/+GaUX/xIkt/9WcOP+1gTj/hoB4/319
+        ff42NjbAAAAASDk1Lg4AAAAAAAAAAAAAAAAAAAAAAAAAAFVTUxR1cnKghYGC7XJvb/9JSEj/Ojo6/zg4
+        OP84Nzj/OTk5/zs7O/8+Pj7/bVAs/6RwKf9rZFz/oqOj/3x8fP9/f3//Z2dn8BISEoUAAAAlR0dGBAAA
+        AAAAAAAAAAAAALKursqKiYn/ZmZl/y0tLf8VFRX/Dg8O/w8PD/8RERH/ExMT/xcXF/8aGxr/ISEh/zc4
+        N/+Ghob/2dnZ/7S0tP+Ojo7/fX19/4GBgf47OzvDAAAARDMzMw4AAAAAAAAAAKqmpvFpaWn/Xl5e/1pZ
+        Wf9DQ0P/Kioq/xcXF/8YGBf/MC8v/zs7O/9paGj/kZGQ/6qqqv/CwsL/09PT/+Hh4f/Ozs7/q6ur/4mJ
+        if+EhIT/aWlp7hUVFYgcHBwiUlJSA6WhofFYWFj/VVVV/2FhYf9paGj/b25u/4WEhP+lpaX/uLm6/8TF
+        xv/LzM3/w8TF/7u7u/+0tLX/tra3/729vv/X19f/3t7e/8bGxv+hoaH/iIiI/4qKiv8rKyueAAAAHayq
+        qn+ioqL9uLm5/8nKy//h4uT/7e/x/+bo6v/S0tL/09HP/9vX1f/h3Nn/5uHd/+Hc2f/Qy8f/wr25/7Sx
+        r/+npKL/qain/8/Pz//Z2dn/u7u7/5ubm/98fHzSICAgEAAAAACUlJQZqqqqdLm6utPT1db+6+3w/+Tk
+        5P/v7ez/9PTz/+/v7//p6en/4uLi/9zc3P/W19f/0dLR/83Nzf/IyMj/vLu6/5WUlP/BwcH/3d3d/9XV
+        1f+enp7Sg4ODAQAAAAAAAAAAAAAAAAAAAACsrKwpra2tf8LCwt/c3N399/f3//r6+v/5+fn/9vb2//Pz
+        8//t7e3/5+Xm/9/f3//Y2dn/0tLS/8fHyP/AwMH/vb6+/8XGxviCh4eRAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAADBwcE4ubm5jsbGx+3f4OH9xMXG/5mZmv+oqqv/5OXm/9TV1/vGx8j1vr6++7Oz
+        s+Crq6unq6urgKurq1moqakaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM7O
+        zQLCwsJMsLCwrri4uNS0tLTJsrKyj7m5uWO3t7c1vb29CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOf3
+        90EDgYFBAQAAQQAAAEEAAABBgICAQefDgUH/w4FB/8OBQf/Dx0H/w/9B/wB/Qf4Af0HgAD9BAAAfQQAA
+        B0EAAANBAAAAQQAAAEEAAABBgAAAQfAAAUH+AAFB/4A/QSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAT05OBkhIRxpXV1cFAAAAAAAAAAAAAAAAQkA/C0ZEQhgAAAAAAAAAAAAA
+        AABKSkoGSUhIGllaWAUAAAAAOjk5azc2NsNhYWHvR0dHmk1MTA5lYFoVLy4uj0JBQtZtbGzqMC8uXWNg
+        UQI6OThrNzY2w2FhYe9HR0eaT1lQDnh3d9qHhof9sbCv/ri3t/1ZWVmcdnBnPnh4efCNfWf+uaaL/qej
+        n/ZOUkdOeHd32l+qaf6xsK/+uLe3/VlZWZxTU1MXgICAaa6ur8uUlJSyaGhnWXFmUgJqX00s1Jc1/9SX
+        Nf+UgWe3bXJZLFNmThdEwlT5Q8NU/5SUlLJnc2lZAAAAAAAAAABqamoGc3JyAQAAAAAAAAAAAAAAANSX
+        NP/UlzX/sI5MVUPEVO1Dw1T3Q8RU/0PEVP9DxFT8Q8RU7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADUlzX/1Jc1/8GYR1VDxFTtQ8NU80PEVP9DxFT/Q8RU9kPEVO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA1Jc1/9SXNf/Imj9VAAAAAAAAAABDw1TzQ8NU9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADSlTTxxo82qtSXNf/UlzX/1adWxtOXNvYAAAAAQ8RU7UPEVO0AAAAAAAAAAAAAAAAAAAAAAAAAAEI+
+        OQE/NikHUTgXTdOWNP/UlzX/1Jc1/9SXNP+GXiCHcWxDAQAAAAAAAAAAAAAAAAAAAABdW1sBLCsrEC0s
+        LElGRESPX11dy399ffqDdmb/05Y0/9SXNf+dgVj/T09P0xUUEUtSTkMGAAAAAAAAAAAAAAAAd3R0aHx6
+        euZPTk7/LS0t/ysrK/8tLS3/MTIy/9CUNP/RlDT/oqKi/4WFhf90dHT4JycnlB8fHxoAAAAAAAAAAJmW
+        lvZmZmb/R0ZG/yUlJf8TExP/ICAg/zQ0NP9kZGT/kZKS/9TU1P/R0dH/paWl/4aGhv9VVVXSFRUVTFJS
+        UgaZlpbsZ2dn/319ff+Uk5T/rKyt/76/wP/My8v/0c/O/8fEw/+5t7b/vLu6/9LT0//IyMj/mpqa/4OD
+        g/cFBQU5kpGRKLW1tZPQ0dLr6evu/+Hh4f/o5uT/6ujo/+Pi4f/Z2Nj/z87O/8XEw/+wr63/ra2t/9bW
+        1v/IyMj/aWlpOgAAAAAAAAAApqWmA7CwsUjExMSh29vb8/T09P/z8/T/6uvr/+jo6P/e39//1NTU/8DB
+        wvy3t7f6vb6+1YGEhAwAAAAAAAAAAAAAAAAAAAAAAAAAANXV1QjBwcFYtbW2uZaWl+K4ubm/u7y8i7a2
+        tl63t7c5s7OzCgAAAAAAAAAAjnGsQQAArEEAAKxBAACsQc4ArEH+AKxB/jOsQfgTrEHgD6xBAAesQQAD
+        rEEAAKxBAACsQQAArEHAAKxB+AOsQQ==
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Tabs/CurrentShares.Designer.cs b/Liquesce/Tabs/CurrentShares.Designer.cs
new file mode 100644
index 0000000..590d63f
--- /dev/null
+++ b/Liquesce/Tabs/CurrentShares.Designer.cs
@@ -0,0 +1,153 @@
+namespace Liquesce.Tabs
+{
+   partial class CurrentShares
+   {
+      /// <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()
+      {
+         System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
+         this.dataGridView1 = new System.Windows.Forms.DataGridView();
+         this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn();
+         this.Description = new System.Windows.Forms.DataGridViewTextBoxColumn();
+         this.Credentials = new System.Windows.Forms.DataGridViewTextBoxColumn();
+         this.progressBar1 = new System.Windows.Forms.ProgressBar();
+         this.btnRefresh = new System.Windows.Forms.Button();
+         this.richTextBox1 = new System.Windows.Forms.RichTextBox();
+         ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
+         this.SuspendLayout();
+         // 
+         // dataGridView1
+         // 
+         this.dataGridView1.AllowUserToAddRows = false;
+         this.dataGridView1.AllowUserToDeleteRows = false;
+         dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.ControlLight;
+         this.dataGridView1.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle2;
+         this.dataGridView1.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.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+         this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.Source,
+            this.Description,
+            this.Credentials});
+         this.dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
+         this.dataGridView1.Location = new System.Drawing.Point(1, 146);
+         this.dataGridView1.MultiSelect = false;
+         this.dataGridView1.Name = "dataGridView1";
+         this.dataGridView1.ReadOnly = true;
+         this.dataGridView1.RowHeadersVisible = false;
+         this.dataGridView1.ShowEditingIcon = false;
+         this.dataGridView1.Size = new System.Drawing.Size(593, 297);
+         this.dataGridView1.TabIndex = 10;
+         // 
+         // Source
+         // 
+         this.Source.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
+         this.Source.HeaderText = "Source Path";
+         this.Source.MinimumWidth = 100;
+         this.Source.Name = "Source";
+         this.Source.ReadOnly = true;
+         // 
+         // Description
+         // 
+         this.Description.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+         this.Description.HeaderText = "Name : Description";
+         this.Description.MinimumWidth = 150;
+         this.Description.Name = "Description";
+         this.Description.ReadOnly = true;
+         this.Description.Width = 150;
+         // 
+         // Credentials
+         // 
+         this.Credentials.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.AllCells;
+         this.Credentials.HeaderText = "User : Credentials";
+         this.Credentials.MinimumWidth = 150;
+         this.Credentials.Name = "Credentials";
+         this.Credentials.ReadOnly = true;
+         this.Credentials.Width = 150;
+         // 
+         // progressBar1
+         // 
+         this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+         this.progressBar1.Location = new System.Drawing.Point(3, 449);
+         this.progressBar1.Name = "progressBar1";
+         this.progressBar1.Size = new System.Drawing.Size(512, 23);
+         this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+         this.progressBar1.TabIndex = 9;
+         // 
+         // btnRefresh
+         // 
+         this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+         this.btnRefresh.Location = new System.Drawing.Point(521, 449);
+         this.btnRefresh.Name = "btnRefresh";
+         this.btnRefresh.Size = new System.Drawing.Size(75, 23);
+         this.btnRefresh.TabIndex = 7;
+         this.btnRefresh.Text = "&Refresh";
+         this.btnRefresh.UseVisualStyleBackColor = true;
+         this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
+         // 
+         // richTextBox1
+         // 
+         this.richTextBox1.BackColor = System.Drawing.SystemColors.Control;
+         this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+         this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Top;
+         this.richTextBox1.Location = new System.Drawing.Point(0, 0);
+         this.richTextBox1.Name = "richTextBox1";
+         this.richTextBox1.ReadOnly = true;
+         this.richTextBox1.Size = new System.Drawing.Size(600, 140);
+         this.richTextBox1.TabIndex = 0;
+         this.richTextBox1.Text = "Text will be replaced by RTF from CurrentShares.RTF";
+         // 
+         // CurrentShares
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.Controls.Add(this.richTextBox1);
+         this.Controls.Add(this.dataGridView1);
+         this.Controls.Add(this.progressBar1);
+         this.Controls.Add(this.btnRefresh);
+         this.DoubleBuffered = true;
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Name = "CurrentShares";
+         this.Size = new System.Drawing.Size(600, 475);
+         ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private System.Windows.Forms.DataGridView dataGridView1;
+      private System.Windows.Forms.DataGridViewTextBoxColumn Source;
+      private System.Windows.Forms.DataGridViewTextBoxColumn Description;
+      private System.Windows.Forms.DataGridViewTextBoxColumn Credentials;
+      private System.Windows.Forms.ProgressBar progressBar1;
+      private System.Windows.Forms.Button btnRefresh;
+      private System.Windows.Forms.RichTextBox richTextBox1;
+
+   }
+}
diff --git a/Liquesce/Tabs/CurrentShares.cs b/Liquesce/Tabs/CurrentShares.cs
new file mode 100644
index 0000000..9dbe092
--- /dev/null
+++ b/Liquesce/Tabs/CurrentShares.cs
@@ -0,0 +1,116 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Welcome.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using LiquesceFacade;
+
+namespace Liquesce.Tabs
+{
+   public partial class CurrentShares : UserControl, ITab
+   {
+      public CurrentShares()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+         // Converted from the CurrentShares.rtf text via notepad :-)
+         richTextBox1.Rtf = @"{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset2 Symbol;}}
+{\colortbl ;\red255\green0\blue0;}
+{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\lang2057\f0\fs18 The current active 'Mount Points' owned by Liquesce will need to be \cf1\b active\b0  \cf0 for this page to work correctly.\par
+\pard{\pntext\f1\'B7\tab}{\*\pn\pnlvlblt\pnf1\pnindent0{\pntxtb\'B7}}\fi-360\li360 Once mounts are working, create shared folder(s) via windows.\par
+{\pntext\f1\'B7\tab}Next, Press refresh, and check that the share details shown here are correct.\par
+{\pntext\f1\'B7\tab}Once correct, press save in the Service Settings tab. \par
+{\pntext\f1\'B7\tab}When Liquesce restarts it will then re-enable these shares.\par
+\pard\sa200\sl276\slmult1\lang9\i Note:\line\pard{\pntext\f1\'B7\tab}{\*\pn\pnlvlblt\pnf1\pnindent0{\pntxtb\'B7}}\fi-360\li360\sa200\sl276\slmult1 Initial display will be from the last stored Liquesce configuration.\i0\par
+}";
+      }
+
+      private ConfigDetails cd1;
+      public ConfigDetails cd 
+      {
+         set
+         {
+            cd1 = value;
+            PopulateShareList();
+         }
+         private get { return cd1; }
+      }
+
+      private void PopulateShareList()
+      {
+         // Populate the fields
+         foreach (object[] row in cd.MountDetails
+            .SelectMany(mt => mt.SharesToRestore
+               .SelectMany(share =>share.UserAccessRules
+                  .Select(fsare => new[] {
+                     share.Path,
+                     share.Name + " : " + share.Description,
+                     GetAceInformation(fsare)
+                  }
+                  )
+                  ).Cast<object[]>())
+               )
+         {
+            dataGridView1.Rows.Add(row);
+         }
+      }
+
+
+      private void btnRefresh_Click(object sender, System.EventArgs e)
+      {
+         try
+         {
+            dataGridView1.Rows.Clear();
+            Enabled = false;
+            UseWaitCursor = true;
+
+            LanManShareHandler lmsHandler = new LanManShareHandler();
+            foreach (MountDetail mt in cd.MountDetails)
+            {
+               mt.SharesToRestore = lmsHandler.MatchDriveLanManShares(mt.DriveLetter);
+            }
+            PopulateShareList();
+         }
+         finally
+         {
+            Enabled = true;
+            UseWaitCursor = false;
+            progressBar1.Style = ProgressBarStyle.Continuous;
+            progressBar1.Value = 0;
+         }
+      }
+
+      private string GetAceInformation(UserAccessRuleExport fsare)
+      {
+         StringBuilder info = new StringBuilder(fsare.DomainUserIdentity);
+         info.Append(" : ").Append(fsare.AccessMask);
+         return info.ToString();
+      }
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/Tabs/CurrentShares.resx b/Liquesce/Tabs/CurrentShares.resx
new file mode 100644
index 0000000..14a4cb0
--- /dev/null
+++ b/Liquesce/Tabs/CurrentShares.resx
@@ -0,0 +1,129 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="Source.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Description.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Credentials.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Tabs/CurrentShares.rtf b/Liquesce/Tabs/CurrentShares.rtf
new file mode 100644
index 0000000..b6c677d
Binary files /dev/null and b/Liquesce/Tabs/CurrentShares.rtf differ
diff --git a/Liquesce/Tabs/ITab.cs b/Liquesce/Tabs/ITab.cs
new file mode 100644
index 0000000..6df63b6
--- /dev/null
+++ b/Liquesce/Tabs/ITab.cs
@@ -0,0 +1,35 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ITab.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using LiquesceFacade;
+
+namespace Liquesce.Tabs
+{
+   internal interface ITab
+   {
+      ConfigDetails cd { set; }
+   }
+}
diff --git a/Liquesce/Tabs/Logging.Designer.cs b/Liquesce/Tabs/Logging.Designer.cs
new file mode 100644
index 0000000..7e478ec
--- /dev/null
+++ b/Liquesce/Tabs/Logging.Designer.cs
@@ -0,0 +1,141 @@
+namespace Liquesce.Tabs
+{
+   partial class Logging
+   {
+      /// <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.btnZipAndEmail = new Shared.CommandLinkButton();
+         this.commandLinkButton2 = new Shared.CommandLinkButton();
+         this.commandLinkButton1 = new Shared.CommandLinkButton();
+         this.btnServiceTail = new Shared.CommandLinkButton();
+         this.SuspendLayout();
+         // 
+         // btnZipAndEmail
+         // 
+         this.btnZipAndEmail.ButtonDepress = ((sbyte)(2));
+         this.btnZipAndEmail.HighlightFillAlpha = ((byte)(250));
+         this.btnZipAndEmail.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnZipAndEmail.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnZipAndEmail.HighlightWidth = 2F;
+         this.btnZipAndEmail.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_Kontact;
+         this.btnZipAndEmail.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnZipAndEmail.Location = new System.Drawing.Point(12, 299);
+         this.btnZipAndEmail.Name = "btnZipAndEmail";
+         this.btnZipAndEmail.Rounding = 10F;
+         this.btnZipAndEmail.Size = new System.Drawing.Size(375, 65);
+         this.btnZipAndEmail.Subscript = "   Collects created logs and puts the location in the clipboard.";
+         this.btnZipAndEmail.TabIndex = 3;
+         this.btnZipAndEmail.Text = "Zip Logs ready for sending etc.";
+         this.btnZipAndEmail.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnZipAndEmail.UseVisualStyleBackColor = true;
+         this.btnZipAndEmail.Click += new System.EventHandler(this.btnZipAndEmail_Click);
+         // 
+         // commandLinkButton2
+         // 
+         this.commandLinkButton2.ButtonDepress = ((sbyte)(2));
+         this.commandLinkButton2.HighlightFillAlpha = ((byte)(250));
+         this.commandLinkButton2.HighlightFillAlphaMouse = ((byte)(125));
+         this.commandLinkButton2.HighlightFillAlphaNormal = ((byte)(75));
+         this.commandLinkButton2.HighlightWidth = 2F;
+         this.commandLinkButton2.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_Log;
+         this.commandLinkButton2.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.commandLinkButton2.Location = new System.Drawing.Point(12, 204);
+         this.commandLinkButton2.Name = "commandLinkButton2";
+         this.commandLinkButton2.Rounding = 10F;
+         this.commandLinkButton2.Size = new System.Drawing.Size(375, 65);
+         this.commandLinkButton2.Subscript = "   Open the Mgt App Log file in a window.";
+         this.commandLinkButton2.TabIndex = 2;
+         this.commandLinkButton2.Text = "Management Log ...";
+         this.commandLinkButton2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.commandLinkButton2.UseVisualStyleBackColor = true;
+         this.commandLinkButton2.Click += new System.EventHandler(this.commandLinkButton2_Click);
+         // 
+         // commandLinkButton1
+         // 
+         this.commandLinkButton1.ButtonDepress = ((sbyte)(2));
+         this.commandLinkButton1.HighlightFillAlpha = ((byte)(250));
+         this.commandLinkButton1.HighlightFillAlphaMouse = ((byte)(125));
+         this.commandLinkButton1.HighlightFillAlphaNormal = ((byte)(75));
+         this.commandLinkButton1.HighlightWidth = 2F;
+         this.commandLinkButton1.Image = global::Liquesce.Properties.Resources.Mart_Glaze_Log;
+         this.commandLinkButton1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.commandLinkButton1.Location = new System.Drawing.Point(12, 109);
+         this.commandLinkButton1.Name = "commandLinkButton1";
+         this.commandLinkButton1.Rounding = 10F;
+         this.commandLinkButton1.Size = new System.Drawing.Size(375, 65);
+         this.commandLinkButton1.Subscript = "   Open the Service Log file in a window.";
+         this.commandLinkButton1.TabIndex = 1;
+         this.commandLinkButton1.Text = "Service Log ...";
+         this.commandLinkButton1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.commandLinkButton1.UseVisualStyleBackColor = true;
+         this.commandLinkButton1.Click += new System.EventHandler(this.commandLinkButton1_Click);
+         // 
+         // btnServiceTail
+         // 
+         this.btnServiceTail.ButtonDepress = ((sbyte)(2));
+         this.btnServiceTail.HighlightFillAlpha = ((byte)(250));
+         this.btnServiceTail.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnServiceTail.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnServiceTail.HighlightWidth = 2F;
+         this.btnServiceTail.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_K_color_edit;
+         this.btnServiceTail.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnServiceTail.Location = new System.Drawing.Point(12, 14);
+         this.btnServiceTail.Name = "btnServiceTail";
+         this.btnServiceTail.Rounding = 10F;
+         this.btnServiceTail.Size = new System.Drawing.Size(375, 65);
+         this.btnServiceTail.Subscript = "   Open the Service Log file in a \"Tail\" window.";
+         this.btnServiceTail.TabIndex = 0;
+         this.btnServiceTail.Text = "Service Tail ...";
+         this.btnServiceTail.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnServiceTail.UseVisualStyleBackColor = true;
+         this.btnServiceTail.Click += new System.EventHandler(this.btnServiceTail_Click);
+         // 
+         // Logging
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.BackColor = System.Drawing.SystemColors.Control;
+         this.Controls.Add(this.btnZipAndEmail);
+         this.Controls.Add(this.commandLinkButton2);
+         this.Controls.Add(this.commandLinkButton1);
+         this.Controls.Add(this.btnServiceTail);
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Name = "Logging";
+         this.Size = new System.Drawing.Size(600, 475);
+         this.Load += new System.EventHandler(this.Logging_Load);
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private Shared.CommandLinkButton btnServiceTail;
+      private Shared.CommandLinkButton commandLinkButton1;
+      private Shared.CommandLinkButton commandLinkButton2;
+      private Shared.CommandLinkButton btnZipAndEmail;
+   }
+}
diff --git a/Liquesce/Tabs/Logging.cs b/Liquesce/Tabs/Logging.cs
new file mode 100644
index 0000000..161f7d6
--- /dev/null
+++ b/Liquesce/Tabs/Logging.cs
@@ -0,0 +1,147 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Logging.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Packaging;
+using System.Windows.Forms;
+using NLog;
+
+namespace Liquesce.Tabs
+{
+   public partial class Logging : UserControl
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      public Logging()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+      }
+
+      private TailForm tailForm;
+
+      private void btnServiceTail_Click(object sender, EventArgs e)
+      {
+         try
+         {
+            if (tailForm == null)
+            {
+               string logLocation = DisplayLog.FindLogLocation(@"LiquesceSvc\Logs\LiquesceSvc.log");
+               if (!string.IsNullOrEmpty(logLocation))
+               {
+                  tailForm = new TailForm(logLocation);
+                  tailForm.Show(this);
+                  tailForm.FormClosing += delegate
+                  {
+                     tailForm = null;
+                     BringToFront();
+                  };
+               }
+            }
+            else
+            {
+               tailForm.BringToFront();
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("OpenFile has an exception: ", ex);
+         }
+      }
+
+      private void commandLinkButton1_Click(object sender, EventArgs e)
+      {
+         DisplayLog.LogDisplay(@"LiquesceSvc\Logs");
+      }
+
+      private void commandLinkButton2_Click(object sender, EventArgs e)
+      {
+         DisplayLog.LogDisplay(@"Liquesce\Logs");
+      }
+
+      private void Logging_Load(object sender, EventArgs e)
+      {
+         btnServiceTail.Focus();
+      }
+
+      /// <summary>
+      ///
+      /// </summary>
+      /// <param name="sender"></param>
+      /// <param name="e"></param>
+      /// <remarks>
+      /// Wanted to do an emailer, but that then prevent the user from creating issues,
+      /// and adding their own text.
+      /// Also the user needs to know their SMTP / Gmail server, account and passord details,
+      /// everytime.
+      /// </remarks>
+      private void btnZipAndEmail_Click(object sender, EventArgs e)
+      {
+         string zipFileName = Path.Combine(Path.GetTempPath(), DateTime.Now.ToString("u").Replace(":", "_")) + ".zip";
+         // Note: The resulting .zip file will produce a file called 
+         //       [Content_Types].xml when it is unZIPped, which contains content 
+         //       information about the types of files included in the .zip file.
+         using (Package zipPackage = Package.Open(zipFileName, FileMode.Create))
+         {
+            foreach (FileInfo fileInfo in GetFilesToCompress())
+            {
+               string zipURI = string.Concat("/", fileInfo.Name.Replace(" ", "_"));
+               Uri partURI = new Uri(zipURI, UriKind.Relative);
+               PackagePart packagePart = zipPackage.CreatePart(partURI, System.Net.Mime.MediaTypeNames.Application.Zip,
+                  CompressionOption.Maximum);
+               using (FileStream fileStream = fileInfo.OpenRead())
+               {
+                  fileStream.CopyTo(packagePart.GetStream());
+               }
+            }
+         }
+         Clipboard.SetText(zipFileName);
+         Clipboard.SetText(zipFileName);
+         MessageBox.Show(this,
+            "The following filename has been copied into the clipboard for easy reference / access" + Environment.NewLine +
+            zipFileName  + Environment.NewLine  + Environment.NewLine +
+            "You will need to delete this after use.",
+            "Current Zip FileName"
+            );
+      }
+
+      private IEnumerable<FileInfo> GetFilesToCompress()
+      {
+         foreach (FileInfo fileInfo in new DirectoryInfo(DisplayLog.FindLogLocation(@"LiquesceSvc")).EnumerateFiles("*", SearchOption.AllDirectories))
+         {
+            yield return fileInfo;
+         }
+         foreach (FileInfo fileInfo in new DirectoryInfo(DisplayLog.FindLogLocation(@"Liquesce")).EnumerateFiles("*", SearchOption.AllDirectories))
+         {
+            yield return fileInfo;
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/Tabs/Logging.resx b/Liquesce/Tabs/Logging.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/Liquesce/Tabs/Logging.resx
@@ -0,0 +1,120 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Tabs/MountingPoints.Designer.cs b/Liquesce/Tabs/MountingPoints.Designer.cs
new file mode 100644
index 0000000..bb13b5d
--- /dev/null
+++ b/Liquesce/Tabs/MountingPoints.Designer.cs
@@ -0,0 +1,175 @@
+namespace Liquesce.Tabs
+{
+   partial class MountingPoints
+   {
+      /// <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.listExistingMounts = new System.Windows.Forms.ListBox();
+         this.pnlStart = new System.Windows.Forms.Panel();
+         this.label1 = new System.Windows.Forms.Label();
+         this.btnNew = new Shared.CommandLinkButton();
+         this.btnEdit = new Shared.CommandLinkButton();
+         this.btnDelete = new Shared.CommandLinkButton();
+         this.edit1 = new Liquesce.Mounting.Edit();
+         this.pnlStart.SuspendLayout();
+         this.SuspendLayout();
+         // 
+         // listExistingMounts
+         // 
+         this.listExistingMounts.FormattingEnabled = true;
+         this.listExistingMounts.IntegralHeight = false;
+         this.listExistingMounts.ItemHeight = 14;
+         this.listExistingMounts.Location = new System.Drawing.Point(402, 91);
+         this.listExistingMounts.Name = "listExistingMounts";
+         this.listExistingMounts.ScrollAlwaysVisible = true;
+         this.listExistingMounts.Size = new System.Drawing.Size(195, 152);
+         this.listExistingMounts.TabIndex = 3;
+         this.listExistingMounts.SelectedIndexChanged += new System.EventHandler(this.listExistingMounts_SelectedIndexChanged);
+         // 
+         // pnlStart
+         // 
+         this.pnlStart.Controls.Add(this.label1);
+         this.pnlStart.Controls.Add(this.btnNew);
+         this.pnlStart.Controls.Add(this.btnEdit);
+         this.pnlStart.Controls.Add(this.btnDelete);
+         this.pnlStart.Controls.Add(this.listExistingMounts);
+         this.pnlStart.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.pnlStart.Location = new System.Drawing.Point(0, 0);
+         this.pnlStart.Name = "pnlStart";
+         this.pnlStart.Size = new System.Drawing.Size(600, 475);
+         this.pnlStart.TabIndex = 4;
+         // 
+         // label1
+         // 
+         this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+         this.label1.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.label1.Location = new System.Drawing.Point(4, 261);
+         this.label1.Name = "label1";
+         this.label1.Size = new System.Drawing.Size(593, 38);
+         this.label1.TabIndex = 4;
+         this.label1.Text = "Once you are happy with the changes, then do not forget to press \"Save\" in the \"S" +
+    "ervice Settings\" tab.";
+         // 
+         // btnNew
+         // 
+         this.btnNew.ButtonDepress = ((sbyte)(2));
+         this.btnNew.HighlightFillAlpha = ((byte)(250));
+         this.btnNew.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnNew.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnNew.HighlightWidth = 2F;
+         this.btnNew.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_Nfs_mount;
+         this.btnNew.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnNew.Location = new System.Drawing.Point(4, 4);
+         this.btnNew.Name = "btnNew";
+         this.btnNew.Rounding = 10F;
+         this.btnNew.Size = new System.Drawing.Size(375, 65);
+         this.btnNew.Subscript = "   Create a new mounting point.";
+         this.btnNew.TabIndex = 0;
+         this.btnNew.Text = "&New";
+         this.btnNew.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnNew.UseVisualStyleBackColor = true;
+         this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
+         // 
+         // btnEdit
+         // 
+         this.btnEdit.ButtonDepress = ((sbyte)(2));
+         this.btnEdit.HighlightFillAlpha = ((byte)(250));
+         this.btnEdit.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnEdit.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnEdit.HighlightWidth = 2F;
+         this.btnEdit.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_Nfs_unmount;
+         this.btnEdit.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnEdit.Location = new System.Drawing.Point(4, 91);
+         this.btnEdit.Name = "btnEdit";
+         this.btnEdit.Rounding = 10F;
+         this.btnEdit.Size = new System.Drawing.Size(375, 65);
+         this.btnEdit.Subscript = "   Change the selected mount point details.";
+         this.btnEdit.TabIndex = 1;
+         this.btnEdit.Text = "&Edit";
+         this.btnEdit.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnEdit.UseVisualStyleBackColor = true;
+         this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
+         // 
+         // btnDelete
+         // 
+         this.btnDelete.ButtonDepress = ((sbyte)(2));
+         this.btnDelete.HighlightFillAlpha = ((byte)(250));
+         this.btnDelete.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnDelete.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnDelete.HighlightWidth = 2F;
+         this.btnDelete.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_K_ppp;
+         this.btnDelete.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnDelete.Location = new System.Drawing.Point(3, 178);
+         this.btnDelete.Name = "btnDelete";
+         this.btnDelete.Rounding = 10F;
+         this.btnDelete.Size = new System.Drawing.Size(375, 65);
+         this.btnDelete.Subscript = "   Delete the selected mount point.";
+         this.btnDelete.TabIndex = 2;
+         this.btnDelete.Text = "&Delete";
+         this.btnDelete.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnDelete.UseVisualStyleBackColor = true;
+         this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
+         // 
+         // edit1
+         // 
+         this.edit1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.edit1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.edit1.Location = new System.Drawing.Point(0, 0);
+         this.edit1.Name = "edit1";
+         this.edit1.Size = new System.Drawing.Size(600, 475);
+         this.edit1.TabIndex = 4;
+         this.edit1.Visible = false;
+         // 
+         // MountingPoints
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.Controls.Add(this.pnlStart);
+         this.Controls.Add(this.edit1);
+         this.DoubleBuffered = true;
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Name = "MountingPoints";
+         this.Size = new System.Drawing.Size(600, 475);
+         this.Leave += new System.EventHandler(this.MountingPoints_Leave);
+         this.pnlStart.ResumeLayout(false);
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private Shared.CommandLinkButton btnNew;
+      private Shared.CommandLinkButton btnEdit;
+      private Shared.CommandLinkButton btnDelete;
+      private System.Windows.Forms.ListBox listExistingMounts;
+      private System.Windows.Forms.Panel pnlStart;
+      private Mounting.Edit edit1;
+      private System.Windows.Forms.Label label1;
+
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/Tabs/MountingPoints.cs b/Liquesce/Tabs/MountingPoints.cs
new file mode 100644
index 0000000..0384068
--- /dev/null
+++ b/Liquesce/Tabs/MountingPoints.cs
@@ -0,0 +1,110 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="MountingPoints.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.Linq;
+using System.Windows.Forms;
+using LiquesceFacade;
+
+namespace Liquesce.Tabs
+{
+   public partial class MountingPoints : UserControl, ITab
+   {
+      public MountingPoints()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+      }
+
+      private ConfigDetails cd1;
+      public ConfigDetails cd
+      {
+         set 
+         { 
+            cd1 = value;
+            edit1.cd = cd;
+            PopulateMountList();
+         }
+         private get { return cd1; }
+      }
+
+      private void PopulateMountList()
+      {
+         listExistingMounts.Items.Clear();
+         foreach (MountDetail mt in cd1.MountDetails)
+         {
+            listExistingMounts.Items.Add(string.Format("{0} ({1})", mt.VolumeLabel, mt.DriveLetter));
+         }
+         listExistingMounts.SelectedIndex = 0;
+      }
+
+      private void listExistingMounts_SelectedIndexChanged(object sender, EventArgs e)
+      {
+         edit1.SelectedIndex( listExistingMounts.SelectedIndex );
+      }
+
+      private void btnNew_Click(object sender, EventArgs e)
+      {
+         int index = cd1.MountDetails.Count;
+         cd1.MountDetails.Add(new MountDetail());
+         PopulateMountList();
+         listExistingMounts.SelectedIndex = index;
+         edit1.Visible = true;
+         pnlStart.Visible = false;
+      }
+
+      private void btnEdit_Click(object sender, EventArgs e)
+      {
+         edit1.Visible = true;
+         pnlStart.Visible = false;
+      }
+
+      private void btnDelete_Click(object sender, EventArgs e)
+      {
+         if (DialogResult.Yes ==
+             MessageBox.Show(this,
+                "Performing this action will remove the selected Mounted drive from this machine.\n Do you wish to continue ?", "Caution..",
+                MessageBoxButtons.YesNo, MessageBoxIcon.Question))
+         {
+            cd1.MountDetails.RemoveAt(listExistingMounts.SelectedIndex);
+            if (!cd1.MountDetails.Any())
+            {
+               cd1.MountDetails.Add(new MountDetail());
+            }
+         }
+         PopulateMountList();
+      }
+
+      private void MountingPoints_Leave(object sender, EventArgs e)
+      {
+         // restore the "Landing visibility"
+         pnlStart.Visible = true;
+         edit1.Visible = false;
+      }
+
+
+   }
+}
diff --git a/Liquesce/Tabs/MountingPoints.resx b/Liquesce/Tabs/MountingPoints.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/Liquesce/Tabs/MountingPoints.resx
@@ -0,0 +1,120 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Tabs/Service.Designer.cs b/Liquesce/Tabs/Service.Designer.cs
new file mode 100644
index 0000000..8d8e7b3
--- /dev/null
+++ b/Liquesce/Tabs/Service.Designer.cs
@@ -0,0 +1,124 @@
+namespace Liquesce.Tabs
+{
+   partial class Service
+   {
+      /// <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.propertyGrid1 = new System.Windows.Forms.PropertyGrid();
+         this.pgrsService = new System.Windows.Forms.ProgressBar();
+         this.btnStopStart = new Shared.CommandLinkButton();
+         this.btnSave = new Shared.CommandLinkButton();
+         this.SuspendLayout();
+         // 
+         // propertyGrid1
+         // 
+         this.propertyGrid1.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.propertyGrid1.Location = new System.Drawing.Point(3, 3);
+         this.propertyGrid1.Name = "propertyGrid1";
+         this.propertyGrid1.Size = new System.Drawing.Size(594, 327);
+         this.propertyGrid1.TabIndex = 0;
+         // 
+         // pgrsService
+         // 
+         this.pgrsService.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+         this.pgrsService.Location = new System.Drawing.Point(384, 430);
+         this.pgrsService.Name = "pgrsService";
+         this.pgrsService.Size = new System.Drawing.Size(211, 23);
+         this.pgrsService.Step = 1;
+         this.pgrsService.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
+         this.pgrsService.TabIndex = 3;
+         this.pgrsService.Visible = false;
+         // 
+         // btnStopStart
+         // 
+         this.btnStopStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+         this.btnStopStart.ButtonDepress = ((sbyte)(2));
+         this.btnStopStart.HighlightFillAlpha = ((byte)(250));
+         this.btnStopStart.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnStopStart.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnStopStart.HighlightWidth = 2F;
+         this.btnStopStart.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_K_cm_system;
+         this.btnStopStart.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnStopStart.Location = new System.Drawing.Point(3, 407);
+         this.btnStopStart.Name = "btnStopStart";
+         this.btnStopStart.Rounding = 10F;
+         this.btnStopStart.Size = new System.Drawing.Size(375, 65);
+         this.btnStopStart.Subscript = "   Stop, then start the service, to use the last saved settings.";
+         this.btnStopStart.TabIndex = 2;
+         this.btnStopStart.Text = "Restart The Service";
+         this.btnStopStart.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnStopStart.UseVisualStyleBackColor = true;
+         this.btnStopStart.Click += new System.EventHandler(this.btnStopStart_Click);
+         // 
+         // btnSave
+         // 
+         this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+         this.btnSave.ButtonDepress = ((sbyte)(2));
+         this.btnSave.HighlightFillAlpha = ((byte)(250));
+         this.btnSave.HighlightFillAlphaMouse = ((byte)(125));
+         this.btnSave.HighlightFillAlphaNormal = ((byte)(75));
+         this.btnSave.HighlightWidth = 2F;
+         this.btnSave.Image = global::Liquesce.Properties.Resources.Umut_Pulat_Tulliana_2_3floppy_mount;
+         this.btnSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnSave.Location = new System.Drawing.Point(3, 336);
+         this.btnSave.Name = "btnSave";
+         this.btnSave.Rounding = 10F;
+         this.btnSave.Size = new System.Drawing.Size(375, 65);
+         this.btnSave.Subscript = "   Save the config file settings including all the mount points.";
+         this.btnSave.TabIndex = 1;
+         this.btnSave.Text = "Save All Settings";
+         this.btnSave.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+         this.btnSave.UseVisualStyleBackColor = true;
+         this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+         // 
+         // Service
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.Controls.Add(this.pgrsService);
+         this.Controls.Add(this.btnStopStart);
+         this.Controls.Add(this.propertyGrid1);
+         this.Controls.Add(this.btnSave);
+         this.DoubleBuffered = true;
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Name = "Service";
+         this.Size = new System.Drawing.Size(600, 475);
+         this.Load += new System.EventHandler(this.Service_Load);
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private Shared.CommandLinkButton btnSave;
+      private System.Windows.Forms.PropertyGrid propertyGrid1;
+      private Shared.CommandLinkButton btnStopStart;
+      private System.Windows.Forms.ProgressBar pgrsService;
+   }
+}
diff --git a/Liquesce/Tabs/Service.cs b/Liquesce/Tabs/Service.cs
new file mode 100644
index 0000000..b090207
--- /dev/null
+++ b/Liquesce/Tabs/Service.cs
@@ -0,0 +1,124 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Service.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion Copyright (C)
+
+using System;
+using System.ComponentModel;
+using System.ServiceProcess;
+using System.Threading;
+using System.Windows.Forms;
+
+using LiquesceFacade;
+using NLog;
+
+namespace Liquesce.Tabs
+{
+   public partial class Service : UserControl, ITab
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      public Service()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+      }
+
+      private void Service_Load(object sender, EventArgs e)
+      {
+         propertyGrid1.SelectedObject = new AdvancedPropertiesDisplay(cd);
+
+         Utils.ResizeDescriptionArea(ref propertyGrid1, 5);
+      }
+
+      private void btnStopStart_Click(object sender, EventArgs e)
+      {
+         try
+         {
+            if (DialogResult.Yes ==
+                MessageBox.Show(this,
+                   "Performing this action will \"Remove the Mounted drive(s)\" on this machine.\nAll open files on the mounts, will be forceably closed by this.\n\nDo you wish to continue ?",
+                   "Caution..", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
+            {
+               UseWaitCursor = true;
+               Enabled = false;
+               pgrsService.Visible = true;
+               pgrsService.Style = ProgressBarStyle.Marquee;
+               BackgroundWorker bw = new BackgroundWorker();
+               bw.DoWork += delegate
+               {
+                  ServiceController serviceController1 = new ServiceController {ServiceName = "LiquesceSvc"};
+                  if (serviceController1.Status != ServiceControllerStatus.Stopped)
+                  {
+                     Log.Info("Calling SCM stop");
+                     serviceController1.Stop();
+                     Log.Info("Now wait for the stopped state");
+                     serviceController1.WaitForStatus(ServiceControllerStatus.Stopped);
+                     Log.Info("Now start, may need a small sleep to allow things to settle 1");
+                     Thread.Sleep(Math.Max(1000, 2500 - (int) cd.DelayStartMilliSec));
+                  }
+                  Log.Info("Calling SCM start");
+                  serviceController1.Start();
+                  Log.Info("Now wait for the stopped state");
+                  serviceController1.WaitForStatus(ServiceControllerStatus.Running);
+                  Log.Info("Now start, may need a small sleep to allow things to settle 2");
+                  Thread.Sleep(Math.Max(1000, 2500 - (int) cd.DelayStartMilliSec));
+               };
+               // what to do when worker completes its task
+               bw.RunWorkerCompleted += delegate(object sender1, RunWorkerCompletedEventArgs rwceArgs)
+               {
+                  if (rwceArgs.Error != null)
+                  {
+                     Log.ErrorException("btnStopStart threw:", rwceArgs.Error);
+                  }
+                  UseWaitCursor = false;
+                  Enabled = true;
+                  pgrsService.Visible = false;
+                  pgrsService.Style = ProgressBarStyle.Continuous;
+               };
+               bw.RunWorkerAsync();
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("commitToolStripMenuItem_Click: Unable to attach to the service, even tho it is running", ex);
+            MessageBox.Show(this, ex.Message, "Has the firewall blocked the communications ?", MessageBoxButtons.OK,
+                            MessageBoxIcon.Stop);
+         }
+      }
+
+      private void btnSave_Click(object sender, EventArgs e)
+      {
+         Log.Info("Save the new details");
+         foreach (MountDetail detail in cd.MountDetails)
+         {
+            detail.UseInplaceRenaming = cd.UseInplaceRenaming;
+         }
+         cd.WriteOutConfigDetails();
+      }
+
+      public ConfigDetails cd { set; private get; }
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/Tabs/Service.resx b/Liquesce/Tabs/Service.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/Liquesce/Tabs/Service.resx
@@ -0,0 +1,120 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Tabs/Welcome.Designer.cs b/Liquesce/Tabs/Welcome.Designer.cs
new file mode 100644
index 0000000..92d824f
--- /dev/null
+++ b/Liquesce/Tabs/Welcome.Designer.cs
@@ -0,0 +1,104 @@
+namespace Liquesce.Tabs
+{
+   partial class Welcome
+   {
+      /// <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.richTextBox1 = new System.Windows.Forms.RichTextBox();
+         this.panel1 = new System.Windows.Forms.Panel();
+         this.label1 = new System.Windows.Forms.Label();
+         this.tsVersion = new System.Windows.Forms.Label();
+         this.panel1.SuspendLayout();
+         this.SuspendLayout();
+         // 
+         // richTextBox1
+         // 
+         this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
+         this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.richTextBox1.Location = new System.Drawing.Point(0, 0);
+         this.richTextBox1.Name = "richTextBox1";
+         this.richTextBox1.ReadOnly = true;
+         this.richTextBox1.Size = new System.Drawing.Size(600, 461);
+         this.richTextBox1.TabIndex = 1;
+         this.richTextBox1.Text = "";
+         // 
+         // panel1
+         // 
+         this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
+         this.panel1.Controls.Add(this.label1);
+         this.panel1.Controls.Add(this.tsVersion);
+         this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+         this.panel1.Location = new System.Drawing.Point(0, 461);
+         this.panel1.Name = "panel1";
+         this.panel1.Size = new System.Drawing.Size(600, 14);
+         this.panel1.TabIndex = 2;
+         // 
+         // label1
+         // 
+         this.label1.AutoSize = true;
+         this.label1.Dock = System.Windows.Forms.DockStyle.Right;
+         this.label1.Location = new System.Drawing.Point(460, 0);
+         this.label1.Name = "label1";
+         this.label1.Size = new System.Drawing.Size(51, 14);
+         this.label1.TabIndex = 0;
+         this.label1.Text = "Version:";
+         // 
+         // tsVersion
+         // 
+         this.tsVersion.AutoSize = true;
+         this.tsVersion.Dock = System.Windows.Forms.DockStyle.Right;
+         this.tsVersion.Location = new System.Drawing.Point(511, 0);
+         this.tsVersion.Name = "tsVersion";
+         this.tsVersion.Size = new System.Drawing.Size(89, 14);
+         this.tsVersion.TabIndex = 1;
+         this.tsVersion.Text = "13.12.9999.21";
+         // 
+         // Welcome
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.Controls.Add(this.richTextBox1);
+         this.Controls.Add(this.panel1);
+         this.DoubleBuffered = true;
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Name = "Welcome";
+         this.Size = new System.Drawing.Size(600, 475);
+         this.Load += new System.EventHandler(this.Welcome_Load);
+         this.panel1.ResumeLayout(false);
+         this.panel1.PerformLayout();
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private System.Windows.Forms.RichTextBox richTextBox1;
+      private System.Windows.Forms.Panel panel1;
+      private System.Windows.Forms.Label label1;
+      private System.Windows.Forms.Label tsVersion;
+   }
+}
diff --git a/Liquesce/Tabs/Welcome.cs b/Liquesce/Tabs/Welcome.cs
new file mode 100644
index 0000000..eee90b1
--- /dev/null
+++ b/Liquesce/Tabs/Welcome.cs
@@ -0,0 +1,75 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Welcome.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.Reflection;
+using System.Windows.Forms;
+
+namespace Liquesce.Tabs
+{
+   public partial class Welcome : UserControl
+   {
+      public Welcome()
+      {
+         InitializeComponent();
+         DoubleBuffered = true;
+
+         // Converted from the Welcome.rtf text via notepad :-)
+         richTextBox1.Rtf = @"{\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fnil\fcharset0 Tahoma;}{\f1\fnil\fcharset2 Symbol;}}
+{\colortbl ;\red0\green0\blue255;}
+{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\ul\b\f0\fs24 Welcome.\ulnone\b0\fs18\par
+\fs20 This is the management application for the \i Liquesce Phase \fs22 ][\fs20  Suite\i0 . It allows you to take your hard disks (internal or external) and make them appear as single large drive.\par
+\par
+\ul\b Performance Tip:\ulnone\b0\par
+Please ensure that for \i any \i0 mounted drive letter \i or \i0 folder that is created via Liquesce, is \i not \i0 protected by an Anti-Virus apllication.\par
+This is because 'It' (the AV) will see all file actions (opens, closes, queries, etc.) on both the source \b AND \b0 the new mount point, and will seriously impact your performance.\par
+\b\par
+\ul Debug Tips:\b0\par
+\pard{\pntext\f1\'B7\tab}{\*\pn\pnlvlblt\pnf1\pnindent0{\pntxtb\'B7}}\fi-360\li720\ulnone Stop the service\par
+{\pntext\f1\'B7\tab}Delete the Svc logs\par
+{\pntext\f1\'B7\tab}Adjust your logging to Trace,\par
+{\pntext\f1\'B7\tab}Drop the threads down to 1, \par
+{\pntext\f1\'B7\tab}Start the service\par
+{\pntext\f1\'B7\tab}Perform the actions that cause a problem. e.g.\par
+\pard{\pntext\f0 i.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnlcrm{\pntxta.}}
+\fi-360\li1080 Use wordpad to open a file on the mounted drive (Make new if you can)\par
+{\pntext\f0 ii.\tab}Make some edits\par
+\pard{\pntext\f1\'B7\tab}{\*\pn\pnlvlblt\pnf1\pnindent0{\pntxtb\'B7}}\fi-360\li720 Make a note of the time (UTC/GMT).\par
+{\pntext\f1\'B7\tab}Stop the service and zip them up \fs18\par
+\pard{\pntext\f0 i.\tab}{\*\pn\pnlvlbody\pnf0\pnindent0\pnstart1\pnlcrm{\pntxta.}}
+\fi-360\li1080\fs20 Use the 'Zip Logs' button in the Logging tab,\fs18\par
+\fs20{\pntext\f0 ii.\tab}Create a new issue here: {\field{\*\fldinst{HYPERLINK 'https://liquesce.codeplex.com/workitem/list/basic'}}{\fldrslt{\ul\cf1 https://liquesce.codeplex.com/workitem/list/basic}}}\f0\fs20 . \lang9\fs22\par
+\lang2057\fs20{\pntext\f0 iii.\tab}With the notes of how and when, fill in the details and attach the log(s)\lang9\fs22\par
+\pard{\pntext\f1\'B7\tab}{\*\pn\pnlvlblt\pnf1\pnindent0{\pntxtb\'B7}}\fi-360\li360\lang2057\fs20 If the actions can be done via clicking things, then use PSR (Problem Steps Recorder) {\field{\*\fldinst{HYPERLINK 'http://www.msigeek.com/2410/problem-step-recorder-an-amazing-screen-capture-tool'}}{\fldrslt{\ul\cf1 http://www.msigeek.com/2410/problem-step-recorder-an-amazing-screen-capture-tool}}}\lang9\f0\fs22\par
+}";
+      }
+
+      private void Welcome_Load(object sender, EventArgs e)
+      {
+         tsVersion.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString();
+      }
+   }
+}
diff --git a/Liquesce/Tabs/Welcome.resx b/Liquesce/Tabs/Welcome.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/Liquesce/Tabs/Welcome.resx
@@ -0,0 +1,120 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Liquesce/Tabs/Welcome.rtf b/Liquesce/Tabs/Welcome.rtf
new file mode 100644
index 0000000..5bac9bf
Binary files /dev/null and b/Liquesce/Tabs/Welcome.rtf differ
diff --git a/Liquesce/TailForm.Designer.cs b/Liquesce/TailForm.Designer.cs
new file mode 100644
index 0000000..7b735d0
--- /dev/null
+++ b/Liquesce/TailForm.Designer.cs
@@ -0,0 +1,125 @@
+namespace Liquesce
+{
+   partial class TailForm
+   {
+      /// <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(TailForm));
+         this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+         this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+         this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
+         this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
+         this.timer1 = new System.Windows.Forms.Timer(this.components);
+         this.textBox1 = new Shared.FlickerFreeRichEditTextBox();
+         this.contextMenuStrip1.SuspendLayout();
+         this.SuspendLayout();
+         // 
+         // contextMenuStrip1
+         // 
+         this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripMenuItem1,
+            this.toolStripMenuItem2,
+            this.toolStripMenuItem3});
+         this.contextMenuStrip1.Name = "contextMenuStrip1";
+         this.contextMenuStrip1.Size = new System.Drawing.Size(126, 70);
+         // 
+         // toolStripMenuItem1
+         // 
+         this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+         this.toolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.Delete;
+         this.toolStripMenuItem1.Size = new System.Drawing.Size(125, 22);
+         this.toolStripMenuItem1.Text = "&Clear";
+         this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click);
+         // 
+         // toolStripMenuItem2
+         // 
+         this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+         this.toolStripMenuItem2.Size = new System.Drawing.Size(125, 22);
+         this.toolStripMenuItem2.Text = "&Freeze";
+         this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click);
+         // 
+         // toolStripMenuItem3
+         // 
+         this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+         this.toolStripMenuItem3.Size = new System.Drawing.Size(125, 22);
+         this.toolStripMenuItem3.Text = "&Resume";
+         this.toolStripMenuItem3.Click += new System.EventHandler(this.toolStripMenuItem3_Click);
+         // 
+         // timer1
+         // 
+         this.timer1.Interval = 250;
+         this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+         // 
+         // textBox1
+         // 
+         this.textBox1.BackColor = System.Drawing.SystemColors.Window;
+         this.textBox1.CausesValidation = false;
+         this.textBox1.ContextMenuStrip = this.contextMenuStrip1;
+         this.textBox1.DetectUrls = false;
+         this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.textBox1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.textBox1.Location = new System.Drawing.Point(0, 0);
+         this.textBox1.Name = "textBox1";
+         this.textBox1.ReadOnly = true;
+         this.textBox1.Size = new System.Drawing.Size(888, 408);
+         this.textBox1.TabIndex = 0;
+         this.textBox1.Text = "";
+         this.textBox1.WordWrap = false;
+         // 
+         // TailForm
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.ClientSize = new System.Drawing.Size(888, 408);
+         this.Controls.Add(this.textBox1);
+         this.DoubleBuffered = true;
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+         this.MinimizeBox = false;
+         this.MinimumSize = new System.Drawing.Size(400, 200);
+         this.Name = "TailForm";
+         this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+         this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+         this.Text = "Tail";
+         this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.TailForm_FormClosing);
+         this.Shown += new System.EventHandler(this.TailForm_Shown);
+         this.contextMenuStrip1.ResumeLayout(false);
+         this.ResumeLayout(false);
+
+      }
+
+      #endregion
+
+      private Shared.FlickerFreeRichEditTextBox textBox1;
+      private System.Windows.Forms.Timer timer1;
+      private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+      private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
+      private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
+      private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/TailForm.cs b/Liquesce/TailForm.cs
new file mode 100644
index 0000000..2e16b15
--- /dev/null
+++ b/Liquesce/TailForm.cs
@@ -0,0 +1,185 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="TailForm.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2012-2014 Smurf-IV
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Windows.Forms;
+using Liquesce.Properties;
+using LiquesceTray;
+
+namespace Liquesce
+{
+   public partial class TailForm : Form
+   {
+      private readonly string logLocation;
+      private long previousSeekPosition;
+      private Color lastColor;
+
+      public TailForm(string logLocation)
+      {
+         this.logLocation = logLocation;
+         InitializeComponent();
+         WindowLocation.GeometryFromString(Settings.Default.TailWindowLocation, this);
+      }
+
+      private void timer1_Tick(object sender, EventArgs e)
+      {
+         if (!Visible
+            || String.IsNullOrEmpty(logLocation)
+            )
+         {
+            return;
+         }
+         try
+         {
+            lock (this)
+            {
+               List<string> linesToProcess = new List<string>();
+               long currentLength = 0;
+               using (StreamReader reader =
+                  new StreamReader(new FileStream(logLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 1024,
+                     FileOptions.SequentialScan)))
+               {
+                  //if the file size has not changed, idle
+
+                  currentLength = reader.BaseStream.Length;
+                  if (currentLength == previousSeekPosition)
+                  {
+                     return;
+                  }
+                  textBox1._Paint = false; // turn off flag to ignore WM_PAINT messages
+                  if (currentLength < previousSeekPosition)
+                  {
+                     textBox1.Clear();
+                     previousSeekPosition = 0;
+                  }
+                  else //seek to the last max offset
+                  {
+                     reader.BaseStream.Seek(previousSeekPosition, SeekOrigin.Begin);
+                  }
+                  // Read out of the file until the EOF
+                  int linesToBeDone = 0;
+                  while (!reader.EndOfStream
+                     && (++linesToBeDone < 100) // Give the display a chance to display something rather than looking like it has hung !
+                     )
+                  {
+                     linesToProcess.Add(reader.ReadLine());
+                  }
+                  previousSeekPosition = reader.BaseStream.Position;
+               }
+               foreach (string line in linesToProcess)
+               {
+                  int textLength = textBox1.TextLength;
+                  textBox1.Select(textLength, 0);
+                  if (line.Length > 29)
+                  {
+                     string trim = line.Substring(28, 2).Trim();
+                     switch (trim[0])
+                     {
+                        case 'F':
+                           textBox1.SelectionColor = Color.DarkViolet;
+                           break;
+
+                        case 'E':
+                           textBox1.SelectionColor = Color.Red;
+                           break;
+
+                        case 'W':
+                           textBox1.SelectionColor = Color.RoyalBlue;
+                           break;
+
+                        case 'I':
+                           textBox1.SelectionColor = Color.Black;
+                           break;
+
+                        case 'D':
+                           textBox1.SelectionColor = Color.DarkGray;
+                           break;
+
+                        case 'T':
+                           textBox1.SelectionColor = Color.DimGray;
+                           break;
+
+                        default:
+                           // Leave it as is
+                           textBox1.SelectionColor = lastColor;
+                           break;
+                     }
+                  }
+                  lastColor = textBox1.SelectionColor;
+                  textBox1.AppendText(line + Environment.NewLine);
+               }
+            }
+         }
+         catch
+         {
+         }
+         finally
+         {
+            textBox1._Paint = true;// restore flag so we can paint the control
+         }
+      }
+
+      private void TailForm_Shown(object sender, EventArgs e)
+      {
+         Text += " " + logLocation;
+         timer1.Enabled = true;
+      }
+
+      private void TailForm_FormClosing(object sender, FormClosingEventArgs e)
+      {
+         Hide();
+         timer1.Enabled = false;
+         // persist our geometry string.
+         Settings.Default.TailWindowLocation = WindowLocation.GeometryToString(this);
+         Settings.Default.Save();
+      }
+
+      private void toolStripMenuItem1_Click(object sender, EventArgs e)
+      {
+         lock (this)
+         {
+            textBox1.Clear();
+         }
+      }
+
+      private void toolStripMenuItem2_Click(object sender, EventArgs e)
+      {
+         timer1.Enabled = false;
+         textBox1.BackColor = SystemColors.ControlLight;
+      }
+
+      private void toolStripMenuItem3_Click(object sender, EventArgs e)
+      {
+         timer1.Enabled = true;
+         textBox1.BackColor = SystemColors.Window;
+      }
+   }
+}
\ No newline at end of file
diff --git a/Liquesce/MainForm.resx b/Liquesce/TailForm.resx
similarity index 94%
rename from Liquesce/MainForm.resx
rename to Liquesce/TailForm.resx
index 91bd26d..6feaf97 100644
--- a/Liquesce/MainForm.resx
+++ b/Liquesce/TailForm.resx
@@ -117,30 +117,12 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="imageListUnits.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>536, 17</value>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>104, 17</value>
   </metadata>
-  <metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>335, 17</value>
-  </metadata>
-  <metadata name="mergeListContext.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
-  <metadata name="refreshExpected.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>800, 17</value>
-  </metadata>
-  <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>427, 17</value>
-  </metadata>
-  <metadata name="FillExpectedLayoutWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>155, 17</value>
-  </metadata>
-  <metadata name="serviceController1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>660, 17</value>
-  </metadata>
-  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>54</value>
-  </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
diff --git a/Liquesce/app.manifest b/Liquesce/app.manifest
new file mode 100644
index 0000000..75ed20c
--- /dev/null
+++ b/Liquesce/app.manifest
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+    <security>
+      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+        <!-- UAC Manifest Options
+            If you want to change the Windows User Account Control level replace the 
+            requestedExecutionLevel node with one of the following.
+
+        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
+        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
+
+            Specifying requestedExecutionLevel node will disable file and registry virtualization.
+            If you want to utilize File and Registry Virtualization for backward 
+            compatibility then delete the requestedExecutionLevel node.
+        -->
+         <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+    <application>
+      <!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.-->
+       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- = Windows 8.1 and Windows Server 2012 R2 -->
+       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- = Windows 8 and Windows Server 2012 -->
+       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- = Windows 7 and Windows Server 2008 R2-->
+    </application>
+  </compatibility>
+
+</asmv1:assembly>
diff --git "a/LiquesceFa\303\247ade/ConfigDetails.cs" "b/LiquesceFa\303\247ade/ConfigDetails.cs"
index 80c855b..ab9ac11 100644
--- "a/LiquesceFa\303\247ade/ConfigDetails.cs"
+++ "b/LiquesceFa\303\247ade/ConfigDetails.cs"
@@ -1,131 +1,299 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ConfigDetails.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
 using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
 using System.Runtime.Serialization;
+using System.Text;
+using System.Xml.Serialization;
+using NLog;
 
 namespace LiquesceFacade
 {
-    [Flags]
-    public enum Mask : uint
-    {
-        FILE_READ_DATA = 0x00000001,
-        FILE_WRITE_DATA = 0x00000002,
-        FILE_APPEND_DATA = 0x00000004,
-        FILE_READ_EA = 0x00000008,
-        FILE_WRITE_EA = 0x00000010,
-        FILE_EXECUTE = 0x00000020,
-        FILE_DELETE_CHILD = 0x00000040,
-        FILE_READ_ATTRIBUTES = 0x00000080,
-        FILE_WRITE_ATTRIBUTES = 0x00000100,
-
-        DELETE = 0x00010000,
-        READ_CONTROL = 0x00020000,
-        WRITE_DAC = 0x00040000,
-        WRITE_OWNER = 0x00080000,
-        SYNCHRONIZE = 0x00100000,
-
-        ACCESS_SYSTEM_SECURITY = 0x01000000,
-        MAXIMUM_ALLOWED = 0x02000000,
-
-        GENERIC_ALL = 0x10000000,
-        GENERIC_EXECUTE = 0x20000000,
-        GENERIC_WRITE = 0x40000000,
-        GENERIC_READ = 0x80000000,
-
-        READ_NTFS = FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
-        CHANGE_NTFS = READ_NTFS + FILE_WRITE_DATA + FILE_APPEND_DATA + FILE_WRITE_EA + FILE_WRITE_ATTRIBUTES + DELETE,
-        FULLCONTROL_NTFS = CHANGE_NTFS + FILE_DELETE_CHILD + WRITE_DAC + WRITE_OWNER,
-    }
-
-    [Flags]
-    public enum AceFlags : int
-    {
-        ObjectInheritAce = 1,
-        ContainerInheritAce = 2,
-        NoPropagateInheritAce = 4,
-        InheritOnlyAce = 8,
-        InheritedAce = 16
-    }
-
-    [Flags]
-    public enum AceType : int
-    {
-        AccessAllowed = 0,
-        AccessDenied = 1,
-        Audit = 2
-    }
-
-    [DataContract]
-    public class UserAccessRuleExport
-    {
-        [DataMember(IsRequired = true)]
-        public string DomainUserIdentity;
-        [DataMember(IsRequired = true)]
-        public Mask AccessMask;
-        [DataMember(IsRequired = true)]
-        public AceFlags InheritanceFlags;
-        [DataMember(IsRequired = true)]
-        public AceType Type;
-    }
-    /// <summary>
-    /// struct to hold the details required be the WMI objects to recreate the share
-    /// </summary>
-    [DataContract]
-    public class LanManShareDetails
-    {
-        [DataMember(IsRequired = true)]
-        public string Name;
-        [DataMember(IsRequired = true)]
-        public string Path; // *** Strip off trailing backslash - it isn't supported
-        [DataMember]
-        public string Description;
-        [DataMember]
-        public UInt32 MaxConnectionsNum;
-        [DataMember]
-        public List<UserAccessRuleExport> UserAccessRules;
-    }
-
-    /// <summary>
-    /// This is the class that will dump out the details to the XML File.
-    /// </summary>
-    [DataContract]
-    public class ConfigDetails
-    {
-
-        // Make this is a string so that the XML looks better (Rather than exporting 72 for 'N')
-        // Also the V 0.6 of Dokan is supposed to be able to use Mount points so this can then be reused for that..
-        [DataMember(IsRequired = true)]
-        public string DriveLetter = "N";
-
-        [DataMember]
-        public ushort ThreadCount = 5;
-
-        [DataMember]
-        public int LockTimeout = short.MaxValue; // Useful if you are getting locks in the multiple threads - Can be set to -1 for infinite
-
-        [DataMember]
-        public bool DebugMode = false;
-
-        [DataMember(IsRequired = true)]
-        public string VolumeLabel = "Mirror of C";
-
-        [DataMember]
-        public string PluginMode = "Priority";
-
-        [DataMember]
-        public UInt64 HoldOffBufferBytes = 1L << 10 << 10 << 10; // ==1GB;
-
-        [DataMember]
-        public UInt32 BufferReadSize = 4 << 10;   // == 4K Standard OS build block size
-
-        [DataMember(IsRequired = true)]
-        public List<string> SourceLocations;
-
-        [DataMember]
-        public string ServiceLogLevel = "Debug"; // NLog's LogLevel.Debug.ToString()
-
-        [DataMember]
-        public List<LanManShareDetails> SharesToRestore;
-
-        public List<string> KnownSharePaths;
-    }
+   /// <summary>
+   /// This is the class that will dump out the details to the XML File.
+   /// </summary>
+   [DataContract]
+   public class ConfigDetails
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+      public const string ProductNameCBFS = "LiquesceSvc";
+      static public readonly string configFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), ProductNameCBFS, "Properties.config.xml");
+
+      public void InitConfigDetails()
+      {
+         MountDetail mt = new MountDetail();
+         mt.InitConfigDetails();
+         MountDetails.Add(mt);
+      }
+
+      public void WriteOutConfigDetails()
+      {
+         WriteOutConfigDetails(this);
+      }
+
+      public static void WriteOutConfigDetails(ConfigDetails currentConfigDetails)
+      {
+         if (currentConfigDetails != null)
+            try
+            {
+               XmlSerializer x = new XmlSerializer(currentConfigDetails.GetType());
+               using (TextWriter textWriter = new StreamWriter(configFile))
+               {
+                  x.Serialize(textWriter, currentConfigDetails);
+               }
+            }
+            catch (Exception ex)
+            {
+               Log.ErrorException("Cannot save configDetails: ", ex);
+            }
+      }
+
+      [DataMember(IsRequired = true)]
+      public uint DelayStartMilliSec = 250;
+
+      [DataMember]
+      public ushort ThreadCount;
+
+      [DataMember]
+      public string ServiceLogLevel = LogLevel.Fatal.Name;
+
+      [DataMember]
+      public UInt16 CacheLifetimeSeconds = 32; // Set to zero to disable
+
+      [DataMember]
+      public bool UseInternalDriverCaches = true;
+
+      [DataMember]
+      public bool UseInplaceRenaming = false;
+
+
+      [DataMember]
+      public List<MountDetail> MountDetails = new List<MountDetail>();
+
+      public new string ToString()
+      {
+         StringBuilder sb = new StringBuilder();
+         sb = sb.AppendFormat("DelayStartMilliSec=[{0}]", DelayStartMilliSec).AppendLine();
+         sb = sb.AppendFormat("ThreadCount=[{0}]", ThreadCount).AppendLine();
+         sb = sb.AppendFormat("ServiceLogLevel[{0}]", ServiceLogLevel).AppendLine();
+         sb = sb.AppendFormat("CacheLifetimeSeconds=[{0}]", CacheLifetimeSeconds).AppendLine();
+         sb = sb.AppendFormat("UseInternalDriverCaches=[{0}]", UseInternalDriverCaches).AppendLine();
+         sb = sb.AppendFormat("UseInplaceRenaming=[{0}]", UseInplaceRenaming).AppendLine();
+         sb = sb.AppendLine("MountDetails:");
+         sb = MountDetails.Aggregate(sb, (current, mountDetail) => current.AppendLine(mountDetail.ToString()));
+         return sb.ToString();
+      }
+   }
+
+   [DataContract]
+   public class MountDetail
+   {
+      public enum AllocationModes
+      {
+         Folder,
+         Priority,
+         Balanced
+      };
+
+      // Make this is a string so that the XML looks better (Rather than exporting 72 for 'N')
+      [DataMember(IsRequired = true)]
+      public string DriveLetter; // InitConfig populates this to the last unused.
+
+      [DataMember(IsRequired = true)]
+      public string VolumeLabel = "Mirror of C";
+
+      [DataMember]
+      public AllocationModes AllocationMode = AllocationModes.Folder;
+
+      [DataMember]
+      public UInt64 HoldOffBufferBytes = 1L << 10 << 10 << 10; // ==1GB;
+
+      [DataMember(IsRequired = true)]
+      public List<SourceLocation> SourceLocations = new List<SourceLocation>();
+
+      [DataMember]
+      public List<LanManShareDetails> SharesToRestore;
+
+      public bool UseInplaceRenaming = false;
+
+      public new string ToString()
+      {
+         StringBuilder sb = new StringBuilder();
+         sb = sb.AppendFormat("\tDriveLetter=[{0}]", DriveLetter).AppendLine();
+         sb = sb.AppendFormat("\tVolumeLabel=[{0}]", VolumeLabel).AppendLine();
+         sb = sb.AppendFormat("\tAllocationMode=[{0}]", AllocationMode).AppendLine();
+         sb = sb.AppendFormat("\tHoldOffBufferBytes=[{0:N0}]", HoldOffBufferBytes).AppendLine();
+         sb = sb.AppendLine("\tSourceLocations:");
+         sb = SourceLocations.Aggregate(sb, (current, location) => current.AppendLine(location.ToString()));
+         return sb.ToString();
+      }
+
+      public void InitConfigDetails()
+      {
+         string[] drives = Environment.GetLogicalDrives();
+         List<char> driveLetters = new List<char>(26);
+         driveLetters.AddRange(drives.Select(dr => dr.ToUpper()[0]));
+         // Reverse find the 1st letter not used
+         for (int i = 0; i < 26; i++)
+         {
+            char letter = (char)('Z' - i);
+            if (!driveLetters.Contains(letter))
+            {
+               DriveLetter = letter.ToString(CultureInfo.InvariantCulture);
+               break;
+            }
+         }
+         if (String.IsNullOrEmpty(DriveLetter))
+         {
+            DriveLetter = "C:\\" + new Guid();
+            Directory.CreateDirectory(DriveLetter);
+         }
+         SourceLocations.Add(new SourceLocation(@"C:\"));
+      }
+   }
+
+   [DataContract]
+   public class SourceLocation
+   {
+      [DataMember]
+      public string SourcePath = string.Empty;
+
+      [DataMember]
+      public bool UseIsReadOnly;
+
+      // paramterless contrsuctor to allow serialisation
+      public SourceLocation()
+      {
+      }
+
+      public SourceLocation(string path, bool isReadOnly = false)
+      {
+         SourcePath = path;
+         UseIsReadOnly = isReadOnly;
+      }
+
+      public new string ToString()
+      {
+         StringBuilder sb = new StringBuilder();
+         sb = sb.AppendFormat("\t\tSourceLocation=[{0}]", SourcePath).AppendLine();
+         sb = sb.AppendFormat("\t\t\tUseIsReadOnly=[{0}]", UseIsReadOnly);
+         return sb.ToString();
+      }
+   }
+
+   #region Lan Share details
+   // ReSharper disable UnusedMember.Global
+   [Flags]
+   public enum Mask : uint
+   {
+      FILE_READ_DATA = 0x00000001,
+      FILE_WRITE_DATA = 0x00000002,
+      FILE_APPEND_DATA = 0x00000004,
+      FILE_READ_EA = 0x00000008,
+      FILE_WRITE_EA = 0x00000010,
+      FILE_EXECUTE = 0x00000020,
+      FILE_DELETE_CHILD = 0x00000040,
+      FILE_READ_ATTRIBUTES = 0x00000080,
+      FILE_WRITE_ATTRIBUTES = 0x00000100,
+
+      DELETE = 0x00010000,
+      READ_CONTROL = 0x00020000,
+      WRITE_DAC = 0x00040000,
+      WRITE_OWNER = 0x00080000,
+      SYNCHRONIZE = 0x00100000,
+
+      ACCESS_SYSTEM_SECURITY = 0x01000000,
+      MAXIMUM_ALLOWED = 0x02000000,
+
+      GENERIC_ALL = 0x10000000,
+      GENERIC_EXECUTE = 0x20000000,
+      GENERIC_WRITE = 0x40000000,
+      GENERIC_READ = 0x80000000,
+
+      READ_NTFS = FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
+      CHANGE_NTFS = READ_NTFS + FILE_WRITE_DATA + FILE_APPEND_DATA + FILE_WRITE_EA + FILE_WRITE_ATTRIBUTES + DELETE,
+      FULLCONTROL_NTFS = CHANGE_NTFS + FILE_DELETE_CHILD + WRITE_DAC + WRITE_OWNER,
+   }
+
+   [Flags]
+   public enum AceFlags : int
+   {
+      ObjectInheritAce = 1,
+      ContainerInheritAce = 2,
+      NoPropagateInheritAce = 4,
+      InheritOnlyAce = 8,
+      InheritedAce = 16
+   }
+
+   [Flags]
+   public enum AceType : int
+   {
+      AccessAllowed = 0,
+      AccessDenied = 1,
+      Audit = 2
+   }
+   // ReSharper restore UnusedMember.Global
+
+   [DataContract]
+   public class UserAccessRuleExport
+   {
+      [DataMember(IsRequired = true)]
+      public string DomainUserIdentity;
+      [DataMember(IsRequired = true)]
+      public Mask AccessMask;
+      [DataMember(IsRequired = true)]
+      public AceFlags InheritanceFlags;
+      [DataMember(IsRequired = true)]
+      public AceType Type;
+   }
+   /// <summary>
+   /// struct to hold the details required be the WMI objects to recreate the share
+   /// </summary>
+   [DataContract]
+   public class LanManShareDetails
+   {
+      [DataMember(IsRequired = true)]
+      public string Name;
+      [DataMember(IsRequired = true)]
+      public string Path; // *** Strip off trailing backslash - it isn't supported
+      [DataMember]
+      public string Description;
+      [DataMember]
+      public UInt32 MaxConnectionsNum;
+      [DataMember]
+      public List<UserAccessRuleExport> UserAccessRules;
+   }
+
+
+   #endregion
+
 }
\ No newline at end of file
diff --git "a/LiquesceFa\303\247ade/DealWithTheCfgChanging.cs" "b/LiquesceFa\303\247ade/DealWithTheCfgChanging.cs"
new file mode 100644
index 0000000..313a15b
--- /dev/null
+++ "b/LiquesceFa\303\247ade/DealWithTheCfgChanging.cs"
@@ -0,0 +1,199 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="DealWithTheCfgChanging.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using System.Xml.Serialization;
+using NLog;
+
+namespace LiquesceFacade
+{
+   public class DealWithTheCfgChanging
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      private void InitialiseToDefault(ref ConfigDetails currentConfigDetails)
+      {
+         try
+         {
+            if (currentConfigDetails == null)
+            {
+               currentConfigDetails = new ConfigDetails();
+               currentConfigDetails.InitConfigDetails();
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("Cannot create the default configDetails: ", ex);
+            currentConfigDetails = null;
+         }
+      }
+
+      public void ReadConfigDetails(ref ConfigDetails currentConfigDetails)
+      {
+         try
+         {
+            InitialiseToDefault(ref currentConfigDetails);
+            XmlSerializer x = new XmlSerializer(typeof(ConfigDetails));
+            x.UnknownElement += XOnUnknownElement;
+            //x.UnknownNode += XOnUnknownNode;
+            //x.UnreferencedObject += XUnreferencedObject;
+            Log.Info("Attempting to read Drive details from: [{0}]", ConfigDetails.configFile);
+            using (XmlTextReader textReader = new XmlTextReader(ConfigDetails.configFile))
+            {
+               currentConfigDetails = (ConfigDetails)x.Deserialize(textReader);
+               if (mtDetail != null)
+               {
+                  currentConfigDetails.MountDetails.Add(mtDetail);
+               }
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("Cannot read the configDetails: ", ex);
+            currentConfigDetails = null;
+         }
+         finally
+         {
+            if (currentConfigDetails == null)
+            {
+               InitialiseToDefault(ref currentConfigDetails);
+               if (!File.Exists(ConfigDetails.configFile))
+                  ConfigDetails.WriteOutConfigDetails(currentConfigDetails);
+            }
+         }
+      }
+
+      private void XUnreferencedObject(object sender, UnreferencedObjectEventArgs e)
+      {
+      }
+
+      private void XOnUnknownNode(object sender, XmlNodeEventArgs xmlNodeEventArgs)
+      {
+      }
+
+      private MountDetail mtDetail;
+
+
+      private void XOnUnknownElement(object sender, XmlElementEventArgs xeeArgs)
+      {
+         string innerText = xeeArgs.Element.InnerText;
+         switch (xeeArgs.Element.Name)
+         {
+            case "DriveLetter":
+               FillInMtDetail(xeeArgs);
+               mtDetail.DriveLetter = innerText;
+               break;
+            case "VolumeLabel":
+               FillInMtDetail(xeeArgs);
+               mtDetail.VolumeLabel = innerText;
+               break;
+            case "AllocationMode":
+               FillInMtDetail(xeeArgs);
+               Enum.TryParse(char.ToUpper(innerText[0]) + innerText.Substring(1), out mtDetail.AllocationMode);
+               break;
+            case "HoldOffBufferBytes":
+               FillInMtDetail(xeeArgs);
+               UInt64.TryParse(innerText, out mtDetail.HoldOffBufferBytes);
+               break;
+
+            case "SourceLocations":
+               FillInMtDetail(xeeArgs);
+               string[] split = innerText.Split(new string[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
+               foreach (string s1 in split.Select(s => s.Trim()).Where(s1 => !string.IsNullOrEmpty(s1)))
+               {
+                  mtDetail.SourceLocations.Add(new SourceLocation(s1));
+               }
+               break;
+            default:
+            Log.Fatal("Unable to find convertor for {0} for {1}", xeeArgs.Element.Name, innerText);
+               break;
+         }
+      }
+
+      private void FillInMtDetail(XmlElementEventArgs xeeArgs)
+      {
+         if (mtDetail == null)
+         {
+            mtDetail = new MountDetail();
+         }
+      }
+
+      private static bool OkToAddThisDriveType(string dr)
+      {
+         bool seemsOK;
+         try
+         {
+            Log.Debug(dr);
+            DriveInfo di = new DriveInfo(dr);
+            DriveType driveType = di.DriveType;
+            switch (driveType)
+            {
+               case DriveType.Removable:
+               case DriveType.Fixed:
+                  {
+                     string di_DriveFormat = di.DriveFormat;
+                     switch (di_DriveFormat.ToUpper())
+                     {
+                        case "CBFS":
+                           Log.Warn("Removing the existing CBFS drive as this would cause confusion ! [{0}]",
+                                    di.Name);
+                           seemsOK = false;
+                           break;
+                        case "FAT":
+                           Log.Warn("Removing FAT formated drive type, as this causes ACL Failures [{0}]", di.Name);
+                           seemsOK = false;
+                           break;
+                        default:
+                           seemsOK = true;
+                           break;
+                     }
+                  }
+                  break;
+               case DriveType.Unknown:
+               case DriveType.NoRootDirectory:
+               case DriveType.Network:
+               case DriveType.CDRom:
+               case DriveType.Ram:
+                  seemsOK = true;
+                  break;
+               default:
+                  throw new ArgumentOutOfRangeException("driveType", "Unknown type detected");
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("Check Drive Format Type threw:", ex);
+            seemsOK = false;
+
+         }
+         return seemsOK;
+
+      }
+   }
+}
diff --git "a/LiquesceFa\303\247ade/ILiquesce.cs" "b/LiquesceFa\303\247ade/ILiquesce.cs"
index 6380831..46b34a1 100644
--- "a/LiquesceFa\303\247ade/ILiquesce.cs"
+++ "b/LiquesceFa\303\247ade/ILiquesce.cs"
@@ -1,5 +1,30 @@
-using System;
-using System.Collections.Generic;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ILiquesce.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.ServiceModel;
 
 namespace LiquesceFacade
@@ -23,24 +48,17 @@ public interface ILiquesce
       [OperationContract(IsOneWay = true)]
       void Start();
 
-      LiquesceSvcState State
+      LiquesceSvcState LiquesceState
       {
          [OperationContract]
          get;
       }
 
-      [OperationContract]
-      List<LanManShareDetails> GetPossibleShares();
-
       ConfigDetails ConfigDetails
       {
          [OperationContract]
          get;
-         [OperationContract(IsOneWay = true)]
-         set;
       }
 
-      [OperationContract]
-      List<string> GetCurrentPluginModes();
    }
 }
diff --git "a/LiquesceFa\303\247ade/ILiquesceCallBack.cs" "b/LiquesceFa\303\247ade/ILiquesceCallBack.cs"
index 85734d9..34997a0 100644
--- "a/LiquesceFa\303\247ade/ILiquesceCallBack.cs"
+++ "b/LiquesceFa\303\247ade/ILiquesceCallBack.cs"
@@ -1,4 +1,30 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ILiquesceCallBack.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.Runtime.Serialization;
 using System.ServiceModel;
 
@@ -10,18 +36,15 @@ public interface IStateChange
       void Update(LiquesceSvcState state, string message);
    }
 
-   [ServiceContract(
-      CallbackContract = typeof(IStateChange),
-      SessionMode = SessionMode.Required)
-   ]
+   [ServiceContract( CallbackContract = typeof(IStateChange))]
    public interface ILiquesceCallBack
    {
 
       [OperationContract(IsOneWay = true)]
-      void Subscribe(Guid id);
+      void Subscribe(Client id);
 
       [OperationContract(IsOneWay = true)]
-      void Unsubscribe(Guid id);
+      void Unsubscribe(Client id);
    }
 
    // Each client connected to the service has a GUID
diff --git "a/LiquesceFa\303\247ade/LanManShareHandler.cs" "b/LiquesceFa\303\247ade/LanManShareHandler.cs"
index 6845c2d..c7ec6ae 100644
--- "a/LiquesceFa\303\247ade/LanManShareHandler.cs"
+++ "b/LiquesceFa\303\247ade/LanManShareHandler.cs"
@@ -1,5 +1,34 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LanManShareHandler.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2011 Smurf-IV
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Management;
 using System.Security.Principal;
@@ -9,40 +38,49 @@
 
 namespace LiquesceFacade
 {
-
-   public static class LanManShareHandler
+   public class LanManShareHandler
    {
       static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+      private List<LanManShareDetails> GotShares;
 
-      private static List<LanManShareDetails> GetLanManShares()
+      private void GetLanManShares()
       {
          List<LanManShareDetails> shares = new List<LanManShareDetails>();
          ManagementClass objClass = new ManagementClass("Win32_Share");
-         foreach (ManagementObject objShare in objClass.GetInstances())
+         foreach (ManagementObject objShare in objClass.GetInstances().Cast<ManagementObject>())
          {
             try
             {
-               PropertyData ong = objShare.Properties["MaximumAllowed"];
-               LanManShareDetails shareDetails = new LanManShareDetails
-                                                    {
-                                                       MaxConnectionsNum = (ong.Value == null) ? UInt32.MaxValue : Convert.ToUInt32(ong.Value),
-                                                       Name = Convert.ToString(objShare.Properties["Name"].Value),
-                                                       Path = Convert.ToString(objShare.Properties["Path"].Value),
-                                                       Description =
-                                                          Convert.ToString(objShare.Properties["Description"].Value)
-                                                    };
-               shares.Add(shareDetails);
+               string type = objShare["Type"].ToString();
+
+               if (type == "0") // 0 = DiskDrive (1 = Print Queue, 2 = Device, 3 = IPH)
+               {
+                  PropertyData ong = objShare.Properties["MaximumAllowed"];
+                  LanManShareDetails shareDetails = new LanManShareDetails
+                  {
+                     MaxConnectionsNum = (ong.Value == null) ? UInt32.MaxValue : Convert.ToUInt32(ong.Value),
+                     Name = Convert.ToString(objShare.Properties["Name"].Value),
+                     Path = Convert.ToString(objShare.Properties["Path"].Value),
+                     Description = Convert.ToString(objShare.Properties["Description"].Value)   // TODO: Should this be "Caption" ??
+                  };
+                  shares.Add(shareDetails);
+               }
             }
             catch
             {
             }
          }
-         return shares;
+         GotShares = shares;
       }
 
-      static public List<LanManShareDetails> MatchDriveLanManShares(string DriveLetter)
+      public List<LanManShareDetails> MatchDriveLanManShares(string DriveLetter)
       {
-         List<LanManShareDetails> lmsd = GetLanManShares().FindAll(share => share.Path.StartsWith(DriveLetter));
+         if (GotShares == null)
+         {
+            GetLanManShares();
+         }
+         Debug.Assert(GotShares != null, "GotShares != null");
+         List<LanManShareDetails> lmsd = GotShares.FindAll(share => share.Path.StartsWith(DriveLetter));
          foreach (LanManShareDetails details in lmsd)
          {
             details.UserAccessRules = new List<UserAccessRuleExport>();
@@ -87,11 +125,10 @@ public static void SetLanManShare(LanManShareDetails share)
       {
          try
          {
-
-            ManagementObject shareMO = new ManagementObject("Win32_Share=" + "'" + share.Name + "'");
+            ManagementObject shareMO = new ManagementObject(string.Format("Win32_Share='{0}'", share.Name));
             if (shareMO != null)
             {
-               Log.Warn("[{0}] may already be shared.", share.Name );
+               Log.Warn("[{0}] may already be shared.", share.Name);
                ManagementBaseObject inDeleteParams = null;
                ManagementBaseObject outDeleteParams = shareMO.InvokeMethod("Delete", inDeleteParams, null);
                if (outDeleteParams != null)
@@ -100,7 +137,7 @@ public static void SetLanManShare(LanManShareDetails share)
                            Convert.ToUInt32(outDeleteParams.Properties["ReturnValue"].Value));
                }
                else
-               Log.Error("Attempt to remove share returned null!");
+                  Log.Error("Attempt to remove share returned null!");
             }
          }
          catch (Exception ex)
@@ -121,7 +158,7 @@ public static void SetLanManShare(LanManShareDetails share)
             SplitUserName(userAccessRule.DomainUserIdentity, ref domainName, ref userName);
 
             NTAccount ntAccountUser = new NTAccount(domainName, userName);
-            SecurityIdentifier sidUser = (SecurityIdentifier) ntAccountUser.Translate(typeof (SecurityIdentifier));
+            SecurityIdentifier sidUser = (SecurityIdentifier)ntAccountUser.Translate(typeof(SecurityIdentifier));
             byte[] sidArrayUser = new byte[sidUser.BinaryLength];
             sidUser.GetBinaryForm(sidArrayUser, 0);
             mUser["SID"] = sidArrayUser;
@@ -136,8 +173,8 @@ public static void SetLanManShare(LanManShareDetails share)
          }
 
          ManagementObject secDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor"), null);
-         // securityDescriptorDefault.Properties["ControlFlags"].Value = 0x8; // Indicates an SD with a default DACL. the object receives the default DACL from the access token of the creator 
-         secDescriptor["ControlFlags"] = 4 + 256;  // 
+         // securityDescriptorDefault.Properties["ControlFlags"].Value = 0x8; // Indicates an SD with a default DACL. the object receives the default DACL from the access token of the creator
+         secDescriptor["ControlFlags"] = 4 + 256;  //
          secDescriptor["DACL"] = userobj;
 
          inParams["Description"] = share.Description;
@@ -160,36 +197,44 @@ public static void SetLanManShare(LanManShareDetails share)
             {
                case 0: // Success
                   break;
+
                case 2:
                   exceptionText = "Access Denied";
                   break;
+
                default:
-               //case 8:
+                  //case 8:
                   exceptionText = String.Format("Unknown Failure [{0}]", ret);
                   break;
+
                case 9:
                   exceptionText = "Invalid Name";
                   break;
+
                case 10:
                   exceptionText = "Invalid Level";
                   break;
+
                case 21:
                   exceptionText = "Invalid Parameter";
                   break;
+
                case 22:
                   // This one is okay as we are recreating the share !
                   // exceptionText = "Duplicate Share";
                   break;
+
                case 23:
                   exceptionText = "Redirected Path";
                   break;
+
                case 24:
                   exceptionText = "Unknown Device or Directory";
                   break;
+
                case 25:
                   exceptionText = "Net Name Not Found";
                   break;
-
             }
          }
          else
@@ -199,7 +244,6 @@ public static void SetLanManShare(LanManShareDetails share)
             throw new Exception(exceptionText);
       }
 
-
       private static void GetSharedFolder(string shareName, out ManagementBaseObject securityDescriptor)
       {
          securityDescriptor = null;
@@ -235,7 +279,7 @@ private static ManagementObject GetSharedFolderSecuritySettingObject(string shar
          ManagementObject sharedFolderObject = null;
 
          //Creating a searcher object to search
-         ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * from Win32_LogicalShareSecuritySetting where Name = '" + sharedFolderName + "'");
+         ManagementObjectSearcher searcher = new ManagementObjectSearcher(string.Format("Select * from Win32_LogicalShareSecuritySetting where Name = '{0}'", sharedFolderName));
          ManagementObjectCollection resultOfSearch = searcher.Get();
          if (resultOfSearch.Count > 0)
          {
@@ -245,7 +289,6 @@ private static ManagementObject GetSharedFolderSecuritySettingObject(string shar
          return sharedFolderObject;
       }
 
-
       // Splits full user name into domain name and username
       // assumes that username and domain name are split by '\'
       private static void SplitUserName(string fullName, ref string domainName, ref string userName)
@@ -272,6 +315,5 @@ private static void SplitUserName(string fullName, ref string domainName, ref st
             userName = fullName;
          }
       }
-
    }
-}
+}
\ No newline at end of file
diff --git "a/LiquesceFa\303\247ade/LiquesceCallBackProxy.cs" "b/LiquesceFa\303\247ade/LiquesceCallBackProxy.cs"
new file mode 100644
index 0000000..ef29c79
--- /dev/null
+++ "b/LiquesceFa\303\247ade/LiquesceCallBackProxy.cs"
@@ -0,0 +1,87 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceCallBackProxy.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.ServiceModel;
+
+namespace LiquesceFacade
+{
+   public class LiquesceCallBackProxy : DuplexClientBase<ILiquesceCallBack>, ILiquesceCallBack
+   {
+
+      public LiquesceCallBackProxy(InstanceContext callbackInstance)
+         : base(callbackInstance)
+      {
+      }
+
+      public LiquesceCallBackProxy(InstanceContext callbackInstance, string endpointConfigurationName)
+         : base(callbackInstance, endpointConfigurationName)
+      {
+      }
+
+      public LiquesceCallBackProxy(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress)
+         : base(callbackInstance, endpointConfigurationName, remoteAddress)
+      {
+      }
+
+      public LiquesceCallBackProxy(InstanceContext callbackInstance, string endpointConfigurationName, EndpointAddress remoteAddress)
+         : base(callbackInstance, endpointConfigurationName, remoteAddress)
+      {
+      }
+
+      public LiquesceCallBackProxy(InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)
+         : base(callbackInstance, binding, remoteAddress)
+      {
+      }
+
+      #region Implementation of ILiquesceCallBack
+
+      public void Subscribe(Client id)
+      {
+         try
+         {
+            base.Channel.Subscribe(id);
+         }
+         catch (EndpointNotFoundException ex)
+         {
+
+            throw new ApplicationException("Liquesce service is off. Please start the Liquesce server first then try to connect",ex);
+         }
+         catch (CommunicationException ex)
+         {
+
+            throw new ApplicationException("Liquesce Service is off. Please start the Liquesce server first then try to connect", ex);
+         }
+      }
+
+      public void Unsubscribe(Client id)
+      {
+         base.Channel.Unsubscribe(id);
+      }
+
+      #endregion
+   }
+}
diff --git "a/LiquesceFa\303\247ade/LiquesceFacade.csproj" "b/LiquesceFa\303\247ade/LiquesceFacade.csproj"
index 2dc5790..d718667 100644
--- "a/LiquesceFa\303\247ade/LiquesceFacade.csproj"
+++ "b/LiquesceFa\303\247ade/LiquesceFacade.csproj"
@@ -90,27 +90,23 @@
       <HintPath>..\ThirdParty\NLog.dll</HintPath>
     </Reference>
     <Reference Include="System" />
-    <Reference Include="System.ComponentModel.Composition" />
     <Reference Include="System.Core" />
     <Reference Include="System.Management" />
-    <Reference Include="System.Runtime.Remoting" />
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.ServiceModel" />
     <Reference Include="System.Windows.Forms" />
-    <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="ConfigDetails.cs" />
+    <Compile Include="DealWithTheCfgChanging.cs" />
     <Compile Include="ILiquesce.cs" />
     <Compile Include="ILiquesceCallBack.cs" />
     <Compile Include="LanManShareHandler.cs" />
+    <Compile Include="LiquesceCallBackProxy.cs" />
+    <Compile Include="LiquesceProxy.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="RWLSExtension.cs" />
-    <Compile Include="SafeDirectoryCatalog.cs" />
     <Compile Include="Utils.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -141,16 +137,10 @@
   <ItemGroup>
     <Content Include="Liquesce.ico" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\ThirdParty\DokanNet\DokanNet.csproj">
-      <Project>{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}</Project>
-      <Name>DokanNet</Name>
-    </ProjectReference>
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
     <VisualStudio>
-      <UserProperties BuildVersion_UseGlobalSettings="False" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" />
+      <UserProperties BuildVersion_UseGlobalSettings="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" />
     </VisualStudio>
   </ProjectExtensions>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
diff --git "a/LiquesceFa\303\247ade/LiquesceProxy.cs" "b/LiquesceFa\303\247ade/LiquesceProxy.cs"
new file mode 100644
index 0000000..7021602
--- /dev/null
+++ "b/LiquesceFa\303\247ade/LiquesceProxy.cs"
@@ -0,0 +1,81 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceProxy.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System.ServiceModel;
+
+namespace LiquesceFacade
+{
+   public class LiquesceProxy : ClientBase<ILiquesce>, ILiquesce
+    {
+        public LiquesceProxy()
+        {
+        }
+
+        public LiquesceProxy(string endpointConfigurationName)
+            : base(endpointConfigurationName)
+        {
+        }
+
+        public LiquesceProxy(string endpointConfigurationName, string remoteAddress)
+            : base(endpointConfigurationName, remoteAddress)
+        {
+        }
+
+        public LiquesceProxy(string endpointConfigurationName, EndpointAddress remoteAddress)
+            : base(endpointConfigurationName, remoteAddress)
+        {
+        }
+
+        public LiquesceProxy(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)
+            : base(binding, remoteAddress)
+        {
+        }
+
+      #region Implementation of ILiquesce
+
+      public void Stop()
+      {
+         base.Channel.Stop();
+      }
+
+      public void Start()
+      {
+         base.Channel.Start();
+      }
+
+      public LiquesceSvcState LiquesceState
+      {
+         get { return base.Channel.LiquesceState; }
+      }
+
+      public ConfigDetails ConfigDetails
+      {
+         get { return base.Channel.ConfigDetails; }
+      }
+
+      #endregion
+    }
+}
diff --git "a/LiquesceFa\303\247ade/Properties/AssemblyInfo.cs" "b/LiquesceFa\303\247ade/Properties/AssemblyInfo.cs"
index 80e3ef6..24875cf 100644
--- "a/LiquesceFa\303\247ade/Properties/AssemblyInfo.cs"
+++ "b/LiquesceFa\303\247ade/Properties/AssemblyInfo.cs"
@@ -1,4 +1,30 @@
-using System.Reflection;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="AssemblyInfo.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System.Reflection;
 using System.Runtime.InteropServices;
 
 // General Information about an assembly is controlled through the following 
@@ -9,7 +35,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("Smurf-IV")]
 [assembly: AssemblyProduct("LiquesceFacade")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 2010")]
+[assembly: AssemblyCopyright("Copyright © Simon Coghlan (Aka Smurf-IV) 2010 - 11")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -31,5 +57,5 @@
 // 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("2011.4.27.432")]
-[assembly: AssemblyFileVersion("2011.4.27.432")]
+[assembly: AssemblyVersion("14.8.856.18")]
+[assembly: AssemblyFileVersion("14.8.856.18")]
diff --git "a/LiquesceFa\303\247ade/RWLSExtension.cs" "b/LiquesceFa\303\247ade/RWLSExtension.cs"
index ae1f007..95366d7 100644
--- "a/LiquesceFa\303\247ade/RWLSExtension.cs"
+++ "b/LiquesceFa\303\247ade/RWLSExtension.cs"
@@ -1,4 +1,22 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="RWLSExtension.cs" company="Smurf-IV">
+//
+//  This program is free software: you can redistribute it and/or modify
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//  </copyright>
+//  <summary>
+//  Url: http://stackoverflow.com/questions/407238/readerwriterlockslim-vs-monitor
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
 using System.Threading;
 
 namespace LiquesceFacade
@@ -34,7 +52,7 @@ public ReadLockHelper(ReaderWriterLockSlim readerWriterLock)
 
          public void Dispose()
          {
-            this.readerWriterLock.ExitReadLock();
+            readerWriterLock.ExitReadLock();
          }
       }
 
@@ -50,7 +68,7 @@ public UpgradeableReadLockHelper(ReaderWriterLockSlim readerWriterLock)
 
          public void Dispose()
          {
-            this.readerWriterLock.ExitUpgradeableReadLock();
+            readerWriterLock.ExitUpgradeableReadLock();
          }
       }
 
@@ -66,7 +84,7 @@ public WriteLockHelper(ReaderWriterLockSlim readerWriterLock)
 
          public void Dispose()
          {
-            this.readerWriterLock.ExitWriteLock();
+            readerWriterLock.ExitWriteLock();
          }
       }
    }
@@ -75,7 +93,6 @@ public void Dispose()
 
    //class ReaderWriterLockedList<T> : SlowList<T>
    //{
-
    //   ReaderWriterLockSlim slimLock = new ReaderWriterLockSlim();
 
    //   public override T this[int index]
@@ -96,5 +113,4 @@ public void Dispose()
    //      }
    //   }
    //}
-
-}
+}
\ No newline at end of file
diff --git "a/LiquesceFa\303\247ade/SafeDirectoryCatalog.cs" "b/LiquesceFa\303\247ade/SafeDirectoryCatalog.cs"
deleted file mode 100644
index e8a4812..0000000
--- "a/LiquesceFa\303\247ade/SafeDirectoryCatalog.cs"
+++ /dev/null
@@ -1,47 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.Composition.Hosting;
-using System.ComponentModel.Composition.Primitives;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-
-namespace LiquesceFacade
-{
-   /// <summary>
-   /// Stolen from http://stackoverflow.com/questions/4144683/handle-reflectiontypeloadexception-during-mef-composition
-   /// </summary>
-   public class SafeDirectoryCatalog : ComposablePartCatalog
-   {
-      private readonly AggregateCatalog _catalog;
-
-      public SafeDirectoryCatalog(string directory)
-      {
-         var files = Directory.EnumerateFiles(directory, "*.dll", SearchOption.AllDirectories);
-
-         _catalog = new AggregateCatalog();
-
-         foreach (var file in files)
-         {
-            try
-            {
-               var asmCat = new AssemblyCatalog(file);
-
-               //Force MEF to load the plugin and figure out if there are any exports
-               // good assemblies will not throw the RTLE exception and can be added to the catalog
-               if (asmCat.Parts.ToList().Count > 0)
-                  _catalog.Catalogs.Add(asmCat);
-            }
-            catch (ReflectionTypeLoadException)
-            {
-            }
-         }
-      }
-      public override IQueryable<ComposablePartDefinition> Parts
-      {
-         get { return _catalog.Parts; }
-      }
-
-   }
-}
diff --git "a/LiquesceFa\303\247ade/Utils.cs" "b/LiquesceFa\303\247ade/Utils.cs"
index 88799d7..af1a405 100644
--- "a/LiquesceFa\303\247ade/Utils.cs"
+++ "b/LiquesceFa\303\247ade/Utils.cs"
@@ -1,74 +1,36 @@
-using System;
-using System.IO;
-using System.Net.Sockets;
-using System.Runtime.InteropServices;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Utils.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2013 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.Windows.Forms;
-using DokanNet;
 
 namespace LiquesceFacade
 {
    public static class Utils
    {
-      public static int HiWord(int number)
-      {
-         return ((number & 0x80000000) == 0x80000000) ? number >> 16 : (number >> 16) & 0xffff;
-      }
-
-      public static int LoWord(int number)
-      {
-         return number & 0xffff;
-      }
-
-      /// <summary>
-      /// #define ERROR_DISK_OPERATION_FAILED 1127L //  While accessing the hard disk, a disk operation failed even after retries.
-      /// The above might be a better error code ??
-      /// </summary>
-      /// <param name="ex">The list of exception types can grow in here</param>
-      /// <returns>!! Must be negative !!</returns>
-      public static int BestAttemptToWin32(Exception ex)
-      {
-/*
-System.ArgumentException: path is a zero-length string, contains only white space, or contains one or more invalid characters as defined by System.IO.Path.InvalidPathChars. 
-
-System.ArgumentNullException: path is null. 
-
-System.IO.PathTooLongException: The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters. 
-
-System.IO.DirectoryNotFoundException: The specified path is invalid (for example, it is on an unmapped drive). 
-
-System.IO.IOException: An I/O error occurred while opening the file. 
-
-System.UnauthorizedAccessException: This operation is not supported on the current platform.
-  -or- 
- path specified a directory.
-  -or- 
-  The caller does not have the required permission. 
-
-System.IO.FileNotFoundException: The file specified in path was not found. 
-
-System.NotSupportedException: path is in an invalid format. 
-
-System.Security.SecurityException: The caller does not have the required permission. 
-*/         
-         if ( ex.InnerException is SocketException)
-         {
-            return -((SocketException) ex.InnerException).ErrorCode;
-         }
-         else
-         {
-            int HrForException = Marshal.GetHRForException(ex);
-            if (ex is IOException)
-            {
-               switch (HrForException)
-               {
-                  case -2147024784:
-                     return Dokan.ERROR_DISK_FULL;
-               }
-            }
-            return (HiWord(HrForException) == 0x8007) ? -LoWord(HrForException) : Dokan.ERROR_EXCEPTION_IN_SERVICE;
-         }
-      }
-
       public static void ResizeDescriptionArea(ref PropertyGrid grid, int nNumLines)
       {
          try
diff --git a/LiquesceSvc/App.config b/LiquesceSvc/App.config
index bbf5dba..6e8fd8b 100644
--- a/LiquesceSvc/App.config
+++ b/LiquesceSvc/App.config
@@ -3,16 +3,20 @@
    <configSections>
       <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
       <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+         <section name="LiquesceSvc.Properties.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
          <section name="LiquesceSvc.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
       </sectionGroup>
    </configSections>
 
+   <connectionStrings>
+      <add name="LiquesceSvc.Properties.Settings.Salt" connectionString="+Od6c3mNYXx4Ix17s1b9iwV7zOHdmMLj7nx+38vjnE36r9YlxR0/cZ6ISo/rez7Czcc4kZw55r/wVYDjNE2vqrjr4/VzgvgW1AgXzvTpLHAfK80RY58QQta1qtXbGgqsTxYJmFHk5ikCd5QFBth1xcJlZ5w62yaScPmWc2ygm58vorqrrTcgq7DIBJpz+YRaQhSKBFdj4IW6ug0OoOyoRkZRaHVTK/BwY2VR4QKRc1eK786/05qM4ABiX3tRrCFb7Ag2G4KleZD0Z2tznzk3ux0gPmLiXU5Hc/T+MEkxiGeQyXnI3Oy40TBgRL6Lv9dJ/TRiYXc32SvrfMgLqcaX0Ks56SfHmBIFLLwwFHRMx2U0HZnESsz2Nid+gJ4ILZDaUatqwAdUaS78rk7eMI3ubXrvA+n5PP3Df1PMI2M0C1LVX/b+OXSdlaVqS9XmMWtBlIh6xJQwlxz8PeargFlltKLroGpVROZJK1z5V5nP48yaaV8rKSb6SPIaybpfPPBy+CEdl57EU5Eh0MGmoWgAtDUQ2ygmEswHR1CyNKT/P7gt9rZDfcjatucd6rpoeY73BphSUQDNZY6MUTYlikg37l5Ob8HTRpI/FYwzSMTzxri4EbYA3reY4p5qNE/GiCmXcsgDaKGhKvz1gYHIugek4dVAaTA0tSqxiuyQtbO6jEz+KpwerYVI+4ir+oay3L1as8n603jeRdXHho7Vq5DsjtsipCEM4f/iq9rKy9sXSUXkOyS66gFktsCYUGxOacfAOeCtXIuIMsjhM8QRZJc+3A==" />
+   </connectionStrings>
    <!-- Stick the namespaces in .. this is supposed to allow the intellisense to work ;-) -->
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <variable name="LogDir" value="${specialfolder:folder=CommonApplicationData}/LiquesceSvc/Logs"/>
       <targets>
          <target name="file" xsi:type="File"
-                 layout="${longdate}[${threadid}][${threadname}] ${level:uppercase=true} ${logger}: ${message} ${exception:format=ToString}"
+                 layout="${longdate}[${threadid}] ${level:uppercase=true} ${logger}: ${message} ${exception:Format=Message,shorttype,StackTrace:separator=&#xD;&#xA;}"
                  fileName="${LogDir}/LiquesceSvc.log"
                  archiveFileName="${LogDir}/LiquesceSvc.{#}.log"
                  archiveAboveSize="1048576"
@@ -30,6 +34,8 @@
    </startup>
 
    <!-- This section controls the remote interfaces exposed by this service. -->
+   <!-- ///// ///// ///// ///// ///// ///// ///// ///// 
+   Removed as this will be now be controlled progmatically !
    <system.serviceModel>
       <services>
          <service name="LiquesceSvc.LiquesceFacade">
@@ -53,13 +59,6 @@
                </baseAddresses>
             </host>
          </service>
-         <service name="LiquesceSvc.ShareEnabler">
-            <endpoint
-              address="net.tcp://localhost:41016/ShareEnabler"
-              binding="netTcpBinding"
-              bindingConfiguration="Mtom_Config"
-              contract="LiquesceFacade.IShareEnabler" />
-         </service>
       </services>
       <bindings>
          <netTcpBinding>
@@ -76,23 +75,35 @@
       <behaviors>
          <serviceBehaviors>
             <behavior name="LiquesceSvc.Service1Behavior">
-               <!-- To avoid disclosing metadata information, 
-          set the value below to false and remove the metadata endpoint above before deployment -->
+               --><!-- To avoid disclosing metadata information, 
+          set the value below to false and remove the metadata endpoint above before deployment --><!--
                <serviceMetadata httpGetEnabled="True"/>
-               <!-- To receive exception details in faults for debugging purposes, 
+               --><!-- To receive exception details in faults for debugging purposes, 
           set the value below to true.  Set to false before deployment 
           to avoid disclosing exception information -->
+   <!--
                <serviceDebug includeExceptionDetailInFaults="False" />
             </behavior>
          </serviceBehaviors>
       </behaviors>
    </system.serviceModel>
+   ///// ///// ///// ///// ///// ///// ///// ///// ///// 
+   End Progmatic removale
+   -->
 
    <applicationSettings>
+      <LiquesceSvc.Properties.Settings1>
+         <setting name="ConfigFileName" serializeAs="String">
+            <value>Properties.config.xml</value>
+         </setting>
+      </LiquesceSvc.Properties.Settings1>
       <LiquesceSvc.Settings1>
          <setting name="ConfigFileName" serializeAs="String">
             <value>Properties.config.xml</value>
          </setting>
       </LiquesceSvc.Settings1>
    </applicationSettings>
+   <runtime> <!-- http://stackoverflow.com/questions/7009759/c-sharp-windows-service-timeout-on-startup -->
+      <generatePublisherEvidence enabled="false" />
+   </runtime>
 </configuration>
diff --git a/LiquesceSvc/CBFS/CBFSWinUtil.cs b/LiquesceSvc/CBFS/CBFSWinUtil.cs
new file mode 100644
index 0000000..0b50b2c
--- /dev/null
+++ b/LiquesceSvc/CBFS/CBFSWinUtil.cs
@@ -0,0 +1,224 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="CBFSWinUtil.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Net.Sockets;
+using System.Runtime.InteropServices;
+
+using CallbackFS;
+using LiquesceSvc;
+using NLog;
+
+namespace CBFS
+{
+   internal static class CBFSWinUtil
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      public static uint HiWord(uint number)
+      {
+         return (((number & 0x80000000) == 0x80000000) ? number >> 16 : (number >> 16) & 0xffff);
+      }
+
+      public static uint LoWord(uint number)
+      {
+         return number & 0xffff;
+      }
+
+      /// <summary>
+      /// If your application needs to report some error when processing the callback, it should throw ECBFSError exception.
+      /// The application must pass the error code with the exception by passing the error code as a parameter to
+      /// ECBFSError constructor.
+      /// Callback File System API will catch ECBFSError exception and extract the error code.
+      /// The error code will be reported to the operating system.
+      /// </summary>
+      /// <param name="ex"></param>
+      [DebuggerHidden]
+      public static void BestAttemptToECBFSError(Exception ex)
+      {
+         Log.ErrorException("CBFSWinError", ex);
+         Win32Exception win32Exception = ex as Win32Exception;
+         if (win32Exception != null)
+         {
+            throw new ECBFSError(ex.Message, (uint)win32Exception.NativeErrorCode);
+         }
+         SocketException socketException = ex.InnerException as SocketException;
+         if (socketException != null)
+         {
+            throw new ECBFSError(socketException.Message, (uint)socketException.ErrorCode);
+         }
+         uint HrForException = (uint)Marshal.GetHRForException(ex);
+         throw new ECBFSError(ex.Message, (HiWord(HrForException) == 0x8007) ? LoWord(HrForException) : ERROR_EXCEPTION_IN_SERVICE);
+      }
+
+      /// <summary>
+      /// Could use reflection to find out the API call name
+      /// But then that would be used for every call so will probably be detremental to the string handling, and the .Net calls
+      /// </summary>
+      /// <param name="functionName">String to log out for this call</param>
+      /// <param name="act">What to call from the derived class</param>
+      [DebuggerHidden]
+      public static void Invoke(string functionName, Action act)
+      {
+         Log.Trace("{0} IN", functionName);
+         try
+         {
+            act();
+         }
+         catch (Exception ex)
+         {
+            BestAttemptToECBFSError(ex);
+         }
+         finally
+         {
+            Log.Trace("{0} OUT", functionName);
+         }
+      }
+
+      // ReSharper disable InconsistentNaming
+      // ReSharper disable MemberCanBePrivate.Global
+#pragma warning disable 169
+
+      #region File Operation Errors
+
+      // ReSharper disable UnusedMember.Global
+
+      // Check http://msdn.microsoft.com/en-us/library/ms819772.aspx (WinError.h) for error codes
+      // From WinError.h -> http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx
+      public const int ERROR_FILE_NOT_FOUND = 2; // MessageText: The system cannot find the file specified.
+
+      public const int ERROR_PATH_NOT_FOUND = 3; // MessageText: The system cannot find the path specified.
+      public const int ERROR_ACCESS_DENIED = 5; // MessageText: Access is denied.
+      public const int ERROR_SHARING_VIOLATION = 32;
+      public const int ERROR_FILE_EXISTS = 80;
+      public const int ERROR_CALL_NOT_IMPLEMENTED = 120;
+      public const int ERROR_DISK_FULL = 112; // There is not enough space on the disk.
+      public const int ERROR_INVALID_NAME = 123;
+      public const int ERROR_DIR_NOT_EMPTY = 145; // MessageText: The directory is not empty.
+      public const int ERROR_ALREADY_EXISTS = 183; // MessageText: Cannot create a file when that file already exists.
+
+      public const int ERROR_EXCEPTION_IN_SERVICE = 1064;
+      //  An exception occurred in the service when handling the control request.
+
+      public const int ERROR_FILE_READ_ONLY = 6009; // The specified file is read only.
+
+      public const int ERROR_SUCCESS = 0;
+      public const int ERROR_NOACCESS = 998; // Invalid access to memory location.
+      public const int ERROR_NOT_SUPPORTED = 50; // The request is not supported.
+
+      public const int ERROR_INVALID_PARAMETER = 87;  // The parameter is incorrect.
+      public const int ERROR_INVALID_HANDLE = 1609;   // Handle is in an invalid state.
+      public const int ERROR_NOT_LOCKED = 158;        // The segment is already unlocked.
+      public const int ERROR_NO_SYSTEM_RESOURCES = 1450;// Insufficient system resources exist to complete the requested service.
+      public const int ERROR_NOT_ENOUGH_MEMORY = 8;   // Not enough storage is available to process this command.
+      public const int ERROR_MORE_DATA = 234;         // More data is available.
+      public const int ERROR_INSUFFICIENT_BUFFER = 122;// The data area passed to a system call is too small.
+      public const int ERROR_NO_MORE_FILES = 18;      // There are no more files.
+      public const int ERROR_INVALID_FUNCTION = 1;    // Incorrect function.
+      public const int ERROR_HANDLE_EOF = 38;         // Reached the end of the file.
+      public const int ERROR_DISK_CORRUPT = 1393;     // The disk structure is corrupted and unreadable.
+      public const int ERROR_BAD_COMMAND = 22;        // The device does not recognize the command.
+      public const int ERROR_CANNOT_MAKE = 82;        // The directory or file cannot be created.
+      public const int ERROR_PROC_NOT_FOUND = 127;    // The specified procedure could not be found.
+      public const int ERROR_OPERATION_ABORTED = 995; // The I/O operation has been aborted because of either a thread exit or an application request.
+      public const int ERROR_IO_DEVICE = 1117;        // The request could not be performed because of an I/O device error.
+
+      // public const uint TYPE_E_IOERROR = 0;
+      public const int ERROR_BAD_UNIT = 20;           // The system cannot find the device specified.
+
+      public const int ERROR_BAD_ARGUMENTS = 160;     // One or more arguments are not correct.
+      public const int ERROR_BAD_EXE_FORMAT = 193;    // %1 is not a valid Win32 application.
+      public const int ERROR_WAIT_NO_CHILDREN = 128;  // There are no child processes to wait for.
+      public const int ERROR_RETRY = 1237;            // The operation could not be completed. A retry should be performed.
+      public const int ERROR_INVALID_ADDRESS = 487;   // Attempt to access invalid address.
+      public const int ERROR_BUSY = 170;              // The requested resource is in use.
+      public const int ERROR_DIRECTORY = 267;         // The directory name is invalid.
+      public const int ERROR_TOO_MANY_OPEN_FILES = 4; // The system cannot open the file.
+      public const int ERROR_EA_TABLE_FULL = 277;     // The extended attribute table file is full.
+      public const int ERROR_FILE_INVALID = 1006;     // The volume for a file has been externally altered so that the opened file is no longer valid.
+      public const int ERROR_CONNECTION_UNAVAIL = 1201;// The device is not currently connected but it is a remembered connection.
+      public const int ERROR_TOO_MANY_LINKS = 1142;   // An attempt was made to create more links on a file than the file system supports.
+      public const int ERROR_BROKEN_PIPE = 109;       // The pipe has been ended.
+      public const int ERROR_ARITHMETIC_OVERFLOW = 534;// Arithmetic result exceeded 32 bits.
+      public const int ERROR_POSSIBLE_DEADLOCK = 1131;// A potential deadlock condition has been detected.
+      public const int ERROR_BUFFER_OVERFLOW = 111;   // The file name is too long.
+      public const int ERROR_TOO_MANY_SEMAPHORES = 100;// Cannot create another system semaphore.
+      public const int ERROR_ARENA_TRASHED = 7;       // The storage control blocks were destroyed.
+      public const int ERROR_INVALID_BLOCK = 9;       // The storage control block address is invalid.
+      public const int ERROR_BAD_ENVIRONMENT = 10;    // The environment is incorrect.
+      public const int ERROR_FILENAME_EXCED_RANGE = 206;// The filename or extension is too long.
+      public const int ERROR_NOT_READY = 21;          // The device is not ready.
+      public const int ERROR_FILE_OFFLINE = 4350;     // This file is currently not available for use on this computer.
+      public const int ERROR_REMOTE_STORAGE_NOT_ACTIVE = 4351;// The remote storage service is not operational at this time.
+      public const int ERROR_NO_SUCH_PRIVILEGE = 1313;// A specified privilege does not exist.
+      public const int ERROR_PRIVILEGE_NOT_HELD = 1314;// A required privilege is not held by the client.
+      public const int ERROR_CANNOT_IMPERSONATE = 1368;// Unable to impersonate using a named pipe until data has been read from that pipe.
+      public const int ERROR_WRITE_PROTECT = 19;      // The media is write protected.
+      public const int ERROR_LOGON_FAILURE = 1326;    // Logon failure: unknown user name or bad password.
+      public const int ERROR_NO_SECURITY_ON_OBJECT = 1350; // Unable to perform a security operation on an object that has no associated security.
+
+      #endregion File Operation Errors
+
+      #region Win32 Constants for file controls
+
+      public const uint FILE_SHARE_READ = 0x00000001;
+      public const uint FILE_SHARE_WRITE = 0x00000002;
+      public const uint FILE_SHARE_DELETE = 0x00000004;
+
+      public const uint CREATE_NEW = 1;
+      public const uint CREATE_ALWAYS = 2;
+      public const uint OPEN_EXISTING = 3;
+      public const uint OPEN_ALWAYS = 4;
+      public const uint TRUNCATE_EXISTING = 5;
+
+      #endregion Win32 Constants for file controls
+
+      // ReSharper restore UnusedMember.Global
+#pragma warning restore 169
+      // ReSharper restore MemberCanBePrivate.Global
+      // ReSharper restore InconsistentNaming
+
+      [DebuggerHidden]
+      public static void ThrowNotFound(uint attributes)
+      {
+         bool isDirectoy = IsDirectory(attributes);
+         throw new ECBFSError((uint)(isDirectoy ? ERROR_PATH_NOT_FOUND : ERROR_FILE_NOT_FOUND));
+      }
+
+      public static bool IsDirectory(uint attributes)
+      {
+         return IsDirectory((NativeFileOps.EFileAttributes)attributes);
+      }
+
+      public static bool IsDirectory(NativeFileOps.EFileAttributes attributes)
+      {
+         return (attributes & NativeFileOps.EFileAttributes.Directory) == NativeFileOps.EFileAttributes.Directory;
+      }
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/CBFS/ICBFSFuncsAdvanced.cs b/LiquesceSvc/CBFS/ICBFSFuncsAdvanced.cs
new file mode 100644
index 0000000..fc635a5
--- /dev/null
+++ b/LiquesceSvc/CBFS/ICBFSFuncsAdvanced.cs
@@ -0,0 +1,294 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ICBFSFunc.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Diagnostics;
+using CallbackFS;
+using NLog;
+
+namespace CBFS
+{
+   /// <summary>
+   /// These events are optional, i.e. you should not attach an event handler if you don't plan to handle it.
+   /// </summary>
+   internal interface ICBFSFuncsAdvancedStreams
+   {
+      /// <summary>
+      /// The application must report information about the entry in the file specified by FileInfo.
+      /// If the entry is present, NamedStreamFound must be set to true and the information about the entry must be included.
+      /// If the entry is not present, NamedStreamFound must be set to false.
+      /// If this is the first call to enumerate the streams, Context in EnumerationInfo can be used to store information,
+      /// which speeds up subsequent enumeration calls. The application can use Context to store the reference to some
+      /// information, identifying the search (such as stream or file handle or database record ID etc).
+      /// The value, set in the event handler, is later passed to all operations, related to this enumeration,
+      /// i.e. subsequent calls to OnEnumerateNamedStreams event handler.
+      /// </summary>
+      /// <param name="fileInfo"></param>
+      /// <param name="userContextInfo"></param>
+      /// <param name="namedStreamsEnumerationInfo"></param>
+      /// <param name="streamName"></param>
+      /// <param name="streamSize"></param>
+      /// <param name="streamAllocationSize"></param>
+      /// <param name="aNamedStreamFound"></param>
+      void EnumerateNamedStreams(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo, ref string streamName, ref long streamSize, ref long streamAllocationSize, out bool aNamedStreamFound);
+
+      /// <summary>
+      /// This event is fired when the OS has finished enumerating named streams of the file and requests the resources, allocated for enumeration, to be released.
+      /// </summary>
+      /// <param name="fileInfo"></param>
+      /// <param name="namedStreamsEnumerationInfo"></param>
+      void CloseNamedStreamsEnumeration(CbFsFileInfo fileInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo);
+   }
+
+   internal interface ICBFSFuncsAdvancedSecurity
+   {
+      /// <summary>
+      /// This event is fired when the OS wants to change file security attributes. Use SecurityInformation parameter to
+      /// find out, what exactly security information must be set. Detailed information about SECURITY_INFORMATION and
+      /// SECURITY_DESCRIPTOR can be found in MSDN Library or Windows NT Platform SDK. The passed security descriptor
+      /// is in the self-relative format, where all security information is stored in a contiguous block of memory.
+      /// For details see MSDN for self-relative and absolute security descriptor formats.
+      /// </summary>
+      /// <param name="fileInfo"></param>
+      /// <param name="userContextInfo"></param>
+      /// <param name="securityInformation"></param>
+      /// <param name="SecurityDescriptor"></param>
+      /// <param name="length"></param>
+      void SetFileSecurity(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, uint securityInformation, IntPtr SecurityDescriptor, uint length);
+
+      /// <summary>
+      /// This event is fired when the OS wants to obtain file security attributes.
+      /// Use SecurityInformation parameter to find out, what exactly security information must be provided.
+      /// Detailed information about SECURITY_INFORMATION and SECURITY_DESCRIPTOR can be found in MSDN Library or
+      /// Windows NT Platform SDK. The returned security descriptor must be in the self-relative format, where all
+      /// security information is stored in a contiguous block of memory. For details see MSDN for self-relative and
+      /// absolute security descriptor formats.
+      /// </summary>
+      /// <remarks>
+      /// NOTE: the system calls the callback twice.
+      /// First it passes 0 in Length parameter and the application must provide the necessary length for the data
+      /// in LengthNeeded parameter. Then the OS will call the callback for the second time,
+      /// passing the actual buffer for the data.
+      /// </remarks>
+      /// <param name="fileInfo"></param>
+      /// <param name="userContextInfo"></param>
+      /// <param name="RequestedInformation"></param>
+      /// <param name="SecurityDescriptor"></param>
+      /// <param name="Length"></param>
+      /// <param name="lengthNeeded"></param>
+      void GetFileSecurity(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, uint RequestedInformation, IntPtr SecurityDescriptor, uint Length, out uint lengthNeeded);
+   }
+
+   internal interface ICBFSFuncsAdvancedFile
+   {
+      /// <summary>
+      /// Use this event to provide file path by it's unique ID.
+      /// </summary>
+      /// <param name="fileId"></param>
+      /// <returns>FilePath</returns>
+      string GetFileNameByFileId(long fileId);
+
+      /// <summary>
+      /// This event is fired when the OS tells the file system, that file buffers (incuding all possible metadata)
+      /// must be flushed and written to the backend storage. FileInfo contains information about the file to be flushed.
+      /// If FileInfo is empty, your code should attempt to flush everything, related to the disk.
+      /// </summary>
+      /// <param name="FileInfo"></param>
+      void FlushFile(CbFsFileInfo FileInfo);
+
+      /// <summary>
+      /// This event is fired when the storage is removed by the user using Eject command in Explorer.
+      /// When the event is fired, the storage has been completely destroyed.
+      /// You don't need to call UnmountMedia() or DeleteStorage() methods.
+      /// </summary>
+      void StorageEjected();
+   }
+
+   // ReSharper disable RedundantAssignment
+   /// <summary>
+   /// Class that forces the abstraction from the CBFS, and handles the error exception conversion.
+   /// </summary>
+   public abstract class CBFSHandlersAdvancedStreams : CBFSHandlers, ICBFSFuncsAdvancedStreams
+   {
+      private static readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      public CBFSHandlersAdvancedStreams()
+      {
+      }
+
+      private void EnumerateNamedStreams(CallbackFileSystem sender, CbFsFileInfo fileInfo, CbFsHandleInfo handleinfo,
+                                         CbFsNamedStreamsEnumerationInfo namedstreamsenumerationinfo,
+                                         ref string streamname, ref long streamsize, ref long streamallocationsize,
+                                         ref bool namedstreamfound)
+      {
+         Log.Trace("EnumerateNamedStreams IN");
+         try
+         {
+            EnumerateNamedStreams(fileInfo, handleinfo, namedstreamsenumerationinfo,
+               ref streamname, ref streamsize, ref streamallocationsize, out namedstreamfound);
+         }
+         catch (Exception ex)
+         {
+            CBFSWinUtil.BestAttemptToECBFSError(ex);
+         }
+         finally
+         {
+            Log.Trace("EnumerateNamedStreams OUT");
+         }
+      }
+
+      public abstract void EnumerateNamedStreams(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo, ref string streamName, ref long streamSize, ref long streamAllocationSize, out bool aNamedStreamFound);
+
+      private void CloseNamedStreamsEnumeration(CallbackFileSystem sender, CbFsFileInfo fileInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo)
+      {
+         CBFSWinUtil.Invoke("CloseNamedStreamsEnumeration", () => CloseNamedStreamsEnumeration(fileInfo, namedStreamsEnumerationInfo));
+      }
+
+      public abstract void CloseNamedStreamsEnumeration(CbFsFileInfo fileInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo);
+   }
+
+   public abstract class CBFSHandlersAdvancedFile : CBFSHandlers, ICBFSFuncsAdvancedFile
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      public CBFSHandlersAdvancedFile()
+      {
+         CbFs.OnGetFileNameByFileId = GetFileNameByFileId;
+         CbFs.OnStorageEjected = StorageEjected;
+      }
+
+      private void GetFileNameByFileId(CallbackFileSystem sender, long fileId, ref string FilePath, ref ushort filePathLength)
+      {
+         string filePath = string.Empty;
+         CBFSWinUtil.Invoke("GetFileNameByFileId", () => filePath = GetFileNameByFileId(fileId));
+         FilePath = filePath;
+         filePathLength = (ushort)FilePath.Length;
+      }
+
+      public abstract string GetFileNameByFileId(long fileId);
+
+      private void StorageEjected(CallbackFileSystem sender)
+      {
+         CBFSWinUtil.Invoke("StorageEjected", StorageEjected);
+      }
+
+      public abstract void StorageEjected();
+   }
+
+   public abstract class CBFSHandlersAdvanced : CBFSHandlers, ICBFSFuncsAdvancedSecurity, ICBFSFuncsAdvancedStreams, ICBFSFuncsAdvancedFile
+   {
+      private static readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      public CBFSHandlersAdvanced()
+      {
+         CbFs.OnSetFileSecurity = SetFileSecurity;
+         CbFs.OnGetFileSecurity = GetFileSecurity;
+         CbFs.OnEnumerateNamedStreams = EnumerateNamedStreams;
+         CbFs.OnCloseNamedStreamsEnumeration = CloseNamedStreamsEnumeration;
+         CbFs.OnGetFileNameByFileId = GetFileNameByFileId;
+         //CbFs.OnStorageEjected = StorageEjected;
+      }
+
+      private void SetFileSecurity(CallbackFileSystem sender, CbFsFileInfo fileInfo, CbFsHandleInfo handleinfo,
+                                   uint securityinformation, IntPtr securitydescriptor, uint length)
+      {
+         CBFSWinUtil.Invoke("SetFileSecurity", () =>
+                                          SetFileSecurity(fileInfo, handleinfo, securityinformation, securitydescriptor, length));
+      }
+
+      public abstract void SetFileSecurity(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, uint securityInformation, IntPtr SecurityDescriptor, uint length);
+
+      [DebuggerHidden] // Stop firing for the "Too small buffer" error
+      private void GetFileSecurity(CallbackFileSystem sender, CbFsFileInfo fileInfo, CbFsHandleInfo handleinfo,
+                                   uint securityinformation, IntPtr securitydescriptor, uint length,
+                                   ref uint lengthNeeded)
+      {
+         Log.Trace("GetFileSecurity IN");
+         try
+         {
+            GetFileSecurity(fileInfo, handleinfo, securityinformation, securitydescriptor, length, out lengthNeeded);
+         }
+         catch (Exception ex)
+         {
+            CBFSWinUtil.BestAttemptToECBFSError(ex);
+         }
+         finally
+         {
+            Log.Trace("GetFileSecurity OUT");
+         }
+      }
+
+      public abstract void GetFileSecurity(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, uint RequestedInformation, IntPtr SecurityDescriptor, uint Length, out uint lengthNeeded);
+
+      private void EnumerateNamedStreams(CallbackFileSystem sender, CbFsFileInfo fileInfo, CbFsHandleInfo handleinfo,
+                                   CbFsNamedStreamsEnumerationInfo namedstreamsenumerationinfo,
+                                   ref string streamname, ref long streamsize, ref long streamallocationsize,
+                                   ref bool namedstreamfound)
+      {
+         Log.Trace("EnumerateNamedStreams IN");
+         try
+         {
+            EnumerateNamedStreams(fileInfo, handleinfo, namedstreamsenumerationinfo,
+               ref streamname, ref streamsize, ref streamallocationsize, out namedstreamfound);
+         }
+         catch (Exception ex)
+         {
+            CBFSWinUtil.BestAttemptToECBFSError(ex);
+         }
+         finally
+         {
+            Log.Trace("EnumerateNamedStreams OUT");
+         }
+      }
+
+      public abstract void EnumerateNamedStreams(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo, ref string streamName, ref long streamSize, ref long streamAllocationSize, out bool aNamedStreamFound);
+
+      private void CloseNamedStreamsEnumeration(CallbackFileSystem sender, CbFsFileInfo fileInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo)
+      {
+         CBFSWinUtil.Invoke("CloseNamedStreamsEnumeration", () => CloseNamedStreamsEnumeration(fileInfo, namedStreamsEnumerationInfo));
+      }
+
+      public abstract void CloseNamedStreamsEnumeration(CbFsFileInfo fileInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo);
+
+      private void GetFileNameByFileId(CallbackFileSystem sender, long fileId, ref string FilePath, ref ushort filePathLength)
+      {
+         string filePath = string.Empty;
+         CBFSWinUtil.Invoke("GetFileNameByFileId", () => filePath = GetFileNameByFileId(fileId));
+         FilePath = filePath;
+         filePathLength = (ushort)FilePath.Length;
+      }
+
+      public abstract string GetFileNameByFileId(long fileId);
+
+      private void StorageEjected(CallbackFileSystem sender)
+      {
+         CBFSWinUtil.Invoke("StorageEjected", StorageEjected);
+      }
+
+      public abstract void StorageEjected();
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/CacheHelper.cs b/LiquesceSvc/CacheHelper.cs
new file mode 100644
index 0000000..11be6f8
--- /dev/null
+++ b/LiquesceSvc/CacheHelper.cs
@@ -0,0 +1,234 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="CacheHelper.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//
+//  </copyright>
+//  <summary>
+//  Url: http://liquesce.wordpress.com/2011/06/07/c-dictionary-cache-that-has-a-timeout-on-its-values/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+
+using LiquesceFacade;
+
+namespace LiquesceSvc
+{
+   /// <summary>
+   /// stolen from the discussions in http://blogs.infosupport.com/blogs/frankb/archive/2009/03/15/CacheDictionary-for-.Net-3.5_2C00_-using-ReaderWriterLockSlim-_3F00_.aspx
+   /// And then made it more useable for the cache timeout implementation.
+   /// I did play with the ConcurrentDictonary, but it became diffcult to follow and place in here.
+   /// Using a ReaderWriterLockSlim made the simplicity of using a lock and a normal dictionary very easy to read.
+   /// </summary>
+   /// <example>
+   /// Use it like a dictionary and then add the functions required
+   /// </example>
+   /// <remarks>
+   /// Does not implement all the interfaces of IDictionary.
+   /// All Thread access locking is performed within this object, so no need for access locking by the caller.
+   /// </remarks>
+   public class CacheHelper<TKey, TValue>
+   {
+      #region private fields
+
+      private readonly bool useAPICallToRelease;
+
+      // ReSharper disable StaticFieldInGenericType
+      // Yes I really do want a new static for each generic TKey combination
+      protected static readonly ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+      // ReSharper restore StaticFieldInGenericType
+
+      protected class ValueObject<TValueObj>
+      {
+         private DateTime TouchExpireTime;
+         public readonly TValueObj CacheValue;
+
+         public ValueObject(uint expireSeconds, TValueObj value)
+         {
+            TouchExpireTime = DateTime.Now.AddSeconds(expireSeconds);
+            CacheValue = value;
+         }
+
+         public bool IsValid
+         {
+            get
+            {
+               return (Lock
+                  || (TouchExpireTime > DateTime.Now)
+                  );
+            }
+         }
+
+         public void Touch(uint expireSeconds)
+         {
+            TouchExpireTime = DateTime.Now.AddSeconds(expireSeconds);
+         }
+
+         public bool Lock { private get; set; }
+      }
+
+      private readonly uint TouchExpireSeconds;
+      protected readonly Dictionary<TKey, ValueObject<TValue>> Cache;
+
+      #endregion private fields
+
+      /// <summary>
+      /// Constructor with the timout value
+      /// </summary>
+      /// <param name="touchExpireSeconds">timeout cannot be -ve</param>
+      /// <param name="useApiCallToRelease">When an function call is made then it will go check the staleness of the cache</param>
+      /// <param name="comparer">The System.Collections.Generic.IEqualityComparer/T/ implementation to use when comparing keys, or null to use the default System.Collections.Generic.EqualityComparer/T/ for the type of the key.</param>
+      public CacheHelper(uint touchExpireSeconds, bool useApiCallToRelease = true, IEqualityComparer<TKey> comparer = (IEqualityComparer<TKey>) null)
+      {
+         Cache = new Dictionary<TKey, ValueObject<TValue>>(comparer);
+         TouchExpireSeconds = touchExpireSeconds;
+         useAPICallToRelease = useApiCallToRelease;
+      }
+
+      /// <summary>
+      /// Value replacement and retrieval
+      /// Will not throw an exception if the object is NOT found
+      /// </summary>
+      /// <param name="key"></param>
+      /// <returns></returns>
+      public TValue this[TKey key]
+      {
+         get
+         {
+            TValue value;
+            TryGetValue(key, out value);
+            return value;
+         }
+         set
+         {
+            using (cacheLock.WriteLock())
+            {
+               Cache[key] = new ValueObject<TValue>(TouchExpireSeconds, value);
+            }
+         }
+      }
+
+      /// <summary>
+      /// Go through the cache and remove the stale items
+      /// </summary>
+      /// <remarks>
+      /// This can be called from a thread, and is used when the useAPICallToRelease is true in the constructor
+      /// </remarks>
+      /// <param name="state">set to null</param>
+      private void CheckStaleness(object state)
+      {
+         using (cacheLock.WriteLock())
+         {
+            try
+            {
+               foreach (KeyValuePair<TKey, ValueObject<TValue>> i in Cache.Where(kvp => ((kvp.Value == null) || !kvp.Value.IsValid)).ToList())
+               {
+                  Cache.Remove(i.Key);
+               }
+            }
+            catch { }
+         }
+      }
+
+      /// <summary>
+      /// Does the value exist at this key that has not timed out ?
+      /// Will not throw an exception if the object is NOT found
+      /// </summary>
+      /// <param name="key"></param>
+      /// <param name="value"></param>
+      /// <returns></returns>
+      public bool TryGetValue(TKey key, out TValue value)
+      {
+         using (cacheLock.UpgradableReadLock())
+         {
+            ValueObject<TValue> valueobj;
+            if (Cache.TryGetValue(key, out valueobj))
+            {
+               if (valueobj.IsValid)
+               {
+                  value = valueobj.CacheValue;
+                  return true;
+               }
+               using (cacheLock.WriteLock())
+               {
+                  Cache.Remove(key);
+               }
+               if (useAPICallToRelease)
+                  ThreadPool.QueueUserWorkItem(CheckStaleness);
+            }
+         }
+
+         value = default(TValue);
+         return false;
+      }
+
+      /// <summary>
+      /// Remove the value
+      /// </summary>
+      /// <param name="key"></param>
+      public void Remove(TKey key)
+      {
+         using (cacheLock.WriteLock())
+         {
+            Cache.Remove(key);
+         }
+      }
+
+      /// <summary>
+      /// Used to prevent an object from being removed from the cache;
+      /// e.g. when a file is open
+      /// Will not throw an exception if the object is NOT found
+      /// </summary>
+      /// <param name="key"></param>
+      /// <param name="state">true to lock</param>
+      public void Lock(TKey key, bool state)
+      {
+         using (cacheLock.ReadLock())
+         {
+            ValueObject<TValue> valueobj;
+            if (Cache.TryGetValue(key, out valueobj))
+            {
+               valueobj.Lock = state;
+               // If this is unlocking then assume that the target object will "be allowed" to be around for a while
+               if (!state)
+               {
+                  valueobj.Touch(TouchExpireSeconds);
+               }
+            }
+         }
+      }
+
+      /// <summary>
+      /// Used to prevent an object from being removed from the cache;
+      /// e.g. when a file is open
+      /// Will not throw an exception if the object is NOT found
+      /// </summary>
+      /// <param name="key"></param>
+      public void Touch(TKey key)
+      {
+         using (cacheLock.ReadLock())
+         {
+            ValueObject<TValue> valueobj;
+            if (Cache.TryGetValue(key, out valueobj))
+            {
+               valueobj.Touch(TouchExpireSeconds);
+            }
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/CachedRootPathsSystemInfo.cs b/LiquesceSvc/CachedRootPathsSystemInfo.cs
new file mode 100644
index 0000000..e79ea38
--- /dev/null
+++ b/LiquesceSvc/CachedRootPathsSystemInfo.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using LiquesceFacade;
+
+namespace LiquesceSvc
+{
+   internal class CachedRootPathsSystemInfo : CacheHelper<string, NativeFileOps> 
+   {
+      public CachedRootPathsSystemInfo(uint cacheLifetimeSeconds)
+         : base(cacheLifetimeSeconds, true, StringComparer.OrdinalIgnoreCase)
+      {
+         // StringComparer.OrdinalIgnoreCase because windows is WriteSensitive
+         // BUT search ignore
+      }
+
+      public void RemoveAllTargetDirsFromLookup(string removeDirSource)
+      {
+         using (cacheLock.WriteLock())
+         {
+            List<string> toBeRemoved = Cache.Keys.Where(key => key.StartsWith(removeDirSource)).ToList();
+            foreach (string s in toBeRemoved)
+            {
+               Cache.Remove(s);
+            }
+         }
+      }
+   }
+}
diff --git a/LiquesceSvc/LiquescOpsCBFSImp.cs b/LiquesceSvc/LiquescOpsCBFSImp.cs
new file mode 100644
index 0000000..76b0115
--- /dev/null
+++ b/LiquesceSvc/LiquescOpsCBFSImp.cs
@@ -0,0 +1,921 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceOps.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2013-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
+using CallbackFS;
+using CBFS;
+using LiquesceFacade;
+using PID = LiquesceSvc.ProcessIdentity;
+
+namespace LiquesceSvc
+{
+   internal partial class LiquesceOps : CBFSHandlersAdvanced
+   {
+      #region CBFS Implementation
+
+      public override void Mount()
+      {
+      }
+
+      public override void UnMount()
+      {
+         using (openFilesSync.WriteLock())
+         {
+            foreach (NativeFileOps obj2 in openFiles.Values)
+            {
+               try
+               {
+                  if (obj2 != null)
+                  {
+                     obj2.Close();
+                  }
+               }
+               catch (Exception ex)
+               {
+                  Log.InfoException("Unmount closing files threw: ", ex);
+               }
+            }
+            openFiles.Clear();
+         }
+      }
+
+      public override void GetVolumeSize(out long TotalNumberOfSectors, out long NumberOfFreeSectors)
+      {
+         ulong freeBytesAvailable;
+         ulong totalBytes;
+         ulong totalFreeBytes;
+         GetDiskFreeSpace(out freeBytesAvailable, out totalBytes, out totalFreeBytes);
+
+         TotalNumberOfSectors = (long)(totalBytes / CbFs.SectorSize);
+         NumberOfFreeSectors = (long)(freeBytesAvailable / CbFs.SectorSize);
+      }
+
+      public override string VolumeLabel
+      {
+         get { return mountDetail.VolumeLabel; }
+         set { mountDetail.VolumeLabel = value; }
+      }
+
+      private static uint volumeSerialNumber = 0x20101112;
+
+      public override uint VolumeId
+      {
+         get { return volumeSerialNumber; }
+         set { volumeSerialNumber = value; }
+      }
+
+      public override void CreateFile(string filename, uint DesiredAccess, uint fileAttributes, uint ShareMode,
+                                      CbFsFileInfo fileInfo,
+                                      CbFsHandleInfo userContextInfo)
+      {
+         int processId = GetProcessId();
+         long openFileKey = fileInfo.UserContext.ToInt64();
+         NativeFileOps foundFileInfo = roots.FindCreateNewAllocationRootPath(filename);
+
+         if (foundFileInfo.ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+
+         string fullName = foundFileInfo.FullName;
+
+         NativeFileOps.EFileAttributes attributes = (NativeFileOps.EFileAttributes)fileAttributes;
+         Log.Debug("CreateFile IN fullName [{0}], DesiredAccess[{1}], fileAttributes[{2}], ShareMode[{3}], ProcessId[{4}], openFileKey [{5}]",
+                  fullName, (NativeFileOps.EFileAccess)DesiredAccess, fileAttributes, (FileShare)ShareMode, processId, openFileKey);
+
+         if (CBFSWinUtil.IsDirectory(attributes))
+         {
+            PID.Invoke(processId, foundFileInfo.CreateDirectory);
+            CallOpenCreateFile(DesiredAccess, attributes, ShareMode, fileInfo, CBFSWinUtil.OPEN_EXISTING, processId, fullName, userContextInfo);
+            return;
+         }
+
+         if (!foundFileInfo.Exists)
+         {
+            Log.Trace("force it to be \"Looked up\" next time");
+            roots.RemoveFromLookup(filename);
+            PID.Invoke(processId, () => NativeFileOps.CreateDirectory(foundFileInfo.DirectoryPathOnly));
+         }
+         int lastError = 0;
+         if (CBFSWinUtil.IsDirectory(attributes))
+         {
+            attributes |= NativeFileOps.EFileAttributes.BackupSemantics;
+         }
+         // Turn off NoBuffering request because http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx
+         attributes &= ~NativeFileOps.EFileAttributes.NoBuffering;
+         // Turn of DeleteOnClose, as CBFS still calls delete
+         attributes &= ~NativeFileOps.EFileAttributes.DeleteOnClose;
+         using (openFilesSync.WriteLock())
+         {
+            NativeFileOps fileStream = null;
+            PID.Invoke(processId, () =>
+            {
+               fileStream = NativeFileOps.CreateFile(fullName, DesiredAccess, ShareMode, CBFSWinUtil.OPEN_ALWAYS, (uint)(attributes));
+               // If a specified file exists before the function call and dwCreationDisposition is CREATE_ALWAYS
+               // or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even when the function succeeds.
+               lastError = Marshal.GetLastWin32Error();
+            });
+            if ((lastError != 0)
+               && (lastError != CBFSWinUtil.ERROR_ALREADY_EXISTS)
+               )
+            {
+               throw new Win32Exception(lastError);
+            }
+            fileInfo.UserContext = new IntPtr(++openFilesLastKey);
+            openFiles.Add(openFilesLastKey, fileStream);
+            Log.Debug("CreateFile fileInfo openFilesLastKey[{0}]", openFilesLastKey);
+            //int currentOpenCount = fileStream.IncrementOpenCount();
+            //Log.Debug("CreateFile fileInfo IncrementOpenCount[{0}]", currentOpenCount);
+            NativeFileOps userFileStream = NativeFileOps.DuplicateHandle(fileStream);
+            userContextInfo.UserContext = new IntPtr(++openFilesLastKey);
+            openFiles.Add(openFilesLastKey, userFileStream);
+            Log.Debug("CallOpenCreateFile userContextInfo openFilesLastKey[{0}]", openFilesLastKey);
+            userFileStream.ProcessID = processId;
+
+            if (lastError != 0)
+            {
+               throw new Win32Exception(lastError);
+            }
+         }
+      }
+
+      private void CallOpenCreateFile(uint DesiredAccess, NativeFileOps.EFileAttributes fileAttributes, uint ShareMode, CbFsFileInfo fileInfo,
+                                           uint creation, int processId, string fullName, CbFsHandleInfo userContextInfo)
+      {
+         long openFileKey = fileInfo.UserContext.ToInt64();
+         Log.Debug(
+            "CallOpenCreateFile IN fullName [{0}], DesiredAccess[{1}], fileAttributes[{2}], ShareMode[{3}], creation [{4}], ProcessId[{5}], openFileKey [{6}]",
+            fullName, (NativeFileOps.EFileAccess)DesiredAccess, fileAttributes, (FileShare)ShareMode, creation, processId, openFileKey);
+         int lastError = 0;
+         if (CBFSWinUtil.IsDirectory(fileAttributes))
+         {
+            fileAttributes |= NativeFileOps.EFileAttributes.BackupSemantics;
+         }
+         NativeFileOps userFileStream = null;
+         //try
+         //{
+         //   PID.Invoke(processId, () =>
+         //   {
+         //      // Turn off NoBuffering request because http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx
+         //      userFileStream = NativeFileOps.CreateFile(fullName, DesiredAccess, ShareMode, creation, (uint)(fileAttributes & ~NativeFileOps.EFileAttributes.NoBuffering));
+         //      // If a specified file exists before the function call and dwCreationDisposition is CREATE_ALWAYS
+         //      // or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even when the function succeeds.
+         //      lastError = Marshal.GetLastWin32Error();
+         //   });
+         //   Log.Trace("It's not gone boom, so it must be okay..");
+         //   userFileStream.Close();
+         //}
+         //catch (Win32Exception w32e)
+         //{
+         //   if (w32e.NativeErrorCode == CBFSWinUtil.ERROR_SHARING_VIOLATION)
+         //   {
+         //      // For some reason when the dllhost (Photo viewer) attempts to open, it throws an "In-Use" error
+         //      // Probably caused by the explorer already opening when performing the double click launch
+         //      if (PID.GetProcessName(processId) != "dllhost")
+         //      {
+         //         throw;
+         //      }
+         //   }
+         //}
+         using (openFilesSync.UpgradableReadLock())
+         {
+            NativeFileOps fileStream;
+            if (!openFiles.TryGetValue(openFileKey, out fileStream))
+            {
+               fileStream = OpenUnderTheRadarFileStream(fullName, fileAttributes);
+               using (openFilesSync.WriteLock())
+               {
+                  fileInfo.UserContext = new IntPtr(++openFilesLastKey);
+                  openFiles.Add(openFilesLastKey, fileStream);
+                  Log.Debug("CallOpenCreateFile fileInfo openFilesLastKey[{0}]", openFilesLastKey);
+               }
+            }
+            else
+            {
+               int currentOpenCount = fileStream.IncrementOpenCount();
+               Log.Debug("CallOpenCreateFile fileInfo IncrementOpenCount[{0}]", currentOpenCount);
+            }
+            userFileStream = NativeFileOps.DuplicateHandle(fileStream);
+            using (openFilesSync.WriteLock())
+            {
+               userContextInfo.UserContext = new IntPtr(++openFilesLastKey);
+               openFiles.Add(openFilesLastKey, userFileStream);
+               Log.Debug("CallOpenCreateFile userContextInfo openFilesLastKey[{0}]", openFilesLastKey);
+               userFileStream.ProcessID = processId;
+            }
+
+
+            if ((lastError != 0)
+               //&& (lastError != CBFSWinUtil.ERROR_ALREADY_EXISTS)
+               )
+            {
+               throw new Win32Exception(lastError);
+            }
+         }
+      }
+
+      private NativeFileOps OpenUnderTheRadarFileStream(string fileName, NativeFileOps.EFileAttributes fileAttributes)
+      {
+         const NativeFileOps.EFileAccess accessMode = NativeFileOps.EFileAccess.FILE_GENERIC_READ | NativeFileOps.EFileAccess.FILE_GENERIC_WRITE;
+         NativeFileOps.EFileAttributes flagsAndAttributes;
+
+         Log.Info("OpenUnderTheRadarFileStream for [{0}]", fileName);
+         const uint share = CBFSWinUtil.FILE_SHARE_READ | CBFSWinUtil.FILE_SHARE_WRITE | CBFSWinUtil.FILE_SHARE_DELETE;
+
+         const uint creationDisposition = CBFSWinUtil.OPEN_EXISTING;
+         if (CBFSWinUtil.IsDirectory(fileAttributes))
+         {
+            Log.Trace("Detected as a Directory");
+            flagsAndAttributes = NativeFileOps.EFileAttributes.BackupSemantics;
+         }
+         else
+         {
+            Log.Trace("Detected as a File");
+            flagsAndAttributes = /*NativeFileOps.EFileAttributes.RandomAccess | NativeFileOps.EFileAttributes.Write_Through*/ NativeFileOps.EFileAttributes.Normal;
+         }
+
+         try
+         {
+            Log.Debug("Open with [{0}]", accessMode);
+            return NativeFileOps.CreateFile(fileName, (uint)accessMode, share, creationDisposition, (uint)flagsAndAttributes);
+         }
+         catch (Win32Exception w32e)
+         {
+            if ((w32e.NativeErrorCode == CBFSWinUtil.ERROR_SHARING_VIOLATION)
+               || (w32e.NativeErrorCode == CBFSWinUtil.ERROR_ACCESS_DENIED)
+               )
+            {
+               Log.Warn("ERROR_SHARING_VIOLATION: Open with [FILE_GENERIC_READ]");
+               return NativeFileOps.CreateFile(fileName, (uint)NativeFileOps.EFileAccess.FILE_GENERIC_READ, share,
+                  creationDisposition, (uint)flagsAndAttributes);
+            }
+            throw;
+         }
+      }
+
+      public override void OpenFile(string filename, uint DesiredAccess, uint fileAttributes, uint ShareMode, CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo)
+      {
+         NativeFileOps foundFileInfo = roots.GetFromPathFileName(filename);
+         string fullName = foundFileInfo.FullName;
+
+         if (!foundFileInfo.Exists)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_FILE_NOT_FOUND);
+         }
+         if (foundFileInfo.ForceUseAsReadOnly)
+         {
+            const NativeFileOps.EFileAccess writeOptions = NativeFileOps.EFileAccess.FILE_WRITE_DATA |
+                                             NativeFileOps.EFileAccess.FILE_APPEND_DATA |
+                                             NativeFileOps.EFileAccess.FILE_WRITE_ATTRIBUTES |
+                                             NativeFileOps.EFileAccess.FILE_WRITE_EA |
+                                             NativeFileOps.EFileAccess.FILE_DELETE_CHILD |
+                                             NativeFileOps.EFileAccess.WriteDAC |
+                                             NativeFileOps.EFileAccess.WriteOwner |
+                                             NativeFileOps.EFileAccess.GenericWrite |
+                                             NativeFileOps.EFileAccess.GenericAll;
+
+            if ((((NativeFileOps.EFileAccess)DesiredAccess) & writeOptions) != 0)
+            {
+               throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+            }
+         }
+
+         NativeFileOps.EFileAttributes attributes = (NativeFileOps.EFileAttributes)fileAttributes;
+         CallOpenCreateFile(DesiredAccess, attributes, ShareMode, fileInfo, CBFSWinUtil.OPEN_EXISTING, GetProcessId(), fullName, userContextInfo);
+      }
+
+      public override void CloseFile(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo)
+      {
+         long openFileKey = fileInfo.UserContext.ToInt64();
+         Log.Debug("CloseFile filename [{0}], fileInfo[{1}], userContextInfo [{2}]",
+            fileInfo.FileName, openFileKey, userContextInfo.UserContext.ToInt64());
+         //CloseFile(userContextInfo.UserContext);
+         if (CloseFile(fileInfo.UserContext))
+         {
+            fileInfo.UserContext = IntPtr.Zero;
+         }
+      }
+
+      private bool CloseFile(IntPtr context)
+      {
+         long openFileKey = context.ToInt64();
+         Log.Debug("CloseFile IN openFileKey [{0}]", openFileKey);
+
+         if (openFileKey != 0)
+         {
+            using (openFilesSync.UpgradableReadLock())
+            {
+               // Decrement the internal open handle
+               // https://www.eldos.com/documentation/cbfs/ref_gen_contexts.html
+               NativeFileOps fileStream;
+               if (openFiles.TryGetValue(openFileKey, out fileStream))
+               {
+                  int decrementOpenCount = fileStream.DecrementOpenCount();
+                  if (decrementOpenCount <= 0)
+                  {
+                     Log.Debug("Close stream [{0}]", fileStream.FullName);
+                     fileStream.Close();
+                     using (openFilesSync.WriteLock())
+                     {
+                        openFiles.Remove(openFileKey);
+                     }
+                  }
+                  else
+                  {
+                     Log.Debug("Remaining OpenCount [{0}]", decrementOpenCount);
+                     return false;
+                  }
+               }
+               else
+               {
+                  Log.Warn("Something has already removed openFileKey [{0}]", openFileKey);
+               }
+            }
+         }
+         else
+         {
+            Log.Warn("CloseFile with no openFileKey");
+         }
+         return true;
+      }
+
+      /// <summary>
+      /// This event is fired when the OS needs to close the previously created or opened handle to the file. 
+      /// This event is different from OnCloseFile in that OnCleanupFile happens immediately when the last handle
+      /// is closed by the application, while OnCloseFile can be called much later when the OS itself decides 
+      /// that the file can be closed. Use FileInfo and HandleInfo to identify the file that needs to be closed. 
+      /// </summary>
+      /// <param name="fileInfo"></param>
+      /// <param name="userContextInfo"></param>
+      public override void CleanupFile(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo)
+      {
+         long openFileKey = fileInfo.UserContext.ToInt64();
+         long userOpenKey = userContextInfo.UserContext.ToInt64();
+         Log.Debug("CleanupFile IN filename [{0}], fileInfo[{1}], userContextInfo [{2}]",
+            fileInfo.FileName, openFileKey, userOpenKey);
+         if (CloseFile(userContextInfo.UserContext))
+         {
+            userContextInfo.UserContext = IntPtr.Zero;
+         }
+         //if (CloseFile(fileInfo.UserContext))
+         //{
+         //   fileInfo.UserContext = IntPtr.Zero;
+         //}
+      }
+
+      public override void GetFileInfo(string FileName, ref bool FileExists, ref DateTime CreationTime,
+                                       ref DateTime LastAccessTime,
+                                       ref DateTime LastWriteTime, ref long lengthOfFile, ref long AllocationSize,
+                                       ref CBFS_LARGE_INTEGER FileId,
+                                       ref uint FileAttributes, ref string ShortFileName, ref string RealFileName)
+      {
+         FileExists = false;
+         NativeFileOps nfo = roots.GetFromPathFileName(FileName);
+         if (nfo.Exists)
+         {
+            WIN32_FIND_DATA fileData = new WIN32_FIND_DATA();
+            PID.Invoke(GetProcessId(), () => fileData = nfo.GetFindData());
+            if (!string.IsNullOrEmpty(fileData.cFileName))
+            {
+               ConvertFoundToReturnParams(out CreationTime, out LastAccessTime, out LastWriteTime, out lengthOfFile, out AllocationSize,
+                     out FileAttributes, out ShortFileName, out RealFileName, fileData);
+               FileId.QuadPart = nfo.IsInvalid ? 0 : nfo.FileId;
+               FileExists = true;
+            }
+         }
+      }
+
+      private void ConvertFoundToReturnParams(out DateTime CreationTime, out DateTime LastAccessTime, out DateTime LastWriteTime, out long lengthOfFile, out long allocationSize, out uint attributes, out string ShortFileName, out string RealFileName, WIN32_FIND_DATA file)
+      {
+         attributes = file.dwFileAttributes;
+         CreationTime = NativeFileOps.ConvertFileTimeToDateTime(file.ftCreationTime);
+         LastAccessTime = NativeFileOps.ConvertFileTimeToDateTime(file.ftLastAccessTime);
+         LastWriteTime = NativeFileOps.ConvertFileTimeToDateTime(file.ftLastWriteTime);
+         // public uint dwVolumeSerialNumber;
+         lengthOfFile = (long)((ulong)file.nFileSizeHigh << 32);
+         lengthOfFile += file.nFileSizeLow;
+         {
+            // The allocation size is in most cases a multiple of the allocation unit (cluster) size.
+            long remainder;
+            long div = Math.DivRem(lengthOfFile, CbFs.SectorSize, out remainder);
+            if (remainder > 0)
+            {
+               div++;
+            }
+            allocationSize = div * CbFs.SectorSize;
+         }
+         // public uint dwNumberOfLinks;
+         ShortFileName = string.IsNullOrWhiteSpace(file.cAlternateFileName) ? file.cFileName : file.cAlternateFileName;
+         RealFileName = file.cFileName;
+      }
+
+      private readonly Dictionary<long, WIN32_FIND_DATA[]> EnumeratedDirectories = new Dictionary<long, WIN32_FIND_DATA[]>();
+
+      public override void EnumerateDirectory(CbFsFileInfo directoryInfo, CbFsHandleInfo userContextInfo,
+                                              CbFsDirectoryEnumerationInfo DirectoryEnumerationInfo, string Mask, bool Restart,
+                                              ref bool FileFound, ref string FileName, ref string ShortFileName,
+                                              ref DateTime CreationTime, ref DateTime LastAccessTime, ref DateTime LastWriteTime,
+                                              ref long lengthOfFile, ref long AllocationSize, ref CBFS_LARGE_INTEGER FileId,
+                                              ref uint attributes)
+      {
+         int processId = GetProcessId();
+         Log.Debug("EnumerateDirectory [{0}] processId[{1}]", directoryInfo.FileName, processId);
+         long refFileHandleContext = directoryInfo.UserContext.ToInt64();
+         Log.Trace("refFileHandleContext [{0}]", refFileHandleContext);
+         int nextOffset = DirectoryEnumerationInfo.UserContext.ToInt32();
+         if (Restart)
+         {
+            CloseDirectoryEnumeration(directoryInfo, DirectoryEnumerationInfo);
+            nextOffset = 0;
+         }
+         WIN32_FIND_DATA[] files;
+         if (nextOffset > 0)
+         {
+            EnumeratedDirectories.TryGetValue(refFileHandleContext, out files);
+         }
+         else
+         {
+            // Nothing or restart = find
+            FindFiles(directoryInfo.FileName, processId, out files, Mask);
+            EnumeratedDirectories[refFileHandleContext] = files;
+         }
+         if ((files == null)
+             || !files.Any()
+             || (nextOffset >= files.Length)
+            )
+         {
+            FileFound = false;
+         }
+         else
+         {
+            ConvertFoundToReturnParams(out CreationTime, out LastAccessTime, out LastWriteTime, out lengthOfFile, out AllocationSize, out attributes, out ShortFileName, out FileName, files[nextOffset++]);
+            // If FileId is supported then set FileId for the file.
+            FileId.QuadPart = 0;
+            if (CbFs.OnGetFileNameByFileId != null)
+            {
+               NativeFileOps fileOps = roots.GetFromPathFileName(Path.Combine(directoryInfo.FileName, FileName));
+               FileId.QuadPart = fileOps.IsInvalid ? 0 : fileOps.FileId;
+            }
+            DirectoryEnumerationInfo.UserContext = new IntPtr(nextOffset);
+            FileFound = true;
+         }
+      }
+
+      public override void CloseDirectoryEnumeration(CbFsFileInfo directoryInfo,
+                                                     CbFsDirectoryEnumerationInfo directoryEnumerationInfo)
+      {
+         long refFileHandleContext = directoryInfo.UserContext.ToInt64();
+         EnumeratedDirectories.Remove(refFileHandleContext);
+      }
+
+      /*
+      This property specifies the number of bytes that the file consumes on disk. Its value may be less than the Size if the file is 'sparse'.
+       * The following paragraph is taken from SSH File Transfer Protocol draft-ietf-secsh-filexfer-10, part 7.4:
+
+       * When present during file creation, the file SHOULD be created and the specified number of bytes preallocated.
+       * If the preallocation fails, the file should be removed (if it was created) and an error returned.
+       * If this field is present during a setstat operation, the file SHOULD be extended or truncated to the specified size.
+       * The 'size' of the file may be affected by this operation. If the operation succeeds, the 'size' should be the minimum
+       * of the 'size' before the operation and the new 'allocation-size'.
+       * Querying the 'allocation-size' after setting it MUST return a value that is greater-than or equal to the value set,
+       * but it MAY not return the precise value set.
+       * If both 'size' and 'allocation-size' are set during a setstat operation, and 'allocation-size' is less than 'size',
+       * the server MUST return SSH_FX_INVALID_PARAMETER.
+      */
+
+      public override void SetAllocationSize(CbFsFileInfo fileInfo, long AllocationSize)
+      {
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Debug("SetAllocationSize [{0}] AllocationSize[{1}] refFileHandleContext[{2}]", fileInfo.FileName, AllocationSize, refFileHandleContext);
+
+         using (openFilesSync.ReadLock())
+         {
+            NativeFileOps stream;
+            if (openFiles.TryGetValue(refFileHandleContext, out stream))
+            {
+               BY_HANDLE_FILE_INFORMATION lpFileInformation = stream.GetFileInformationByHandle();
+               long thisFileSize = (lpFileInformation.nFileSizeHigh << 32) + lpFileInformation.nFileSizeLow;
+               if (thisFileSize < AllocationSize)
+               {
+                  // Need to check that the source FullName drive has enough free space for this "Potential" allocation
+                  ulong lpFreeBytesAvailable, num2, num3;
+                  // Regardless of the API owner Process ID, make sure "we" can get the answer
+                  new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
+                  if (GetDiskFreeSpaceExW(roots.GetRoot(stream.FullName), out lpFreeBytesAvailable, out num2, out num3))
+                  {
+                     if (lpFreeBytesAvailable - (decimal) AllocationSize + thisFileSize < 0)
+                     {
+                        //NativeFileOps confirmSpace = roots.FindCreateNewAllocationRootPath(fileInfo.FileName, (ulong)(AllocationSize));
+                        Log.Warn(
+                           "There is a problem, in the amount of space required to fullfill this request with respect to the amount of space originally allocated");
+                        // TODO: Move the file, or return not enough space ??
+                        throw new ECBFSError(CBFSWinUtil.ERROR_NO_SYSTEM_RESOURCES);
+                     }
+                  }
+               }
+               stream.SetLength(AllocationSize);
+            }
+            else
+            {
+               CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+            }
+         }
+      }
+
+      public override void SetEndOfFile(CbFsFileInfo fileInfo, long EndOfFile)
+      {
+         Log.Debug("SetEndOfFile [{0}] EndOfFile[{1}]", fileInfo.FileName, EndOfFile);
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Trace("refFileHandleContext [{0}]", refFileHandleContext);
+
+         using (openFilesSync.ReadLock())
+         {
+            NativeFileOps stream;
+            if (openFiles.TryGetValue(refFileHandleContext, out stream))
+            {
+               stream.SetLength(EndOfFile);
+            }
+            else
+            {
+               CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+            }
+         }
+      }
+
+      /// You should not delete file on DeleteFile or DeleteDirectory.
+      // When DeleteFile or DeleteDirectory, you must check whether
+      // you can delete or not, and return 0 (when you can delete it)
+      // or appropriate error codes such as -ERROR_DIR_NOT_EMPTY,
+      // -ERROR_SHARING_VIOLATION.
+      public override bool CanFileBeDeleted(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo)
+      {
+         long userOpenKey = userContextInfo.UserContext.ToInt64();
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Debug("CanFileBeDeleted [{0}] IN userOpenKey[{1}], refFileHandleContext[{2}]", fileInfo.FileName, userOpenKey, refFileHandleContext);
+         NativeFileOps stream;
+         using (openFilesSync.ReadLock())
+         {
+            openFiles.TryGetValue(refFileHandleContext, out stream);
+         }
+         // TODO: Need to find out if this ever get called before IsDirectoryEmtpy
+         // TODO: Need to check if any of the files are open within a directory.
+         return ((stream != null)
+            && !stream.ForceUseAsReadOnly
+            );
+      }
+
+      [DebuggerHidden] // Stop it firing when setting file times inside recycler bin's
+      public override void SetFileAttributes(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo,
+                                             DateTime creationTime,
+                                             DateTime lastAccessTime, DateTime lastWriteTime, uint fileAttributes)
+      {
+         long userFileKey = userContextInfo.UserContext.ToInt64();
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Debug("SetFileAttributes [{0}] IN userFileKey[{1}], refFileHandleContext[{2}], CreationTime [{3}] LastAccessTime[{4}], LastWriteTime[{5}], FileAttributes[{6}]",
+            fileInfo.FileName, userFileKey, refFileHandleContext, creationTime, lastAccessTime, lastWriteTime, (NativeFileOps.EFileAttributes)fileAttributes);
+         using (openFilesSync.ReadLock())
+         {
+            NativeFileOps stream;
+            openFiles.TryGetValue(refFileHandleContext, out stream);
+            if ((stream == null)
+                || stream.IsInvalid
+               )
+            {
+               CBFSWinUtil.ThrowNotFound(fileAttributes);
+            }
+            else
+            {
+               int processId = GetProcessId();
+               if ((fileAttributes != 0) // Requestor is stating no change
+                   && (stream.Attributes != fileAttributes)
+                  )
+               {
+                  Log.Trace("changing from old Attributes [{0}] to new Attributes [{1}]", (NativeFileOps.EFileAttributes)stream.Attributes, (NativeFileOps.EFileAttributes)fileAttributes);
+                  PID.Invoke(processId, () => stream.SetFileAttributes(fileAttributes));
+               }
+               if ((creationTime != DateTime.MinValue) // Requestor is stating no change
+                   || (lastAccessTime != DateTime.MinValue)
+                   || (lastWriteTime != DateTime.MinValue)
+                  )
+               {
+                  Log.Trace("changing Times");
+                  // if (Roots.RecyclerDirectoryNames.Any(stream.FullName.Contains))
+                  // is true then this will throw an exception
+                  // !! THAT IS IMPORTANT !!
+                  // AS it sets up Explorer to allow the movement to the Recycler bin, usinfg the Processes credentials.
+                  PID.Invoke(processId, () => stream.SetFileTime(creationTime, lastAccessTime, lastWriteTime));
+               }
+            }
+         }
+      }
+
+      public override void DeleteFile(CbFsFileInfo fileInfo)
+      {
+         NativeFileOps nfo = roots.GetFromPathFileName(fileInfo.FileName);
+         if (nfo.IsDirectory)
+         {
+            foreach (string fullPathsThatContainThis in roots.GetFullPathsThatContainThis(fileInfo.FileName))
+            {
+               nfo = new NativeFileOps(fullPathsThatContainThis, false);
+               PID.Invoke(GetProcessId(), nfo.DeleteDirectory);
+            }
+         }
+         else
+         {
+            PID.Invoke(GetProcessId(), nfo.DeleteFile);
+         }
+         roots.RemoveFromLookup(fileInfo.FileName);
+      }
+
+      public override void RenameOrMoveFile(CbFsFileInfo fileInfo, string NewFileName)
+      {
+         Log.Debug("RenameOrMoveFile [{0}] to [{1}]", fileInfo.FileName, NewFileName);
+         if (fileInfo.FileName == NewFileName) // This is some weirdness that SyncToy tries to pull !!
+         {
+            return;
+         }
+         // Cbfs has handled the closing and replaceIfExists checks, so it needs to be set always here.
+         // https://www.eldos.com/forum/read.php?FID=13&TID=2015
+
+         PID.Invoke(GetProcessId(), () => XMoveFile.Move(roots, fileInfo.FileName, NewFileName, true, mountDetail.UseInplaceRenaming));
+      }
+
+      public override void ReadFile(CbFsFileInfo fileInfo, long Position, byte[] Buffer, UInt32 BytesToRead, out UInt32 bytesRead)
+      {
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Debug("ReadFile [{0}] IN Position=[{1}] BytesToRead=[{2}] refFileHandleContext[{3}]", fileInfo.FileName, Position, BytesToRead, refFileHandleContext);
+
+         bytesRead = 0;
+         using (openFilesSync.ReadLock())
+         {
+            NativeFileOps fileStream;
+            openFiles.TryGetValue(refFileHandleContext, out fileStream);
+            if ((fileStream != null)
+               && !fileStream.IsInvalid)
+            {
+               // Use the current offset as a check first to speed up access in large sequential file reads
+
+               fileStream.SetFilePointer(Position, SeekOrigin.Begin);
+               if (!fileStream.ReadFile(Buffer, BytesToRead, out bytesRead))
+               {
+                  throw new Win32Exception();
+               }
+            }
+            else
+            {
+               CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+            }
+         }
+         Log.Debug("ReadFile bytesRead [{0}]", bytesRead);
+      }
+
+      public override void WriteFile(CbFsFileInfo fileInfo, long Position, byte[] Buffer, UInt32 BytesToWrite, out UInt32 bytesWritten)
+      {
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Debug("ReadFile [{0}] IN Position=[{1}] BytesToWrite=[{2}] refFileHandleContext [{3}]", fileInfo.FileName, Position, BytesToWrite, refFileHandleContext);
+
+         bytesWritten = 0;
+         using (openFilesSync.ReadLock())
+         {
+            NativeFileOps fileStream;
+            openFiles.TryGetValue(refFileHandleContext, out fileStream);
+            if ((fileStream != null)
+               && !fileStream.IsInvalid
+               )
+            {
+               // Use the current offset as a check first to speed up access in large sequential file reads
+               fileStream.SetFilePointer(Position, SeekOrigin.Begin);
+
+               if (!fileStream.WriteFile(Buffer, BytesToWrite, out bytesWritten))
+               {
+                  throw new Win32Exception();
+               }
+               //fileStream.FlushFileBuffers();
+            }
+            else
+            {
+               CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+            }
+         }
+         Log.Trace("WriteFile [{0}]", bytesWritten);
+      }
+
+      public override bool IsDirectoryEmpty(CbFsFileInfo directoryInfo, string DirectoryName)
+      {
+         NativeFileOps nfo = roots.GetFromPathFileName(DirectoryName);
+         if (!nfo.Exists)
+         {
+            CBFSWinUtil.ThrowNotFound((uint)NativeFileOps.EFileAttributes.Directory);
+         }
+         return roots.GetFullPathsThatContainThis(DirectoryName)
+            .Select(fullPathsThatContainThis => new NativeFileOps(fullPathsThatContainThis, false).IsEmptyDirectory)
+            .All(isEmptyDirectory => isEmptyDirectory);
+      }
+
+      #endregion CBFS Implementation
+
+      #region CBFSHandlersAdvanced
+
+      public override void SetFileSecurity(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, uint securityInformation, IntPtr SecurityDescriptor, uint length)
+      {
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         long userFileKey = userContextInfo.UserContext.ToInt64();
+         Log.Debug("SetFileSecurityNative[{0}][{1}] with Length[{2}], refFileHandleContext[{3}], userFileKey[{4}]",
+            fileInfo.FileName, (NativeFileOps.SECURITY_INFORMATION)securityInformation, length, refFileHandleContext, userFileKey);
+
+         NativeFileOps stream;
+         using (openFilesSync.ReadLock())
+         {
+            openFiles.TryGetValue(userFileKey, out stream);
+            if (stream != null)
+            {
+               // Assume that the Open has already been allowe therefore Write_DACL allowed !
+               stream.SetFileSecurity(securityInformation, SecurityDescriptor, length);
+            }
+         }
+         if (stream == null)
+         {
+            CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+         }
+      }
+
+      [DebuggerHidden] // Stop firing for the "Too small buffer" error
+      public override void GetFileSecurity(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo, uint RequestedInformation, IntPtr SecurityDescriptor, uint Length, out uint lengthNeeded)
+      {
+         long userFileKey = userContextInfo.UserContext.ToInt64();
+         long refFileHandleContext = fileInfo.UserContext.ToInt64();
+         Log.Debug("GetFileSecurity[{0}][{1}] with Length[{2}], refFileHandleContext[{3}], userFileKey[{4}]",
+            fileInfo.FileName, (NativeFileOps.SECURITY_INFORMATION)RequestedInformation, Length, refFileHandleContext, userFileKey);
+         lengthNeeded = 0;
+
+         NativeFileOps stream;
+         using (openFilesSync.ReadLock())
+         {
+            openFiles.TryGetValue(userFileKey, out stream);
+            if (stream != null)
+            {
+               // Assume that READ_DACL has already been allowed.
+               stream.GetFileSecurity(RequestedInformation, SecurityDescriptor, Length, ref lengthNeeded);
+            }
+         }
+         if (stream == null)
+         {
+            CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+         }
+      }
+
+      #region Stream Enumeration
+
+      private readonly Dictionary<long, ReadOnlyCollection<AlternateNativeInfo>> EnumeratedStream = new Dictionary<long, ReadOnlyCollection<AlternateNativeInfo>>();
+
+      public override void EnumerateNamedStreams(CbFsFileInfo fileInfo, CbFsHandleInfo userContextInfo,
+                                                 CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo,
+                                                 ref string streamName, ref long streamSize, ref long streamAllocationSize,
+                                                 out bool aNamedStreamFound)
+      {
+         long userOpenKey = userContextInfo.UserContext.ToInt64();
+         Log.Debug("EnumerateNamedStreams [{0}] userOpenKey[{1}]", fileInfo.FileName, userOpenKey);
+
+         ReadOnlyCollection<AlternateNativeInfo> alternates = null;
+         int nextOffset = namedStreamsEnumerationInfo.UserContext.ToInt32();
+         using (openFilesSync.ReadLock())
+         {
+            NativeFileOps fileStream;
+            openFiles.TryGetValue(userOpenKey, out fileStream);
+            if ((fileStream == null)
+                || fileStream.IsInvalid
+               )
+            {
+               CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+            }
+
+            if (nextOffset > 0)
+            {
+               EnumeratedStream.TryGetValue(userOpenKey, out alternates);
+            }
+            else
+            {
+               // Nothing = find
+               PID.Invoke(fileStream.ProcessID, () => alternates = fileStream.ListAlternateDataStreams());
+               EnumeratedStream[userOpenKey] = alternates;
+            }
+         }
+
+         if ((alternates == null)
+            || !alternates.Any()
+            || (nextOffset >= alternates.Count)
+            )
+         {
+            aNamedStreamFound = false;
+         }
+         else
+         {
+            AlternateNativeInfo info = alternates[nextOffset++];
+            streamName = info.StreamName;
+            streamSize = info.StreamSize;
+            {
+               // The allocation size is in most cases a multiple of the allocation unit (cluster) size.
+               long remainder;
+               long div = Math.DivRem(streamSize, CbFs.SectorSize, out remainder);
+               if (remainder > 0)
+                  div++;
+               streamAllocationSize = div * CbFs.SectorSize;
+            }
+            namedStreamsEnumerationInfo.UserContext = new IntPtr(nextOffset);
+            aNamedStreamFound = true;
+         }
+      }
+
+      public override void CloseNamedStreamsEnumeration(CbFsFileInfo fileInfo, CbFsNamedStreamsEnumerationInfo namedStreamsEnumerationInfo)
+      {
+         long refFileHandleContext = namedStreamsEnumerationInfo.UserContext.ToInt64();
+         EnumeratedStream.Remove(refFileHandleContext);
+      }
+
+      #endregion Stream Enumeration
+
+      public override string GetFileNameByFileId(long fileId)
+      {
+         return roots.FindByFileId(fileId);
+      }
+
+      /// <summary>
+      ///
+      /// </summary>
+      /// <param name="fileInfo">
+      /// Contains information about the file. Can be null.
+      /// If FileInfo is empty, your code should attempt to flush everything, related to the disk.
+      /// </param>
+      public override void FlushFile(CbFsFileInfo fileInfo)
+      {
+         if (fileInfo != null)
+         {
+            long refFileHandleContext = fileInfo.UserContext.ToInt64();
+            Log.Debug("FlushFileBuffers IN [{0}], refFileHandleContext[{1}]", fileInfo.FileName, refFileHandleContext);
+            using (openFilesSync.ReadLock())
+            {
+               NativeFileOps fileStream;
+               if (openFiles.TryGetValue(refFileHandleContext, out fileStream))
+               {
+                  if (!fileStream.IsDirectory)
+                  {
+                     fileStream.FlushFileBuffers();
+                  }
+               }
+               else
+               {
+                  CBFSWinUtil.ThrowNotFound(0 /*NativeFileOps.EFileAttributes.Normal*/);
+               }
+            }
+         }
+         else
+         {
+            Log.Debug("FlushFileBuffers IN with null");
+            foreach (NativeFileOps fileStream in openFiles.Values.Where(fileStream => !fileStream.IsDirectory))
+            {
+               fileStream.FlushFileBuffers();
+            }
+         }
+      }
+
+      public override void StorageEjected()
+      {
+         throw new NotImplementedException();
+      }
+
+      #endregion CBFSHandlersAdvanced
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LiquesceCallBackFacade.cs b/LiquesceSvc/LiquesceCallBackFacade.cs
index ed9fd18..7ba5924 100644
--- a/LiquesceSvc/LiquesceCallBackFacade.cs
+++ b/LiquesceSvc/LiquesceCallBackFacade.cs
@@ -1,4 +1,30 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceCallBackFacade.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+
 using System.ServiceModel;
 using LiquesceFacade;
 using NLog;
@@ -19,13 +45,13 @@ public LiquesceCallBackFacade()
       {
          Log.Debug("Object Created");
       }
-      public void Subscribe(Guid id)
+      public void Subscribe(Client id)
       {
          Log.Debug("Calling Subscribe");
          ManagementLayer.Instance.Subscribe(id);
       }
 
-      public void Unsubscribe(Guid id)
+      public void Unsubscribe(Client id)
       {
          Log.Debug("Calling Unsubscribe");
          ManagementLayer.Instance.Unsubscribe(id);
diff --git a/LiquesceSvc/LiquesceFacade.cs b/LiquesceSvc/LiquesceFacade.cs
index f9102eb..ec0cf2c 100644
--- a/LiquesceSvc/LiquesceFacade.cs
+++ b/LiquesceSvc/LiquesceFacade.cs
@@ -1,4 +1,30 @@
-using System.Collections.Generic;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceFacade.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+
 using System.ServiceModel;
 using System.Threading;
 using LiquesceFacade;
@@ -34,7 +60,7 @@ public void Start()
          ThreadPool.QueueUserWorkItem(ManagementLayer.Instance.Start);
       }
 
-      public LiquesceSvcState State
+      public LiquesceSvcState LiquesceState
       {
          get
          {
@@ -43,13 +69,6 @@ public LiquesceSvcState State
          }
       }
 
-      public List<LanManShareDetails> GetPossibleShares()
-      {
-          Log.Debug("Calling GetPossibleShares");
-          return ManagementLayer.Instance.GetPossibleShares();
-      }
-
-       
       public ConfigDetails ConfigDetails
       {
          get
@@ -64,10 +83,5 @@ public ConfigDetails ConfigDetails
          }
       }
 
-      public List<string> GetCurrentPluginModes()
-      {
-         Log.Debug("Calling GetPossibleShares");
-         return ManagementLayer.Instance.GetCurrentPluginModes();
-      }
    }
 }
diff --git a/LiquesceSvc/LiquesceOps.cs b/LiquesceSvc/LiquesceOps.cs
index d1118c6..c6ff805 100644
--- a/LiquesceSvc/LiquesceOps.cs
+++ b/LiquesceSvc/LiquesceOps.cs
@@ -1,497 +1,103 @@
-// Implement API's based on http://dokan-dev.net/en/docs/dokan-readme/
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceOps.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
 
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Runtime.InteropServices;
+using System.Security.Permissions;
 using System.Text;
 using System.Threading;
-using DokanNet;
 using LiquesceFacade;
-using LiquesceSvcMEF;
-using Microsoft.Win32.SafeHandles;
 using NLog;
-using ComTypes = System.Runtime.InteropServices.ComTypes;
+using PID = LiquesceSvc.ProcessIdentity;
 
 namespace LiquesceSvc
 {
-   internal class LiquesceOps : IDokanOperations
+   internal partial class LiquesceOps
    {
-      static private readonly string PathDirectorySeparatorChar = Path.DirectorySeparatorChar.ToString();
       static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-      private readonly ConfigDetails configDetails;
-      private readonly IServicePlugin plugin;
 
       // currently open files...
       // last key
-      static private UInt64 openFilesLastKey;
+      static private Int64 openFilesLastKey;
       // lock
-      static private readonly ReaderWriterLockSlim openFilesSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+      private readonly ReaderWriterLockSlim openFilesSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
       // dictionary of all open files
-      static private readonly Dictionary<UInt64, FileStreamName> openFiles = new Dictionary<UInt64, FileStreamName>();
+      private readonly Dictionary<Int64, NativeFileOps> openFiles = new Dictionary<Int64, NativeFileOps>();
 
-      /// <summary>
-      /// Constructor to manage this object
-      /// </summary>
-      /// <param name="configDetails"></param>
-      /// <param name="plugin"></param>
-      public LiquesceOps(ConfigDetails configDetails, IServicePlugin plugin)
+      private readonly Roots roots;
+      private readonly MountDetail mountDetail;
+
+      public LiquesceOps(MountDetail mountDetail, uint cacheLifetimeSeconds)
       {
-         this.configDetails = configDetails;
-         this.plugin = plugin;
-         plugin.KnownSharePaths = configDetails.KnownSharePaths;
-         plugin.SourceLocations = configDetails.SourceLocations;
+         this.mountDetail = mountDetail;
+         roots = new Roots(mountDetail, cacheLifetimeSeconds);
       }
 
-      #region IDokanOperations Implementation
+      #region FindFiles etc. Implementation
 
-      /// <summary>
-      /// The information given in the Dokan info is a bit misleading about the return codes
-      /// This is what the Win OS suystem is expecting http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx
-      /// So.. Everything succeeds but the Return code is ERROR_ALREADY_EXISTS
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="rawFlagsAndAttributes"></param>
-      /// <param name="info"></param>
-      /// <param name="rawAccessMode"></param>
-      /// <param name="rawShare"></param>
-      /// <param name="rawCreationDisposition"></param>
-      /// <returns></returns>
-      public int CreateFile(string dokanPath, uint rawAccessMode, uint rawShare, uint rawCreationDisposition, uint rawFlagsAndAttributes, DokanFileInfo info)
+      // TODO: Need a away to make the IEnumberable, so that large dir counts do not get bogged down.
+      // yield return WIN32_FIND_DATA
+      private void FindFiles(string startPath, int processId, out WIN32_FIND_DATA[] files, string pattern = "*")
       {
-         int actualErrorCode = Dokan.DOKAN_SUCCESS;
-         // Increment now in case there is an exception later, Used inthe finally operation to denote a CreateFile operation indexer
-         ++openFilesLastKey; // never be Zero !
+         files = null;
          try
          {
-            Log.Debug(
-               "CreateFile IN dokanPath [{0}], rawAccessMode[{1}], rawShare[{2}], rawCreationDisposition[{3}], rawFlagsAndAttributes[{4}], ProcessId[{5}]",
-               dokanPath, rawAccessMode, rawShare, rawCreationDisposition, rawFlagsAndAttributes, info.ProcessId);
-            bool isCreate = (rawCreationDisposition == Proxy.CREATE_NEW) || (rawCreationDisposition == Proxy.CREATE_ALWAYS);
-            string actualLocation = isCreate ? plugin.CreateLocation(dokanPath) : plugin.OpenLocation(dokanPath);
-            bool writeable = (((rawAccessMode & Proxy.FILE_WRITE_DATA) == Proxy.FILE_WRITE_DATA));
-
-            // Need to solve the issue with Synctoy performing moves into unknown / unused space
-            // MoveFile pathSource: [F:\_backup\Kylie Minogue\FSP01FA0CF932F74BF5AE5C217F4AE6626B.tmp] pathTarget: [G:\_backup\Kylie Minogue\(2010) Aphrodite\12 - Can't Beat The Feeling.mp3] 
-            // MoveFile threw:  System.IO.DirectoryNotFoundException: The system cannot find the path specified. (Exception from HRESULT: 0x80070003)
-            string newDir = Path.GetDirectoryName(actualLocation);
-            if (!String.IsNullOrEmpty(newDir)
-               && (isCreate || writeable)
-               )
+            Log.Debug("FindFiles IN startPath[{0}], pattern[{1}]", startPath, pattern);
+            // NTFS is case-preserving but case-insensitive in the Win32 namespace
+            Dictionary<string, WIN32_FIND_DATA> uniqueFiles =
+               new Dictionary<string, WIN32_FIND_DATA>(StringComparer.OrdinalIgnoreCase);
+            //uniqueFiles.Add(".",
+            // FindFiles should not return an empty array. It should return parent ("..") and self ("."). That wasn't obvious!
+            PID.Invoke(processId, delegate
             {
-               DirectoryInfo dirInfo = new DirectoryInfo(newDir);
-               if (!dirInfo.Exists)
+               // Do this in reverse, so that the preferred references overwrite the older files
+               for (int i = mountDetail.SourceLocations.Count - 1; i >= 0; i--)
                {
-                  Log.Trace("We want to create a new file in: [{0}]", newDir);
-                  dirInfo.Create();
-               }
-            }
+                  Dictionary<string, WIN32_FIND_DATA> localUniqueFiles = new Dictionary<string, WIN32_FIND_DATA>(StringComparer.OrdinalIgnoreCase);
 
-            if (Directory.Exists(actualLocation))
-            {
-               actualErrorCode = OpenDirectory(dokanPath, info);
-               // info.IsDirectory = true;
-               return actualErrorCode;
-            }
-            switch (rawCreationDisposition)
-            {
-               //case FileMode.Create:
-               //case FileMode.OpenOrCreate:
-               //   if (fileExists)
-               //      actualErrorCode = Dokan.ERROR_ALREADY_EXISTS;
-               //   break;
-               //case FileMode.CreateNew:
-               //   if (fileExists)
-               //      return Dokan.ERROR_FILE_EXISTS;
-               //   break;
-               case Proxy.OPEN_EXISTING:
-               //case FileMode.Append:
-               case Proxy.TRUNCATE_EXISTING:
+                  NativeFileFind.AddFiles(mountDetail.SourceLocations[i].SourcePath + startPath, localUniqueFiles, pattern);
+                  bool useIsReadOnly = mountDetail.SourceLocations[i].UseIsReadOnly;
+                  foreach (KeyValuePair<string, WIN32_FIND_DATA> uniqueFile in localUniqueFiles)
                   {
-                     // Stop using exceptions to throw ERROR_FILE_NOT_FOUND
-                     FileSystemInfo fileExits = plugin.GetInfo(dokanPath, false);
-                     if ((fileExits == null)
-                         || !fileExits.Exists
-                        )
+                     WIN32_FIND_DATA findData = uniqueFile.Value;
+                     if (useIsReadOnly)
                      {
-                        actualErrorCode = Dokan.ERROR_FILE_NOT_FOUND;
-                        return actualErrorCode;
+                        findData.dwFileAttributes |= (uint) NativeFileOps.EFileAttributes.Readonly;
                      }
+                     uniqueFiles[uniqueFile.Key] = findData;
                   }
-                  break;
-            }
-
-            // See http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx#caching_behavior
-            if (info.PagingIo)
-               rawFlagsAndAttributes |= Proxy.FILE_FLAG_RANDOM_ACCESS;
-
-            // FILE_FLAG_NO_BUFFERING flag requires that all I/O operations on the file handle be in multiples of the sector size, 
-            // AND that the I/O buffers also be aligned on addresses which are multiples of the sector size
-            if (info.Nocache)
-               rawFlagsAndAttributes |= Proxy.FILE_FLAG_WRITE_THROUGH; // | Proxy.FILE_FLAG_NO_BUFFERING;
-            if (info.SynchronousIo)
-               rawFlagsAndAttributes |= Proxy.FILE_FLAG_SEQUENTIAL_SCAN;
-
-            SafeFileHandle handle = CreateFile(actualLocation, rawAccessMode, rawShare, IntPtr.Zero, rawCreationDisposition, rawFlagsAndAttributes, IntPtr.Zero);
-
-            if (handle.IsInvalid)
-            {
-               Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-            }
-            FileStreamName fs = new FileStreamName(actualLocation, handle, writeable ? FileAccess.ReadWrite : FileAccess.Read, (int)configDetails.BufferReadSize);
-            using (openFilesSync.WriteLock())
-            {
-               info.refFileHandleContext = openFilesLastKey; // never be Zero !
-               openFiles.Add(openFilesLastKey, fs);
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CreateFile threw: ", ex);
-            actualErrorCode = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("CreateFile OUT actualErrorCode=[{0}] context[{1}]", actualErrorCode, openFilesLastKey);
-         }
-         return actualErrorCode;
-      }
-
-      public int OpenDirectory(string dokanPath, DokanFileInfo info)
-      {
-         int dokanError = Dokan.DOKAN_ERROR;
-         try
-         {
-            Log.Trace("OpenDirectory IN DokanProcessId[{0}]", info.ProcessId);
-            List<string> currentMatchingDirs = plugin.OpenDirectoryLocations(dokanPath);
-            if (currentMatchingDirs.Count > 0)
-            {
-               info.IsDirectory = true;
-               dokanError = Dokan.DOKAN_SUCCESS;
-            }
-            else
-            {
-               Log.Warn("Probably someone has removed this from the actual mounts.");
-               dokanError = Dokan.ERROR_PATH_NOT_FOUND;
-            }
-         }
-         finally
-         {
-            Log.Trace("OpenDirectory OUT. dokanError[{0}]", dokanError);
-         }
-         return dokanError;
-      }
-
-
-      public int CreateDirectory(string dokanPath, DokanFileInfo info)
-      {
-         int dokanError = Dokan.DOKAN_ERROR;
-
-         try
-         {
-            // NORMAL mode
-            Log.Trace("CreateDirectory IN DokanProcessId[{0}]", info.ProcessId);
-            string path = plugin.CreateLocation(dokanPath);
-            if (!Directory.Exists(path))
-            {
-               Directory.CreateDirectory(path);
-            }
-            Log.Debug("By the time it gets here the dir should exist, or have existed by another method / thread");
-            info.IsDirectory = true;
-            dokanError = Dokan.DOKAN_SUCCESS;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CreateDirectory threw: ", ex);
-            dokanError = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("CreateDirectory OUT dokanError[{0}]", dokanError);
-         }
-         return dokanError;
-      }
-
-      /*
-      Cleanup is invoked when the function CloseHandle in Windows API is executed. 
-      If the file system application stored file handle in the refFileHandleContext variable when the function CreateFile is invoked, 
-      this should be closed in the Cleanup function, not in CloseFile function. If the user application calls CloseHandle
-      and subsequently open the same file, the CloseFile function of the file system application may not be invoked 
-      before the CreateFile API is called. This may cause sharing violation error. 
-      Note: when user uses memory mapped file, WriteFile or ReadFile function may be invoked after Cleanup in order to 
-      complete the I/O operations. The file system application should also properly work in this case.
-      */
-      /// <summary>
-      /// When info->DeleteOnClose is true, you must delete the file in Cleanup.
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="info"></param>
-      /// <returns></returns>
-      public int Cleanup(string dokanPath, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("Cleanup IN DokanProcessId[{0}] with dokanPath [{1}]", info.ProcessId, dokanPath);
-            CloseAndRemove(info);
-            if (info.DeleteOnClose)
-            {
-               if (info.IsDirectory)
-               {
-                  Log.Trace("DeleteOnClose Directory");
-                  List<string> targetDeletes = plugin.OpenDirectoryLocations(dokanPath);
-                     // Only delete the directories that this knew about before the delete was called 
-                     // (As the user may be moving files into the sources from the mount !!)
-                  for (int index = 0; index < targetDeletes.Count; index++)
-                  {
-                     string fullPath = targetDeletes[index];
-                     Log.Trace("Deleting matched dir [{0}]", fullPath);
-                     Directory.Delete(fullPath, false);
-                  }
-                  plugin.DirectoryDeleted(targetDeletes);
-                  plugin.DeleteLocation(dokanPath, true);
-
-               }
-               else
-               {
-                  Log.Trace("DeleteOnClose File");
-                  File.Delete(plugin.OpenLocation(dokanPath));
-                  plugin.FileDeleted(new List<string>( new [] {dokanPath} ) );
-                  plugin.DeleteLocation(dokanPath, false);
-               }
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("Cleanup threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("Cleanup OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int CloseFile(string dokanPath, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("CloseFile IN DokanProcessId[{0}]", info.ProcessId);
-            CloseAndRemove(info);
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CloseFile threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("CloseFile OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-
-      public int ReadFileNative(string dokanPath, IntPtr rawBuffer, uint rawBufferLength, ref uint rawReadLength, long rawOffset, DokanFileInfo info)
-      {
-         int errorCode = Dokan.DOKAN_SUCCESS;
-         bool closeOnReturn = false;
-         FileStream fileStream = null;
-         try
-         {
-            Log.Debug("ReadFile IN offset=[{1}] DokanProcessId[{0}]", info.ProcessId, rawOffset);
-            rawReadLength = 0;
-            if (info.refFileHandleContext == 0)
-            {
-               string path = plugin.OpenLocation(dokanPath);
-               Log.Warn("No context handle for [" + path + "]");
-               fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, (int)configDetails.BufferReadSize);
-               closeOnReturn = true;
-            }
-            else
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  fileStream = openFiles[info.refFileHandleContext];
-            }
-            if (rawOffset > fileStream.Length)
-            {
-               errorCode = Dokan.DOKAN_ERROR;
-            }
-            else
-            {
-               fileStream.Seek(rawOffset, SeekOrigin.Begin);
-               // readBytes = (uint)fileStream.Read(buffer, 0, buffer.Length);
-               if (0 == ReadFile(fileStream.SafeFileHandle, rawBuffer, rawBufferLength, out rawReadLength, IntPtr.Zero))
-               {
-                  Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
                }
-               //else if ( rawReadLength == 0 )
-               //{
-               //   // ERROR_HANDLE_EOF 38 (0x26)
-               //   if (fileStream.Position == fileStream.Length)
-               //      errorCode = -38;
-               //}
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("ReadFile threw: ", ex);
-            errorCode = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            try
-            {
-               if (closeOnReturn
-                  && (fileStream != null)
-                  )
-                  fileStream.Close();
-            }
-            catch (Exception ex)
-            {
-               Log.ErrorException("closeOnReturn threw: ", ex);
-            }
-            Log.Debug("ReadFile OUT readBytes=[{0}], errorCode[{1}]", rawReadLength, errorCode);
-         }
-         return errorCode;
-      }
-
-      public int WriteFileNative(string dokanPath, IntPtr rawBuffer, uint rawNumberOfBytesToWrite, ref uint rawNumberOfBytesWritten, long rawOffset, DokanFileInfo info)
-      {
-         int errorCode = Dokan.DOKAN_SUCCESS;
-         rawNumberOfBytesWritten = 0;
-         try
-         {
-            Log.Trace("WriteFile IN DokanProcessId[{0}]", info.ProcessId);
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               FileStreamName fileStream;
-               using (openFilesSync.ReadLock())
-                  fileStream = openFiles[info.refFileHandleContext];
-               if (!info.WriteToEndOfFile)//  If true, write to the current end of file instead of Offset parameter.
-                  fileStream.Seek(rawOffset, SeekOrigin.Begin);
-               else
-                  fileStream.Seek(0, SeekOrigin.End);
-               if (0 == WriteFile(fileStream.SafeFileHandle, rawBuffer, rawNumberOfBytesToWrite, out rawNumberOfBytesWritten, IntPtr.Zero))
-               {
-                  Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-               }
-            }
-            else
-            {
-               errorCode = Dokan.ERROR_FILE_NOT_FOUND;
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("WriteFile threw: ", ex);
-            errorCode = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("WriteFile OUT Written[{0}] errorCode[{1}]", rawNumberOfBytesWritten, errorCode);
-         }
-         return errorCode;
-      }
-
-
-      public int FlushFileBuffers(string dokanPath, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("FlushFileBuffers IN DokanProcessId[{0}]", info.ProcessId);
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  openFiles[info.refFileHandleContext].Flush();
-            }
-            else
-            {
-               return Dokan.ERROR_FILE_NOT_FOUND;
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("FlushFileBuffers threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("FlushFileBuffers OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int GetFileInformation(string dokanPath, ref FileInformation fileinfo, DokanFileInfo info)
-      {
-         int dokanReturn = Dokan.ERROR_FILE_NOT_FOUND;
-         try
-         {
-            Log.Trace("GetFileInformation IN DokanProcessId[{0}]", info.ProcessId);
-            FileSystemInfo fsi = plugin.GetInfo(dokanPath, (info.refFileHandleContext != 0));
-            if (fsi != null)
-            {
-               // Prevent expensive time spent allowing indexing == FileAttributes.NotContentIndexed
-               // Prevent the system from timing out due to slow access through the driver == FileAttributes.Offline
-               fileinfo.Attributes = fsi.Attributes | FileAttributes.NotContentIndexed;
-               if (Log.IsTraceEnabled)
-                  fileinfo.Attributes |= FileAttributes.Offline;
-               fileinfo.CreationTime = fsi.CreationTime;
-               fileinfo.LastAccessTime = fsi.LastAccessTime;
-               fileinfo.LastWriteTime = fsi.LastWriteTime;
-               fileinfo.FileName = fsi.Name; // <- this is not used in the structure that is passed back to Dokan !
-               fileinfo.Length = info.IsDirectory ? 0L : ((FileInfo)fsi).Length;
-               dokanReturn = Dokan.DOKAN_SUCCESS;
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("FlushFileBuffers threw: ", ex);
-            dokanReturn = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("GetFileInformation OUT Attributes[{0}] Length[{1}] dokanReturn[{2}]", fileinfo.Attributes, fileinfo.Length, dokanReturn);
-         }
-         return dokanReturn;
-      }
-
-      public int FindFilesWithPattern(string dokanPath, string pattern, out FileInformation[] files, DokanFileInfo info)
-      {
-         return FindFiles(dokanPath, out files, pattern);
-      }
-
-      public int FindFiles(string dokanPath, out FileInformation[] files, DokanFileInfo info)
-      {
-         return FindFiles(dokanPath, out files);
-      }
-
-      private int FindFiles(string dokanPath, out FileInformation[] files, string pattern = "*")
-      {
-         files = null;
-         try
-         {
-            Log.Debug("FindFiles IN [{0}], pattern[{1}]", dokanPath, pattern);
-            files = plugin.FindFiles(dokanPath, pattern).Select(info => new FileInformation
-                                                                          {
-                                                                             // Prevent expensive time spent allowing indexing == FileAttributes.NotContentIndexed
-                                                                             Attributes = info.Attributes | FileAttributes.NotContentIndexed, 
-                                                                             CreationTime = info.CreationTime, 
-                                                                             LastAccessTime = info.LastAccessTime, 
-                                                                             LastWriteTime = info.LastWriteTime, 
-                                                                             Length = ((info.Attributes & FileAttributes.Directory) == FileAttributes.Directory) ? 0L : ((FileInfo) info).Length, 
-                                                                             FileName = info.Name
-                                                                          }).ToArray();
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("FindFiles threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
+            });
+            // If these are not found then the loop speed of a "failed remove" and "not finding" is the same !
+            uniqueFiles.Remove(@"System Volume Information"); // NTFS
+            files = new WIN32_FIND_DATA[uniqueFiles.Values.Count];
+            uniqueFiles.Values.CopyTo(files, 0);
          }
          finally
          {
@@ -502,591 +108,66 @@ private int FindFiles(string dokanPath, out FileInformation[] files, string patt
                {
                   StringBuilder sb = new StringBuilder();
                   sb.AppendLine();
-                  for (int index = 0; index < files.Length; index++)
+                  foreach (WIN32_FIND_DATA fileInformation in files)
                   {
-                     FileInformation fileInformation = files[index];
-                     sb.AppendLine(fileInformation.FileName);
+                     sb.AppendLine(fileInformation.cFileName);
                   }
                   Log.Trace(sb.ToString());
                }
             }
          }
-         return Dokan.DOKAN_SUCCESS;
       }
 
-      public int SetFileAttributes(string dokanPath, FileAttributes attr, DokanFileInfo info)
+      public void GetDiskFreeSpace(out ulong freeBytesAvailable, out ulong totalBytes, out ulong totalFreeBytes)
       {
-         try
-         {
-            Log.Trace("SetFileAttributes IN DokanProcessId[{0}]", info.ProcessId);
-            string path = plugin.OpenLocation(dokanPath);
-            // This uses  if (!Win32Native.SetFileAttributes(fullPathInternal, (int) fileAttributes))
-            // And can throw PathTOOLong
-            File.SetAttributes(path, attr);
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetFileAttributes threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("SetFileAttributes OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
+         Log.Trace("GetDiskFreeSpace IN ");
+         freeBytesAvailable = totalBytes = totalFreeBytes = 0;
 
-      public int SetFileTimeNative(string dokanPath, ref ComTypes.FILETIME rawCreationTime, ref ComTypes.FILETIME rawLastAccessTime,
-          ref ComTypes.FILETIME rawLastWriteTime, DokanFileInfo info)
-      {
-         List<SafeFileHandle> handles = new List<SafeFileHandle>();
-         bool needToClose = false;
-         try
+         HashSet<string> uniqueWriteableSources = new HashSet<string>();
+         foreach (SourceLocation location in mountDetail.SourceLocations.Where(location => !location.UseIsReadOnly))
          {
-            Log.Trace("SetFileTime IN DokanProcessId[{0}]", info.ProcessId);
-            using (openFilesSync.ReadLock())
-            {
-               if (info.refFileHandleContext != 0)
-               {
-                  Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-                  handles.Add( openFiles[info.refFileHandleContext].SafeFileHandle );
-               }
-               else
-               {
-                  // Workaround the dir set
-                  // ERROR LiquesceSvc.LiquesceOps: SetFileTime threw:  System.UnauthorizedAccessException: Access to the path 'G:\_backup\Kylie Minogue\Dir1' is denied.
-                  // To create a handle to a directory, you have to use FILE_FLAG_BACK_SEMANTICS.
-                  string path = plugin.OpenLocation(dokanPath);
-                  const uint rawAccessMode = Proxy.GENERIC_READ | Proxy.GENERIC_WRITE;
-                  const uint rawShare = Proxy.FILE_SHARE_READ | Proxy.FILE_SHARE_WRITE;
-                  const uint rawCreationDisposition = Proxy.OPEN_EXISTING;
-                  uint rawFlagsAndAttributes = 0;
-                  if (Directory.Exists(path))
-                  {
-                     rawFlagsAndAttributes = Proxy.FILE_FLAG_BACKUP_SEMANTICS;
-                     handles.AddRange(plugin.OpenDirectoryLocations(dokanPath).Select(
-                        location => CreateFile(location, rawAccessMode, rawShare, IntPtr.Zero, rawCreationDisposition, rawFlagsAndAttributes, IntPtr.Zero)
-                        ));
-                  }
-                  else
-                  {
-                     handles.Add( CreateFile(path, rawAccessMode, rawShare, IntPtr.Zero, rawCreationDisposition,
-                                                 rawFlagsAndAttributes, IntPtr.Zero) );
-                  }
-                  needToClose = true;
-               }
-               ComTypes.FILETIME lpCreationTime = rawCreationTime;
-               ComTypes.FILETIME lpAccessTime = rawLastAccessTime;
-               ComTypes.FILETIME lpWriteTime = rawLastWriteTime;
-               for (int index = 0; index < handles.Count; index++)
-               {
-                  SafeFileHandle fileHandle = handles[index];
-                  lpCreationTime = rawCreationTime;
-                  lpAccessTime = rawLastAccessTime;
-                  lpWriteTime = rawLastWriteTime;
-                  if ((fileHandle != null)
-                      && !fileHandle.IsInvalid
-                     )
-                  {
-                     if (!SetFileTime(fileHandle, ref lpCreationTime, ref lpAccessTime, ref lpWriteTime))
-                     {
-                        Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-                     }
-                  }
-               }
-               // They are passed as ref, so they might have been updated ?
-               rawCreationTime = lpCreationTime;
-               rawLastAccessTime = lpAccessTime;
-               rawLastWriteTime = lpWriteTime;
-
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetFileTime threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
+            uniqueWriteableSources.Add(NativeFileOps.GetRootOrMountFor(location.SourcePath));
          }
-         finally
-         {
-            try
-            {
-               if (needToClose)
-               {
-                  foreach (SafeFileHandle fileHandle in
-                     handles.Where(fileHandle => (fileHandle != null) && !fileHandle.IsInvalid))
-                  {
-                     fileHandle.Close();
-                  }
-               }
-            }
-            catch
-            {
-            }
-            Log.Trace("SetFileTime OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      /// <summary>
-      /// You should not delete file on DeleteFile or DeleteDirectory.
-      // When DeleteFile or DeleteDirectory, you must check whether
-      // you can delete or not, and return 0 (when you can delete it)
-      // or appropriate error codes such as -ERROR_DIR_NOT_EMPTY,
-      // -ERROR_SHARING_VIOLATION.
-      // When you return 0 (ERROR_SUCCESS), you get Cleanup with
-      // FileInfo->DeleteOnClose set TRUE, you delete the file.
-      //
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="info"></param>
-      /// <returns></returns>
-      public int DeleteFile(string dokanPath, DokanFileInfo info)
-      {
-         int dokanReturn = Dokan.DOKAN_ERROR;
-         try
-         {
-            Log.Trace("DeleteFile IN DokanProcessId[{0}]", info.ProcessId);
-            dokanReturn = (File.Exists(plugin.OpenLocation(dokanPath)) ? Dokan.DOKAN_SUCCESS : Dokan.ERROR_FILE_NOT_FOUND);
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("DeleteFile threw: ", ex);
-            dokanReturn = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("DeleteFile OUT dokanReturn[(0}]", dokanReturn);
-         }
-         return dokanReturn;
-      }
 
-      public int DeleteDirectory(string dokanPath, DokanFileInfo info)
-      {
-         int dokanReturn = Dokan.DOKAN_ERROR;
-         string path = plugin.OpenLocation(dokanPath);
-         try
+         // Regardless of the API owner Process ID, make sure "we" can get the answer
+         new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
+         foreach (string source in uniqueWriteableSources)
          {
-            Log.Trace("DeleteDirectory IN DokanProcessId[{0}]", info.ProcessId);
-            DirectoryInfo dirInfo = new DirectoryInfo(path);
-            if (dirInfo.Exists)
+            ulong num;
+            ulong num2;
+            ulong num3;
+            if (GetDiskFreeSpaceExW(source, out num, out num2, out num3))
             {
-               FileSystemInfo[] fileInfos = dirInfo.GetFileSystemInfos();
-               dokanReturn = (fileInfos.Length > 0) ? Dokan.ERROR_DIR_NOT_EMPTY : Dokan.DOKAN_SUCCESS;
+               freeBytesAvailable += num;
+               totalBytes += num2;
+               totalFreeBytes += num3;
             }
-            else
-               dokanReturn = Dokan.ERROR_FILE_NOT_FOUND;
+            Log.Debug("DirectoryName=[{0}], FreeBytesAvailable=[{1}], TotalNumberOfBytes=[{2}], TotalNumberOfFreeBytes=[{3}]",
+                  source, num, num2, num3);
          }
-         catch (Exception ex)
-         {
-            Log.ErrorException("DeleteDirectory threw: ", ex);
-            dokanReturn = Utils.BestAttemptToWin32(ex);
-         }
-         finally
+         HashSet<string> uniqueReadonlySources = new HashSet<string>();
+         foreach (SourceLocation location in mountDetail.SourceLocations.Where(location => location.UseIsReadOnly))
          {
-            Log.Trace("DeleteDirectory OUT dokanReturn[(0}]", dokanReturn);
+            uniqueReadonlySources.Add(NativeFileOps.GetRootOrMountFor(location.SourcePath));
          }
 
-         return dokanReturn;
-      }
-
-
-      private void XMoveDirContents(string pathSource, string pathTarget, Dictionary<string, int> hasPathBeenUsed, bool replaceIfExisting)
-      {
-         Log.Info("XMoveDirContents pathSource: [{0}] pathTarget: [{1}]", pathSource, pathTarget);
-         DirectoryInfo currentDirectory = new DirectoryInfo(pathSource);
-         if (!Directory.Exists(pathTarget))
-            Directory.CreateDirectory(pathTarget);
-         foreach (FileInfo filein in currentDirectory.GetFiles())
+         foreach (string source in uniqueReadonlySources)
          {
-            string fileTarget = pathTarget + Path.DirectorySeparatorChar + filein.Name;
-            if (!hasPathBeenUsed.ContainsKey(fileTarget))
+            ulong num;
+            ulong num2;
+            ulong num3;
+            if (GetDiskFreeSpaceExW(source, out num, out num2, out num3))
             {
-               XMoveFile(filein.FullName, fileTarget, replaceIfExisting);
-               hasPathBeenUsed[fileTarget] = 1;
-            }
-            else
-            {
-               filein.Delete();
+               totalBytes += num2;
             }
+            Log.Debug("DirectoryName=[{0}], FreeBytesAvailable=[{1}], TotalNumberOfBytes=[{2}], TotalNumberOfFreeBytes=[{3}]",
+                  source, num, num2, num3);
          }
-         foreach (DirectoryInfo dr in currentDirectory.GetDirectories())
-         {
-            XMoveDirContents(dr.FullName, pathTarget + Path.DirectorySeparatorChar + dr.Name, hasPathBeenUsed, replaceIfExisting);
-         }
-         Directory.Delete(pathSource);
-      }
-      private void XMoveFile(string pathSource, string pathTarget, bool replaceIfExisting)
-      {
-         // http://msdn.microsoft.com/en-us/library/aa365240%28VS.85%29.aspx
-         UInt32 dwFlags = (uint)(replaceIfExisting ? 1 : 0);
-         // If the file is to be moved to a different volume, the function simulates the move by using the 
-         // CopyFile and DeleteFile functions.
-         dwFlags += 2; // MOVEFILE_COPY_ALLOWED 
-
-         // The function does not return until the file is actually moved on the disk.
-         // Setting this value guarantees that a move performed as a copy and delete operation 
-         // is flushed to disk before the function returns. The flush occurs at the end of the copy operation.
-         dwFlags += 8; // MOVEFILE_WRITE_THROUGH
-
-         if (!MoveFileEx(pathSource, pathTarget, dwFlags))
-            Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-      }
-
-
-      public int MoveFile(string dokanPath, string newname, bool replaceIfExisting, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("MoveFile IN DokanProcessId[{0}]", info.ProcessId);
-            Log.Info("MoveFile replaceIfExisting [{0}] dokanPath: [{1}] newname: [{2}]", replaceIfExisting, dokanPath, newname);
-            if (dokanPath == newname)   // This is some weirdness that SyncToy tries to pull !!
-               return Dokan.DOKAN_SUCCESS;
-            // Work out that if a location already exists then that is the new target and not to scatter it across the other drives !
-            string pathTarget = plugin.OpenLocation(newname);
-            if (!String.IsNullOrEmpty(pathTarget))
-            {
-               if (!replaceIfExisting )
-                  return Dokan.ERROR_FILE_EXISTS;
-            }
-            else
-               pathTarget = plugin.CreateLocation(newname);
-
-            if (!info.IsDirectory)
-            {
-               if (info.refFileHandleContext != 0)
-               {
-                  Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-                  FileStreamName fileHandle = openFiles[info.refFileHandleContext];
-                  if (fileHandle != null)
-                     fileHandle.Close();
-               }
-               string pathSource = plugin.OpenLocation(dokanPath);
-               if (String.IsNullOrEmpty(pathSource))
-                  return Dokan.ERROR_FILE_NOT_FOUND;
-               Log.Info("MoveFile pathSource: [{0}] pathTarget: [{1}]", pathSource, pathTarget);
-               XMoveFile(pathSource, pathTarget, replaceIfExisting);
-            }
-            else
-            {
-               // getting all paths of the source location
-               List<string> targetMoves = plugin.OpenDirectoryLocations(dokanPath);
-               int count = targetMoves.Count;
-               if (count <= 0)
-               {
-                  Log.Error("MoveFile: Could not find directory [{0}]", dokanPath);
-                  return Dokan.ERROR_PATH_NOT_FOUND;
-               }
-               Dictionary<string, int> hasPathBeenUsed = new Dictionary<string, int>();
-               for (int i = count - 1; i >= 0; i--)
-               {
-                  XMoveDirContents(targetMoves[i], pathTarget, hasPathBeenUsed, replaceIfExisting);
-               }
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("MoveFile threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("MoveFile OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int SetEndOfFile(string dokanPath, long length, DokanFileInfo info)
-      {
-         int dokanReturn = Dokan.DOKAN_ERROR;
-         try
-         {
-            Log.Trace("SetEndOfFile IN DokanProcessId[{0}]", info.ProcessId);
-            dokanReturn = SetAllocationSize(dokanPath, length, info);
-            if (dokanReturn == Dokan.ERROR_FILE_NOT_FOUND)
-            {
-               string path = plugin.OpenLocation(dokanPath);
-               using (Stream stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
-               {
-                  stream.SetLength(length);
-               }
-               dokanReturn = Dokan.DOKAN_SUCCESS;
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetEndOfFile threw: ", ex);
-            dokanReturn = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("SetEndOfFile OUT", dokanReturn);
-         }
-         return dokanReturn;
-      }
-
-      public int SetAllocationSize(string dokanPath, long length, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("SetAllocationSize IN DokanProcessId[{0}]", info.ProcessId);
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  openFiles[info.refFileHandleContext].SetLength(length);
-            }
-            else
-            {
-               // Setting file pointers positions is done with open handles !
-               return Dokan.ERROR_FILE_NOT_FOUND;
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetAllocationSize threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("SetAllocationSize OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int LockFile(string dokanPath, long offset, long length, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("LockFile IN DokanProcessId[{0}]", info.ProcessId);
-            if (length < 0)
-            {
-               Log.Warn("Resetting length to [0] from [{0}]", length);
-               length = 0;
-            }
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  openFiles[info.refFileHandleContext].Lock(offset, length);
-            }
-            else
-            {
-               return Dokan.ERROR_FILE_NOT_FOUND;
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("LockFile threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("LockFile OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int UnlockFile(string dokanPath, long offset, long length, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("UnlockFile IN DokanProcessId[{0}]", info.ProcessId);
-            if (length < 0)
-            {
-               Log.Warn("Resetting length to [0] from [{0}]", length);
-               length = 0;
-            }
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  openFiles[info.refFileHandleContext].Unlock(offset, length);
-            }
-            else
-            {
-               return Dokan.ERROR_FILE_NOT_FOUND;
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("UnlockFile threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("UnlockFile OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int GetDiskFreeSpace(ref ulong freeBytesAvailable, ref ulong totalBytes, ref ulong totalFreeBytes, DokanFileInfo info)
-      {
-         try
-         {
-            Log.Trace("GetDiskFreeSpace IN DokanProcessId[{0}]", info.ProcessId);
-            ulong localFreeBytesAvailable = 0, localTotalBytes = 0, localTotalFreeBytes = 0;
-            configDetails.SourceLocations.ForEach(str =>
-                                                     {
-                                                        ulong num;
-                                                        ulong num2;
-                                                        ulong num3;
-                                                        if (GetDiskFreeSpaceEx(str, out num, out num2, out num3))
-                                                        {
-                                                           localFreeBytesAvailable += num;
-                                                           localTotalBytes += num2;
-                                                           localTotalFreeBytes += num3;
-                                                        }
-                                                     });
-            freeBytesAvailable = localFreeBytesAvailable;
-            totalBytes = localTotalBytes;
-            totalFreeBytes = localTotalFreeBytes;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("UnlockFile threw: ", ex);
-            return Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("GetDiskFreeSpace OUT");
-         }
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int Unmount(DokanFileInfo info)
-      {
-         Log.Trace("Unmount IN DokanProcessId[{0}]", info.ProcessId);
-         using (openFilesSync.WriteLock())
-         {
-            foreach (FileStreamName obj2 in openFiles.Values)
-            {
-               try
-               {
-                  if (obj2 != null)
-                  {
-                     obj2.Close();
-                  }
-               }
-               catch (Exception ex)
-               {
-                  Log.InfoException("Unmount closing files threw: ", ex);
-               }
-            }
-            openFiles.Clear();
-         }
-         Log.Trace("Unmount out");
-         return Dokan.DOKAN_SUCCESS;
-      }
-
-      public int GetFileSecurityNative(string file, ref SECURITY_INFORMATION rawRequestedInformation, ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, ref uint rawSecurityDescriptorLengthNeeded, DokanFileInfo info)
-      {
-         Log.Trace("Unmount IN GetFileSecurity[{0}]", info.ProcessId);
-         int dokanReturn = Dokan.DOKAN_ERROR;
-         try
-         {
-            string objectPath;
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  objectPath = openFiles[info.refFileHandleContext].Name;
-            }
-            else
-            {
-               objectPath = plugin.OpenLocation(file);
-            }
-            if ( !GetFileSecurity( objectPath, rawRequestedInformation, ref rawSecurityDescriptor, rawSecurityDescriptorLength, ref rawSecurityDescriptorLengthNeeded ) )
-            {
-               Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("GetFileSecurity threw: ", ex);
-            dokanReturn = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("GetFileSecurity out");
-         }
-         return dokanReturn;
-      }
-
-      public int SetFileSecurityNative(string file, ref SECURITY_INFORMATION rawSecurityInformation, ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, DokanFileInfo info)
-      {
-         Log.Trace("Unmount IN SetFileSecurity[{0}]", info.ProcessId);
-         int dokanReturn = Dokan.DOKAN_ERROR;
-         try
-         {
-            string objectPath;
-            if (info.refFileHandleContext != 0)
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  objectPath = openFiles[info.refFileHandleContext].Name;
-            }
-            else
-            {
-               objectPath = plugin.OpenLocation(file);
-            }
-            if ( !SetFileSecurity( objectPath, rawSecurityInformation, ref rawSecurityDescriptor))
-            {
-               Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetFileSecurity threw: ", ex);
-            dokanReturn = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            Log.Trace("SetFileSecurity out");
-         }
-         return dokanReturn;
+         Log.Trace("GetDiskFreeSpace OUT");
       }
 
       #endregion
 
-
-      private void CloseAndRemove(DokanFileInfo info)
-      {
-         if (info.refFileHandleContext != 0)
-         {
-            Log.Trace("CloseAndRemove info.refFileHandleContext [{0}]", info.refFileHandleContext);
-            using (openFilesSync.UpgradableReadLock())
-            {
-               // The File can be closed by the remote client via Delete (as it does not know to close first!)
-               FileStreamName fileStream;
-               if (openFiles.TryGetValue(info.refFileHandleContext, out fileStream))
-               {
-                  bool canWrite = fileStream.CanWrite;
-                  using (openFilesSync.WriteLock())
-                  {
-                     openFiles.Remove(info.refFileHandleContext);
-                  }
-                  Log.Trace("CloseAndRemove [{0}] info.refFileHandleContext[{1}]", fileStream.Name,
-                            info.refFileHandleContext);
-                  fileStream.Flush();
-                  fileStream.Close();
-                  if (canWrite)
-                     plugin.FileClosed(fileStream.Name);
-               }
-               else
-               {
-                  Log.Debug("Something has already closed info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               }
-            }
-            info.refFileHandleContext = 0;
-         }
-      }
-
-
       public void InitialiseShares(object state)
       {
          Log.Debug("InitialiseShares IN");
@@ -1094,7 +175,7 @@ public void InitialiseShares(object state)
          {
             Thread.Sleep(250); // Give the driver some time to mount
             // Now check (in 2 phases) the existence of the drive
-            string path = configDetails.DriveLetter + ":" + PathDirectorySeparatorChar;
+            string path = mountDetail.DriveLetter + ":" + Roots.PathDirectorySeparatorChar;
             while (!Directory.Exists(path))
             {
                Log.Info("Waiting for Dokan to create the drive letter before reapplying the shares");
@@ -1104,22 +185,17 @@ public void InitialiseShares(object state)
             do
             {
                string[] drives = Environment.GetLogicalDrives();
-               if (Array.Exists(drives, dr => dr.Remove(1) == configDetails.DriveLetter))
+               if (Array.Exists(drives, dr => dr.Remove(1) == mountDetail.DriveLetter))
                   break;
                Log.Info("Waiting for Dokan to create the drive letter before reapplying the shares (Phase 2)");
                Thread.Sleep(100);
             } while (ManagementLayer.Instance.State == LiquesceSvcState.Running);
 
-            configDetails.KnownSharePaths = new List<string>(configDetails.SharesToRestore.Count);
-            foreach (LanManShareDetails shareDetails in configDetails.SharesToRestore)
+            foreach (LanManShareDetails shareDetails in mountDetail.SharesToRestore)
             {
-               configDetails.KnownSharePaths.Add(shareDetails.Path);
                try
                {
                   Log.Info("Restore share for : [{0}] [{1} : {2}]", shareDetails.Path, shareDetails.Name, shareDetails.Description);
-                  // Got to force the file to be found so, that the share has somewhere to attach to
-                  string connectSearch = shareDetails.Path.Replace(Path.GetPathRoot(shareDetails.Path), PathDirectorySeparatorChar);
-                  OpenDirectory(connectSearch, new DokanFileInfo());
                   LanManShareHandler.SetLanManShare(shareDetails);
                }
                catch (Exception ex)
@@ -1139,232 +215,15 @@ public void InitialiseShares(object state)
             Log.Debug("InitialiseShares OUT");
          }
       }
-
-      #region For the ShareEnabler
-
-      /// <summary>
-      /// Will only return tha actual readbytes array size, May be null or zero bytes long
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="buffer"></param>
-      /// <param name="requestedReadLength"></param>
-      /// <param name="actualReadLength"></param>
-      /// <param name="offset"></param>
-      /// <param name="info"></param>
-      /// <returns></returns>
-      internal int ReadFile(string dokanPath, out byte[] buffer, int requestedReadLength, out int actualReadLength, long offset, DokanFileInfo info)
-      {
-         int errorCode = Dokan.DOKAN_SUCCESS;
-         actualReadLength = 0;
-         buffer = null;
-         bool closeOnReturn = false;
-         FileStream fileStream = null;
-         try
-         {
-            Log.Debug("ReadFile IN offset=[{1}] DokanProcessId[{0}]", info.ProcessId, offset);
-            if (info.refFileHandleContext == 0)
-            {
-               string path = plugin.OpenLocation(dokanPath);
-               Log.Warn("No context handle for [" + path + "]");
-               fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, (int)configDetails.BufferReadSize);
-               closeOnReturn = true;
-            }
-            else
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  fileStream = openFiles[info.refFileHandleContext];
-            }
-            fileStream.Seek(offset, SeekOrigin.Begin);
-            byte[] internalBuffer = new byte[requestedReadLength];
-            actualReadLength = fileStream.Read(internalBuffer, 0, requestedReadLength);
-            if (actualReadLength != requestedReadLength)
-               Array.Resize(ref internalBuffer, actualReadLength);
-            buffer = internalBuffer;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("ReadFile threw: ", ex);
-            errorCode = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            try
-            {
-               if (closeOnReturn
-                  && (fileStream != null)
-                  )
-                  fileStream.Close();
-            }
-            catch (Exception ex)
-            {
-               Log.ErrorException("ReadFile closing filestream threw: ", ex);
-            }
-            Log.Debug("ReadFile OUT readBytes=[{0}], errorCode[{1}]", actualReadLength, errorCode);
-         }
-         return errorCode;
-      }
-
-      public int WriteFile(string dokanPath, byte[] buffer, long offset, DokanFileInfo info)
-      {
-         int errorCode = Dokan.DOKAN_ERROR;
-         bool closeOnReturn = false;
-         FileStream fileStream = null;
-         try
-         {
-            Log.Trace("WriteFile IN DokanProcessId[{0}]", info.ProcessId);
-            if (info.refFileHandleContext == 0)
-            {
-               string path = plugin.OpenLocation(dokanPath);
-               Log.Warn("No context handle for [" + path + "]");
-               fileStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write, (int)configDetails.BufferReadSize);
-               closeOnReturn = true;
-            }
-            else
-            {
-               Log.Trace("info.refFileHandleContext [{0}]", info.refFileHandleContext);
-               using (openFilesSync.ReadLock())
-                  fileStream = openFiles[info.refFileHandleContext];
-            }
-            if (!info.WriteToEndOfFile)//  If true, write to the current end of file instead of Offset parameter.
-               fileStream.Seek(offset, SeekOrigin.Begin);
-            else
-               fileStream.Seek(0, SeekOrigin.End);
-            fileStream.Write(buffer, 0, buffer.Length);
-            errorCode = Dokan.DOKAN_SUCCESS;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("WriteFile threw: ", ex);
-            errorCode = Utils.BestAttemptToWin32(ex);
-         }
-         finally
-         {
-            try
-            {
-               if (closeOnReturn
-                  && (fileStream != null)
-                  )
-                  fileStream.Close();
-            }
-            catch (Exception ex)
-            {
-               Log.ErrorException("WriteFile closing filestream threw: ", ex);
-            }
-            Log.Trace("WriteFile OUT errorCode[{0}]", errorCode);
-         }
-         return errorCode;
-      }
-
-      #endregion
-
-
       #region DLL Imports
-      /// <summary>
-      /// The CreateFile function creates or opens a file, file stream, directory, physical disk, volume, console buffer, tape drive,
-      /// communications resource, mailslot, or named pipe. The function returns a handle that can be used to access an object.
-      /// </summary>
-      /// <param name="lpdokanPath"></param>
-      /// <param name="dwDesiredAccess"> access to the object, which can be read, write, or both</param>
-      /// <param name="dwShareMode">The sharing mode of an object, which can be read, write, both, or none</param>
-      /// <param name="SecurityAttributes">A pointer to a SECURITY_ATTRIBUTES structure that determines whether or not the returned handle can
-      /// be inherited by child processes. Can be null</param>
-      /// <param name="dwCreationDisposition">An action to take on files that exist and do not exist</param>
-      /// <param name="dwFlagsAndAttributes">The file attributes and flags. </param>
-      /// <param name="hTemplateFile">A handle to a template file with the GENERIC_READ access right. The template file supplies file attributes
-      /// and extended attributes for the file that is being created. This parameter can be null</param>
-      /// <returns>If the function succeeds, the return value is an open handle to a specified file. If a specified file exists before the function
-      /// all and dwCreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even when the function
-      /// succeeds. If a file does not exist before the call, GetLastError returns 0 (zero).
-      /// If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
-      /// </returns>
-      [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
-      private static extern SafeFileHandle CreateFile(
-              string lpdokanPath,
-              uint dwDesiredAccess,
-              uint dwShareMode,
-              IntPtr SecurityAttributes,
-              uint dwCreationDisposition,
-              uint dwFlagsAndAttributes,
-              IntPtr hTemplateFile
-              );
-
-      [DllImport("kernel32.dll", SetLastError = true)]
-      private static extern int WriteFile(SafeFileHandle handle, IntPtr buffer,
-        uint numBytesToWrite, out uint numBytesWritten, IntPtr /*NativeOverlapped* */ lpOverlapped);
-
-      [DllImport("kernel32.dll", SetLastError = true)]
-      private static extern int ReadFile(SafeFileHandle handle, IntPtr bytes,
-         uint numBytesToRead, out uint numBytesRead_mustBeZero, IntPtr /*NativeOverlapped* */ overlapped);
-
-      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
-      private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable,
-         out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
 
-      [DllImport("kernel32.dll", SetLastError = true)]
-      private static extern bool MoveFileEx(string lpExistingdokanPath, string lpNewdokanPath, UInt32 dwFlags);
-
-      [DllImport("user32.dll", CharSet = CharSet.Auto)]
-      private static extern int SendNotifyMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
-
-      [DllImport("kernel32.dll", SetLastError = true)]
-      [return: MarshalAs(UnmanagedType.Bool)]
-      private static extern bool SetFileTime(SafeFileHandle hFile, ref ComTypes.FILETIME lpCreationTime, ref ComTypes.FILETIME lpLastAccessTime, ref ComTypes.FILETIME lpLastWriteTime);
-
-      private enum SE_OBJECT_TYPE
-      {
-         SE_UNKNOWN_OBJECT_TYPE = 0,
-         SE_FILE_OBJECT,
-         SE_SERVICE,
-         SE_PRINTER,
-         SE_REGISTRY_KEY,
-         SE_LMSHARE,
-         SE_KERNEL_OBJECT,
-         SE_WINDOW_OBJECT,
-         SE_DS_OBJECT,
-         SE_DS_OBJECT_ALL,
-         SE_PROVIDER_DEFINED_OBJECT,
-         SE_WMIGUID_OBJECT,
-         SE_REGISTRY_WOW64_32KEY
-      }
-      /// <summary>
-      /// The GetFileSecurity function obtains specified information about the security of a file or directory. The information obtained is constrained by the caller's access rights and privileges.
-      ///	The GetNamedSecurityInfo function provides functionality similar to GetFileSecurity for files as well as other types of objects.
-      /// Windows NT 3.51 and earlier:  The GetNamedSecurityInfo function is not supported.
-      /// </summary>
-      /// <param name="lpdokanPath">[in] Pointer to a null-terminated string that specifies the file or directory for which security information is retrieved.</param>
-      /// <param name="requestedInformation">[in] A SecurityInformation value that identifies the security information being requested. </param>
-      /// <param name="securityDescriptor">[out] Pointer to a buffer that receives a copy of the security descriptor of the object specified by the lpdokanPath parameter. The calling process must have permission to view the specified aspects of the object's security status. The SECURITY_DESCRIPTOR structure is returned in self-relative format.</param>
-      /// <param name="length">[in] Specifies the size, in bytes, of the buffer pointed to by the pSecurityDescriptor parameter.</param>
-      /// <param name="lengthNeeded">[out] Pointer to the variable that receives the number of bytes necessary to store the complete security descriptor. If the returned number of bytes is less than or equal to nLength, the entire security descriptor is returned in the output buffer; otherwise, none of the descriptor is returned.</param>
-      /// <returns></returns>
-      [DllImport("AdvAPI32.DLL", CharSet = CharSet.Auto, SetLastError = true, CallingConvention=CallingConvention.Winapi )]
-      private static extern bool GetFileSecurity(string lpdokanPath, SECURITY_INFORMATION requestedInformation, ref SECURITY_DESCRIPTOR pSecurityDescriptor, 
-         uint length, ref uint lengthNeeded);
-
-      [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention=CallingConvention.Winapi )]
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.Winapi)]
       [return: MarshalAs(UnmanagedType.Bool)]
-      private static extern bool SetFileSecurity( string pdokanPath, SECURITY_INFORMATION SecurityInformation, ref SECURITY_DESCRIPTOR pSecurityDescriptor );
+      private static extern bool GetDiskFreeSpaceExW(string lpDirectoryName, out ulong lpFreeBytesAvailable,
+         out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
 
       #endregion
 
-
    }
 
-   // This is used for tracking what file is in the store
-   // If the code never looks for name, then it might be jitted out
-   internal class FileStreamName : FileStream
-   {
-      public new string Name 
-      { 
-         get; 
-         private set; 
-      }
-
-      public FileStreamName(string name, SafeFileHandle handle, FileAccess access, int bufferSize)
-         : base(handle, access, bufferSize)
-      {
-         Name = name;
-      }
-   }
 }
\ No newline at end of file
diff --git a/LiquesceSvc/LiquesceService.cs b/LiquesceSvc/LiquesceService.cs
index c605cec..51f1a96 100644
--- a/LiquesceSvc/LiquesceService.cs
+++ b/LiquesceSvc/LiquesceService.cs
@@ -1,9 +1,35 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="LiquesceService.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.Diagnostics;
-using System.Reflection;
 using System.ServiceModel;
 using System.ServiceProcess;
 using System.Threading;
+using LiquesceFacade;
 using NLog;
 
 namespace LiquesceSvc
@@ -12,7 +38,6 @@ public partial class LiquesceService : ServiceBase
    {
       static private readonly Logger Log = LogManager.GetCurrentClassLogger();
 
-
       public LiquesceService()
       {
          try
@@ -34,9 +59,9 @@ public LiquesceService()
       }
 
       public static bool RunningAsService
-      { 
-         get; 
-         set; 
+      {
+         get;
+         set;
       }
 
       private static void LogUnhandledException(object sender, UnhandledExceptionEventArgs e)
@@ -61,28 +86,28 @@ private static void LogUnhandledException(object sender, UnhandledExceptionEvent
 
       private static ServiceHost _ILiquesceHost;
       private static ServiceHost _ILiquesceHostCallBack;
-      
+
       public void StartService(string[] args)
-      { 
-         OnStart(args); 
+      {
+         OnStart(args);
       }
 
       public void StopService()
-      { 
-         OnStop(); 
+      {
+         OnStop();
       }
 
       protected override void OnStart(string[] args)
       {
-         Log.Info("OnStart");
+         Log.Error("OnStart");
          try
          {
             if (RunningAsService)
                RequestAdditionalTime(30000);
-               // let the SCM know that this part could take a while due to other services starting up
+            // let the SCM know that this part could take a while due to other services starting up
             foreach (string arg in args)
             {
-               Log.Debug(arg);
+               Log.Error(arg);
                switch (arg.ToUpper())
                {
                   case "-DEBUG":
@@ -91,31 +116,35 @@ protected override void OnStart(string[] args)
                      break;
                }
             }
-            _ILiquesceHost = new ServiceHost(typeof (LiquesceFacade));
-            _ILiquesceHostCallBack = new ServiceHost(typeof (LiquesceCallBackFacade));
-            _ILiquesceHost.Open();
-            _ILiquesceHostCallBack.Open();
-
             if (RunningAsService)
             {
                RequestAdditionalTime(30000);
-                  // let the SCM know that this part could take a while due to other services starting up
+               // let the SCM know that this part could take a while due to other services starting up
                base.OnStart(args);
 
-               Log.Info("Create Management object to hold the listeners etc.");
+               Log.Error("Create Management object to hold the listeners etc.");
                RequestAdditionalTime(30000);
-                  // let the SCM know that this part could take a while due to other services starting up
+               // let the SCM know that this part could take a while due to other services starting up
             }
             // Queue the main work as a thread pool task as we want this method to finish promptly.
             ThreadPool.QueueUserWorkItem(ThreadProc, this);
          }
          catch (Exception ex)
          {
+            /*
+Windows Server 2003/Windows XP - use the HttpCfg.exe tool
+Windows 7/Windows Server 2008 - configure these settings with the Netsh.exe tool (you need to deal with UAC here). The steps are mentioned below:
+1. Go to Start > Accessories > Command Prompt > Right-Click (Run as Administrator)
+2. Execute this at the command prompt:
+HTTP could not register URL http://+:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).
+    netsh http add urlacl url=http://+:8000/OrderManagerService user=DOMAIN\username
+    8000 here is your port number, you can replace this with a port number of  your choice (using which your WCF service is hosted)            
+             */
             Log.ErrorException("LiquesceService startup error.", ex);
-               base.EventLog.WriteEntry(ex.Message, EventLogEntryType.Error);
-               OnStop();
-               if (RunningAsService)
-                  Stop();
+            base.EventLog.WriteEntry(ex.Message, EventLogEntryType.Error);
+            OnStop();
+            if (RunningAsService)
+               Stop();
             throw;
          }
       }
@@ -126,14 +155,27 @@ protected override void OnStart(string[] args)
       /// <param name="stateInfo">Object passed into the method for context info.</param>
       static void ThreadProc(Object stateInfo)
       {
-         Log.Info("LiquesceService object starting.");
+         Log.Error("LiquesceService object starting.");
          LiquesceService me = stateInfo as LiquesceService;
          try
          {
-            Log.Info("Running Assembly Information.");
+            Log.Info("Populate the LiquesceFacade");
+            _ILiquesceHost = new ServiceHost(typeof(LiquesceFacade));
+            System.ServiceModel.Channels.Binding namedPipeBinding = new NetNamedPipeBinding();
+            _ILiquesceHost.AddServiceEndpoint(typeof(ILiquesce), namedPipeBinding, "net.pipe://localhost/LiquesceFacade");
+
+            Log.Error("Populate the LiquesceCallBackFacade");
+            _ILiquesceHostCallBack = new ServiceHost(typeof(LiquesceCallBackFacade));
+            System.ServiceModel.Channels.Binding namedPipeBindingpublish = new NetNamedPipeBinding();
+            _ILiquesceHostCallBack.AddServiceEndpoint(typeof(ILiquesceCallBack), namedPipeBindingpublish, "net.pipe://localhost/LiquesceCallBackFacade");
 
+            Log.Error("Open the Facades");
+            _ILiquesceHost.Open();
+            _ILiquesceHostCallBack.Open();
+
+            Log.Error("ManagementLayer.Instance.Start");
             ManagementLayer.Instance.Start(null);
-            Log.Info("Blocking thread ManagementLayer.Instance.Start has exited.");
+            Log.Error("Blocking thread ManagementLayer.Instance.Start has exited.");
          }
          catch (Exception ex)
          {
@@ -158,9 +200,9 @@ protected override void OnStop()
             Log.Info("Stop the ManagementLayer and remove");
             if (RunningAsService)
                RequestAdditionalTime(30000);
-            
+
             // Then stop the host calling in
-            if ( _ILiquesceHost != null )
+            if (_ILiquesceHost != null)
                _ILiquesceHost.Close();
             // Now stop the drives
             ManagementLayer.Instance.Stop();
diff --git a/LiquesceSvc/LiquesceSvc.csproj b/LiquesceSvc/LiquesceSvc.csproj
index df57ccf..ec2bd47 100644
--- a/LiquesceSvc/LiquesceSvc.csproj
+++ b/LiquesceSvc/LiquesceSvc.csproj
@@ -14,7 +14,7 @@
     <TargetFrameworkProfile>
     </TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
-    <SccProjectName>%24/Liquesce/Liquesce/LiquesceSvc</SccProjectName>
+    <SccProjectName>%24/Liquesce/Liquesce-PhaseII/LiquesceSvc</SccProjectName>
     <SccLocalPath>.</SccLocalPath>
     <SccAuxPath>https://tfs.codeplex.com/tfs/tfs08</SccAuxPath>
     <SccProvider>{4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}</SccProvider>
@@ -44,16 +44,19 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
     <PlatformTarget>x86</PlatformTarget>
     <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
+    <Optimize>false</Optimize>
     <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSet>BasicCorrectnessRules.ruleset</CodeAnalysisRuleSet>
+    <UseVSHostingProcess>false</UseVSHostingProcess>
+    <RunCodeAnalysis>false</RunCodeAnalysis>
   </PropertyGroup>
   <PropertyGroup>
     <ApplicationIcon>Liquesce.ico</ApplicationIcon>
@@ -122,25 +125,47 @@
     <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>
   </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject>LiquesceSvc.Program</StartupObject>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationManifest>app.manifest</ApplicationManifest>
+  </PropertyGroup>
   <ItemGroup>
+    <Reference Include="CBFS5Net, Version=5.1.148.0, Culture=neutral, PublicKeyToken=0f194b348c109bec, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\ThirdParty\CBFS\32bit\CBFS5Net.dll</HintPath>
+    </Reference>
     <Reference Include="NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
       <HintPath>..\ThirdParty\NLog.dll</HintPath>
     </Reference>
     <Reference Include="System" />
-    <Reference Include="System.ComponentModel.Composition" />
     <Reference Include="System.Configuration.Install" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Management" />
     <Reference Include="System.ServiceModel" />
     <Reference Include="System.Windows.Forms" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
     <Reference Include="System.ServiceProcess" />
-    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="..\..\..\Amalgam\Phase III\AmalgamClientTray\CBFS\ICBFSFuncs.cs">
+      <Link>CBFS\ICBFSFuncs.cs</Link>
+    </Compile>
+    <Compile Include="CachedRootPathsSystemInfo.cs" />
+    <Compile Include="CacheHelper.cs" />
+    <Compile Include="CBFS\CBFSWinUtil.cs" />
+    <Compile Include="CBFS\ICBFSFuncsAdvanced.cs" />
+    <Compile Include="LiquescOpsCBFSImp.cs" />
+    <Compile Include="LowLevelOSAccess\AlternateNativeInfo.cs" />
+    <Compile Include="LowLevelOSAccess\HGlobal.cs" />
+    <Compile Include="LowLevelOSAccess\NativeFileFind.cs" />
+    <Compile Include="LowLevelOSAccess\NativeFileOps.cs" />
+    <Compile Include="LowLevelOSAccess\NfsSupport.cs" />
+    <Compile Include="LowLevelOSAccess\ProcessExtensions.cs" />
+    <Compile Include="LowLevelOSAccess\ProcessIdentity.cs" />
+    <Compile Include="LowLevelOSAccess\SafeHGlobalHandle.cs" />
+    <Compile Include="LowLevelOSAccess\Win32Structs.cs" />
+    <Compile Include="Roots.cs" />
     <Compile Include="LiquesceCallBackFacade.cs" />
     <Compile Include="LiquesceFacade.cs" />
     <Compile Include="LiquesceOps.cs" />
@@ -159,20 +184,22 @@
       <DependentUpon>ProjectInstaller.cs</DependentUpon>
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Properties\Settings1.cs" />
-    <Compile Include="Properties\Settings1.Designer.cs">
+    <Compile Include="Salt.cs" />
+    <Compile Include="Properties\Settings.Designer.cs">
       <AutoGen>True</AutoGen>
       <DesignTimeSharedInput>True</DesignTimeSharedInput>
-      <DependentUpon>Settings1.settings</DependentUpon>
+      <DependentUpon>Settings.settings</DependentUpon>
     </Compile>
+    <Compile Include="XMoveFile.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config">
       <SubType>Designer</SubType>
     </None>
-    <None Include="Properties\Settings1.settings">
+    <None Include="app.manifest" />
+    <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
-      <LastGenOutput>Settings1.Designer.cs</LastGenOutput>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
     </None>
   </ItemGroup>
   <ItemGroup>
@@ -180,22 +207,6 @@
       <Project>{CFE5DC7B-25FB-45C4-AF18-1963853375E1}</Project>
       <Name>LiquesceFacade</Name>
     </ProjectReference>
-    <ProjectReference Include="..\LiquesceSvcMEF\LiquesceSvcMEF.csproj">
-      <Project>{E39910A2-C72A-4D3C-BFD0-4356906B86A7}</Project>
-      <Name>LiquesceSvcMEF</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\ServiceMEFs\FolderMEF\FolderMEF.csproj">
-      <Project>{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}</Project>
-      <Name>FolderMEF</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\ServiceMEFs\PriorityMEF\PriorityMEF.csproj">
-      <Project>{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}</Project>
-      <Name>PriorityMEF</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\ThirdParty\DokanNet\DokanNet.csproj">
-      <Project>{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}</Project>
-      <Name>DokanNet</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="ProjectInstaller.resx">
@@ -233,7 +244,7 @@
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
     <VisualStudio>
-      <UserProperties BuildVersion_UseGlobalSettings="False" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" />
+      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UseGlobalSettings="True" />
     </VisualStudio>
   </ProjectExtensions>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
diff --git a/LiquesceSvc/LowLevelOSAccess/AlternateNativeInfo.cs b/LiquesceSvc/LowLevelOSAccess/AlternateNativeInfo.cs
new file mode 100644
index 0000000..f993389
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/AlternateNativeInfo.cs
@@ -0,0 +1,254 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+namespace LiquesceSvc
+{
+   public class AlternateNativeInfo
+   {
+      public FileStreamType StreamType { get; set; }
+      public FileStreamAttributes StreamAttributes { get; set; }
+      public string StreamName { get; set; }
+      public long StreamSize { get; set; }
+   }
+
+   public class AlternateNameWrapper : IDisposable
+   {
+      private static readonly SafeHGlobalHandle _invalidBlock = SafeHGlobalHandle.Invalid();
+
+      public AlternateNameWrapper()
+      {
+         MemoryBlock = _invalidBlock;
+      }
+
+      /// <summary>
+      /// Returns the handle to the block of memory.
+      /// </summary>
+      /// <value>The <see cref="SafeHGlobalHandle"/> representing the block of memory.</value>
+      public SafeHGlobalHandle MemoryBlock { get; set; }
+
+      #region Methods
+
+      /// <summary>
+      /// Performs application-defined tasks associated with freeing, 
+      /// releasing, or resetting unmanaged resources.
+      /// </summary>
+      public void Dispose()
+      {
+         if (!MemoryBlock.IsInvalid)
+         {
+            MemoryBlock.Dispose();
+            MemoryBlock = _invalidBlock;
+         }
+      }
+
+      /// <summary>
+      /// Ensures that there is sufficient memory allocated.
+      /// </summary>
+      /// <param name="capacity">The required capacity of the block, in bytes.</param>
+      /// <exception cref="OutOfMemoryException">There is insufficient memory to satisfy the request.</exception>
+      public void EnsureCapacity(uint capacity)
+      {
+         uint currentSize = MemoryBlock.IsInvalid ? 0 : MemoryBlock.Size;
+         if (capacity > currentSize)
+         {
+            if (0 != currentSize)
+            {
+               currentSize <<= 1;
+            }
+            if (capacity > currentSize)
+            {
+               currentSize = capacity;
+            }
+            if (!MemoryBlock.IsInvalid)
+            {
+               MemoryBlock.Dispose();
+            }
+            MemoryBlock = SafeHGlobalHandle.Allocate(currentSize);
+         }
+      }
+
+      /// <summary>
+      /// Reads the Unicode string from the memory block.
+      /// </summary>
+      /// <param name="length">The length of the string to read, in characters.</param>
+      /// <returns>The string read from the memory block.</returns>
+      public string ReadString(uint length)
+      {
+         if ((0 >= length)
+             || MemoryBlock.IsInvalid
+            )
+         {
+            return null;
+         }
+         if (length > MemoryBlock.Size)
+         {
+            length = MemoryBlock.Size;
+         }
+         return Marshal.PtrToStringUni(MemoryBlock.DangerousGetHandle(), (int) length);
+      }
+
+      /// <summary>
+      /// Reads the string, and extracts the stream name.
+      /// </summary>
+      /// <param name="length">The length of the string to read, in characters.</param>
+      /// <returns>The stream name./// </returns>
+      public string ReadAlternateStreamName(uint length)
+      {
+         string name = ReadString(length);
+         if (!string.IsNullOrEmpty(name))
+         {
+            // Name is of the format ":NAME:$DATA\0"
+            int separatorIndex = name.IndexOf(NativeFileFind.StreamSeparator, 1);
+            if (-1 != separatorIndex)
+            {
+               name = name.Substring(1, separatorIndex - 1);
+            }
+            else
+            {
+               // Should never happen!
+               separatorIndex = name.IndexOf('\0');
+               name = 1 < separatorIndex ? name.Substring(1, separatorIndex - 1) : null;
+            }
+         }
+
+         return name;
+      }
+
+      #endregion
+   }
+
+   
+   internal static class AlternativeStreamSupport
+   {
+
+      // "Characters whose integer representations are in the range from 1 through 31,
+      // except for alternate streams where these characters are allowed"
+      // http://msdn.microsoft.com/en-us/library/aa365247(v=VS.85).aspx
+      private static readonly char[] InvalidStreamNameChars = Path.GetInvalidFileNameChars().Where(c => c < 1 || c > 31).ToArray();
+
+      // ReSharper disable once UnusedParameter.Local
+      private static void ValidateStreamName(string streamName)
+      {
+         if (!String.IsNullOrEmpty(streamName)
+             && (-1 != streamName.IndexOfAny(InvalidStreamNameChars))
+            )
+         {
+            // ERROR_INVALID_NAME = 123
+            throw new Win32Exception(123, "The stream name contains invalid characters");
+         }
+      }
+
+      public static List<AlternateNativeInfo> ListAlternateDataStreams(SafeFileHandle hFile)
+      {
+         List<AlternateNativeInfo> result = new List<AlternateNativeInfo>();
+
+         using (AlternateNameWrapper alternateName = new AlternateNameWrapper())
+         {
+            if (!hFile.IsInvalid)
+            {
+               WIN32_STREAM_ID streamId = new WIN32_STREAM_ID();
+               UInt32 dwStreamHeaderSize = (uint) Marshal.SizeOf(streamId);
+               bool finished = false;
+               IntPtr context = IntPtr.Zero;
+               UInt32 bytesRead;
+
+               try
+               {
+                  while (!finished)
+                  {
+                     // Read the next stream header:
+                     if (!BackupRead(hFile, ref streamId, dwStreamHeaderSize, out bytesRead, false, false, ref context)
+                         || (dwStreamHeaderSize != bytesRead)
+                        )
+                     {
+                        finished = true;
+                     }
+                     else
+                     {
+                        // Read the stream name:
+                        string foundStreamName = String.Empty;
+                        if (0 != streamId.dwStreamNameSize)
+                        {
+                           alternateName.EnsureCapacity(streamId.dwStreamNameSize);
+                           if (
+                              !BackupRead(hFile, alternateName.MemoryBlock, streamId.dwStreamNameSize, out bytesRead, false, false,
+                                 ref context))
+                           {
+                              foundStreamName = null;
+                              finished = true;
+                           }
+                           else
+                           {
+                              // Unicode chars are 2 bytes:
+                              foundStreamName = alternateName.ReadAlternateStreamName(bytesRead >> 1);
+                           }
+                        }
+
+                        // Add the stream info to the result:
+                        if (!String.IsNullOrEmpty(foundStreamName))
+                        {
+                           result.Add(new AlternateNativeInfo
+                           {
+                              StreamType = (FileStreamType) streamId.dwStreamType,
+                              StreamAttributes = (FileStreamAttributes) streamId.dwStreamAttributes,
+                              StreamSize = streamId.Size,
+                              StreamName = foundStreamName
+                           });
+                        }
+
+                        // Skip the contents of the stream:
+                        uint bytesSeekedLow;
+                        uint bytesSeekedHigh;
+                        if (!finished
+                            &&
+                            !BackupSeek(hFile, (uint) (streamId.Size & 0xFFFFFFFF), (uint) (streamId.Size >> 32), out bytesSeekedLow,
+                               out bytesSeekedHigh, ref context)
+                           )
+                        {
+                           finished = true;
+                        }
+                     }
+                  }
+               }
+               finally
+               {
+                  // Abort the backup:
+                  BackupRead(hFile, alternateName.MemoryBlock, 0, out bytesRead, true, false, ref context);
+               }
+            }
+         }
+
+         return result;
+      }
+
+      [DllImport("kernel32", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool BackupRead(SafeFileHandle hFile, ref WIN32_STREAM_ID pBuffer,
+                                            [In] UInt32 numberOfBytesToRead, out UInt32 numberOfBytesRead,
+                                            [In] [MarshalAs(UnmanagedType.Bool)] bool abort,
+                                            [In] [MarshalAs(UnmanagedType.Bool)] bool processSecurity,
+                                            ref IntPtr context);
+
+      [DllImport("kernel32", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool BackupRead(SafeFileHandle hFile, SafeHGlobalHandle pBuffer,
+                                            [In] UInt32 numberOfBytesToRead, out UInt32 numberOfBytesRead,
+                                            [In] [MarshalAs(UnmanagedType.Bool)] bool abort,
+                                            [In] [MarshalAs(UnmanagedType.Bool)] bool processSecurity,
+                                            ref IntPtr context);
+
+      [DllImport("kernel32", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool BackupSeek(SafeFileHandle hFile,
+                                            [In] UInt32 bytesToSeekLow, [In] UInt32 bytesToSeekHigh,
+                                            out UInt32 bytesSeekedLow,
+                                            out UInt32 bytesSeekedHigh,
+                                            [In] ref IntPtr context);
+
+   }
+}
diff --git a/LiquesceSvc/LowLevelOSAccess/HGlobal.cs b/LiquesceSvc/LowLevelOSAccess/HGlobal.cs
new file mode 100644
index 0000000..0eff617
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/HGlobal.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+namespace LiquesceSvc.LowLevelOSAccess
+{
+   /// <summary>
+   /// Stoeln from https://stackoverflow.com/questions/3525932/should-marshal-freehglobal-be-placed-in-a-finally-block-to-ensure-resources-are
+   /// </summary>
+   /// <example>
+   /// <code>
+   /// using (var h = new HGlobal(buffer.Length))
+   /// {
+   ///   h.WriteArray(0, buffer, 0, buffer.Length);
+   /// }
+   /// </code>
+   /// </example>
+   internal class HGlobal : SafeHandleZeroOrMinusOneIsInvalid
+   {
+      public HGlobal(int cb)
+         : base(true)
+      {
+         SetHandle(Marshal.AllocHGlobal(cb));
+      }
+
+      protected override bool ReleaseHandle()
+      {
+         Marshal.FreeHGlobal(handle);
+         return true;
+      }
+
+      public static implicit operator IntPtr(HGlobal w)
+      {
+         return w.DangerousGetHandle();
+      }
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LowLevelOSAccess/NativeFileFind.cs b/LiquesceSvc/LowLevelOSAccess/NativeFileFind.cs
new file mode 100644
index 0000000..c6cdab9
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/NativeFileFind.cs
@@ -0,0 +1,168 @@
+//
+// Stolen and modified from http://pinvoke.net/default.aspx/FindFirstFile
+// 2013 Added the Alternative stream finding as well.
+// 2014 Added the FindFileByFileID
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
+using Microsoft.Win32.SafeHandles;
+using NLog;
+
+namespace LiquesceSvc
+{
+   internal class NativeFileFind
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+      public const char StreamSeparator = ':';
+
+      /// <summary>
+      /// stolen from http://stackoverflow.com/questions/755574/how-to-quickly-check-if-folder-is-empty-net
+      /// And then some changes made.
+      /// </summary>
+      /// <param name="path"></param>
+      /// <returns></returns>
+      public static bool IsDirEmpty(string path)
+      {
+         bool maybeEmpty;
+         Log.Trace("IsDirEmpty IN pathAndPattern[{0}]", path);
+         try
+         {
+            char endChar = path[path.Length - 1];
+            if (endChar != Path.DirectorySeparatorChar)
+               path += Path.DirectorySeparatorChar;
+            path += '*';
+
+            WIN32_FIND_DATA findData;
+            using (SafeFindHandle findHandle = FindFirstFile(path, out findData))
+            {
+               do
+               {
+                  maybeEmpty = ((findData.cFileName == ".")
+                     || (findData.cFileName == "..")
+                     );
+               } while (maybeEmpty
+                  && FindNextFile(findHandle, out findData)
+                  );
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("IsDirEmpty threw: ", ex);
+            maybeEmpty = false;
+         }
+         return maybeEmpty;
+      }
+
+      public static bool FindFirstOnly(string pathAndPattern, ref WIN32_FIND_DATA findData)
+      {
+         bool success;
+         Log.Trace("FindFirstOnly IN pathAndPattern[{0}]", pathAndPattern);
+         try
+         {
+            using (SafeFindHandle findHandle = FindFirstFile(pathAndPattern, out findData))
+            {
+               success = !findHandle.IsInvalid;
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("FindFirstOnly threw: ", ex);
+            success = false;
+         }
+         return success;
+      }
+
+      // TODO: Need a away to make the IEnumberable, so that large dir counts do not get bogged down.
+      // yield return WIN32_FIND_DATA
+      public static void AddFiles(string path, Dictionary<string, WIN32_FIND_DATA> files, string pattern)
+      {
+         Log.Trace("AddFiles IN path[{0}] pattern[{1}]", path, pattern);
+         try
+         {
+            WIN32_FIND_DATA findData;
+
+            // please note that the following line won't work if you try this on a network folder, like \\Machine\C$
+            // simply remove the \\?\ part in this case or use \\?\UNC\ prefix
+            // FileSystemInfo[] fileSystemInfos = dirInfo.GetFileSystemInfos(pattern, SearchOption.TopDirectoryOnly);
+            using (SafeFindHandle findHandle = FindFirstFile(NativeFileOps.CombineNoChecks(path, pattern), out findData))
+            {
+               if (!findHandle.IsInvalid)
+               {
+                  do
+                  {
+                     AddToUniqueLookup(findData, files);
+                  }
+                  while (FindNextFile(findHandle, out findData));
+               }
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("AddFiles threw: ", ex);
+            throw;
+         }
+      }
+
+      private static void AddToUniqueLookup(WIN32_FIND_DATA info2, Dictionary<string, WIN32_FIND_DATA> files)
+      {
+         if (!string.IsNullOrWhiteSpace(info2.cFileName))
+         {
+            // Prevent expensive time spent allowing indexing == FileAttributes.NotContentIndexed
+            info2.dwFileAttributes |= (uint)NativeFileOps.EFileAttributes.NotContentIndexed;
+            // Prevent the system from timing out due to slow access through the driver == FileAttributes.Offline
+            //if (Log.IsTraceEnabled)
+            //   info2.dwFileAttributes |= (uint) NativeFileOps.EFileAttributes.Offline;
+            files[info2.cFileName] = info2;
+         }
+      }
+
+      /// <summary>
+      /// Stolen and modified from http://pinvoke.net/default.aspx/FindFirstFile
+      /// </summary>
+      internal sealed class SafeFindHandle : SafeHandleZeroOrMinusOneIsInvalid
+      {
+         // Methods
+         [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
+         internal SafeFindHandle()
+            : base(true)
+         {
+         }
+
+         public SafeFindHandle(IntPtr preExistingHandle, bool ownsHandle)
+            : base(ownsHandle)
+         {
+            base.SetHandle(preExistingHandle);
+         }
+
+         protected override bool ReleaseHandle()
+         {
+            if (!(IsInvalid || IsClosed))
+            {
+               return FindClose(this);
+            }
+            return (IsInvalid || IsClosed);
+         }
+
+         protected override void Dispose(bool disposing)
+         {
+            if (!(IsInvalid || IsClosed))
+            {
+               FindClose(this);
+            }
+            base.Dispose(disposing);
+         }
+      }
+
+      [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+      private static extern SafeFindHandle FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      private static extern bool FindClose(SafeHandle hFindFile);
+
+      [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+      private static extern bool FindNextFile(SafeHandle hFindFile, out WIN32_FIND_DATA lpFindFileData);
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LowLevelOSAccess/NativeFileOps.cs b/LiquesceSvc/LowLevelOSAccess/NativeFileOps.cs
new file mode 100644
index 0000000..06a0264
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/NativeFileOps.cs
@@ -0,0 +1,1140 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="NativeFileOps.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2011-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Collections.ObjectModel;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.AccessControl;
+using System.Security.Principal;
+using System.Text;
+using System.Threading;
+
+using CBFS;
+using Microsoft.Win32.SafeHandles;
+
+namespace LiquesceSvc
+{
+   /// <summary>
+   /// Some of this has been inspired by .Net code from System\IO\File.cs
+   /// </summary>
+   [SuppressUnmanagedCodeSecurity]
+   [SecurityCritical]
+   internal class NativeFileOps
+   {
+      public string FullName { get; private set; }
+
+      private readonly SafeFileHandle handle;
+
+      public bool ForceUseAsReadOnly { get; private set; }
+
+      /// <summary>
+      /// Not all file systems can record creation and last access times, and not all file systems record them in the same manner.
+      /// For example, on the FAT file system, create time has a resolution of 10 milliseconds, write time has a resolution of 2 seconds,
+      /// and access time has a resolution of 1 day. The NTFS file system delays updates to the last access time for a file by up to
+      /// 1 hour after the last access. For more information. See http://msdn.microsoft.com/en-us/library/windows/desktop/aa365740%28v=VS.85%29.aspx
+      /// </summary>
+      private BY_HANDLE_FILE_INFORMATION? cachedFileInformation;
+
+      private WIN32_FILE_ATTRIBUTE_DATA? cachedAttributeData;
+
+      public bool IsInvalid
+      {
+         get { return handle.IsInvalid; }
+      }
+
+      public NativeFileOps(string fullName, bool forceUseAsReadOnly)
+         : this(fullName, new SafeFileHandle(IntPtr.Zero, false), forceUseAsReadOnly)
+      {
+      }
+
+      private NativeFileOps(string fullName, SafeFileHandle handle, bool forceUseAsReadOnly)
+      {
+         this.handle = handle;
+         if (!handle.IsInvalid
+            && !handle.IsClosed
+            )
+         {
+            IncrementOpenCount();
+         }
+         FullName = GetFullPathName(fullName);
+         ForceUseAsReadOnly = forceUseAsReadOnly;
+      }
+
+      /// <summary>
+      /// Taken from System\IO\Path.cs
+      /// and then remove the checks to allow speedier combines
+      /// </summary>
+      /// <param name="path1"></param>
+      /// <param name="path2"></param>
+      /// <returns></returns>
+      public static string CombineNoChecks(string path1, string path2)
+      {
+         if (path2.Length == 0)
+         {
+            return path1;
+         }
+         if (path1.Length == 0 || Path.IsPathRooted(path2))
+         {
+            return path2;
+         }
+         return AddTrailingSeperator(path1) + path2;
+      }
+
+      /// <summary>
+      /// Call the native function to create an appropriate wrapper for the File Operations
+      /// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
+      /// </summary>
+      /// <param name="lpFileName"></param>
+      /// <param name="dwDesiredAccess"></param>
+      /// <param name="dwShareMode"></param>
+      /// <param name="dwCreationDisposition"></param>
+      /// <param name="dwFlagsAndAttributes"></param>
+      /// <returns>New class object or an exception</returns>
+      public static NativeFileOps CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint dwCreationDisposition, uint dwFlagsAndAttributes)
+      {
+         SafeFileHandle handle = CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, IntPtr.Zero,
+                                                    dwCreationDisposition, dwFlagsAndAttributes, IntPtr.Zero);
+         if (handle.IsInvalid)
+         {
+            throw new Win32Exception();
+         }
+         return new NativeFileOps(lpFileName, handle, false);
+      }
+
+      static public void CreateDirectory(string pathName)
+      {
+         DirectoryInfo dirInfo = new DirectoryInfo(pathName);
+         if (!dirInfo.Exists)
+         {
+            dirInfo.Create();
+            DirectorySecurity sec = dirInfo.GetAccessControl();
+            // Using this instead of the "Everyone" string means we work on non-English systems.
+            SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
+            // Aim for: Everyone | Modify, Synchronize | ContainerInherit, ObjectInherit | None | Allow
+            sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize,
+               InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
+            dirInfo.SetAccessControl(sec);
+         }
+      }
+
+      public void CreateDirectory()
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         CreateDirectory(FullName);
+      }
+
+      static public void DeleteDirectory(string path)
+      {
+         try
+         {
+            if (!RemoveDirectory(path))
+            {
+               throw new Win32Exception();
+            }
+         }
+         catch
+         {
+            if (!Roots.RecyclerDirectoryNames.Any(path.Contains))
+            {
+               // only throw due to be unable to delete from Recycler, as it may have already been tidied up
+               throw;
+            }
+         }
+      }
+
+      public void DeleteDirectory()
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         if (Exists)
+         {
+            DeleteDirectory(FullName);
+            RemoveCachedFileInformation();
+         }
+      }
+
+      static public void DeleteFile(string path)
+      {
+         try
+         {
+            if (!DeleteFileW(path))
+            {
+               throw new Win32Exception();
+            }
+         }
+         catch
+         {
+            if (!Roots.RecyclerDirectoryNames.Any(path.Contains))
+            {
+               // only throw due to be unable to delete from Recycler, as it may have already been tidied up
+               throw;
+            }
+         }
+      }
+
+      public void DeleteFile()
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         if (Exists)
+         {
+            DeleteFile(FullName);
+            RemoveCachedFileInformation();
+         }
+      }
+
+      public void SetFilePointer(long offset, SeekOrigin origin)
+      {
+         long currentOffset = offset;
+         if ((origin == SeekOrigin.Begin)
+            && (currentOffset != 0) // Reset's should be fast
+            )
+         {
+            origin = SeekOrigin.Current;
+            // Use the SetFilePointer function to query the current file pointer position.
+            // To do this, specify a move method of FILE_CURRENT and a distance of zero.
+            int loStart = 0;
+            int hiStart = 0;
+            loStart = SetFilePointer(handle, loStart, ref hiStart, SeekOrigin.Current);
+            if (loStart == -1)
+            {
+               throw new Win32Exception();
+            }
+            currentOffset -= (((long)hiStart << 32) | (loStart & UInt32.MaxValue));
+            if (currentOffset == 0)
+            {
+               // No movement required
+               return;
+            }
+         }
+
+         int lo = (int)(currentOffset & UInt32.MaxValue);
+         int hi = (lo != currentOffset) ? (int)(currentOffset >> 32) : 0;
+         if (SetFilePointer(handle, lo, ref hi, origin) == -1)
+         {
+            throw new Win32Exception();
+         }
+      }
+
+      public bool ReadFile(byte[] bytes, UInt32 numBytesToRead, out UInt32 numBytesRead_mustBeZero)
+      {
+         // ReSharper disable once RedundantAssignment
+         numBytesRead_mustBeZero = 0;
+         //NativeOverlapped overlapped = new NativeOverlapped();
+         return ReadFile(handle, bytes, numBytesToRead, out numBytesRead_mustBeZero, IntPtr.Zero);
+      }
+
+      public void Close()
+      {
+         if (!handle.IsInvalid
+             && !handle.IsClosed
+            )
+         {
+            handle.Close();
+         }
+      }
+
+      public bool WriteFile(byte[] buffer, UInt32 numBytesToWrite, out UInt32 numBytesWritten)
+      {
+         numBytesWritten = 0;
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         try
+         {
+            //NativeOverlapped overlapped = new NativeOverlapped();
+            return WriteFile(handle, buffer, numBytesToWrite, out numBytesWritten, IntPtr.Zero);
+         }
+         finally
+         {
+            if (numBytesWritten != 0)
+            {
+               RemoveCachedFileInformation();
+            }
+         }
+      }
+
+      public void FlushFileBuffers()
+      {
+         if (!FlushFileBuffers(handle))
+         {
+            throw new Win32Exception();
+         }
+      }
+
+      public BY_HANDLE_FILE_INFORMATION GetFileInformationByHandle()
+      {
+         BY_HANDLE_FILE_INFORMATION lpFileInformation = new BY_HANDLE_FILE_INFORMATION();
+         BY_HANDLE_FILE_INFORMATION? local = cachedFileInformation;
+         if (local.HasValue)
+         {
+            lpFileInformation = local.Value;
+         }
+         else if (!GetFileInformationByHandle(handle, ref lpFileInformation))
+         {
+            throw new Win32Exception();
+         }
+         else
+         {
+            // Ensure that the attributes stored are the Extended variety
+            lpFileInformation.dwFileAttributes = Attributes;
+            if (ForceUseAsReadOnly)
+            {
+               lpFileInformation.dwFileAttributes |= (uint)EFileAttributes.Readonly;
+            }
+            cachedFileInformation = lpFileInformation;
+         }
+         return lpFileInformation;
+      }
+
+      static public string GetRootOrMountFor(string path)
+      {
+         do
+         {
+            NativeFileOps dirInfo = new NativeFileOps(path, false);
+            EFileAttributes attr = (EFileAttributes)dirInfo.Attributes;
+            if ((attr & EFileAttributes.ReparsePoint) == EFileAttributes.ReparsePoint)
+            {
+               path = AddTrailingSeperator(path);
+               const int MaxVolumeNameLength = 100;
+               StringBuilder sb = new StringBuilder(MaxVolumeNameLength);
+               if (GetVolumeNameForVolumeMountPointW(path, sb, MaxVolumeNameLength))
+               {
+                  return sb.ToString();
+               }
+            }
+            string tmp = GetParentPathName(path);
+            if (string.IsNullOrEmpty(tmp))
+            {
+               return AddTrailingSeperator(path);
+            }
+            path = tmp;
+         } while (!string.IsNullOrEmpty(path));
+         return path;
+      }
+
+      private static string AddTrailingSeperator(string path)
+      {
+         char ch = path[path.Length - 1];
+         if (!IsDirectorySeparator(ch))
+         {
+            path += Path.DirectorySeparatorChar;
+         }
+         return path;
+      }
+
+      private void RemoveCachedFileInformation()
+      {
+         cachedFileInformation = null;
+         cachedAttributeData = null;
+      }
+
+      private static long ConvertDateTimeToFiletime(DateTime time)
+      {
+         return (time == DateTime.MinValue) ? 0 : time.ToFileTimeUtc();
+      }
+
+      public static DateTime ConvertFileTimeToDateTime(WIN32_FIND_FILETIME data)
+      {
+         long fileTime = ((long)data.dwHighDateTime << 32) | data.dwLowDateTime;
+         return (fileTime != 0) ? DateTime.FromFileTimeUtc(fileTime) : DateTime.MinValue;
+      }
+
+      [DebuggerHidden] // Stop it firing when setting file times inside recycler bin's
+      public void SetFileTime(DateTime creationTime, DateTime lastAccessTime, DateTime lastWriteTime)
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         long lpCreationTime = ConvertDateTimeToFiletime(creationTime);
+         long lpLastAccessTime = ConvertDateTimeToFiletime(lastAccessTime);
+         long lpLastWriteTime = ConvertDateTimeToFiletime(lastWriteTime);
+         if (!SetFileTime(handle, ref lpCreationTime, ref lpLastAccessTime, ref lpLastWriteTime))
+         {
+            throw new Win32Exception();
+         }
+         RemoveCachedFileInformation();
+      }
+
+      /// <summary>
+      /// Will throw exceptions if it fails
+      /// </summary>
+      /// <param name="length"></param>
+      public void SetLength(long length)
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         SetFilePointer(length, SeekOrigin.Begin);
+         if (!SetEndOfFile(handle))
+         {
+            throw new Win32Exception();
+         }
+         RemoveCachedFileInformation();
+      }
+
+      private void CheckData()
+      {
+         WIN32_FILE_ATTRIBUTE_DATA? local = cachedAttributeData;
+         if (!local.HasValue)
+         {
+            WIN32_FILE_ATTRIBUTE_DATA newData;
+            if (GetFileAttributesEx(FullName, GET_FILEEX_INFO_LEVELS.GetFileExInfoStandard, out newData))
+            {
+               if (ForceUseAsReadOnly)
+               {
+                  newData.dwFileAttributes |= (uint)EFileAttributes.Readonly;
+               }
+               cachedAttributeData = newData;
+            }
+         }
+      }
+
+      public uint Attributes
+      {
+         get
+         {
+            return (Exists) ? cachedAttributeData.Value.dwFileAttributes : 0;
+         }
+      }
+
+      /// <summary>
+      /// Returns the FileId
+      /// </summary>
+      /// <remarks>
+      /// May return 0 if not found
+      /// </remarks>
+      public long FileId
+      {
+         get
+         {
+            if (Exists)
+            {
+               if (!cachedFileInformation.HasValue)
+               {
+                  GetFileInformationByHandle();
+               }
+               return (((long)cachedFileInformation.Value.nFileIndexHigh) << 32) + cachedFileInformation.Value.nFileIndexLow;
+            }
+            return 0;
+         }
+      }
+
+      public string DirectoryPathOnly
+      {
+         get {
+            return GetDirectoryName(FullName);
+         }
+      }
+
+      /// <summary>
+      /// Stolen from Path.GetDirectoryName() then simplified
+      /// </summary>
+      /// <param name="fullName"></param>
+      /// <returns></returns>
+      static public string GetDirectoryName(string fullName)
+      {
+         int length = fullName.Length;
+         char ch;
+         do
+         {
+            ch = fullName[--length];
+         } while (!IsDirectorySeparator(ch));
+         return AddTrailingSeperator(fullName.Substring(0, length));
+      }
+
+      public string FileName
+      {
+         get { return GetFileName(FullName); }
+      }
+
+      public ulong Length
+      {
+         get
+         {
+            return (!Exists || IsDirectory) ? 0 : ((ulong)cachedAttributeData.Value.nFileSizeHigh << 32) | (cachedAttributeData.Value.nFileSizeLow & UInt32.MaxValue);
+         }
+      }
+
+      public bool Exists
+      {
+         get
+         {
+            try
+            {
+               CheckData();
+               return cachedAttributeData.HasValue;
+            }
+            catch
+            {
+               return false;
+            }
+         }
+      }
+
+      public bool IsDirectory
+      {
+         get
+         {
+            try
+            {
+               return ((EFileAttributes)Attributes & EFileAttributes.Directory) == EFileAttributes.Directory;
+            }
+            catch (Exception)
+            {
+               return false;
+            }
+         }
+      }
+
+      public bool IsEmptyDirectory
+      {
+         get
+         {
+            return !String.IsNullOrEmpty(FullName) && IsDirectory &&
+               (FullName.Length <= MAX_PATH ? PathIsDirectoryEmptyW(FullName) : NativeFileFind.IsDirEmpty(FullName));
+         }
+      }
+
+      public WIN32_FIND_DATA GetFindData()
+      {
+         WIN32_FIND_DATA findData = new WIN32_FIND_DATA();
+         WIN32_FIND_DATA win32FindData = (NativeFileFind.FindFirstOnly(FullName, ref findData) ? findData : new WIN32_FIND_DATA());
+         if (ForceUseAsReadOnly)
+         {
+            win32FindData.dwFileAttributes |= (uint)EFileAttributes.Readonly;
+         }
+         return win32FindData;
+      }
+
+      public void SetFileAttributes(uint attr)
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         if (!SetFileAttributesW(FullName, (FileAttributes)attr))
+         {
+            throw new Win32Exception();
+         }
+         RemoveCachedFileInformation();
+      }
+
+      private static string GetFullPathName(string startPath)
+      {
+         StringBuilder buffer = new StringBuilder(MAX_PATH + 1);
+         int fullPathNameLength = GetFullPathNameW(startPath, MAX_PATH + 1, buffer, IntPtr.Zero);
+         if (fullPathNameLength > MAX_PATH)
+         {
+            buffer.Length = fullPathNameLength;
+            fullPathNameLength = GetFullPathNameW(startPath, fullPathNameLength, buffer, IntPtr.Zero);
+         }
+         if (fullPathNameLength == 0)
+         {
+            throw new Win32Exception();
+         }
+         return buffer.ToString();
+      }
+
+      private static int GetRootLength(string path)
+      {
+         int index = 0;
+         int length = path.Length;
+         if (length >= 1 && IsDirectorySeparator(path[0]))
+         {
+            index = 1;
+            if (length >= 2 && IsDirectorySeparator(path[1]))
+            {
+               index = 2;
+               int num = 2;
+               while (index < length
+                      && (IsDirectorySeparator(path[index])
+                          || --num > 0)
+                     )
+               {
+                  ++index;
+               }
+            }
+         }
+         else if (length >= 2
+            && path[1] == Path.VolumeSeparatorChar
+            )
+         {
+            index = 2;
+            if (length >= 3
+               && IsDirectorySeparator(path[2])
+               )
+               ++index;
+         }
+         return index;
+      }
+
+      public static bool IsDirectorySeparator(char c)
+      {
+         return c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar;
+      }
+
+      public static string GetFileName(string fullName)
+      {
+         // Stolen from Path.GetFileName() then simplified
+         int length = fullName.Length;
+         int index = length;
+         char ch;
+         do
+         {
+            ch = fullName[--index];
+         } while (!IsDirectorySeparator(ch));
+         return fullName.Substring(index + 1, length - index - 1);
+      }
+
+      public static string GetParentPathName(string startPathFileName)
+      {
+         int rootLength = GetRootLength(startPathFileName);
+         int length = startPathFileName.Length;
+         if (startPathFileName.Length > rootLength)
+         {
+            do
+            {
+               // Spin maddly
+            } while (length > rootLength
+                     && !IsDirectorySeparator(startPathFileName[--length])
+                     );
+
+            return startPathFileName.Substring(0, length);
+         }
+
+         return string.Empty;
+      }
+
+      public ReadOnlyCollection<AlternateNativeInfo> ListAlternateDataStreams()
+      {
+         return AlternativeStreamSupport.ListAlternateDataStreams(handle).AsReadOnly();
+      }
+
+      [DebuggerHidden] // Stop the "Buffer is too small" from breaking the debugger
+      public void GetFileSecurity(uint /*SECURITY_INFORMATION*/ securityInformation, IntPtr /*ref SECURITY_DESCRIPTOR*/ securityDescriptor, uint length, ref uint lengthNeeded)
+      {
+         SECURITY_INFORMATION rawRequestedInformation = (SECURITY_INFORMATION)securityInformation;
+         // Following in an attempt to solve Win 7 and above share write access
+         //if ( PID.CouldBeSMB(info.ProcessId ) )
+         //   return ( dokanReturn = Dokan.ERROR_CALL_NOT_IMPLEMENTED);
+
+         SECURITY_INFORMATION reqInfo = rawRequestedInformation;
+         AccessControlSections includeSections = AccessControlSections.None;
+         if ((reqInfo & SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION) == SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Owner;
+         }
+         if ((reqInfo & SECURITY_INFORMATION.GROUP_SECURITY_INFORMATION) == SECURITY_INFORMATION.GROUP_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Group;
+         }
+         if ((reqInfo & SECURITY_INFORMATION.DACL_SECURITY_INFORMATION) == SECURITY_INFORMATION.DACL_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Access;
+         }
+         if ((reqInfo & SECURITY_INFORMATION.SACL_SECURITY_INFORMATION) == SECURITY_INFORMATION.SACL_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Audit;
+         }
+         FileSystemSecurity pSD = (!IsDirectory)
+                                     ? (FileSystemSecurity)File.GetAccessControl(FullName, includeSections)
+                                     : Directory.GetAccessControl(FullName, includeSections);
+         byte[] managedDescriptor = pSD.GetSecurityDescriptorBinaryForm();
+         lengthNeeded = (uint)managedDescriptor.Length;
+         if (lengthNeeded <= 32)
+         {
+            // Deal with FAT32 drives not being able to "Hold" ACL on files.
+            // This in turn will prevent explorer from allowing tab to be constructed to attempt to "Set" ACL on FAT32 files.
+            throw new Win32Exception(CBFSWinUtil.ERROR_NO_SECURITY_ON_OBJECT);
+         }
+         // if the buffer is not enough the we must pass the correct error
+         // If the returned number of bytes is less than or equal to nLength, the entire security descriptor is returned in the output buffer; otherwise, none of the descriptor is returned.
+         if (length < lengthNeeded)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_INSUFFICIENT_BUFFER);
+         }
+         Marshal.Copy(managedDescriptor, 0, securityDescriptor, managedDescriptor.Length);
+      }
+
+      public void SetFileSecurity(uint /*SECURITY_INFORMATION*/ securityInformation, IntPtr /*ref SECURITY_DESCRIPTOR*/ securityDescriptor, uint length)
+      {
+         if (ForceUseAsReadOnly)
+         {
+            throw new Win32Exception(CBFSWinUtil.ERROR_WRITE_PROTECT);
+         }
+         SECURITY_INFORMATION rawSecurityInformation = (SECURITY_INFORMATION)securityInformation;
+         SECURITY_INFORMATION reqInfo = rawSecurityInformation;
+         AccessControlSections includeSections = AccessControlSections.None;
+         if ((reqInfo & SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION) == SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Owner;
+         }
+         if ((reqInfo & SECURITY_INFORMATION.GROUP_SECURITY_INFORMATION) == SECURITY_INFORMATION.GROUP_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Group;
+         }
+         if ((reqInfo & SECURITY_INFORMATION.DACL_SECURITY_INFORMATION) == SECURITY_INFORMATION.DACL_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Access;
+         }
+         if ((reqInfo & SECURITY_INFORMATION.SACL_SECURITY_INFORMATION) == SECURITY_INFORMATION.SACL_SECURITY_INFORMATION)
+         {
+            includeSections |= AccessControlSections.Audit;
+         }
+         FileSystemSecurity pSD = (!IsDirectory)
+                                     ? (FileSystemSecurity)File.GetAccessControl(FullName, includeSections)
+                                     : Directory.GetAccessControl(FullName, includeSections);
+         byte[] binaryForm = new byte[length];
+         Marshal.Copy(securityDescriptor, binaryForm, 0, binaryForm.Length);
+         pSD.SetAccessRuleProtection(
+            (reqInfo & SECURITY_INFORMATION.PROTECTED_DACL_SECURITY_INFORMATION) ==
+            SECURITY_INFORMATION.PROTECTED_DACL_SECURITY_INFORMATION,
+            (reqInfo & SECURITY_INFORMATION.UNPROTECTED_DACL_SECURITY_INFORMATION) ==
+            SECURITY_INFORMATION.UNPROTECTED_DACL_SECURITY_INFORMATION);
+         pSD.SetAuditRuleProtection(
+            (reqInfo & SECURITY_INFORMATION.PROTECTED_SACL_SECURITY_INFORMATION) ==
+            SECURITY_INFORMATION.PROTECTED_SACL_SECURITY_INFORMATION,
+            (reqInfo & SECURITY_INFORMATION.UNPROTECTED_SACL_SECURITY_INFORMATION) ==
+            SECURITY_INFORMATION.UNPROTECTED_SACL_SECURITY_INFORMATION);
+         pSD.SetSecurityDescriptorBinaryForm(binaryForm, includeSections);
+         // Apply these changes.
+         if (IsDirectory)
+         {
+            Directory.SetAccessControl(FullName, (DirectorySecurity)pSD);
+         }
+         else
+         {
+            File.SetAccessControl(FullName, (FileSecurity)pSD);
+         }
+      }
+
+      #region DLL Imports
+
+      #region SetFileSecurity
+
+      /// <summary>
+      /// Check http://msdn.microsoft.com/en-us/library/cc230369%28v=prot.13%29.aspx
+      /// and usage http://msdn.microsoft.com/en-us/library/ff556635%28v=vs.85%29.aspx
+      /// </summary>
+      [Flags]
+      // ReSharper disable UnusedMember.Global
+      public enum SECURITY_INFORMATION : uint
+      {
+         /// <summary>
+         /// Enums found @ http://msdn.microsoft.com/en-us/library/windows/desktop/aa379579(v=vs.85).aspx
+         /// </summary>
+         OWNER_SECURITY_INFORMATION = 0x00000001,
+
+         GROUP_SECURITY_INFORMATION = 0x00000002,
+         DACL_SECURITY_INFORMATION = 0x00000004,
+         SACL_SECURITY_INFORMATION = 0x00000008,
+         LABEL_SECURITY_INFORMATION = 0x00000010,
+         ATTRIBUTE_SECURITY_INFORMATION = 0x00000020,
+         SCOPE_SECURITY_INFORMATION = 0x00000040,
+         UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
+         UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
+         PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000,
+         PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000
+         /*
+   ATTRIBUTE_SECURITY_INFORMATION      The security property of the object being referenced.
+
+   BACKUP_SECURITY_INFORMATION         The backup properties of the object being referenced.
+
+   DACL_SECURITY_INFORMATION           The DACL of the object is being referenced.
+
+   GROUP_SECURITY_INFORMATION          The primary group identifier of the object is being referenced.
+
+   LABEL_SECURITY_INFORMATION          The mandatory integrity label is being referenced.
+                                       The mandatory integrity label is an ACE in the SACL of the object.
+
+   OWNER_SECURITY_INFORMATION          The owner identifier of the object is being referenced.
+
+   PROTECTED_DACL_SECURITY_INFORMATION The DACL cannot inherit access control entries (ACEs).
+
+   PROTECTED_SACL_SECURITY_INFORMATION The SACL cannot inherit ACEs.
+
+   SACL_SECURITY_INFORMATION           The SACL of the object is being referenced.
+
+   SCOPE_SECURITY_INFORMATION          The Central Access Policy (CAP) identifier applicable on the object that is being referenced. Each CAP identifier is stored in a SYSTEM_SCOPED_POLICY_ID_ACE type in the SACL of the SD.
+
+   UNPROTECTED_DACL_SECURITY_INFORMATION  The DACL inherits ACEs from the parent object.
+
+   UNPROTECTED_SACL_SECURITY_INFORMATION  The SACL inherits ACEs from the parent object.
+          * */
+      }
+
+      // ReSharper restore UnusedMember.Global
+
+      ///// <summary>
+      ///// See http://www.pinvoke.net/search.aspx?search=SECURITY_DESCRIPTOR&namespace=[All]
+      ///// </summary>
+      // ReSharper disable FieldCanBeMadeReadOnly.Global
+      // ReSharper disable MemberCanBePrivate.Global
+      // ReSharper disable UnusedMember.Global
+      [StructLayout(LayoutKind.Sequential, Pack = 4)]
+      public struct SECURITY_DESCRIPTOR
+      {
+         /// <summary>
+         /// Structure taken from http://msdn.microsoft.com/en-us/library/ff556610%28v=vs.85%29.aspx
+         /// </summary>
+         public byte revision;
+
+         public byte size;
+         public short control;   // == SECURITY_DESCRIPTOR_CONTROL
+         public IntPtr owner;    // == PSID
+         public IntPtr group;    // == PSID
+         public IntPtr sacl;     // == PACL
+         public IntPtr dacl;     // == PACL
+      }
+
+      // ReSharper restore UnusedMember.Global
+      // ReSharper restore MemberCanBePrivate.Global
+
+      #endregion SetFileSecurity
+
+      #region Create File
+
+      /// <summary>
+      /// The CreateFile function creates or opens a file, file stream, directory, physical disk, volume, console buffer, tape drive,
+      /// communications resource, mailslot, or named pipe. The function returns a handle that can be used to access an object.
+      /// </summary>
+      /// <param name="lpFileName"></param>
+      /// <param name="dwDesiredAccess"> access to the object, which can be read, write, or both</param>
+      /// <param name="dwShareMode">The sharing mode of an object, which can be read, write, both, or none</param>
+      /// <param name="SecurityAttributes">A pointer to a SECURITY_ATTRIBUTES structure that determines whether or not the returned handle can
+      /// be inherited by child processes. Can be null</param>
+      /// <param name="dwCreationDisposition">An action to take on files that exist and do not exist</param>
+      /// <param name="dwFlagsAndAttributes">The file attributes and flags. </param>
+      /// <param name="hTemplateFile">A handle to a template file with the GENERIC_READ access right. The template file supplies file attributes
+      /// and extended attributes for the file that is being created. This parameter can be null</param>
+      /// <returns>If the function succeeds, the return value is an open handle to a specified file. If a specified file exists before the function
+      /// call and dwCreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even when the function
+      /// succeeds. If a file does not exist before the call, GetLastError returns 0 (zero).
+      /// If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
+      /// </returns>
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall,
+         SetLastError = true)]
+      private static extern SafeFileHandle CreateFileW(
+         string lpFileName,
+         uint dwDesiredAccess,
+         uint dwShareMode,
+         IntPtr SecurityAttributes,
+         uint dwCreationDisposition,
+         uint dwFlagsAndAttributes,
+         IntPtr hTemplateFile
+         );
+
+      // ReSharper disable UnusedMember.Global
+      [Flags]
+      public enum EFileAttributes : uint
+      {
+         Readonly = 0x00000001,
+         Hidden = 0x00000002,
+         System = 0x00000004,
+         Directory = 0x00000010,
+         Archive = 0x00000020,
+         Device = 0x00000040,
+         Normal = 0x00000080,
+         Temporary = 0x00000100,
+         SparseFile = 0x00000200,
+         ReparsePoint = 0x00000400,
+         Compressed = 0x00000800,
+         Offline = 0x00001000,
+         NotContentIndexed = 0x00002000,
+         Encrypted = 0x00004000,
+         Write_Through = 0x80000000,
+         Overlapped = 0x40000000,
+         NoBuffering = 0x20000000,
+         RandomAccess = 0x10000000,
+         SequentialScan = 0x08000000,
+         DeleteOnClose = 0x04000000,
+         BackupSemantics = 0x02000000,
+         PosixSemantics = 0x01000000,
+         OpenReparsePoint = 0x00200000,
+         OpenNoRecall = 0x00100000,
+         FirstPipeInstance = 0x00080000
+      }
+
+      [Flags]
+      public enum EFileAccess : uint
+      {
+         //
+         // Standard Section
+         //
+
+         AccessSystemSecurity = 0x1000000, // AccessSystemAcl access type
+         MaximumAllowed = 0x2000000, // MaximumAllowed access type
+
+         Delete = 0x10000,
+         ReadControl = 0x20000,
+         WriteDAC = 0x40000,
+         WriteOwner = 0x80000,
+         Synchronize = 0x100000,
+
+         StandardRightsRequired = 0xF0000,
+         StandardRightsRead = ReadControl,
+         StandardRightsWrite = ReadControl,
+         StandardRightsExecute = ReadControl,
+         StandardRightsAll = 0x1F0000,
+         SpecificRightsAll = 0xFFFF,
+
+         FILE_READ_DATA = 0x0001, // file & pipe
+         FILE_LIST_DIRECTORY = 0x0001, // directory
+         FILE_WRITE_DATA = 0x0002, // file & pipe
+         FILE_ADD_FILE = 0x0002, // directory
+         FILE_APPEND_DATA = 0x0004, // file
+         FILE_ADD_SUBDIRECTORY = 0x0004, // directory
+         FILE_CREATE_PIPE_INSTANCE = 0x0004, // named pipe
+         FILE_READ_EA = 0x0008, // file & directory
+         FILE_WRITE_EA = 0x0010, // file & directory
+         FILE_EXECUTE = 0x0020, // file
+         FILE_TRAVERSE = 0x0020, // directory
+         FILE_DELETE_CHILD = 0x0040, // directory
+         FILE_READ_ATTRIBUTES = 0x0080, // all
+         FILE_WRITE_ATTRIBUTES = 0x0100, // all
+
+         //
+         // Generic Section
+         //
+
+         GenericRead = 0x80000000,
+         GenericWrite = 0x40000000,
+         GenericExecute = 0x20000000,
+         GenericAll = 0x10000000,
+
+         SPECIFIC_RIGHTS_ALL = 0x00FFFF,
+
+         FILE_ALL_ACCESS =
+            StandardRightsRequired |
+            Synchronize |
+            0x1FF,
+
+         FILE_GENERIC_READ =
+            StandardRightsRead |
+            FILE_READ_DATA |
+            FILE_READ_ATTRIBUTES |
+            FILE_READ_EA |
+            Synchronize,
+
+         FILE_GENERIC_WRITE =
+            StandardRightsWrite |
+            FILE_WRITE_DATA |
+            FILE_WRITE_ATTRIBUTES |
+            FILE_WRITE_EA |
+            FILE_APPEND_DATA |
+            Synchronize,
+
+         FILE_GENERIC_EXECUTE =
+            StandardRightsExecute |
+            FILE_READ_ATTRIBUTES |
+            FILE_EXECUTE |
+            Synchronize
+      }
+
+      // ReSharper restore UnusedMember.Global
+
+      #endregion Create File
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool GetFileInformationByHandle(SafeFileHandle hFile, [MarshalAs(UnmanagedType.Struct)] ref BY_HANDLE_FILE_INFORMATION lpFileInformation);
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, BestFitMapping = false)]
+      private static extern int GetFullPathNameW(string path, int numBufferChars, StringBuilder buffer, IntPtr mustBeZero);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool SetEndOfFile(SafeFileHandle hFile);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool FlushFileBuffers(SafeFileHandle hFile);
+
+      [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+      private static extern int SetFilePointer(SafeFileHandle hFile, int lDistanceToMove, ref int lpDistanceToMoveHigh, SeekOrigin dwMoveMethod);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool WriteFile(SafeFileHandle handle, [In] byte[] lpBuffer,
+                                          [In] UInt32 numBytesToWrite, out UInt32 lpNumBytesWritten, [In] IntPtr lpOverlapped);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool ReadFile(SafeFileHandle handle, [Out] byte[] lpBuffer,
+                                         [In] UInt32 numBytesToRead, out UInt32 lpNumBytesRead_mustBeZero, [In] IntPtr overlapped);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool SetFileTime(SafeFileHandle hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);
+
+      // http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx
+      [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool GetFileAttributesEx(string lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, out WIN32_FILE_ATTRIBUTE_DATA lpFileInformation);
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool GetVolumeNameForVolumeMountPointW(string lpszVolumeMountPoint, [Out] StringBuilder lpszVolumeName,
+                                                                   uint cchBufferLength);
+
+      [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool SetFileAttributesW(string name, FileAttributes attr);
+
+      // Stolen from
+      // ReSharper disable MemberCanBePrivate.Local
+      [StructLayout(LayoutKind.Sequential, Pack = 4)]
+      private struct WIN32_FILE_ATTRIBUTE_DATA
+      {
+         public uint dwFileAttributes;
+         public WIN32_FIND_FILETIME ftCreationTime;
+         public WIN32_FIND_FILETIME ftLastAccessTime;
+         public WIN32_FIND_FILETIME ftLastWriteTime;
+         public uint nFileSizeHigh;
+         public uint nFileSizeLow;
+
+         [SecurityCritical]
+         internal void PopulateFrom(BY_HANDLE_FILE_INFORMATION findData)
+         {
+            dwFileAttributes = findData.dwFileAttributes;
+            ftCreationTime = findData.ftCreationTime;
+            ftLastAccessTime = findData.ftLastAccessTime;
+            ftLastWriteTime = findData.ftLastWriteTime;
+            nFileSizeHigh = findData.nFileSizeHigh;
+            nFileSizeLow = findData.nFileSizeLow;
+         }
+      }
+
+      // ReSharper restore MemberCanBePrivate.Local
+
+      // ReSharper disable UnusedMember.Local
+      private enum GET_FILEEX_INFO_LEVELS
+      {
+         GetFileExInfoStandard,
+         GetFileExMaxInfoLevel
+      }
+
+      // ReSharper restore UnusedMember.Local
+
+      [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool PathIsDirectoryEmptyW([MarshalAs(UnmanagedType.LPWStr), In] string pszPath);
+
+      private const int MAX_PATH = 260;
+
+      // ReSharper disable UnusedMember.Local
+#pragma warning disable 169
+#pragma warning disable 414
+      private static readonly int MaxLongPath = 32000;
+
+      private static readonly string Prefix = "\\\\?\\";
+#pragma warning restore 414
+#pragma warning restore 169
+      // ReSharper restore UnusedMember.Local
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool RemoveDirectory(string path);
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, BestFitMapping = false)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr), In] string path);
+
+      #endregion DLL Imports
+
+      /// <summary>
+      /// Stores the user side process ID
+      /// </summary>
+      public int ProcessID { get; set; }
+
+      private int openCount;
+
+      /// <summary>
+      /// Increment the open counter (for internal usage)
+      /// </summary>
+      /// <returns></returns>
+      public int IncrementOpenCount()
+      {
+         return Interlocked.Increment(ref openCount);
+      }
+
+      /// <summary>
+      /// Decrement the counter (for internal usage)
+      /// </summary>
+      /// <returns>The value after the decrement</returns>
+      public int DecrementOpenCount()
+      {
+         return Interlocked.Decrement(ref openCount);
+      }
+
+      [Flags]
+      // ReSharper disable UnusedMember.Local
+      private enum DuplicateOptions : uint
+      {
+         DUPLICATE_CLOSE_SOURCE = (0x00000001),// Closes the source handle. This occurs regardless of any error status returned.
+         DUPLICATE_SAME_ACCESS = (0x00000002), //Ignores the dwDesiredAccess parameter. The duplicate handle has the same access as the source handle.
+      }
+
+      // ReSharper restore UnusedMember.Local
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool DuplicateHandle([In] IntPtr hSourceProcessHandle, [In] SafeFileHandle hSourceHandle,
+        [In] IntPtr hTargetProcessHandle, out SafeFileHandle lpTargetHandle,
+        [In] uint dwDesiredAccess, [In]  [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, [In] DuplicateOptions dwOptions);
+
+      public static NativeFileOps DuplicateHandle(NativeFileOps sourceHandle)
+      {
+         IntPtr currentProcess = Process.GetCurrentProcess().Handle;
+         SafeFileHandle lpTargetHandle;
+         if (!DuplicateHandle(currentProcess, sourceHandle.handle, currentProcess,
+                  out lpTargetHandle, 0, false, DuplicateOptions.DUPLICATE_SAME_ACCESS))
+         {
+            throw new Win32Exception();
+         }
+         return new NativeFileOps(sourceHandle.FullName, lpTargetHandle, sourceHandle.ForceUseAsReadOnly);
+      }
+
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LowLevelOSAccess/NfsSupport.cs b/LiquesceSvc/LowLevelOSAccess/NfsSupport.cs
new file mode 100644
index 0000000..72cf9fe
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/NfsSupport.cs
@@ -0,0 +1,246 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Runtime.InteropServices;
+
+using Microsoft.Win32.SafeHandles;
+using NLog;
+
+namespace LiquesceSvc.LowLevelOSAccess
+{
+   internal static class NfsSupport
+   {
+      private static readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      #region GetByFileId Stuff
+
+      private const uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;
+
+      /// <summary>
+      /// Calls the necessary function to find the Filename from the Id
+      /// stolen from the Mapper example application and code from http://www.osronline.com/showThread.cfm?link=123420
+      /// </summary>
+      /// <param name="rootToCheck"></param>
+      /// <param name="fileId"></param>
+      /// <returns> string.Empty for nothing found</returns>
+      public static string GetByFileId(string rootToCheck, long fileId)
+      {
+         // Create them externally so that they can be tidied up in the finally statement.
+         SafeFileHandle rootHandle = null;
+         SafeFileHandle fileHandle = null;
+
+         try
+         {
+            const string urlString = @"\\.\";
+            rootToCheck = urlString + rootToCheck;
+            rootHandle = CreateFileW(rootToCheck, 0,
+               FileShare.ReadWrite | FileShare.Delete,
+               IntPtr.Zero,
+               FileMode.Open,
+               FILE_FLAG_BACKUP_SEMANTICS,
+               IntPtr.Zero);
+            if (rootHandle.IsInvalid)
+            {
+               throw new Win32Exception();
+            }
+
+            using (HGlobal fileIdBuffer = new HGlobal(Marshal.SizeOf(fileId)))
+            {
+               Marshal.WriteInt64(fileIdBuffer, fileId);
+
+               UNICODE_STRING name = new UNICODE_STRING();
+               name.Length = name.MaximumLength = 8;
+               name.Buffer = fileIdBuffer;
+
+               using (HGlobal nameBuffer = new HGlobal(Marshal.SizeOf(name)))
+               {
+                  Marshal.StructureToPtr(name, nameBuffer, false);
+
+                  OBJECT_ATTRIBUTES objAttributes = new OBJECT_ATTRIBUTES();
+                  objAttributes.Length = (uint)Marshal.SizeOf(objAttributes);
+                  objAttributes.ObjectName = nameBuffer;
+                  objAttributes.RootDirectory = rootHandle.DangerousGetHandle();
+                  objAttributes.Attributes = 0;
+                  objAttributes.SecurityDescriptor = IntPtr.Zero;
+                  objAttributes.SecurityQualityOfService = IntPtr.Zero;
+
+                  IO_STATUS_BLOCK iosb = new IO_STATUS_BLOCK();
+
+                  uint status = NtOpenFile(out fileHandle,
+                     (uint)NativeFileOps.EFileAccess.FILE_READ_ATTRIBUTES,
+                     ref objAttributes,
+                     ref iosb,
+                     FileShare.ReadWrite,
+                     0x00002000 //FILE_OPEN_BY_FILE_ID
+                     );
+                  if (status != 0)
+                  {
+                     int win32Error = (int)LsaNtStatusToWinError(status);
+                     throw new Win32Exception(win32Error);
+                  }
+               }
+            }
+
+            const int fileNameInfoBufferSize = 512;
+
+            using (HGlobal fileNameInfoBuffer = new HGlobal(fileNameInfoBufferSize))
+            {
+               if (!GetFileInformationByHandleEx(fileHandle, FILE_INFO_BY_HANDLE_CLASS.FileNameInfo,
+                  fileNameInfoBuffer,
+                  fileNameInfoBufferSize))
+               {
+                  throw new Win32Exception();
+               }
+
+               // Get data from the output buffer
+               int dataLength = Marshal.ReadInt32(fileNameInfoBuffer);
+               IntPtr stringOffset = new IntPtr(((IntPtr)fileNameInfoBuffer).ToInt32() + sizeof(int));
+               string filePath = Marshal.PtrToStringUni(stringOffset, dataLength / sizeof(char));
+               // File path also contains root part of mRootPath (without drive letter).
+               // Remove it.
+               const string driveColon = "X:";
+               return filePath.Substring(rootToCheck.Length - driveColon.Length);
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.InfoException(string.Format("GetByFileId could not open [{0}]", rootToCheck), ex);
+            return string.Empty;
+         }
+         finally
+         {
+            try
+            {
+               if (fileHandle != null)
+               {
+                  fileHandle.Close();
+               }
+               if (rootHandle != null)
+               {
+                  rootHandle.Close();
+               }
+            }
+            catch (Exception e)
+            {
+               Log.ErrorException("GetByFileId finally threw:", e);
+            }
+         }
+      }
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall,
+   SetLastError = true)]
+      private static extern SafeFileHandle CreateFileW(
+         string lpFileName,
+         uint dwDesiredAccess,
+         FileShare dwShareMode,
+         IntPtr SecurityAttributes,
+         FileMode dwCreationDisposition,
+         uint dwFlagsAndAttributes,
+         IntPtr hTemplateFile
+         );
+
+      [StructLayout(LayoutKind.Sequential, Pack = 4)]
+      private struct OBJECT_ATTRIBUTES
+      {
+         internal uint Length;
+         internal IntPtr RootDirectory;
+         internal IntPtr ObjectName;
+         internal uint Attributes;
+         internal IntPtr SecurityDescriptor;
+         internal IntPtr SecurityQualityOfService;
+      };
+
+      [StructLayout(LayoutKind.Sequential, Pack = 4)]
+      private struct UNICODE_STRING
+      {
+         internal ushort Length;
+         internal ushort MaximumLength;
+         internal IntPtr Buffer;
+      };
+
+      [StructLayout(LayoutKind.Sequential, Pack = 4)]
+      private struct IO_STATUS_BLOCK
+      {
+         private readonly uint Status;
+         private readonly ulong information;
+      }
+
+      [DllImport("ntdll.dll", ExactSpelling = true, SetLastError = false)]
+      private static extern uint NtOpenFile(
+          out  SafeFileHandle FileHandle,
+          uint DesiredAccess,
+          ref OBJECT_ATTRIBUTES ObjectAttributes,
+          ref IO_STATUS_BLOCK IoStatusBlock,
+          FileShare ShareAccess,
+          uint OpenOptions
+          );
+
+      // ReSharper disable UnusedMember.Local
+      private enum FILE_ID_TYPE
+      {
+         FileIdType,
+         MaximumFileIdType
+      }
+
+      // ReSharper disable NotAccessedField.Local
+      private struct FILE_ID_DESCRIPTOR
+      {
+         private UInt32 dwSize;  // Size of the struct
+         private FILE_ID_TYPE Type; // Describes the type of identifier passed in. 0 == Use the FileId member of the union.
+         private Int64 FileId;   // A EXT_FILE_ID_128 structure containing the 128-bit file ID of the file. This is used on ReFS file systems.
+
+         public FILE_ID_DESCRIPTOR(uint dwSize, FILE_ID_TYPE type, long fileId)
+            : this()
+         {
+            this.dwSize = dwSize;
+            Type = type;
+            FileId = fileId;
+         }
+      };
+
+      // ReSharper restore NotAccessedField.Local
+      // ReSharper restore UnusedMember.Local
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+      private static extern SafeFileHandle OpenFileById(
+         SafeFileHandle hVolumeHint,
+         FILE_ID_DESCRIPTOR lpFileId,
+         UInt32 dwDesiredAccess,
+         UInt32 dwShareMode,
+         IntPtr lpSecurityAttributes, // Reserved.
+         UInt32 dwFlagsAndAttributes
+         );
+
+      [DllImport("Advapi32.dll", ExactSpelling = true, SetLastError = false)]
+      private static extern uint LsaNtStatusToWinError(uint Status);
+
+      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+      // ReSharper disable UnusedMember.Local
+      private struct FILE_NAME_INFO
+      {
+         internal UInt32 FileNameLength;
+
+         [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)]
+         internal string FileName;
+      }
+
+      private enum FILE_INFO_BY_HANDLE_CLASS
+      {
+         FileNameInfo = 2,
+         FileIdBothDirectoryInfo = 10
+      }
+
+      // ReSharper restore UnusedMember.Local
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool GetFileInformationByHandleEx(
+          SafeFileHandle FileHandle,
+          FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
+          IntPtr FileInformation,
+          uint BufferSize
+          );
+
+      #endregion GetByFileId Stuff
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LowLevelOSAccess/ProcessExtensions.cs b/LiquesceSvc/LowLevelOSAccess/ProcessExtensions.cs
new file mode 100644
index 0000000..d14feae
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/ProcessExtensions.cs
@@ -0,0 +1,173 @@
+//-----------------------------------------------------------------------
+// <copyright file="ProcessExtensions.cs" company="DockOfTheBay">
+//     http://dotbay.blogspot.com/2009/06/finding-owner-of-process-in-c.html
+//    Modification by Simon Coghlan (Aka Smurf-IV)
+// </copyright>
+// <summary>Defines the ProcessExtensions class.</summary>
+//-----------------------------------------------------------------------
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+using System.Security.Principal;
+
+// ProcessExtensions.cs(15,40): warning CS0618: 'System.Security.Permissions.SecurityAction.RequestMinimum' is obsolete: 'Assembly level declarative security is obsolete and is no longer enforced by the CLR by default.
+// [assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
+// [assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
+namespace LiquesceSvc
+{
+   // If you incorporate this code into a DLL, be sure to demand FullTrust.
+   //[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
+   public static class ProcessExtensions
+   {
+      private static readonly bool isWinVistaOrHigher = IsWinVistaOrHigher();
+
+      private static bool IsWinVistaOrHigher()
+      {
+         OperatingSystem OS = Environment.OSVersion;
+         return (OS.Platform == PlatformID.Win32NT) && (OS.Version.Major >= 6);
+      }
+
+      /// <summary>
+      /// Returns the WindowsIdentity associated to a Process
+      /// </summary>
+      /// <param name="process">The Windows Process.</param>
+      /// <returns>The WindowsIdentity of the Process.</returns>
+      /// <remarks>Be prepared for 'Access Denied' Exceptions</remarks>
+      [SecuritySafeCritical]
+      [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+      [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlPrincipal)]
+      [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
+      public static WindowsIdentity WindowsIdentity(this Process process)
+      {
+         IntPtr ph = IntPtr.Zero;
+         IntPtr dupeTokenHandle = IntPtr.Zero;
+         IntPtr hprocess = IntPtr.Zero;
+
+         try
+         {
+            WindowsIdentity wi;
+            // If you absolutely need every process identity without exception or guesswork, you’ll need to run this code under an NT Service running as System.
+            // process.Handle fails for applications like MsMpEng on Windows 8.1
+            // So get a handle that hard way ! http://www.aboutmycode.com/net-framework/how-to-get-elevated-process-path-in-net/
+            hprocess = OpenProcess((isWinVistaOrHigher ? ProcessAccessFlags.QueryLimitedInformation : ProcessAccessFlags.QueryInformation), false, process.Id);
+
+            // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
+            if (OpenProcessToken(hprocess, TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY, out ph))
+            {
+               // Hint of Duplicate handle from
+               // http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.impersonate%28v=vs.71%29.aspx
+               wi = new WindowsIdentity(DuplicateToken(ph, SecurityImpersonationLevel.SecurityImpersonation, ref dupeTokenHandle) ? dupeTokenHandle : ph);
+            }
+            else
+            {
+               // Might be running under a console app without the correct permissions
+               wi = System.Security.Principal.WindowsIdentity.GetCurrent();
+            }
+            return wi;
+         }
+         finally
+         {
+            if (dupeTokenHandle != IntPtr.Zero)
+               CloseHandle(dupeTokenHandle);
+
+            if (ph != IntPtr.Zero)
+               CloseHandle(ph);
+
+            if (hprocess != IntPtr.Zero)
+               CloseHandle(hprocess);
+         }
+      }
+
+      [Flags]
+      private enum ProcessAccessFlags : uint
+      {
+         // ReSharper disable UnusedMember.Local
+         All = 0x001F0FFF,  // This is the default used by the Process class
+
+         Terminate = 0x00000001,
+         CreateThread = 0x00000002,
+         VMOperation = 0x00000008,
+         VMRead = 0x00000010,
+         VMWrite = 0x00000020,
+         DupHandle = 0x00000040,
+         SetInformation = 0x00000200,
+         QueryInformation = 0x00000400,
+         QueryLimitedInformation = 0x00001000,  // Windows Server 2003 and Windows XP:  This access right is not supported.
+         Synchronize = 0x00100000
+         // ReSharper restore UnusedMember.Local
+      }
+
+      [DllImport("kernel32.dll")]
+      private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
+
+      // ReSharper disable UnusedMember.Local
+      private const uint STANDARD_RIGHTS_REQUIRED = 0x000F0000;
+
+      private const uint STANDARD_RIGHTS_READ = 0x00020000;
+      private const uint TOKEN_ASSIGN_PRIMARY = 0x0001;
+      private const uint TOKEN_DUPLICATE = 0x0002;
+      private const uint TOKEN_IMPERSONATE = 0x0004;
+      private const uint TOKEN_QUERY = 0x0008;
+      private const uint TOKEN_QUERY_SOURCE = 0x0010;
+      private const uint TOKEN_ADJUST_PRIVILEGES = 0x0020;
+      private const uint TOKEN_ADJUST_GROUPS = 0x0040;
+      private const uint TOKEN_ADJUST_DEFAULT = 0x0080;
+      private const uint TOKEN_ADJUST_SESSIONID = 0x0100;
+      private const uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);
+
+      private const uint TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY |
+          TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE |
+          TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT |
+          TOKEN_ADJUST_SESSIONID);
+
+      // ReSharper restore UnusedMember.Local
+
+      [DllImport("advapi32.dll", SetLastError = true)]
+      private static extern bool OpenProcessToken(IntPtr processHandle, uint desiredAccess, out IntPtr tokenHandle);
+
+      [DllImport("kernel32.dll", SetLastError = true)]
+      [return: MarshalAs(UnmanagedType.Bool)]
+      private static extern bool CloseHandle(IntPtr hObject);
+
+      private enum SecurityImpersonationLevel
+      {
+         // ReSharper disable UnusedMember.Local
+
+         /// <summary>
+         /// The server process cannot obtain identification information about the client,
+         /// and it cannot impersonate the client. It is defined with no value given, and thus,
+         /// by ANSI C rules, defaults to a value of zero.
+         /// </summary>
+         SecurityAnonymous = 0,
+
+         /// <summary>
+         /// The server process can obtain information about the client, such as security identifiers and privileges,
+         /// but it cannot impersonate the client. This is useful for servers that export their own objects,
+         /// for example, database products that export tables and views.
+         /// Using the retrieved client-security information, the server can make access-validation decisions without
+         /// being able to use other services that are using the client's security context.
+         /// </summary>
+         SecurityIdentification = 1,
+
+         /// <summary>
+         /// The server process can impersonate the client's security context on its local system.
+         /// The server cannot impersonate the client on remote systems.
+         /// </summary>
+         SecurityImpersonation = 2,
+
+         /// <summary>
+         /// The server process can impersonate the client's security context on remote systems.
+         /// NOTE: Windows NT:  This impersonation level is not supported.
+         /// </summary>
+         SecurityDelegation = 3,
+
+         // ReSharper restore UnusedMember.Local
+      }
+
+      [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+      private extern static bool DuplicateToken(IntPtr ExistingTokenHandle, SecurityImpersonationLevel SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LowLevelOSAccess/ProcessIdentity.cs b/LiquesceSvc/LowLevelOSAccess/ProcessIdentity.cs
new file mode 100644
index 0000000..3fad2da
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/ProcessIdentity.cs
@@ -0,0 +1,175 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ProcessIdentity.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2011-2012 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Security.Principal;
+using NLog;
+
+namespace LiquesceSvc
+{
+   internal static class ProcessIdentity
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+      private static readonly CacheHelper<int, WindowsIdentity> cacheProcessIdToWi = new CacheHelper<int, WindowsIdentity>(60);
+      private static readonly uint systemProcessId = GetSystemProcessId();
+
+      /// <summary>
+      /// Find the System.exe ID to prevent impersonation of it.
+      /// This is to workaround the impersonation of a user coming over the share access
+      /// </summary>
+      /// <exception cref="SystemException">thrown if system.exe is not found</exception>
+      /// <returns>systemProcessId</returns>
+      private static uint GetSystemProcessId()
+      {
+         Process[] processesByName = Process.GetProcessesByName("System");
+         try
+         {
+            if (processesByName.Any())
+            {
+               return (uint) processesByName[0].Id;
+            }
+         }
+         finally
+         {
+            foreach (Process process in processesByName)
+            {
+               // Be nice to system resources !
+               process.Dispose();
+            }
+         }
+         throw new SystemException("Unable to identify System.exe process ID");
+      }
+
+      /// <summary>
+      /// Pass in the processID from CBFS and the Anonymouse delegate Action.
+      /// </summary>
+      /// <param name="processId"></param>
+      /// <param name="act"></param>
+      /// <remarks>
+      /// If the process is the System.exe, then this has probably come over the SMB2 or other network protocol.
+      /// Which means that it will have checked the access permissions for whatever the action is going to be.
+      /// http://msdn.microsoft.com/en-us/library/gg465326%28v=PROT.10%29.aspx
+      /// </remarks>
+      static public void Invoke(int processId, Action act)
+      {
+         if (CouldBeSMB(processId))
+         {
+            act();
+         }
+         else
+         {
+            using (InvokeHelper(processId))
+            {
+               act();
+            }
+         }
+      }
+
+      /// <summary>
+      /// Does the processID match the system ID ?
+      /// </summary>
+      /// <param name="processId"></param>
+      /// <returns></returns>
+      private static bool CouldBeSMB(int processId)
+      {
+         return (systemProcessId == processId);
+      }
+
+      public static string GetProcessName(int processId)
+      {
+         using (Process ownerProcess = Process.GetProcessById(processId))
+         {
+            return ownerProcess.ProcessName;
+         }
+      }
+
+      private static WindowsImpersonationContext InvokeHelper(int processId)
+      {
+         WindowsIdentity wi = FindWindowsIdentity(processId);
+         return wi.Impersonate();
+      }
+
+      private static WindowsIdentity FindWindowsIdentity(int processId)
+      {
+         if (processId == 0)
+         {
+            throw new Win32Exception(1314); // ERROR_PRIVILEGE_NOT_HELD
+         }
+         // To minimise the cache footrint.. All that is needed is the WindowsIdentity from the process
+         WindowsIdentity wi;
+         if (!cacheProcessIdToWi.TryGetValue(processId, out wi))
+         {
+            using (Process ownerProcess = Process.GetProcessById(processId))
+            {
+               Log.Info("Obtaining processName [{0}] from ID of [{1}]", ownerProcess.ProcessName, processId);
+               wi = ownerProcess.WindowsIdentity();
+               cacheProcessIdToWi[processId] = wi;
+            }
+         }
+         else
+         {
+            cacheProcessIdToWi.Touch(processId);
+         }
+         return wi;
+      }
+
+      public static uint CheckForNTAuthority(uint processId)
+      {
+         if (processId == systemProcessId)
+         {
+            return systemProcessId;
+         }
+         WindowsIdentity wi = FindWindowsIdentity((int) processId);
+         return (wi.IsSystem) ? systemProcessId : processId;
+         // Alternate method if the "Cached way above doe snot yield the correct results
+         // This by it's nature is painfully slow !
+         //string query = "Select * From Win32_Process Where ProcessID = " + processId;
+         //ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
+         //ManagementObjectCollection processList = searcher.Get();
+
+         //foreach (ManagementObject obj in processList.Cast<ManagementObject>())
+         //{
+         //   object[] argList = { string.Empty, string.Empty };
+         //   int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList));
+         //   if (returnVal == 0)
+         //   {
+         //      // return DOMAIN\user
+         //      return (argList[1].ToString() == "NT AUTHORITY")
+         //             && (argList[0].ToString() == "SYSTEM")
+         //                ? 4
+         //                : processId;
+         //   }
+         //}
+
+         //return processId;
+      }
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/LowLevelOSAccess/SafeHGlobalHandle.cs b/LiquesceSvc/LowLevelOSAccess/SafeHGlobalHandle.cs
new file mode 100644
index 0000000..f8a2290
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/SafeHGlobalHandle.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Runtime.ConstrainedExecution;
+using System.Runtime.InteropServices;
+
+namespace LiquesceSvc
+{
+   /// <summary>
+   /// A <see cref="SafeHandle"/> for a global memory allocation.
+   /// </summary>
+   public sealed class SafeHGlobalHandle : SafeHandle
+   {
+      /// <summary>
+      /// Initializes a new instance of the <see cref="SafeHGlobalHandle"/> class.
+      /// </summary>
+      /// <param name="toManage"> The initial handle value. </param>
+      /// <param name="size">The size of this memory block, in bytes.</param>
+      [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
+      private SafeHGlobalHandle(IntPtr toManage, uint size)
+         : base(IntPtr.Zero, true)
+      {
+         Size = size;
+         SetHandle(toManage);
+      }
+
+      /// <summary>
+      /// Initializes a new instance of the <see cref="SafeHGlobalHandle"/> class.
+      /// </summary>
+      private SafeHGlobalHandle()
+         : base(IntPtr.Zero, true)
+      {
+      }
+
+
+      #region Properties
+
+      /// <summary>
+      /// Gets a value indicating whether the handle value is invalid.
+      /// </summary>
+      /// <value>true if the handle value is invalid; otherwise, false</value>
+      public override bool IsInvalid
+      {
+         get { return IntPtr.Zero == handle; }
+      }
+
+      /// <summary>
+      /// Returns the size of this memory block.
+      /// </summary>
+      /// <value>The size of this memory block, in bytes.</value>
+      public uint Size { get; private set; }
+
+      #endregion
+
+      #region Methods
+
+      /// <summary>
+      /// Allocates memory from the unmanaged memory of the process using GlobalAlloc.
+      /// </summary>
+      /// <param name="bytes">The number of bytes in memory required.</param>
+      /// <returns>A SafeHGlobalHandle representing the memory.</returns>
+      /// <exception cref="OutOfMemoryException">There is insufficient memory to satisfy the request.</exception>
+      public static SafeHGlobalHandle Allocate(uint bytes)
+      {
+         return new SafeHGlobalHandle(Marshal.AllocHGlobal((int) bytes), bytes);
+      }
+
+      /// <summary>
+      /// Returns an invalid handle.
+      /// </summary>
+      /// <returns>An invalid SafeHGlobalHandle.</returns>
+      public static SafeHGlobalHandle Invalid()
+      {
+         return new SafeHGlobalHandle();
+      }
+
+      /// <summary>
+      /// Executes the code required to free the handle.
+      /// </summary>
+      /// <returns>
+      /// true if the handle is released successfully;
+      /// otherwise, in the event of a catastrophic failure, false.
+      /// In this case, it generates a releaseHandleFailed MDA Managed Debugging Assistant.
+      /// </returns>
+      protected override bool ReleaseHandle()
+      {
+         Marshal.FreeHGlobal(handle);
+         return true;
+      }
+
+      #endregion
+   }
+}
diff --git a/LiquesceSvc/LowLevelOSAccess/Win32Structs.cs b/LiquesceSvc/LowLevelOSAccess/Win32Structs.cs
new file mode 100644
index 0000000..f9a8f12
--- /dev/null
+++ b/LiquesceSvc/LowLevelOSAccess/Win32Structs.cs
@@ -0,0 +1,126 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Win32Structs.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2013 Smurf-IV
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace LiquesceSvc
+{
+
+   ////
+   /// <summary>
+   /// Structure used for Windows API calls related to file information.
+   /// </summary>
+   /// <remarks>
+   /// Workaround from http://www.pinvoke.net/default.aspx/Structures/WIN32_FIND_DATA.html
+   /// </remarks>
+   // ReSharper disable FieldCanBeMadeReadOnly.Global
+   [StructLayout(LayoutKind.Sequential, Pack = 4)]
+   public struct WIN32_FIND_FILETIME
+   {
+      public UInt32 dwLowDateTime;
+      public UInt32 dwHighDateTime;
+   }
+   // ReSharper restore FieldCanBeMadeReadOnly.Global
+
+   /// <summary>
+   /// http://msdn.microsoft.com/en-us/library/aa363788%28VS.85%29.aspx
+   /// </summary>
+   // ReSharper disable FieldCanBeMadeReadOnly.Global
+   [StructLayout(LayoutKind.Sequential, Pack = 4)]
+   public struct BY_HANDLE_FILE_INFORMATION
+   {
+      public uint dwFileAttributes;
+      public WIN32_FIND_FILETIME ftCreationTime;
+      public WIN32_FIND_FILETIME ftLastAccessTime;
+      public WIN32_FIND_FILETIME ftLastWriteTime;
+      public uint dwVolumeSerialNumber;
+      public uint nFileSizeHigh;
+      public uint nFileSizeLow;
+      public uint dwNumberOfLinks;
+      public uint nFileIndexHigh;
+      public uint nFileIndexLow;
+   }
+   // ReSharper restore FieldCanBeMadeReadOnly.Global
+
+   // ReSharper disable FieldCanBeMadeReadOnly.Global
+   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)]
+   public struct WIN32_FIND_DATA
+   {
+      public uint dwFileAttributes;
+      public WIN32_FIND_FILETIME ftCreationTime;
+      public WIN32_FIND_FILETIME ftLastAccessTime;
+      public WIN32_FIND_FILETIME ftLastWriteTime;
+      public uint nFileSizeHigh;
+      public uint nFileSizeLow;
+      private readonly uint dwReserved0;
+      private readonly uint dwReserved1;
+      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
+      public string cFileName;
+      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] public readonly string cAlternateFileName;
+   }
+   // ReSharper restore FieldCanBeMadeReadOnly.Global
+
+   // ReSharper disable UnusedMember.Global
+   // http://msdn.microsoft.com/en-us/library/windows/desktop/aa362667(v=vs.85).aspx
+   public enum FileStreamType
+   {
+      Data = 1,
+      ExternalData = 2,
+      SecurityData = 3,
+      AlternateData = 4,
+      Link = 5,
+      PropertyData = 6,
+      ObjectID = 7,
+      ReparseData = 8,
+      SparseDock = 9,
+      BACKUP_TXFS_DATA  // Transactional NTFS (TxF) data stream. This corresponds to the NTFS $TXF_DATA stream type.
+   }
+   [Flags]
+   public enum FileStreamAttributes
+   {
+      None = 0,
+      ModifiedWhenRead = 1,
+      ContainsSecurity = 2,
+      ContainsProperties = 4,
+      Sparse = 8,
+   }
+   // ReSharper restore UnusedMember.Global
+
+   // ReSharper disable FieldCanBeMadeReadOnly.Global
+   [StructLayout(LayoutKind.Sequential, Pack = 4)]
+   public struct WIN32_STREAM_ID
+   {
+      public UInt32 dwStreamType;
+      public UInt32 dwStreamAttributes;
+      public long Size;
+      public UInt32 dwStreamNameSize;
+      // WCHAR cStreamName[1]; 
+   }
+   // ReSharper restore FieldCanBeMadeReadOnly.Global
+
+
+}
\ No newline at end of file
diff --git a/LiquesceSvc/ManagementLayer.cs b/LiquesceSvc/ManagementLayer.cs
index 7df24ef..26e9fa4 100644
--- a/LiquesceSvc/ManagementLayer.cs
+++ b/LiquesceSvc/ManagementLayer.cs
@@ -1,30 +1,54 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ManagementLayer.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
 using System.Collections.Generic;
-using System.ComponentModel.Composition;
-using System.ComponentModel.Composition.Hosting;
 using System.IO;
 using System.Linq;
 using System.Reflection;
 using System.ServiceModel;
 using System.Threading;
-using System.Xml.Serialization;
-using DokanNet;
+
+using CallbackFS;
+using CBFS;
 using LiquesceFacade;
-using LiquesceSvc.Properties;
-using LiquesceSvcMEF;
+using Microsoft.Win32;
 using NLog;
 using NLog.Config;
 
 namespace LiquesceSvc
 {
-   class ManagementLayer
+   internal class ManagementLayer
    {
       static private readonly Logger Log = LogManager.GetCurrentClassLogger();
       private static ManagementLayer instance;
       private ConfigDetails currentConfigDetails;
       private readonly DateTime startTime;
-      private readonly string configFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "LiquesceSvc", Settings1.Default.ConfigFileName);
-      private char mountedDriveLetter;
       private LiquesceSvcState state = LiquesceSvcState.Stopped;
       private static readonly Dictionary<Client, IStateChange> subscribers = new Dictionary<Client, IStateChange>();
       private static readonly ReaderWriterLockSlim subscribersLock = new ReaderWriterLockSlim();
@@ -37,34 +61,6 @@ public static ManagementLayer Instance
          get { return instance ?? (instance = new ManagementLayer()); }
       }
 
-
-      [ImportMany(typeof(ICreateFactory))]
-      public IEnumerable<Lazy<ICreateFactory, IDescription>> pluginProviders;
-
-      private void DoImport()
-      {
-         //An aggregate catalog that combines multiple catalogs
-         //Adds all the parts found in all assemblies in the same directory as the executing program
-         var catalog = new SafeDirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
-
-         //Create the CompositionContainer with the parts in the catalog
-         CompositionContainer container = new CompositionContainer(catalog);
-
-         //Fill the imports of this object
-         container.ComposeParts(this);
-         foreach (Lazy<ICreateFactory, IDescription> plugin in pluginProviders)
-         {
-            try 
-            {
-               var val = plugin.Value;
-            }
-            catch (CompositionException ex)
-            {
-               Log.ErrorException("pluginProviders have an invalid value: ", ex);
-            }
-         }   
-      }
-
       /// <summary>
       /// Private constructor to prevent multiple instances
       /// </summary>
@@ -74,7 +70,6 @@ private ManagementLayer()
          {
             Log.Debug("New ManagementLayer created.");
             startTime = DateTime.UtcNow;
-            DoImport();
          }
          catch (Exception ex)
          {
@@ -82,13 +77,13 @@ private ManagementLayer()
          }
       }
 
-      public void Subscribe(Guid guid)
+      public void Subscribe(Client id)
       {
          try
          {
             IStateChange callback = OperationContext.Current.GetCallbackChannel<IStateChange>();
             using (subscribersLock.WriteLock())
-               subscribers.Add(new Client { id = guid }, callback);
+               subscribers.Add(id, callback);
          }
          catch (Exception ex)
          {
@@ -96,17 +91,17 @@ public void Subscribe(Guid guid)
          }
       }
 
-      public void Unsubscribe(Guid guid)
+      public void Unsubscribe(Client id)
       {
          try
          {
-            IStateChange callback = OperationContext.Current.GetCallbackChannel<IStateChange>();
-            using (subscribersLock.WriteLock())
+            using (subscribersLock.UpgradableReadLock())
             {
-               var query = from c in subscribers.Keys
-                           where c.id == guid
-                           select c;
-               subscribers.Remove(query.First());
+               IEnumerable<Client> query = from c in subscribers.Keys
+                                           where c.id == id.id
+                                           select c;
+               using (subscribersLock.WriteLock())
+                  subscribers.Remove(query.First());
             }
          }
          catch (Exception ex)
@@ -115,140 +110,152 @@ public void Unsubscribe(Guid guid)
          }
       }
 
-      // ReSharper disable MemberCanBeMadeStatic.Local
-      // This will need to be changed to be a map of drive to ops
-      public LiquesceOps dokanOperations
-      // ReSharper restore MemberCanBeMadeStatic.Local
-      {
-         get;
-         private set;
-      }
+      private readonly List<LiquesceOps> liquesceOperations = new List<LiquesceOps>();
+
       /// <summary>
-      /// Invokes DokanNet.DokanMain function to mount a drive. 
-      /// The function blocks until the file system is unmounted.
-      /// Administrator privilege is needed to communicate with Dokan driver. 
-      /// You need a manifest file for .NET application.
+      /// Mount a drive.
       /// </summary>
       /// <returns></returns>
       public void Start(object obj)
       {
          try
          {
+            TimeSpan delayStart = DateTime.UtcNow - startTime;
             int repeatWait = 0;
             while (IsRunning
                && (repeatWait++ < 100)
                )
             {
-               Log.Warn("Last Dokan is still running");
+               Log.Warn("Last CBFS is still running");
                Thread.Sleep(250);
             }
             if (!IsRunning)
             {
                if (currentConfigDetails == null)
-                  ReadConfigDetails();
-               FireStateChange(LiquesceSvcState.InError, "Starting up");
+               {
+                  new DealWithTheCfgChanging().ReadConfigDetails(ref currentConfigDetails);
+               }
+               FireStateChange(LiquesceSvcState.Unknown, "Starting up");
                if (currentConfigDetails == null)
                {
                   Log.Fatal("Unable to read the config details to allow this service to run. Will now exit");
                   Environment.Exit(-1);
-                  // ReSharper disable HeuristicUnreachableCode
-                  return;
-                  // ReSharper restore HeuristicUnreachableCode
+                  // return;
                }
-               SetNLogLevel(currentConfigDetails.ServiceLogLevel);
-
-               FireStateChange(LiquesceSvcState.Unknown, "Dokan initialised");
-               IsRunning = true;
-
-               // TODO: Search all usages of the DriveLetter and make sure they become MountPoint compatible
-               string mountPoint = currentConfigDetails.DriveLetter;
-               //if (mountPoint.Length == 1)
-               //   mountPoint += ":\\"; // Make this into a MountPoint for V 0.6.0
-               DokanOptions options = new DokanOptions
+               string friendlyName = string.Empty;
+               try
                {
-                  MountPoint = mountPoint,
-                  ThreadCount = currentConfigDetails.ThreadCount,
-                  DebugMode = currentConfigDetails.DebugMode,
-                  //      public bool UseStdErr;
-                  // UseAltStream = true, // This needs all sorts of extra API's
-                  UseKeepAlive = true,  // When you set TRUE on DokanOptions->UseKeepAlive, dokan library automatically unmounts 15 seconds after user-mode file system hanged up
-                  NetworkDrive = false,  // Set this to true to see if it stops the recycler bin question until [workitem:7253] is sorted
-                  VolumeLabel = currentConfigDetails.VolumeLabel
-               };
-
-               IServicePlugin plugin = pluginProviders.Where(pluginProvider => 0 == String.Compare(pluginProvider.Metadata.Description, currentConfigDetails.PluginMode, true)).Select(pluginProvider => pluginProvider.Value.Create()).FirstOrDefault(); 
-               plugin.Initialise(currentConfigDetails.DriveLetter, currentConfigDetails.HoldOffBufferBytes);
-               dokanOperations = new LiquesceOps(currentConfigDetails, plugin);
-               ThreadPool.QueueUserWorkItem(dokanOperations.InitialiseShares, dokanOperations);
-
-               mountedDriveLetter = currentConfigDetails.DriveLetter[0];
-
+                  RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
+                  if (rk != null)
+                  {
+                     friendlyName = rk.GetValue("ProductName").ToString();
+                  }
+               }
+               catch { }
+               Log.Info("OSVersion [{0}], OSFriendlyName [{1}] Is64BitOperatingSystem [{2}]", 
+                  Environment.OSVersion.VersionString, friendlyName, Environment.Is64BitOperatingSystem);
+               Log.Info("ProcessorCount [{0}] Is64BitProcess [{1}] CLR version [{2}]",
+                  Environment.ProcessorCount, Environment.Is64BitProcess, Environment.Version);
+               Log.Fatal(currentConfigDetails.ToString());
+               SetNLogLevel(currentConfigDetails.ServiceLogLevel);
 
-               try
+               // Sometimes the math gets all confused due to the casting !!
+               int delayStartMilliseconds = (int)(currentConfigDetails.DelayStartMilliSec - delayStart.Milliseconds);
+               if ((delayStartMilliseconds > 0)
+                   && (delayStartMilliseconds < UInt16.MaxValue)
+                  )
                {
-                  Log.Info("DokanVersion:[{0}], DokanDriverVersion[{1}]", Dokan.DokanVersion(), Dokan.DokanDriverVersion());
-                  Dokan.DokanUnmount(mountedDriveLetter);
+                  Log.Info("Delay Start needs to be obeyed");
+                  Thread.Sleep(delayStartMilliseconds);
                }
-               catch (Exception ex)
+
+               if (!CBFSHandlers.CheckStatus(ConfigDetails.ProductNameCBFS))
                {
-                  Log.InfoException("Make sure it's unmounted threw:", ex);
+                  FireStateChange(LiquesceSvcState.InError, "Driver is not mounted - Driver Something is wrong");
+#if DEBUG
+                  Log.Fatal("Build the mounter application and change it's private string mGuid = Guid to be LiquesceSvc");
+                  Log.Fatal("Run it as \"Administrator\" and install the driver");
+                  Log.Fatal("Press \"Install\" -> find the cab file -> answer the trust question");
+                  Log.Fatal("Wait about 30 seconds and it will then confirm the version number of the cab file selected");
+#endif
+                  Environment.Exit(-4); // Driver something wrong
+                  // return;
                }
-               int retVal = Dokan.DokanMain(options, dokanOperations);
-               Log.Warn("Dokan.DokanMain has exited");
-               IsRunning = false;
-               switch (retVal)
+
+               foreach (MountDetail mountDetail in currentConfigDetails.MountDetails)
                {
-                  case Dokan.DOKAN_SUCCESS: // = 0;
-                     FireStateChange(LiquesceSvcState.Stopped, "Dokan is not mounted");
-                     break;
-                  case Dokan.DOKAN_ERROR:// = -1; // General Error
-                     FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_ERROR] - General Error");
-                     break;
-                  case Dokan.DOKAN_DRIVE_LETTER_ERROR: // = -2; // Bad Drive letter
-                     FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_DRIVE_LETTER_ERROR] - Bad drive letter");
-                     break;
-                  case Dokan.DOKAN_DRIVER_INSTALL_ERROR: // = -3; // Can't install driver
-                     FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_DRIVER_INSTALL_ERROR]");
-                     Environment.Exit(-1);
-                     break;
-                  case Dokan.DOKAN_START_ERROR: // = -4; // Driver something wrong
-                     FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_START_ERROR] - Driver Something is wrong");
-                     Environment.Exit(-1);
-                     break;
-                  case Dokan.DOKAN_MOUNT_ERROR: // = -5; // Can't assign drive letter
-                     FireStateChange(LiquesceSvcState.InError, "Dokan is not mounted [DOKAN_MOUNT_ERROR] - Can't assign drive letter");
-                     break;
-                  default:
-                     FireStateChange(LiquesceSvcState.InError, String.Format("Dokan is not mounted [Uknown Error: {0}]", retVal));
-                     Environment.Exit(-1);
-                     break;
+                  LiquesceOps liquesceOps = new LiquesceOps(mountDetail, currentConfigDetails.CacheLifetimeSeconds);
+                  liquesceOperations.Add(liquesceOps);
+
+                  liquesceOps.RegisterAndInit(Properties.Settings.Default.Salt, ConfigDetails.ProductNameCBFS, currentConfigDetails.ThreadCount,
+                      CbFsStorageType.stDisk, false);
+                  try
+                  {
+                     // Attempt to remove a drive that may have been zombied by a crash etc.
+                     // https://www.eldos.com/forum/read.php?FID=8&TID=747
+                     // If the following blows, it means that you might be using the vshost to debug
+                     liquesceOps.AddMountingPoint(mountDetail.DriveLetter, CallbackFileSystem.CBFS_SYMLINK_MOUNT_MANAGER, 0);
+                     liquesceOps.DeleteMountingPoint();
+                     liquesceOps.DeleteStorage(true);
+                     liquesceOps.CreateStorage(CbFsStorageType.stDisk, currentConfigDetails.ThreadCount, currentConfigDetails.UseInternalDriverCaches, "Liquesce.ico");
+                  }
+                  catch (Exception ex)
+                  {
+                     Log.FatalException("Attempt to remove a drive that may have been zombied by a crash etc.", ex);
+                  }
+
+                  // Now get the drive letter ready
+                  liquesceOps.AddMountingPoint(mountDetail.DriveLetter, CallbackFileSystem.CBFS_SYMLINK_MOUNT_MANAGER, 0);
+                  ulong freeBytesAvailable;
+                  ulong totalBytes;
+                  ulong totalFreeBytes;
+                  liquesceOps.GetDiskFreeSpace(out freeBytesAvailable, out totalBytes, out totalFreeBytes);
+
+                  DirectoryInfo dir = new DirectoryInfo(mountDetail.DriveLetter);
+                  // TODO: Search all usages of the DriveLetter and make sure they become MountPoint compatible
+                  if (mountDetail.DriveLetter.Length > 1)
+                  {
+                     if (dir.Exists)
+                     {
+                        Log.Warn("Removing directory [{0}]", dir.FullName);
+                        dir.Delete(true);
+                     }
+                     Log.Warn("Recreate the directory [{0}]", dir.FullName);
+                     dir.Create();
+                  }
+
+                  ThreadPool.QueueUserWorkItem(liquesceOps.InitialiseShares);
+
+                  FireStateChange(LiquesceSvcState.Running, "Liquesce initialised");
+                  IsRunning = true;
+
+                  // now mount and this will launch the callbacks
+#if DEBUG
+                  const int ApiTimeout = 0; // This means no timeout, usefull for debugging
+#else
+               const int ApiTimeout = 32000; // Default to TCP timout of 32 seconds
+#endif
+                  liquesceOps.MountMedia(ApiTimeout);
                }
             }
             else
             {
-               FireStateChange(LiquesceSvcState.InError, "Seems like the last exit request into Dokan did not exit in time");
+               FireStateChange(LiquesceSvcState.InError, "Seems like the last exit request did not exit in time");
+               Environment.Exit(-7);
             }
          }
          catch (Exception ex)
          {
             Log.ErrorException("Start has failed in an uncontrolled way: ", ex);
-            Environment.Exit(-1);
-         }
-         finally
-         {
-            IsRunning = false;
+            Environment.Exit(-8);
          }
       }
 
       private void SetNLogLevel(string serviceLogLevel)
       {
          LoggingConfiguration currentConfig = LogManager.Configuration;
-         //LogManager.DisableLogging();
          foreach (LoggingRule rule in currentConfig.LoggingRules)
          {
-            rule.EnableLoggingForLevel(LogLevel.Fatal);
-            rule.EnableLoggingForLevel(LogLevel.Error);
-            rule.EnableLoggingForLevel(LogLevel.Info);
             // Turn on in order
             switch (serviceLogLevel)
             {
@@ -258,31 +265,56 @@ private void SetNLogLevel(string serviceLogLevel)
                default:
                case "Debug":
                   rule.EnableLoggingForLevel(LogLevel.Debug);
+                  goto case "Info"; // Drop through
+               case "Info":
+                  rule.EnableLoggingForLevel(LogLevel.Info);
                   goto case "Warn"; // Drop through
                case "Warn":
                   rule.EnableLoggingForLevel(LogLevel.Warn);
+                  goto case "Error"; // Drop through
+               case "Error":
+                  rule.EnableLoggingForLevel(LogLevel.Error);
+                  goto case "Fatal"; // Drop through
+               case "Fatal":
+                  rule.EnableLoggingForLevel(LogLevel.Fatal);
                   break;
+               //case "Off":
+               //   rule.EnableLoggingForLevel(LogLevel.Off);
+               //   break;
             }
             // Turn off the rest
             switch (serviceLogLevel)
             {
+               // rule.DisableLoggingForLevel(LogLevel.Off);
+               case "Off":
+                  rule.DisableLoggingForLevel(LogLevel.Fatal);
+                  goto case "Fatal";
+               case "Fatal":
+                  rule.DisableLoggingForLevel(LogLevel.Error);
+                  goto case "Error";
+               case "Error":
+                  rule.DisableLoggingForLevel(LogLevel.Warn);
+                  goto case "Warn";
                case "Warn":
+                  rule.DisableLoggingForLevel(LogLevel.Info);
+                  goto case "Info";
+               case "Info":
                   rule.DisableLoggingForLevel(LogLevel.Debug);
-                  goto default; // Drop through
-               default:
-                  //case "Debug":
+                  goto case "Debug";
+               case "Debug":
                   rule.DisableLoggingForLevel(LogLevel.Trace);
                   break;
+
                case "Trace":
                   // Prevent turning off again !
                   break;
             }
          }
-         //LogManager.EnableLogging();
-         //LogManager.Configuration = null;
          LogManager.ReconfigExistingLoggers();
-         //LogManager.Configuration = currentConfig;
+         Log.Fatal("Test @ [{0}]", serviceLogLevel);
+         Log.Error("Test @ [{0}]", serviceLogLevel);
          Log.Warn("Test @ [{0}]", serviceLogLevel);
+         Log.Info("Test @ [{0}]", serviceLogLevel);
          Log.Debug("Test @ [{0}]", serviceLogLevel);
          Log.Trace("Test @ [{0}]", serviceLogLevel);
       }
@@ -296,7 +328,7 @@ public ConfigDetails CurrentConfigDetails
          {
             currentConfigDetails = value;
             // I know.. Bad form calling a function in a setter !
-            WriteOutConfigDetails();
+            currentConfigDetails.WriteOutConfigDetails();
          }
       }
 
@@ -309,13 +341,23 @@ internal void FireStateChange(LiquesceSvcState newState, string message)
             using (subscribersLock.ReadLock())
             {
                // Get all the clients in dictionary
-               var query = (from c in subscribers
-                            select c.Value).ToList();
+               IStateChange[] query = (from c in subscribers
+                                       select c.Value).ToArray();
                // Create the callback action
-               Action<IStateChange> action = callback => callback.Update(newState, message);
+               Type type = typeof(IStateChange);
+               MethodInfo methodInfo = type.GetMethod("Update");
 
                // For each connected client, invoke the callback
-               query.ForEach(action);
+               foreach (IStateChange stateChange in query)
+               {
+                  try
+                  {
+                     methodInfo.Invoke(stateChange, new object[] { newState, message });
+                  }
+                  catch
+                  {
+                  }
+               }
             }
          }
          catch (Exception ex)
@@ -331,104 +373,22 @@ public LiquesceSvcState State
 
       public void Stop()
       {
-         if (IsRunning)
-         {
-            FireStateChange(LiquesceSvcState.Unknown, "Stop has been requested");
-            int retVal = Dokan.DokanUnmount(mountedDriveLetter);
-            Log.Info("Stop returned[{0}]", retVal);
-         }
-      }
-
-      public List<LanManShareDetails> GetPossibleShares()
-      {
-         // TODO: Phase 2 will have a foreach onthe drive letter
-         return (LanManShareHandler.MatchDriveLanManShares(currentConfigDetails.DriveLetter));
-      }
-
-
-      private void ReadConfigDetails()
-      {
-         try
+         foreach (LiquesceOps liquesceOps in liquesceOperations)
          {
-            InitialiseToDefault();
-            XmlSerializer x = new XmlSerializer(currentConfigDetails.GetType());
-            Log.Info("Attempting to read Dokan Drive details from: [{0}]", configFile);
-            using (TextReader textReader = new StreamReader(configFile))
-            {
-               currentConfigDetails = x.Deserialize(textReader) as ConfigDetails;
-            }
-            Log.Info("Now normalise the paths to allow the file finders to work correctly");
-            if (currentConfigDetails != null)
-            {
-               List<string> fileSourceLocations = new List<string>(currentConfigDetails.SourceLocations);
-               currentConfigDetails.SourceLocations.Clear();
-
-               fileSourceLocations.ForEach(
-                  location => currentConfigDetails.SourceLocations.Add(Path.GetFullPath(location).TrimEnd(Path.DirectorySeparatorChar)));
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("Cannot read the configDetails: ", ex);
-            currentConfigDetails = null;
-         }
-         finally
-         {
-            if (currentConfigDetails == null)
-            {
-               InitialiseToDefault();
-               if (!File.Exists(configFile))
-                  WriteOutConfigDetails();
-            }
-         }
-
-      }
-
-      private void InitialiseToDefault()
-      {
-         try
-         {
-            if (currentConfigDetails == null)
-            {
-               currentConfigDetails = new ConfigDetails
-                                         {
-                                            DebugMode = true,
-                                            DriveLetter = "N",
-                                            SourceLocations = new List<string>(1),
-                                            ThreadCount = 1,
-                                            //HoldOffBufferBytes = 1*1024*1024*1024, // ==1GB
-                                            VolumeLabel = "InternallyCreated"
-                                         };
-               currentConfigDetails.SourceLocations.Add(@"C:\");
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("Cannot create the default configDetails: ", ex);
-            currentConfigDetails = null;
-         }
-      }
-
-      private void WriteOutConfigDetails()
-      {
-         if (currentConfigDetails != null)
             try
             {
-               XmlSerializer x = new XmlSerializer(currentConfigDetails.GetType());
-               using (TextWriter textWriter = new StreamWriter(configFile))
-               {
-                  x.Serialize(textWriter, currentConfigDetails);
-               }
+               FireStateChange(LiquesceSvcState.Unknown, "Stop has been requested");
+               liquesceOps.DeleteMountingPoint();
+               liquesceOps.UnmountMedia();
             }
-            catch (Exception ex)
+            finally
             {
-               Log.ErrorException("Cannot save configDetails: ", ex);
+               liquesceOps.DeleteStorage(true);
             }
-      }
+         }
+         FireStateChange(LiquesceSvcState.Stopped, "Stop has exited");
 
-      public List<string> GetCurrentPluginModes()
-      {
-         return pluginProviders.Select(pluginProvider => pluginProvider.Metadata.Description).ToList();
+         Log.Info("Stopped OUT");
       }
    }
-}
+}
\ No newline at end of file
diff --git a/LiquesceSvc/Program.cs b/LiquesceSvc/Program.cs
index 3e1ae04..bfa6400 100644
--- a/LiquesceSvc/Program.cs
+++ b/LiquesceSvc/Program.cs
@@ -1,4 +1,33 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Program.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Diagnostics;
 using System.Reflection;
 using System.ServiceProcess;
 using System.Windows.Forms;
@@ -6,36 +35,93 @@
 
 namespace LiquesceSvc
 {
-   static class Program
+   internal static class Program
    {
       static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
-      static void Main(string[] args)
+      /// <remarks>
+      /// Option to either start from SCM or from Console to allow debugging
+      /// </remarks>
+      private static void Main(string[] args)
       {
-         Log.Error("=====================================================================");
-         Log.Error("File Re-opened: Ver :" + Assembly.GetExecutingAssembly().GetName().Version.ToString());
-         var runner = new LiquesceService();
-         if ((args.Length > 0) && ("/debug" == args[0].ToLower()))
+         try
+         {
+            AppDomain.CurrentDomain.UnhandledException += logUnhandledException;
+         }
+         catch (Exception ex)
+         {
+            try
+            {
+               Log.FatalException("Failed to attach unhandled exception handler...", ex);
+            }
+            catch
+            {
+            }
+         }
+         try
+         {
+            Log.Fatal("=====================================================================");
+            Log.Fatal("File Re-opened: Ver :" + Assembly.GetExecutingAssembly().GetName().Version);
+            LiquesceService runner = new LiquesceService();
+            if ((args.Length > 0) && ("/debug" == args[0].ToLower()))
+            {
+               // main service object
+               LiquesceService.RunningAsService = false;
+               runner.StartService(args);
+               Console.WriteLine("Press Q to quit");
+               Application.Run();
+               runner.StopService();
+               // We called the static run, so call the static exit
+               Application.Exit();
+            }
+            else
+            {
+               LiquesceService.RunningAsService = true;
+               ServiceBase.Run(new ServiceBase[] { runner });
+            }
+         }
+         catch (Exception ex)
          {
-            // main service object
-            LiquesceService.RunningAsService = false;
-            runner.StartService(args);
-            Console.WriteLine("Press Q to quit");
-            Application.Run();
-            runner.StopService();
-            // We called the static run, so call the static exit
-            Application.Exit();
+            Log.FatalException("Exception has not been caught by the rest of the application!", ex);
+            throw; // Force the log out to the logUnhandledException handler
          }
-         else
+         finally
          {
-            LiquesceService.RunningAsService = true;
-            ServiceBase.Run(new ServiceBase[] { runner });
+            Log.Fatal("File Closing");
+            Log.Fatal("=====================================================================");
          }
+      }
+
+      private static void logUnhandledException(object sender, UnhandledExceptionEventArgs e)
+      {
+         try
+         {
+            string cs = Assembly.GetExecutingAssembly().GetName().Name;
+            EventLog eventLog = new EventLog();
+            if (!EventLog.SourceExists(cs))
+            {
+               EventLog.CreateEventSource(cs, "Application");
+            }
 
-         Log.Error("========================Clean=Exit===================================");
+            EventLog.WriteEntry(cs, e.ExceptionObject.ToString(), EventLogEntryType.Error);
+            Log.Fatal("Unhandled exception.\r\n{0}", e.ExceptionObject);
+            Exception ex = e.ExceptionObject as Exception;
+            if (ex != null)
+            {
+               Log.FatalException("Exception details", ex);
+               EventLog.WriteEntry(cs, ex.ToString(), EventLogEntryType.Error);
+            }
+            else
+            {
+               Log.Fatal("Unexpected exception.");
+            }
+         }
+         catch
+         {
+         }
       }
    }
-
-}
+}
\ No newline at end of file
diff --git a/LiquesceSvc/ProjectInstaller.Designer.cs b/LiquesceSvc/ProjectInstaller.Designer.cs
index af8ebe3..81beffd 100644
--- a/LiquesceSvc/ProjectInstaller.Designer.cs
+++ b/LiquesceSvc/ProjectInstaller.Designer.cs
@@ -43,7 +43,7 @@ private void InitializeComponent()
          this.serviceInstaller1.DisplayName = "Liquesce Service";
          this.serviceInstaller1.ServiceName = "LiquesceSvc";
          this.serviceInstaller1.ServicesDependedOn = new string[] {
-        "DokanMounter"};
+        "PlugPlay"};
          this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
          // 
          // ProjectInstaller
diff --git a/LiquesceSvc/ProjectInstaller.cs b/LiquesceSvc/ProjectInstaller.cs
index 47200df..905564d 100644
--- a/LiquesceSvc/ProjectInstaller.cs
+++ b/LiquesceSvc/ProjectInstaller.cs
@@ -1,4 +1,30 @@
-using System.ComponentModel;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="ProjectInstaller.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System.ComponentModel;
 using System.Configuration.Install;
 
 
diff --git a/LiquesceSvc/ProjectInstaller.resx b/LiquesceSvc/ProjectInstaller.resx
index 5e2bcbc..297c843 100644
--- a/LiquesceSvc/ProjectInstaller.resx
+++ b/LiquesceSvc/ProjectInstaller.resx
@@ -118,7 +118,7 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <metadata name="serviceProcessInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 54</value>
+    <value>17, 56</value>
   </metadata>
   <metadata name="serviceInstaller1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>187, 17</value>
diff --git a/LiquesceSvc/Properties/AssemblyInfo.cs b/LiquesceSvc/Properties/AssemblyInfo.cs
index e9e38bf..8167a77 100644
--- a/LiquesceSvc/Properties/AssemblyInfo.cs
+++ b/LiquesceSvc/Properties/AssemblyInfo.cs
@@ -1,4 +1,29 @@
-using System.Reflection;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="AssemblyInfo.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+using System.Reflection;
 using System.Runtime.InteropServices;
 
 // General Information about an assembly is controlled through the following 
@@ -9,7 +34,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("Smurf-IV")]
 [assembly: AssemblyProduct("LiquesceSvc")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 2010")]
+[assembly: AssemblyCopyright("Copyright © Simon Coghlan (Aka Smurf-IV) 2010 - 11")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -31,5 +56,5 @@
 // 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("2011.4.27.641")]
-[assembly: AssemblyFileVersion("2011.4.27.641")]
+[assembly: AssemblyVersion("14.9.2281.3")]
+[assembly: AssemblyFileVersion("14.9.2281.3")]
diff --git a/LiquesceSvc/Properties/Settings.Designer.cs b/LiquesceSvc/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..e69b5d6
--- /dev/null
+++ b/LiquesceSvc/Properties/Settings.Designer.cs
@@ -0,0 +1,36 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18408
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace LiquesceSvc.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(@"+Od6c3mNYXx4Ix17s1b9iwV7zOHdmMLj7nx+38vjnE36r9YlxR0/cZ6ISo/rez7Czcc4kZw55r/wVYDjNE2vqrjr4/VzgvgW1AgXzvTpLHAfK80RY58QQta1qtXbGgqsTxYJmFHk5ikCd5QFBth1xcJlZ5w62yaScPmWc2ygm58vorqrrTcgq7DIBJpz+YRaQhSKBFdj4IW6ug0OoOyoRkZRaHVTK/BwY2VR4QKRc1eK786/05qM4ABiX3tRrCFb7Ag2G4KleZD0Z2tznzk3ux0gPmLiXU5Hc/T+MEkxiGeQyXnI3Oy40TBgRL6Lv9dJ/TRiYXc32SvrfMgLqcaX0Ks56SfHmBIFLLwwFHRMx2U0HZnESsz2Nid+gJ4ILZDaUatqwAdUaS78rk7eMI3ubXrvA+n5PP3Df1PMI2M0C1LVX/b+OXSdlaVqS9XmMWtBlIh6xJQwlxz8PeargFlltKLroGpVROZJK1z5V5nP48yaaV8rKSb6SPIaybpfPPBy+CEdl57EU5Eh0MGmoWgAtDUQ2ygmEswHR1CyNKT/P7gt9rZDfcjatucd6rpoeY73BphSUQDNZY6MUTYlikg37l5Ob8HTRpI/FYwzSMTzxri4EbYA3reY4p5qNE/GiCmXcsgDaKGhKvz1gYHIugek4dVAaTA0tSqxiuyQtbO6jEz+KpwerYVI+4ir+oay3L1as8n603jeRdXHho7Vq5DsjtsipCEM4f/iq9rKy9sXSUXkOyS66gFktsCYUGxOacfAOeCtXIuIMsjhM8QRZJc+3A==")]
+        public string Salt {
+            get {
+                return ((string)(this["Salt"]));
+            }
+        }
+    }
+}
diff --git a/LiquesceSvc/Properties/Settings.settings b/LiquesceSvc/Properties/Settings.settings
new file mode 100644
index 0000000..7f14d0e
--- /dev/null
+++ b/LiquesceSvc/Properties/Settings.settings
@@ -0,0 +1,13 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="LiquesceSvc.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="Salt" 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;+Od6c3mNYXx4Ix17s1b9iwV7zOHdmMLj7nx+38vjnE36r9YlxR0/cZ6ISo/rez7Czcc4kZw55r/wVYDjNE2vqrjr4/VzgvgW1AgXzvTpLHAfK80RY58QQta1qtXbGgqsTxYJmFHk5ikCd5QFBth1xcJlZ5w62yaScPmWc2ygm58vorqrrTcgq7DIBJpz+YRaQhSKBFdj4IW6ug0OoOyoRkZRaHVTK/BwY2VR4QKRc1eK786/05qM4ABiX3tRrCFb7Ag2G4KleZD0Z2tznzk3ux0gPmLiXU5Hc/T+MEkxiGeQyXnI3Oy40TBgRL6Lv9dJ/TRiYXc32SvrfMgLqcaX0Ks56SfHmBIFLLwwFHRMx2U0HZnESsz2Nid+gJ4ILZDaUatqwAdUaS78rk7eMI3ubXrvA+n5PP3Df1PMI2M0C1LVX/b+OXSdlaVqS9XmMWtBlIh6xJQwlxz8PeargFlltKLroGpVROZJK1z5V5nP48yaaV8rKSb6SPIaybpfPPBy+CEdl57EU5Eh0MGmoWgAtDUQ2ygmEswHR1CyNKT/P7gt9rZDfcjatucd6rpoeY73BphSUQDNZY6MUTYlikg37l5Ob8HTRpI/FYwzSMTzxri4EbYA3reY4p5qNE/GiCmXcsgDaKGhKvz1gYHIugek4dVAaTA0tSqxiuyQtbO6jEz+KpwerYVI+4ir+oay3L1as8n603jeRdXHho7Vq5DsjtsipCEM4f/iq9rKy9sXSUXkOyS66gFktsCYUGxOacfAOeCtXIuIMsjhM8QRZJc+3A==&lt;/ConnectionString&gt;
+&lt;/SerializableConnectionString&gt;</DesignTimeValue>
+      <Value Profile="(Default)">+Od6c3mNYXx4Ix17s1b9iwV7zOHdmMLj7nx+38vjnE36r9YlxR0/cZ6ISo/rez7Czcc4kZw55r/wVYDjNE2vqrjr4/VzgvgW1AgXzvTpLHAfK80RY58QQta1qtXbGgqsTxYJmFHk5ikCd5QFBth1xcJlZ5w62yaScPmWc2ygm58vorqrrTcgq7DIBJpz+YRaQhSKBFdj4IW6ug0OoOyoRkZRaHVTK/BwY2VR4QKRc1eK786/05qM4ABiX3tRrCFb7Ag2G4KleZD0Z2tznzk3ux0gPmLiXU5Hc/T+MEkxiGeQyXnI3Oy40TBgRL6Lv9dJ/TRiYXc32SvrfMgLqcaX0Ks56SfHmBIFLLwwFHRMx2U0HZnESsz2Nid+gJ4ILZDaUatqwAdUaS78rk7eMI3ubXrvA+n5PP3Df1PMI2M0C1LVX/b+OXSdlaVqS9XmMWtBlIh6xJQwlxz8PeargFlltKLroGpVROZJK1z5V5nP48yaaV8rKSb6SPIaybpfPPBy+CEdl57EU5Eh0MGmoWgAtDUQ2ygmEswHR1CyNKT/P7gt9rZDfcjatucd6rpoeY73BphSUQDNZY6MUTYlikg37l5Ob8HTRpI/FYwzSMTzxri4EbYA3reY4p5qNE/GiCmXcsgDaKGhKvz1gYHIugek4dVAaTA0tSqxiuyQtbO6jEz+KpwerYVI+4ir+oay3L1as8n603jeRdXHho7Vq5DsjtsipCEM4f/iq9rKy9sXSUXkOyS66gFktsCYUGxOacfAOeCtXIuIMsjhM8QRZJc+3A==</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
\ No newline at end of file
diff --git a/LiquesceSvc/Properties/Settings1.Designer.cs b/LiquesceSvc/Properties/Settings1.Designer.cs
deleted file mode 100644
index d367b85..0000000
--- a/LiquesceSvc/Properties/Settings1.Designer.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-//------------------------------------------------------------------------------
-// <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 LiquesceSvc.Properties {
-    
-    
-    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
-    internal sealed partial class Settings1 : global::System.Configuration.ApplicationSettingsBase {
-        
-        private static Settings1 defaultInstance = ((Settings1)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings1())));
-        
-        public static Settings1 Default {
-            get {
-                return defaultInstance;
-            }
-        }
-        
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("Properties.config.xml")]
-        public string ConfigFileName {
-            get {
-                return ((string)(this["ConfigFileName"]));
-            }
-        }
-    }
-}
diff --git a/LiquesceSvc/Properties/Settings1.cs b/LiquesceSvc/Properties/Settings1.cs
deleted file mode 100644
index 0c7c89b..0000000
--- a/LiquesceSvc/Properties/Settings1.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-namespace LiquesceSvc.Properties {
-    
-    
-    // This class allows you to handle specific events on the settings class:
-    //  The SettingChanging event is raised before a setting's value is changed.
-    //  The PropertyChanged event is raised after a setting's value is changed.
-    //  The SettingsLoaded event is raised after the setting values are loaded.
-    //  The SettingsSaving event is raised before the setting values are saved.
-    internal sealed partial class Settings1 {
-        
-        public Settings1() {
-            // // To add event handlers for saving and changing settings, uncomment the lines below:
-            //
-            // this.SettingChanging += this.SettingChangingEventHandler;
-            //
-            // this.SettingsSaving += this.SettingsSavingEventHandler;
-            //
-        }
-        
-        private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
-            // Add code to handle the SettingChangingEvent event here.
-        }
-        
-        private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
-            // Add code to handle the SettingsSaving event here.
-        }
-    }
-}
diff --git a/LiquesceSvc/Properties/Settings1.settings b/LiquesceSvc/Properties/Settings1.settings
deleted file mode 100644
index a0f4c69..0000000
--- a/LiquesceSvc/Properties/Settings1.settings
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="LiquesceSvc" GeneratedClassName="Settings1">
-  <Profiles />
-  <Settings>
-    <Setting Name="ConfigFileName" Type="System.String" Scope="Application">
-      <Value Profile="(Default)">Properties.config.xml</Value>
-    </Setting>
-  </Settings>
-</SettingsFile>
\ No newline at end of file
diff --git a/LiquesceSvc/Roots.cs b/LiquesceSvc/Roots.cs
new file mode 100644
index 0000000..fe23dda
--- /dev/null
+++ b/LiquesceSvc/Roots.cs
@@ -0,0 +1,417 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Roots.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
+using LiquesceFacade;
+using LiquesceSvc.LowLevelOSAccess;
+using NLog;
+
+namespace LiquesceSvc
+{
+   /// <summary>
+   /// this class delivers the current physical root of the disk which should be used next
+   /// for file/folder creation.
+   /// It also handles a few other fileName operations like detection, and deletion.
+   /// </summary>
+   internal class Roots
+   {
+      public static readonly string PathDirectorySeparatorChar = Path.DirectorySeparatorChar.ToString(CultureInfo.InvariantCulture);
+      private static readonly string RootPathDirectorySeparatorChar = PathDirectorySeparatorChar + PathDirectorySeparatorChar;
+      private static readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      private readonly CachedRootPathsSystemInfo cachedRootPathsSystemInfo;
+
+      private readonly MountDetail mountDetail;
+
+      private readonly bool AreAllReadOnly;
+      private readonly bool AreAnyAllReadOnly;
+
+      // constructor
+      public Roots(MountDetail mountDetail, uint cacheLifetimeSeconds)
+      {
+         this.mountDetail = mountDetail;
+         AreAnyAllReadOnly = mountDetail.SourceLocations.Any(sl => sl.UseIsReadOnly);
+         if (AreAnyAllReadOnly)
+         {
+            AreAllReadOnly = mountDetail.SourceLocations.TrueForAll(sl => sl.UseIsReadOnly);
+         }
+         // NTFS is case-preserving but case-insensitive in the Win32 namespace
+         cachedRootPathsSystemInfo = new CachedRootPathsSystemInfo(cacheLifetimeSeconds); 
+      }
+
+      public NativeFileOps GetFromPathFileName(string pathFileName)
+      {
+         Log.Trace("GetFromPathFileName [{0}]", pathFileName);
+         NativeFileOps fsi = null;
+         bool isNamedStream = false;
+         string namedStream = string.Empty;
+         try
+         {
+            if (cachedRootPathsSystemInfo.TryGetValue(pathFileName, out fsi))
+            {
+               Log.Trace("Found pathFileName in cache");
+               return fsi;
+            }
+            if ((pathFileName.Length == 1)
+               && NativeFileOps.IsDirectorySeparator(pathFileName[0])
+               )
+            {
+               Log.Trace("Assuming Home directory so add new to cache and return");
+               string firstSourceLocation = mountDetail.SourceLocations.First().SourcePath;
+               return (fsi = new NativeFileOps(firstSourceLocation, IsRootReadOnly(firstSourceLocation)));
+            }
+
+            string searchFilename = RemoveStreamPart(pathFileName, out isNamedStream, out namedStream);
+
+            if (isNamedStream)
+            {
+               if (string.IsNullOrEmpty(searchFilename))
+               {
+                  // TODO: Should something have gone boom before this ?
+                  if (System.Diagnostics.Debugger.IsAttached)
+                     System.Diagnostics.Debugger.Break();
+               }
+               if (cachedRootPathsSystemInfo.TryGetValue(searchFilename, out fsi))
+               {
+                  Log.Trace("Found in cache from native not stream");
+                  return (fsi = new NativeFileOps(string.Format("{0}:{1}", fsi.FullName, namedStream), IsRootReadOnly(fsi.DirectoryPathOnly)));
+               }
+            }
+            Log.Trace("Not found in cache so search for filename");
+
+            // TODO: Not found, so check to see if this is a recycler bin offset
+
+            foreach (string sourceLocation in GetAllRootPathsWhereExists(NativeFileOps.GetParentPathName(pathFileName)))
+            {
+               fsi = new NativeFileOps(Path.Combine(sourceLocation, searchFilename), IsRootReadOnly(sourceLocation));
+               if (fsi.Exists)
+               {
+                  return fsi;
+               }
+            }
+
+            //-------------------------------------
+            Log.Trace("file/folder not found");
+            // So create a holder for the return and do not store
+            fsi = FindCreateNewAllocationRootPath(searchFilename);
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("GetFromPathFileName threw: ", ex);
+         }
+         finally
+         {
+            if ((fsi != null)
+               && fsi.Exists
+               )
+            {
+               Log.Debug("GetFromPathFileName from [{0}] found [{1}]", pathFileName, fsi.FullName);
+               if (string.IsNullOrEmpty(pathFileName))
+               {
+                  // TODO: Should something have gone boom before this ?
+                  if (System.Diagnostics.Debugger.IsAttached)
+                     System.Diagnostics.Debugger.Break();
+               }
+
+               cachedRootPathsSystemInfo[pathFileName] = fsi;
+               if (isNamedStream)
+               {
+                  Log.Warn("isNamedStream [{0}] found [{1}]", pathFileName, namedStream);
+                  cachedRootPathsSystemInfo[string.Format("{0}:{1}", pathFileName, namedStream)] = fsi;
+               }
+            }
+            else
+            {
+               Log.Debug("GetFromPathFileName found nothing for [{0}].", pathFileName);
+            }
+         }
+         return fsi;
+      }
+
+      private static string RemoveStreamPart(string pathFileName, out bool isNamedStream, out string namedStream)
+      {
+         string searchFilename = pathFileName.Trim(Path.DirectorySeparatorChar);
+         string[] splits = searchFilename.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
+         int offset = Path.IsPathRooted(pathFileName) ? 2 : 1;
+         if (splits.Length > offset)
+         {
+            isNamedStream = true;
+            searchFilename = splits[offset - 1];
+            namedStream = splits[offset];
+         }
+         else
+         {
+            isNamedStream = false;
+            namedStream = string.Empty;
+         }
+         return searchFilename;
+      }
+
+      private bool IsRootReadOnly(string newTarget)
+      {
+         if (AreAllReadOnly)
+         {
+            return true;
+         }
+         if (!AreAnyAllReadOnly)
+         {
+            return false;
+         }
+         string root = GetRoot(newTarget);
+         return mountDetail.SourceLocations.Any(location => (location.SourcePath == root) && (location.UseIsReadOnly));
+      }
+
+      public IEnumerable<string> GetFullPathsThatContainThis(string relativefolder)
+      {
+         return from location in mountDetail.SourceLocations
+                select new DirectoryInfo(location.SourcePath + relativefolder)
+                   into dir
+                   where dir.Exists
+                   select dir.FullName;
+      }
+
+      public IEnumerable<string> GetAllRootPathsWhereExists(string relativefolder)
+      {
+         return mountDetail.SourceLocations.Where(location => Directory.Exists(location.SourcePath + relativefolder)).Select(location => location.SourcePath);
+      }
+
+      public string GetRoot(string path)
+      {
+         if (!string.IsNullOrEmpty(path))
+         {
+            foreach (SourceLocation location in mountDetail.SourceLocations.Where(location => path.Contains(location.SourcePath)))
+            {
+               return location.SourcePath;
+            }
+         }
+         return string.Empty;
+      }
+
+      // return the path from a inputpath seen relative from the root
+      public string GetRelative(string path)
+      {
+         return RootPathDirectorySeparatorChar + path.Replace(GetRoot(path), string.Empty);
+      }
+
+      public string FindByFileId(long fileId)
+      {
+         foreach (string found in mountDetail.SourceLocations
+            .Select(location => NfsSupport.GetByFileId(location.SourcePath, fileId))
+            .Where(found => !string.IsNullOrEmpty(found)))
+         {
+            return GetRelative(found);
+         }
+         return string.Empty;
+      }
+
+      internal static readonly string[] RecyclerDirectoryNames = { @"$RECYCLE.BIN", @"Recycle Bin", @"RECYCLER", @"Recycled" };
+
+      // this method returns a path (real physical path) of a place where the next folder/file root can be created.
+      public NativeFileOps FindCreateNewAllocationRootPath(string pathFileName, UInt64 length = 0)
+      {
+         ulong spaceRequired = Math.Max(mountDetail.HoldOffBufferBytes, length);
+
+         const int dirSize = 4 * 1024; // Even A directory requires 4KB to be created !
+         if (spaceRequired < dirSize)
+         {
+            spaceRequired = dirSize;
+         }
+         Log.Trace("FindCreateNewAllocationRootPath [{0}] spaceRequired [{1}]", pathFileName, spaceRequired);
+         bool isNamedStream;
+         string namedStream;
+         string searchFilename = RemoveStreamPart(pathFileName, out isNamedStream, out namedStream);
+
+         string foundRoot = null;
+         string relativeParent = NativeFileOps.GetParentPathName(pathFileName);
+
+         NativeFileOps fsi;
+         if (cachedRootPathsSystemInfo.TryGetValue(relativeParent, out fsi))
+         {
+            Log.Trace("Found relativeParent in cache");
+            foundRoot = GetRoot(fsi.FullName);
+            if (!CheckSourceForSpace(spaceRequired, foundRoot))
+            {
+               foundRoot = string.Empty;
+            }
+         }
+         if (string.IsNullOrEmpty(foundRoot))
+         {
+            switch (mountDetail.AllocationMode)
+            {
+               case MountDetail.AllocationModes.Folder:
+                  foundRoot = GetWriteableSourceThatMatchesThisFolderWithSpace(relativeParent, spaceRequired);
+                  if (string.IsNullOrEmpty(foundRoot))
+                     goto case MountDetail.AllocationModes.Priority;
+                  break;
+
+               case MountDetail.AllocationModes.Priority:
+                  foundRoot = GetWriteableHighestPrioritySourceWithSpace(spaceRequired);
+                  if (string.IsNullOrEmpty(foundRoot))
+                     goto case MountDetail.AllocationModes.Balanced;
+                  break;
+
+               case MountDetail.AllocationModes.Balanced:
+                  foundRoot = GetWriteableSourceWithMostFreeSpace(spaceRequired);
+                  break;
+
+               default:
+                  foundRoot = GetWriteableSourceWithMostFreeSpace(spaceRequired);
+                  break;
+            }
+         }
+         string newPathName = Path.Combine(foundRoot, searchFilename);
+         // TODO: Should something have gone boom before this ?
+         if (System.Diagnostics.Debugger.IsAttached)
+         {
+            if ((newPathName == searchFilename)
+                || (newPathName == pathFileName)
+               )
+            {
+               System.Diagnostics.Debugger.Break();
+            }
+         }
+
+         NativeFileOps newAllocationRootPath = isNamedStream ? new NativeFileOps(string.Format("{0}:{1}", newPathName, namedStream), IsRootReadOnly(foundRoot))
+                                                            : new NativeFileOps(newPathName, IsRootReadOnly(foundRoot));
+         // If a recycler is required then request usage of an existing one from a root drive.
+         if (RecyclerDirectoryNames.Any(pathFileName.Contains))
+         {
+            newAllocationRootPath = new NativeFileOps(NativeFileOps.GetRootOrMountFor(newAllocationRootPath.FullName) + pathFileName,
+               newAllocationRootPath.ForceUseAsReadOnly);
+         }
+
+         return newAllocationRootPath;
+      }
+
+      // returns the root for:
+      //  The first disk where relativeFolder exists and if there is enough free space
+      private string GetWriteableSourceThatMatchesThisFolderWithSpace(string relativeFolder, ulong spaceRequired)
+      {
+         Log.Trace("Trying GetSourceThatMatchesThisFolderWithSpace([{0}],[{1}])", relativeFolder, spaceRequired);
+         // remove the last \ to delete the last directory
+         relativeFolder = relativeFolder.TrimEnd(new[] { Path.DirectorySeparatorChar });
+
+         // for every source location
+         foreach (string sourcePath in
+            from sourcePath in mountDetail.SourceLocations
+                  .Where(s => !s.UseIsReadOnly)
+                  .Select(s => s.SourcePath)
+            where CheckSourceForSpace(spaceRequired, sourcePath)
+            let testpath = sourcePath + relativeFolder
+            where new NativeFileOps(testpath, AreAllReadOnly).Exists
+            select sourcePath
+                     )
+         {
+            return sourcePath;
+         }
+         return string.Empty;
+      }
+
+      // returns the next root with the highest priority and the space
+      private string GetWriteableHighestPrioritySourceWithSpace(ulong spaceRequired)
+      {
+         Log.Trace("Trying GetHighestPrioritySourceWithSpace([{0}])", spaceRequired);
+         foreach (SourceLocation w in mountDetail.SourceLocations.Where(s => !s.UseIsReadOnly))
+         {
+            if (CheckSourceForSpace(spaceRequired, w.SourcePath))
+               return w.SourcePath;
+         }
+         return string.Empty;
+      }
+
+      private static bool CheckSourceForSpace(ulong spaceRequired, string sourcePath)
+      {
+         ulong lpFreeBytesAvailable, num2, num3;
+         // Regardless of the API owner Process ID, make sure "we" can get the answer
+         new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
+         return (GetDiskFreeSpaceExW(sourcePath, out lpFreeBytesAvailable, out num2, out num3)
+                 && (lpFreeBytesAvailable > spaceRequired)
+                );
+      }
+
+      // returns the root with the most free space
+      private string GetWriteableSourceWithMostFreeSpace(ulong spaceRequired)
+      {
+         Log.Trace("Trying GetSourceWithMostFreeSpace([{0}])", spaceRequired);
+         ulong highestFreeSpace = 0;
+         string sourceWithMostFreeSpace = string.Empty;
+
+         // Regardless of the API owner Process ID, make sure "we" can get the answer
+         new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Assert();
+         foreach (SourceLocation str in mountDetail.SourceLocations.Where(s => !s.UseIsReadOnly))
+         {
+            ulong num, num2, num3;
+            if (GetDiskFreeSpaceExW(str.SourcePath, out num, out num2, out num3))
+            {
+               if (highestFreeSpace < num)
+               {
+                  highestFreeSpace = num;
+                  sourceWithMostFreeSpace = str.SourcePath;
+               }
+            }
+         }
+         if (highestFreeSpace < spaceRequired)
+            Log.Warn("Amount of free space[{0}] on [{1}] is less than required [{2}]", highestFreeSpace, sourceWithMostFreeSpace, spaceRequired);
+         return sourceWithMostFreeSpace;
+      }
+
+      private string FindOffsetPath(string fullFilePath)
+      {
+         foreach (SourceLocation location in mountDetail.SourceLocations.Where(location => fullFilePath.StartsWith(location.SourcePath)))
+         {
+            return fullFilePath.Remove(0, location.SourcePath.Length);
+         }
+         return string.Empty;
+      }
+
+      // removes a path from root lookup
+      public void RemoveFromLookup(string filename)
+      {
+         cachedRootPathsSystemInfo.Remove(filename);
+      }
+
+      public void RemoveAllTargetDirsFromLookup(string removeDirSource)
+      {
+         cachedRootPathsSystemInfo.RemoveAllTargetDirsFromLookup(removeDirSource);
+      }
+
+      #region DLL Imports
+
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+      private static extern bool GetDiskFreeSpaceExW(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
+
+      #endregion DLL Imports
+
+   }
+}
\ No newline at end of file
diff --git a/LiquesceSvc/Salt.cs b/LiquesceSvc/Salt.cs
new file mode 100644
index 0000000..d18503f
--- /dev/null
+++ b/LiquesceSvc/Salt.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Security.Cryptography;
+using System.Text;
+
+// ReSharper disable CheckNamespace
+namespace StringBuffers
+// ReSharper restore CheckNamespace
+{
+   /// <summary>
+   /// Simple obfustication to try and stop obvious decompilation, but still use a good algorithm.
+   /// </summary>
+   static public class StringBuffers
+   {
+      // Use some strings that an application will already have in its string list.
+      private static readonly byte[] key = Encoding.ASCII.GetBytes(@"System.Runtime.CompilerServices ");
+      private static readonly byte[] iv = Encoding.ASCII.GetBytes(@"FileDescription ");
+    
+      public static string ToBuffer(this string text)
+      {
+         using (SymmetricAlgorithm algorithm = new RijndaelManaged())
+         {
+            ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
+            byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
+            byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
+            return Convert.ToBase64String(outputBuffer);
+         }
+      }
+
+      public static string FromBuffer(this string text)
+      {
+         using (SymmetricAlgorithm algorithm = new RijndaelManaged())
+         {
+            ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
+            byte[] inputbuffer = Convert.FromBase64String(text);
+            byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
+            return Encoding.Unicode.GetString(outputBuffer);
+         }
+      }
+   }
+}
diff --git a/LiquesceSvc/XMoveFile.cs b/LiquesceSvc/XMoveFile.cs
new file mode 100644
index 0000000..d46e6f4
--- /dev/null
+++ b/LiquesceSvc/XMoveFile.cs
@@ -0,0 +1,301 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="XMoveFile.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV) & fpDragon
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.IO.IsolatedStorage;
+using System.Linq;
+using System.Runtime.InteropServices;
+using CBFS;
+using NLog;
+
+// ReSharper disable UnusedMember.Local
+namespace LiquesceSvc
+{
+   static internal class XMoveFile
+   {
+      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
+
+      /// <summary>
+      /// Moves / Renames a file / Directory. This function has to work out which
+      /// </summary>
+      /// <param name="roots"></param>
+      /// <param name="oldName">FullPath to Old</param>
+      /// <param name="newName">FullPath to new</param>
+      /// <param name="replaceIfExisting"></param>
+      /// <param name="useInplaceRenaming"></param>
+      public static void Move(Roots roots, string oldName, string newName, bool replaceIfExisting, bool useInplaceRenaming)
+      {
+         Log.Info("MoveFile replaceIfExisting [{0}] filename: [{1}] newname: [{2}]", replaceIfExisting, oldName, newName);
+
+         NativeFileOps pathSource = roots.GetFromPathFileName(oldName);
+         if (!pathSource.IsDirectory)
+         {
+            //1 Same directory Rename Scenario:
+            //   MoveFileProxy replaceIfExisting [0] file: [\Test1\ds\New Text Document (2).txt] newfile: [\Test1\ds\test.txt]
+            //
+            //2 Move into a subdir off "ds" Scenario:
+            //   MoveFileProxy replaceIfExisting [0] file: [\Test1\ds\New Text Document (3).txt] newfile: [\Test1\ds\ds\New Text Document (3).txt]
+            //   File will be in [\Test1\ds\ds\New Text Document (3).txt]
+            //
+            //3 Rename a File when a directory name already exists
+            //   MoveFileProxy replaceIfExisting [0] file: [\Test1\ds\New Text Document (2).txt] newfile: [\Test1\ds\test.txt]
+            //   But the Direcotory [\Test1\ds\test.txt] exists ! Resulting in the correct Explorer message
+            //
+            //4 Rename a file to be the same name as the parent directory
+            //   MoveFile [\Test1\ds\test.txt\New Text Document (2).txt] to [\test.txt]
+            //   Should result in [\Test1\ds\test.txt\test.txt]
+            //
+            //5 Move a file to be Closer to the Mount point (higher) in the directory structure
+            //   MoveFileProxy replaceIfExisting [0] file: [\Test1\ds\ds\New Text Document (3).txt] newfile: [\Test1\New Text Document (3).txt]
+            //
+            //6 Rename a file to a Name that already exists at this level
+            //   MoveFileProxy replaceIfExisting [0] file: [\Test1\ds\testSame (2).txt] newfile: [\Test1\ds\testSame.txt]
+            //   [\Test1\ds\testSame.txt] already exists; so should display a MessageBox in Explorer
+            //
+            //7 Now perform all the above via a share access that does not contain the dir name
+            //   i.e. ShareName is [TestShare] pointing at [\Test1]
+            //   Scenario 1 produces MoveFile [\Test1\ds\New Text Document (2).txt] to [\ds\test.txt]
+            //
+            //8 Perform a delete on the Server Mount to see if the file is moved to the recycle bin
+            //   MoveFile Should be used to go to the Recycler dependent on the Drive Format Type and ACL Status
+            //
+            // While we are here, remove
+            roots.RemoveFromLookup(oldName); // File has been removed
+
+            // Need to check if this is going to the recycler
+            if (Roots.RecyclerDirectoryNames.Any(newName.Contains))
+            {
+               SendToRecycler(roots, pathSource.FullName, newName);
+            }
+            else if (useInplaceRenaming)
+            {
+               string relativeNewParent = NativeFileOps.GetParentPathName(newName);
+               string sourceRoot = roots.GetRoot(pathSource.DirectoryPathOnly);
+               // relativeNewParent will start with the //'s
+               string newTarget = sourceRoot + relativeNewParent;
+               // This will handle Drive 1 containg the dir, drive 2 containing the file at a lower point
+               // i.e. copying down the dir chain to a non-existing dir whilst inplace is in force.
+               NativeFileOps.CreateDirectory(newTarget);
+
+               string fileTarget = Path.Combine(newTarget, NativeFileOps.GetFileName(newName));
+               MoveFileExInPlace(pathSource.FullName, fileTarget, replaceIfExisting);
+            }
+            else
+            {
+               // Now check to see if this has enough space to make a "Copy" before the atomic delete of MoveFileEX
+               NativeFileOps pathTarget = roots.FindCreateNewAllocationRootPath(newName, pathSource.Length);
+               // The new target might be on a different drive, so re-create the folder path to the new location
+               NativeFileOps.CreateDirectory(pathTarget.DirectoryPathOnly);
+               MoveFileEx(pathSource.FullName, pathTarget.FullName, replaceIfExisting);
+            }
+
+         }
+         else
+         {
+            // Repeat the file tests above, but use directories instead.
+            Log.Trace("GetAllPaths [{0}]", oldName);
+            string[] allPossibleRootTargets = roots.GetAllRootPathsWhereExists(oldName).ToArray();
+            Log.Trace("Now do them backwards so that overwrites are done correctly");
+            Array.Reverse(allPossibleRootTargets);
+
+            // While we are here, remove
+            roots.RemoveAllTargetDirsFromLookup(oldName); // File has been removed
+
+            // newName will already be calculated as the relative offset (Should have starting '\')
+            foreach (string dirRootSource in allPossibleRootTargets)
+            {
+               string sourceName = dirRootSource + oldName;
+               // Need to check if this is going to the recycler
+               if (Roots.RecyclerDirectoryNames.Any(newName.Contains))
+               {
+                  SendToRecycler(roots, sourceName, newName);
+                  continue;
+               }
+
+               DirectoryInfo source = new DirectoryInfo(sourceName);
+               string newTarget = dirRootSource + newName;
+               DirectoryInfo target = new DirectoryInfo(newTarget);
+
+               // This will handle Drive 1 containg the dir, drive 2 containing the file at a lower point
+               // i.e. copying down the dir chain to a non-existing dir whilst inplace is in force.
+               NativeFileOps.CreateDirectory(NativeFileOps.GetDirectoryName(newTarget));
+
+               if (useInplaceRenaming
+                  && !target.Exists    // Cannot do inplace if the DirExists
+                  )
+               {
+                  //Directory.Move(source.FullName, target.FullName);
+                  //source.MoveTo(target.FullName);
+                  MoveFileExInPlace(source.FullName, target.FullName, false);
+               }
+               else
+               {
+                  Move(roots, source, newName, replaceIfExisting);
+               }
+            }
+         }
+
+         roots.RemoveFromLookup(newName); // Not a null file anymore
+      }
+
+      private static void Move(Roots roots, DirectoryInfo pathSource, string pathTarget_FullName, bool replaceIfExisting)
+      {
+         string pathSource_FullName = pathSource.FullName;
+         Log.Trace("Move(pathSource[{0}], pathTarget[{1}], replaceIfExisting[{2}], useInplaceRenaming[{3}])", pathSource_FullName, pathTarget_FullName, replaceIfExisting);
+
+         // Don't forget this directory
+         NativeFileOps newTarget = roots.FindCreateNewAllocationRootPath(pathTarget_FullName);
+         newTarget.CreateDirectory();
+
+         // for every file in the current folder
+         foreach (FileInfo filein in pathSource.EnumerateFiles())
+         {
+            // with each file, allow the target to distribute in case space is a problem
+            string fileSource = Path.Combine(pathSource_FullName, filein.Name);
+            newTarget = roots.FindCreateNewAllocationRootPath(Path.Combine(pathTarget_FullName, filein.Name), (ulong)filein.Length);
+            // The new target might be on a different drive, so re-create the folder path to the new location
+            NativeFileOps.CreateDirectory(newTarget.DirectoryPathOnly);
+
+            MoveFileEx(fileSource, newTarget.FullName, replaceIfExisting);
+         }
+
+         // for every subfolder recurse
+         foreach (DirectoryInfo dr in pathSource.EnumerateDirectories())
+         {
+            string dirSource = Path.Combine(pathTarget_FullName, dr.Name);
+            Move(roots, dr, dirSource, replaceIfExisting);
+         }
+
+         Log.Trace("Delete this Dir[{0}]", pathSource_FullName);
+         try
+         {
+            NativeFileOps.DeleteDirectory(pathSource_FullName);
+         }
+         catch (Exception ex)
+         {
+            Log.WarnException("Failed to delete " + pathSource_FullName, ex);
+         }         
+      }
+
+      private static void MoveFileExInPlace(string pathSource, string pathTarget, bool replaceIfExisting)
+      {
+         // http://msdn.microsoft.com/en-us/library/aa365240%28VS.85%29.aspx
+         MoveFileFlags dwFlags = (replaceIfExisting ? MoveFileFlags.MOVEFILE_REPLACE_EXISTING : 0);
+
+         Log.Trace("MoveFileExW(pathSource[{0}], pathTarget[{1}], dwFlags[{2}])", pathSource, pathTarget, dwFlags);
+         if (!MoveFileExW(pathSource, pathTarget, dwFlags))
+         {
+            throw new Win32Exception();
+         }
+      }
+
+      private static void MoveFileEx(string pathSource, string pathTarget, bool replaceIfExisting)
+      {
+         // http://msdn.microsoft.com/en-us/library/aa365240%28VS.85%29.aspx
+         MoveFileFlags dwFlags = (replaceIfExisting ? MoveFileFlags.MOVEFILE_REPLACE_EXISTING : 0);
+         // If the file is to be moved to a different volume, the function simulates the move by using the
+         // CopyFile and DeleteFile functions.
+         dwFlags |= MoveFileFlags.MOVEFILE_COPY_ALLOWED;
+
+         // The function does not return until the file is actually moved on the disk.
+         // Setting this value guarantees that a move performed as a copy and delete operation
+         // is flushed to disk before the function returns. The flush occurs at the end of the copy operation.
+         dwFlags |= MoveFileFlags.MOVEFILE_WRITE_THROUGH;
+
+         Log.Trace("MoveFileExW(pathSource[{0}], pathTarget[{1}], dwFlags[{2}])", pathSource, pathTarget, dwFlags);
+         if (!MoveFileExW(pathSource, pathTarget, dwFlags))
+         {
+            throw new Win32Exception();
+         }
+      }
+
+      private static void SendToRecycler(Roots roots, string pathSource, string pathTarget)
+      {
+         // Work out the location of the Recycler
+         string trimmedTarget = (from recyclerDirectoryName in Roots.RecyclerDirectoryNames 
+                                 let indexOf = pathTarget.IndexOf(recyclerDirectoryName, StringComparison.Ordinal) 
+                                 where indexOf >= 0 
+                                 select pathTarget.Remove(0, indexOf + recyclerDirectoryName.Length)
+                                 ).FirstOrDefault();
+
+         string sourceRoot = roots.GetRoot(pathSource);
+         string recyclerTarget = (from recycler in Roots.RecyclerDirectoryNames 
+                                  select new DirectoryInfo(sourceRoot + recycler) 
+                                  into info1 
+                                  where info1.Exists 
+                                  select info1.FullName + trimmedTarget
+                                  ).FirstOrDefault();
+         
+         if (string.IsNullOrEmpty(recyclerTarget))
+         {
+            // Set to use the @"Recycle Bin"
+            DirectoryInfo info = new DirectoryInfo(sourceRoot + Roots.RecyclerDirectoryNames[1]);
+            info.Create();
+            info.Attributes = info.Attributes | FileAttributes.Hidden | FileAttributes.System;
+            recyclerTarget = info.FullName + trimmedTarget;
+            //throw new Win32Exception(CBFSWinUtil.ERROR_INVALID_ADDRESS, string.Format("Unable to send {0} to the Recycle.bin", pathTarget));
+         }
+         // Create the Directory - In case it is in mixed mode
+         NativeFileOps.CreateDirectory(NativeFileOps.GetDirectoryName(recyclerTarget));
+         // Move and overwrite - Just in case
+         MoveFileEx(pathSource, recyclerTarget, true);
+      }
+
+      #region Win32
+
+      /// <summary>
+      /// http://pinvoke.net/default.aspx/Enums/MoveFileFlags.html
+      /// </summary>
+      [Flags]
+      private enum MoveFileFlags
+      {
+         MOVEFILE_REPLACE_EXISTING = 0x00000001,
+         MOVEFILE_COPY_ALLOWED = 0x00000002,
+         MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004,
+         MOVEFILE_WRITE_THROUGH = 0x00000008,
+         MOVEFILE_CREATE_HARDLINK = 0x00000010,
+         MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x00000020
+      }
+
+      /// <summary>
+      /// http://www.pinvoke.net/default.aspx/kernel32.movefileex
+      /// </summary>
+      /// <param name="lpExistingFileName"></param>
+      /// <param name="lpNewFileName"></param>
+      /// <param name="dwFlags"></param>
+      /// <returns></returns>
+      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.Winapi)]
+      private static extern bool MoveFileExW(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);
+
+      #endregion Win32
+   }
+}
+
+// ReSharper restore UnusedMember.Local
\ No newline at end of file
diff --git a/LiquesceSvc/app.manifest b/LiquesceSvc/app.manifest
new file mode 100644
index 0000000..9272d5d
--- /dev/null
+++ b/LiquesceSvc/app.manifest
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+    <security>
+      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+        <!-- UAC Manifest Options
+            If you want to change the Windows User Account Control level replace the 
+            requestedExecutionLevel node with one of the following.
+
+        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
+        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
+
+            Specifying requestedExecutionLevel node will disable file and registry virtualization.
+            If you want to utilize File and Registry Virtualization for backward 
+            compatibility then delete the requestedExecutionLevel node.
+        -->
+        <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+    <application>
+      <!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.-->
+       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- = Windows 8.1 and Windows Server 2012 R2 -->
+       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- = Windows 8 and Windows Server 2012 -->
+       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- = Windows 7 and Windows Server 2008 R2-->
+    </application>
+  </compatibility>
+  
+</asmv1:assembly>
diff --git a/LiquesceSvcMEF/CommonStorage.cs b/LiquesceSvcMEF/CommonStorage.cs
deleted file mode 100644
index e0b4fe5..0000000
--- a/LiquesceSvcMEF/CommonStorage.cs
+++ /dev/null
@@ -1,264 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using NLog;
-
-namespace LiquesceSvcMEF
-{
-   public abstract class CommonStorage : IManagement
-   {
-      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-      protected string root;
-      protected UInt64 HoldOffBufferBytes
-      {
-         get;
-         private set;
-      }
-      protected List<string> sourceLocations;
-      protected List<string> knownSharePaths;
-
-      static protected readonly string PathDirectorySeparatorChar = Path.DirectorySeparatorChar.ToString();
-
-      protected readonly Dictionary<string, List<string>> foundDirectories = new Dictionary<string, List<string>>();
-      protected readonly ReaderWriterLockSlim foundDirectoriesSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-
-      protected readonly ReaderWriterLockSlim rootPathsSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-      protected readonly Dictionary<string, string> rootPaths = new Dictionary<string, string>();
-
-      protected readonly ReaderWriterLockSlim fileInfoSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-      protected readonly Dictionary<string, FileSystemInfo> fileInfoCache = new Dictionary<string, FileSystemInfo>();
-
-      #region Implementation of IManagement
-
-      /// <summary>
-      /// Used to force this Extension to read it's config information
-      /// </summary>
-      /// <param name="mountPoint">Ofset into the Config information as there may be more than one mount</param>
-      /// <param name="holdOffBufferBytes">When creating new objects, this is used to move to the next calculated location</param>
-      virtual public void Initialise(string mountPoint, UInt64 holdOffBufferBytes)
-      {
-         Log.Debug("Initialise([{0}])", mountPoint);
-         root = mountPoint;
-         if (mountPoint.Length == 1)
-            root += ":" + PathDirectorySeparatorChar;
-         HoldOffBufferBytes = holdOffBufferBytes;
-      }
-
-      /// <summary>
-      /// Called to get this thing going
-      /// </summary>
-      virtual public void Start()
-      {
-         Log.Debug("Start()");
-      }
-
-      /// <summary>
-      /// Called to exit the functions / threads, so be nice because this is normally 
-      /// the service closing and will have limited time before the rug is pulled
-      /// </summary>
-      virtual public void Stop()
-      {
-         Log.Debug("Start()");
-      }
-
-      /// <summary>
-      /// Details to be passed in of the base mountPoint information
-      /// </summary>
-      public List<string> SourceLocations
-      {
-         set { sourceLocations = value; }
-      }
-
-      /// <summary>
-      /// Details to be passed in as the shares are "discovered" for the mountPoint
-      /// </summary>
-      public List<string> KnownSharePaths
-      {
-         set { knownSharePaths = value; }
-      }
-
-      #endregion
-
-#region ILocations helpers
-      public FileSystemInfo GetInfo(string dokanPath, bool refreshCache)
-      {
-         FileSystemInfo fsi = null;
-         string path = OpenLocation(dokanPath);
-         if (!String.IsNullOrEmpty(path))
-         {
-            if (!refreshCache)
-            {
-               using (fileInfoSync.ReadLock())
-               {
-                  if (fileInfoCache.TryGetValue(path, out fsi))
-                     return fsi;
-               }
-            }
-            // USe internal objects to prevent getting the information twice (See internal usage of FileInfo.Exists(path))
-            fsi = new FileInfo(path);
-            if (!fsi.Exists)
-            {
-               fsi = new DirectoryInfo(path);
-               if (!fsi.Exists)
-                  fsi = null;
-            }
-            if (fsi != null)
-               using (fileInfoSync.WriteLock())
-               {
-                  fileInfoCache[path] = fsi;
-               }
-         }
-         return fsi;
-      }
-
-      public abstract string OpenLocation(string dokanPath);
-
-      /// <summary>
-      /// Return Physical Location of an existing file
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>Physical Location</returns>
-      public List<string> OpenDirectoryLocations(string dokanPath)
-      {
-         List<string> found = null;
-         using (foundDirectoriesSync.UpgradableReadLock())
-         {
-            if (String.IsNullOrWhiteSpace(dokanPath))
-               throw new ArgumentNullException(dokanPath, "Not allowed to pass this length 2");
-            if (dokanPath[0] != Path.DirectorySeparatorChar)
-               dokanPath = PathDirectorySeparatorChar + dokanPath;
-            if (!foundDirectories.TryGetValue(dokanPath, out found))
-            {
-               found = sourceLocations.Select(sourceLocation => sourceLocation + dokanPath).Where(Directory.Exists).ToList();
-               if (found.Count > 0)
-               {
-                  if ((GetInfo(dokanPath, false).Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
-                  {
-                     found.RemoveRange(1, found.Count - 1);
-                  }
-                  using (foundDirectoriesSync.WriteLock())
-                  {
-                     foundDirectories[dokanPath] = found;
-                  }
-               }
-            }
-         }
-         return found;
-      }
-
-      /// <summary>
-      /// Called when the actual file / directory has been deleted.
-      /// This allows the location cache's to be updated
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="isDirectory"></param>
-      public void DeleteLocation(string dokanPath, bool isDirectory)
-      {
-         if (isDirectory)
-         {
-            using (foundDirectoriesSync.WriteLock())
-            {
-               foundDirectories.Remove(dokanPath);
-            }
-         }
-         else
-         {
-            // TODO: Do the File cache removal
-         }
-      }
-
-      /// <summary>
-      /// Return the found elements from the dokanPath
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="pattern">search pattern</param>
-      public FileSystemInfo[] FindFiles(string dokanPath, string pattern)
-      {
-         string path = OpenLocation(dokanPath);
-         Dictionary<string, FileSystemInfo> uniqueFiles = new Dictionary<string, FileSystemInfo>();
-         if (!Directory.Exists(path))
-         {
-            // TODO: Check if this is ever called
-            AddFiles(path, uniqueFiles, pattern);
-         }
-         else
-         {
-            List<string> currentMatchingDirs = OpenDirectoryLocations(dokanPath);
-            // Do this in reverse, so that the preferred references overwrite the older files
-            for (int i = currentMatchingDirs.Count - 1; i >= 0; i--)
-            {
-               AddFiles(currentMatchingDirs[i], uniqueFiles, pattern);
-            }
-         }
-         // TODO: Should this return "." and ".." info as well ?
-         FileSystemInfo[] foundFiles = new FileSystemInfo[uniqueFiles.Count];
-         int index = 0;
-         using (fileInfoSync.WriteLock())
-         {
-            // Update the cache and perform the return build up
-            foreach (FileSystemInfo info in uniqueFiles.Select(kvp => kvp.Value))
-            {
-               fileInfoCache[info.FullName] = info;
-               foundFiles[index++] = info;
-            }
-         }
-         return foundFiles;
-      }
-
-#endregion
-
-      private string TrimToMount(string fullFilePath)
-      {
-         int index = sourceLocations.FindIndex(fullFilePath.StartsWith);
-         return index >= 0 ? fullFilePath.Remove(0, sourceLocations[index].Length) : String.Empty;
-      }
-
-      // adds the root path to rootPaths dicionary for a specific file
-      protected string TrimAndAddUnique(string fullFilePath)
-      {
-         string key = TrimToMount(fullFilePath);
-         if (!String.IsNullOrEmpty(key))
-         {
-            Log.Trace("Adding [{0}] to [{1}]", key, fullFilePath);
-            using (rootPathsSync.WriteLock())
-            {
-               rootPaths[key] = fullFilePath;
-            }
-            return key;
-         }
-         throw new ArgumentException("Unable to find BelongTo Path: " + fullFilePath, fullFilePath);
-      }
-
-      private void AddFiles(string path, Dictionary<string, FileSystemInfo> files, string pattern)
-      {
-         Log.Trace("AddFiles IN path[{0}] pattern[{1}]", path, pattern);
-         try
-         {
-            DirectoryInfo dirInfo = new DirectoryInfo(path);
-            if (dirInfo.Exists)
-            {
-               FileSystemInfo[] fileSystemInfos = dirInfo.GetFileSystemInfos(pattern, SearchOption.TopDirectoryOnly);
-               //                  bool isDirectoy = (info2.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
-               foreach (FileSystemInfo info2 in fileSystemInfos)
-               {
-                  // Prevent the system from timing out due to slow access through the driver == FileAttributes.Offline
-                  if (Log.IsTraceEnabled
-                     && ((info2.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)   // Not even XP allows this!
-                     )
-                  {
-                     info2.Attributes |= FileAttributes.Offline;
-                  }
-                  files[TrimAndAddUnique(info2.FullName)] = info2;
-               }
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("AddFiles threw: ", ex);
-         }
-      }
-   }
-}
diff --git a/LiquesceSvcMEF/IFileEventHandlers.cs b/LiquesceSvcMEF/IFileEventHandlers.cs
deleted file mode 100644
index 6e7c2e0..0000000
--- a/LiquesceSvcMEF/IFileEventHandlers.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-
-namespace LiquesceSvcMEF
-{
-   /// <summary>
-   /// Will respond to deletes, and moves that have already occurred
-   /// The order of firing (i.e after a directory move) will be:
-   /// FileDeleted
-   /// DirectoryDeleted
-   /// FileClosed
-   /// </summary>
-   public interface IFileEventHandlers
-   {
-      /// <summary>
-      /// To be used after a file has possibly been updated and closed.
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      void FileClosed(List<string> actualLocations);
-
-      /// <summary>
-      /// To be used after a file has possibly been updated and closed.
-      /// </summary>
-      /// <param name="actualLocation"></param>
-      void FileClosed(string actualLocation);
-
-      /// <summary>
-      /// A file has been removed from the system
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      void FileDeleted(List<string> actualLocations);
-
-      /// <summary>
-      /// When a directory is deleted (i.e. is empty), this will be called
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      void DirectoryDeleted(List<string> actualLocations);
-
-   }
-}
diff --git a/LiquesceSvcMEF/ILocations.cs b/LiquesceSvcMEF/ILocations.cs
deleted file mode 100644
index 4b15659..0000000
--- a/LiquesceSvcMEF/ILocations.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-
-namespace LiquesceSvcMEF
-{
-   /// <summary>
-   /// Used to get the next / this file location(s), i.e. Create / Open calls
-   /// </summary>
-   public interface ILocations
-   {
-      /// <summary>
-      /// Return possible Physical Location of the new file, does not create it
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>New Physical Location to create the new object</returns>
-      string CreateLocation(string dokanPath);
-
-      /// <summary>
-      /// Return Physical Location of an existing file
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>Physical Location</returns>
-      string OpenLocation(string dokanPath);
-
-      /// <summary>
-      /// Return location(s) of the directories that make up the merged directory object.
-      /// Return them in priority order (i.e. the order they are defined in the GUI)
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>Physical Location</returns>
-      List<string> OpenDirectoryLocations(string dokanPath);
-
-      /// <summary>
-      /// Called when the actual file / directory has been deleted.
-      /// This allows the location cache's to be updated
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="isDirectory"></param>
-      void DeleteLocation(string dokanPath, bool isDirectory);
-
-      /// <summary>
-      /// Populate the base class with the appropriate object
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <param name="refreshCache">If Liquesce knows it has the file open then it will send true</param>
-      FileSystemInfo GetInfo(string dokanPath, bool refreshCache);
-
-      /// <summary>
-      /// Return the found elements from the dokanPath
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="pattern">search pattern</param>
-      FileSystemInfo[] FindFiles(string dokanPath, string pattern);
-   }
-}
diff --git a/LiquesceSvcMEF/IManagement.cs b/LiquesceSvcMEF/IManagement.cs
deleted file mode 100644
index 730684e..0000000
--- a/LiquesceSvcMEF/IManagement.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace LiquesceSvcMEF
-{
-   public interface IManagement
-   {
-      /// <summary>
-      /// Used to force this Extension to read it's config information
-      /// </summary>
-      /// <param name="mountPoint">Ofset into the Config information as there may be more than one mount</param>
-      /// <param name="holdOffBufferBytes">When creating new objects, this is used to move to the next calculated location</param>
-      void Initialise(string mountPoint, UInt64 holdOffBufferBytes);
-
-      /// <summary>
-      /// Called to get this thing going
-      /// </summary>
-      void Start();
-
-      /// <summary>
-      /// Called to exit the functions / threads, so be nice because this is normally 
-      /// the service closing and will have limited time before the rug is pulled
-      /// </summary>
-      void Stop();
-
-      /// <summary>
-      /// Details to be passed in of the base mountPoint information
-      /// </summary>
-      List<string> SourceLocations { set; }
-
-      /// <summary>
-      /// Details to be passed in as the shares are "discovered" for the mountPoint
-      /// </summary>
-      List<string> KnownSharePaths { set; }
-
-   }
-}
diff --git a/LiquesceSvcMEF/IMoveManager.cs b/LiquesceSvcMEF/IMoveManager.cs
deleted file mode 100644
index 76c8b5f..0000000
--- a/LiquesceSvcMEF/IMoveManager.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-
-namespace LiquesceSvcMEF
-{
-   public interface IMoveManager
-   {
-      /// <summary>
-      /// Move directories depends on the scatter pattern beig used by the plugin.
-      /// Therefore if a priority is implemented, then it could be that some files from a remote part are
-      /// being collasced into a single location, but that location may already exist
-      /// There are other difficult scenrios that each of the plugins will need to solve.
-      /// When they have done, they must inform the other plugin's of their actions.
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="dokanTarget"></param>
-      /// <param name="replaceIfExisting"></param>
-      /// <param name="actualFileNewLocations"></param>
-      /// <param name="actualFileDeleteLocations"></param>
-      /// <param name="actualDirectoryDeleteLocations"></param>
-      void MoveDirectory(string dokanPath, string dokanTarget, bool replaceIfExisting, out List<string> actualFileNewLocations, out List<string> actualFileDeleteLocations, out List<string> actualDirectoryDeleteLocations);
-   }
-}
diff --git a/LiquesceSvcMEF/IServicePlugin.cs b/LiquesceSvcMEF/IServicePlugin.cs
deleted file mode 100644
index c2332b7..0000000
--- a/LiquesceSvcMEF/IServicePlugin.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-
-namespace LiquesceSvcMEF
-{
-   public interface IDescription
-   {
-      /// <summary>
-      /// Returns the name of the functionality provided, i.e. Priority
-      /// will normally be the static string used in the menu items / logging
-      /// </summary>
-      string Description { get; }
-   }
-
-   public interface ICreateFactory
-   {
-      /// <summary>
-      /// Creates a new class object that implements IServicePlugin
-      /// </summary>
-      /// <returns></returns>
-      IServicePlugin Create();
-   }
-
-   // +=+= The Service will then import this way
-   // +=+= See http://msdn.microsoft.com/en-us/library/dd460648.aspx#further_imports_and_importmany
-   //[ImportMany]
-   //IEnumerable<Lazy<IDescription, ICreateFactory>> operations;
-
-   // +=+= The MEF Dll will then implement this for export and object creation when Add class object are required
-   //[Export(typeof(ICreateFactory))]
-   //[ExportMetadata("Description", "Add")]
-   //class Add: ICreateFactory
-   //{
-   //    IServicePlugin Create()
-   //    {
-   //        return new Add();
-   //    }
-   //#region Implement Interfaces
-   //#endregion
-   //}
-
-   /// <summary>
-   /// The Main Plugin Interface that will be Implemented and then detected from the MEF DLL's
-   /// and used in the Liquesce Service
-   /// </summary>
-   public interface IServicePlugin : IManagement, ILocations, IMoveManager, IFileEventHandlers
-   {
-   }
-}
diff --git a/LiquesceSvcMEF/Liquesce.ico b/LiquesceSvcMEF/Liquesce.ico
deleted file mode 100644
index 184a228..0000000
Binary files a/LiquesceSvcMEF/Liquesce.ico and /dev/null differ
diff --git a/LiquesceSvcMEF/LiquesceSvcMEF.csproj b/LiquesceSvcMEF/LiquesceSvcMEF.csproj
deleted file mode 100644
index 14456c5..0000000
--- a/LiquesceSvcMEF/LiquesceSvcMEF.csproj
+++ /dev/null
@@ -1,149 +0,0 @@
-<?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>{E39910A2-C72A-4D3C-BFD0-4356906B86A7}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>LiquesceSvcMEF</RootNamespace>
-    <AssemblyName>LiquesceSvcMEF</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
-    <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>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>
-  <PropertyGroup>
-    <ApplicationIcon>Liquesce.ico</ApplicationIcon>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Debug\LiquesceSvcMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Release\LiquesceSvcMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
-    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="NLog">
-      <HintPath>..\ThirdParty\NLog.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="CommonStorage.cs" />
-    <Compile Include="IFileEventHandlers.cs" />
-    <Compile Include="ILocations.cs" />
-    <Compile Include="IManagement.cs" />
-    <Compile Include="IMoveManager.cs" />
-    <Compile Include="IServicePlugin.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="RWLSExtension.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
-      <Visible>False</Visible>
-      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <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>false</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="Liquesce.ico" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PostBuildEvent>Time /t</PostBuildEvent>
-  </PropertyGroup>
-  <ProjectExtensions>
-    <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
-    </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
diff --git a/LiquesceSvcMEF/Properties/AssemblyInfo.cs b/LiquesceSvcMEF/Properties/AssemblyInfo.cs
deleted file mode 100644
index c6da9e3..0000000
--- a/LiquesceSvcMEF/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-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("LiquesceSvcMEF")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Smurf-IV")]
-[assembly: AssemblyProduct("Liquesce")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 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("35c85a67-5d71-4cc1-82eb-c7b68d69b429")]
-
-// 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("2011.4.27.18")]
-[assembly: AssemblyFileVersion("2011.4.27.18")]
diff --git a/LiquesceSvcMEF/RWLSExtension.cs b/LiquesceSvcMEF/RWLSExtension.cs
deleted file mode 100644
index 2d5dc3f..0000000
--- a/LiquesceSvcMEF/RWLSExtension.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-using System;
-using System.Threading;
-
-namespace LiquesceSvcMEF
-{
-   // Stolen from http://stackoverflow.com/questions/407238/readerwriterlockslim-vs-monitor
-   //
-   internal static class RWLSExtension
-   {
-      public static ReadLockHelper ReadLock(this ReaderWriterLockSlim readerWriterLock)
-      {
-         return new ReadLockHelper(readerWriterLock);
-      }
-
-      public static UpgradeableReadLockHelper UpgradableReadLock(this ReaderWriterLockSlim readerWriterLock)
-      {
-         return new UpgradeableReadLockHelper(readerWriterLock);
-      }
-
-      public static WriteLockHelper WriteLock(this ReaderWriterLockSlim readerWriterLock)
-      {
-         return new WriteLockHelper(readerWriterLock);
-      }
-
-      public struct ReadLockHelper : IDisposable
-      {
-         private readonly ReaderWriterLockSlim readerWriterLock;
-
-         public ReadLockHelper(ReaderWriterLockSlim readerWriterLock)
-         {
-            readerWriterLock.EnterReadLock();
-            this.readerWriterLock = readerWriterLock;
-         }
-
-         public void Dispose()
-         {
-            this.readerWriterLock.ExitReadLock();
-         }
-      }
-
-      public struct UpgradeableReadLockHelper : IDisposable
-      {
-         private readonly ReaderWriterLockSlim readerWriterLock;
-
-         public UpgradeableReadLockHelper(ReaderWriterLockSlim readerWriterLock)
-         {
-            readerWriterLock.EnterUpgradeableReadLock();
-            this.readerWriterLock = readerWriterLock;
-         }
-
-         public void Dispose()
-         {
-            this.readerWriterLock.ExitUpgradeableReadLock();
-         }
-      }
-
-      public struct WriteLockHelper : IDisposable
-      {
-         private readonly ReaderWriterLockSlim readerWriterLock;
-
-         public WriteLockHelper(ReaderWriterLockSlim readerWriterLock)
-         {
-            readerWriterLock.EnterWriteLock();
-            this.readerWriterLock = readerWriterLock;
-         }
-
-         public void Dispose()
-         {
-            this.readerWriterLock.ExitWriteLock();
-         }
-      }
-   }
-
-   // Example usage
-
-   //class ReaderWriterLockedList<T> : SlowList<T>
-   //{
-
-   //   ReaderWriterLockSlim slimLock = new ReaderWriterLockSlim();
-
-   //   public override T this[int index]
-   //   {
-   //      get
-   //      {
-   //         using (slimLock.ReadLock())
-   //         {
-   //            return base[index];
-   //         }
-   //      }
-   //      set
-   //      {
-   //         using (slimLock.WriteLock())
-   //         {
-   //            base[index] = value;
-   //         }
-   //      }
-   //   }
-   //}
-
-}
diff --git a/LiquesceTray/App.config b/LiquesceTray/App.config
index 706006a..f6016a3 100644
--- a/LiquesceTray/App.config
+++ b/LiquesceTray/App.config
@@ -2,6 +2,9 @@
 <configuration>
    <configSections>
       <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
+      <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+         <section name="LiquesceTray.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+      </sectionGroup>
    </configSections>
 
    <!-- Stick the namespaces in .. this is supposed to allow the intellisense to work ;-) -->
@@ -10,7 +13,7 @@
       <variable name="LogDir" value="${specialfolder:folder=CommonApplicationData}/Liquesce/Logs"/>
       <targets>
          <target name="file" xsi:type="File"
-                 layout="${longdate}[${threadid}][${threadname}] ${level:uppercase=true} ${logger}: ${message} ${exception:format=ToString}"
+                 layout="${longdate}[${threadid}] ${level:uppercase=true} ${logger}: ${message} ${exception:format=ToString}"
                  fileName="${LogDir}/LiquesceTray.log"
                  archiveFileName="${LogDir}/LiquesceTray.{#}.log"
                  archiveAboveSize="1048576"
@@ -23,36 +26,14 @@
          <logger name="*" minlevel="Debug" writeTo="file"/>
       </rules>
    </nlog>
-   <system.serviceModel>
-      <client>
-         <endpoint address="net.tcp://127.0.0.1:41014/LiquesceFacade"
-            binding="netTcpBinding" bindingConfiguration="tcp_Unsecured"
-            contract="LiquesceFacade.ILiquesce" name="LiquesceFacade" />
-         <endpoint address="net.tcp://localhost:41015/LiquesceCallBackFacade"
-            binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ILiquesceCallBack"
-            contract="LiquesceCallbackSvcRef.ILiquesceCallBack" name="NetTcpBinding_ILiquesceCallBack" />
-      </client>
-      <bindings>
-         <netTcpBinding>
-            <binding name="tcp_Unsecured">
-               <security mode="None" />
-            </binding>
-            <binding name="NetTcpBinding_ILiquesceCallBack" closeTimeout="00:01:00"
-               openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
-               transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
-               hostNameComparisonMode="StrongWildcard" listenBacklog="10"
-               maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
-               maxReceivedMessageSize="65536">
-               <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
-                  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
-               <reliableSession ordered="true" inactivityTimeout="00:10:00"
-                  enabled="false" />
-               <security mode="None">
-                  <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
-                  <message clientCredentialType="Windows" />
-               </security>
-            </binding>
-         </netTcpBinding>
-      </bindings>
-   </system.serviceModel>
+   <userSettings>
+      <LiquesceTray.Properties.Settings>
+         <setting name="WindowLocation" serializeAs="String">
+            <value />
+         </setting>
+         <setting name="UpdateRequired" serializeAs="String">
+            <value>True</value>
+         </setting>
+      </LiquesceTray.Properties.Settings>
+   </userSettings>
 </configuration>
diff --git a/LiquesceTray/DoubleProgressBar.Designer.cs b/LiquesceTray/DoubleProgressBar.Designer.cs
index d753f74..531a0cd 100644
--- a/LiquesceTray/DoubleProgressBar.Designer.cs
+++ b/LiquesceTray/DoubleProgressBar.Designer.cs
@@ -125,9 +125,6 @@ private void InitializeComponent()
             ToolTip_panel1 = new System.Windows.Forms.ToolTip();
             ToolTip_panel1.SetToolTip(this.panel1, "Data");
 
-            ToolTip_panel2 = new System.Windows.Forms.ToolTip();
-            ToolTip_panel2.SetToolTip(this.panel2, "Backup");
-
             ToolTip_free = new System.Windows.Forms.ToolTip();
             ToolTip_free.SetToolTip(this, "Free Space");
 
@@ -471,7 +468,6 @@ private void Draw3DBorder(Graphics g)
         private Panel panel1;
         private Panel panel2;
         ToolTip ToolTip_panel1;
-        ToolTip ToolTip_panel2;
         ToolTip ToolTip_free;
         private TransparentLabel labelChange; 
 
diff --git a/LiquesceTray/DoubleProgressBar.cs b/LiquesceTray/DoubleProgressBar.cs
index fff37c3..079fd55 100644
--- a/LiquesceTray/DoubleProgressBar.cs
+++ b/LiquesceTray/DoubleProgressBar.cs
@@ -1,4 +1,29 @@
-using System.Windows.Forms;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="DoubleProgressBar.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2011 fpDragon
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+using System.Windows.Forms;
 
 namespace LiquesceTray
 {
diff --git a/LiquesceTray/DropZone.Designer.cs b/LiquesceTray/DropZone.Designer.cs
new file mode 100644
index 0000000..e0199e7
--- /dev/null
+++ b/LiquesceTray/DropZone.Designer.cs
@@ -0,0 +1,84 @@
+namespace LiquesceTray
+{
+    partial class DropZone
+    {
+        /// <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()
+        {
+         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DropZone));
+         this.textBox1 = new System.Windows.Forms.TextBox();
+         this.listBox1 = new System.Windows.Forms.ListBox();
+         this.SuspendLayout();
+         // 
+         // textBox1
+         // 
+         this.textBox1.Location = new System.Drawing.Point(14, 13);
+         this.textBox1.Name = "textBox1";
+         this.textBox1.Size = new System.Drawing.Size(637, 22);
+         this.textBox1.TabIndex = 0;
+         // 
+         // listBox1
+         // 
+         this.listBox1.FormattingEnabled = true;
+         this.listBox1.ItemHeight = 14;
+         this.listBox1.Location = new System.Drawing.Point(14, 41);
+         this.listBox1.Name = "listBox1";
+         this.listBox1.Size = new System.Drawing.Size(637, 102);
+         this.listBox1.TabIndex = 1;
+         // 
+         // DropZone
+         // 
+         this.AllowDrop = true;
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.ClientSize = new System.Drawing.Size(666, 156);
+         this.Controls.Add(this.listBox1);
+         this.Controls.Add(this.textBox1);
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+         this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+         this.MaximizeBox = false;
+         this.MinimizeBox = false;
+         this.Name = "DropZone";
+         this.Opacity = 0.75D;
+         this.ShowInTaskbar = false;
+         this.Text = "DropZone - Drag and drop your files or folders here to see on which disks they ar" +
+    "e!";
+         this.TopMost = true;
+         this.Load += new System.EventHandler(this.DropZone_Load);
+         this.DragDrop += new System.Windows.Forms.DragEventHandler(this.Dropper_DragDrop);
+         this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Dropper_DragEnter);
+         this.ResumeLayout(false);
+         this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.ListBox listBox1;
+    }
+}
\ No newline at end of file
diff --git a/LiquesceTray/DropZone.cs b/LiquesceTray/DropZone.cs
new file mode 100644
index 0000000..bf9893d
--- /dev/null
+++ b/LiquesceTray/DropZone.cs
@@ -0,0 +1,113 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="DropZone.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2011 fpFragon
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
+using System.IO;
+using System.Linq;
+using System.ServiceModel;
+using System.Windows.Forms;
+using LiquesceFacade;
+
+namespace LiquesceTray
+{
+   public partial class DropZone : Form
+   {
+      private ConfigDetails config;
+
+      public DropZone()
+      {
+         InitializeComponent();
+      }
+
+      private void Dropper_DragEnter(object sender, DragEventArgs e)
+      {
+         e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None;
+      }
+
+      private void Dropper_DragDrop(object sender, DragEventArgs e)
+      {
+         string[] strFiles = (string[])e.Data.GetData(DataFormats.FileDrop);
+         GetAllRoots(strFiles[0]);
+      }
+
+      private void DropZone_Load(object sender, EventArgs e)
+      {
+         GetConfig();
+
+      }
+
+      private bool GetConfig()
+      {
+         bool value = true;
+         try
+         {
+            EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/LiquesceFacade");
+            NetNamedPipeBinding namedPipeBindingpublish = new NetNamedPipeBinding();
+            LiquesceProxy proxy = new LiquesceProxy(namedPipeBindingpublish, endpointAddress);
+
+            config = proxy.ConfigDetails;
+         }
+         catch
+         {
+            value = false;
+         }
+         return value;
+      }
+
+
+      private void GetAllRoots(string liquescePath)
+      {
+         textBox1.Text = liquescePath;
+
+         listBox1.Items.Clear();
+
+         // check if path is on liquesce drive
+         if (config.MountDetails.Select(mt => mt.DriveLetter).Any(dv => dv[0] == liquescePath[0]))
+         {
+            // cut drive letter and :
+            string relative = liquescePath.Substring(2);
+
+            foreach (string root in config.MountDetails.Select(mt => mt.SourceLocations).SelectMany(scs => scs.Select(sc => sc.SourcePath)))
+            {
+               if (File.Exists(root + relative))
+               {
+                  listBox1.Items.Add(root + relative);
+               }
+
+               if (Directory.Exists(root + relative))
+               {
+                  listBox1.Items.Add(root + relative);
+               }
+            }
+         }
+         else
+         {
+            listBox1.Items.Add("File is not in Liquesce Drive.");
+         }
+      }
+
+   }
+}
diff --git a/LiquesceTray/DropZone.resx b/LiquesceTray/DropZone.resx
new file mode 100644
index 0000000..fcf9eb0
--- /dev/null
+++ b/LiquesceTray/DropZone.resx
@@ -0,0 +1,418 @@
+<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA
+        IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYGBgENDQ0DEBAQCQ4O
+        DhMODg4gCwsLLgsLCzsODg5HCQkJTQEBAU4BAQFOCQkJTQ4ODkcLCws7CwsLLg4ODiAODg4TEBAQCQ0N
+        DQMGBgYBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsLARAQEAgPDw8gDQ0NSRIS
+        EnkYGBijHBsbxB8fH9siISHpJSQj8iYlJfcnJib6JiYm+yUkJPskJCT7JCMk+yQjI/oiIiL3Hx8f8hwb
+        G+kZGBjaFxcXwxUVFaIQEBB4DQ0NSQ4PDyAQEBAICwsLAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREQoPDw80FRUVeyAf
+        H8EpKCjrMjAw/DQyMv8yMTH/MjEx/zEwMP8xLy//MC8u/y8uLv8uLS3/LSws/ywsLP8sKyv/Kikq/ysq
+        Kv8rKir/Kyoq/ysqKv8rKir/LCsr/y8tLf8yMDD/MC8u/CcmJuoeHR3AExMTeg8PDzMREREKAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhINExMTTRwc
+        HLQsKyvwNjU1/jo4OP86ODf/ODc3/zc2Nv83Njb/Pj08/0pIR/9UUVD/W1lX/19dXP9iYF7/Y2Ff/2Jf
+        Xv9fXFr/WldW/1VTUf9QTkz/TUpJ/0dFRP8+PT3/NTQ0/zIxMf82NDT/Ojk4/zw6Ov8+PDv/PTs7/jEv
+        Lu4bGxuyEhISTRISEg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTAxAQ
+        EC0WFhamKikq9jIxMv82NTX/Ojg4/0RBQP9aV1b/cGxr/4B9e/+NiYb/ko6L/5KOi/+QjIn/jYqH/4uI
+        hf+IhIH/hIF9/4B8ef96dnP/dXFu/3Btav9va2j/dHBt/3p1c/+AfHr/h4SA/4WCgP97eHf/amhn/1RR
+        Uf9APT3/QkA//0RBQP88Ojn/LCsr8xQUFKIQEBAtExMTAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAPDw8BEBAQNRgYGckoKCn+Li0u/zs4OP9mYmH/kIuJ/6mioP+ooZ//oZqY/5mUkv+Pioj/fnp4/25r
+        af9gXVv/U1FP/0lHRv9CQD//PDo4/zg2Nf81MzL/NTMy/zY0M/86ODb/REJA/1BOTP9fXFr/cm9s/4WC
+        f/+UkI7/oJuZ/6umpP+loJ//hYGA/1tYV/89Ozr/NzU1/y0sLf4WFhbAEBAQNA8PDwEAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAQEBARExMUryIiJP8zMjL/cGxq/62opf+7tLH/tqyq/6KWlP9/c3L/XlRU/0xF
+        Rf9KRUT/VFFP/2FeXP9saWf/dXJv/3t4dv9+enj/fXp3/3p3dP91cm//cW5r/2toZf9lYmD/Yl9c/11a
+        WP9UUlD/SkhG/0E+Pf9FQkH/WVNS/393d/+imZn/ta2s/7mxsP+knp3/ZGFg/zUzNP8nJif+Dw8QnxAQ
+        EBIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCQolHR0f9URDQv+dmJb/ubKv/7Cno/+Ie3b/cWBc/4Ft
+        a/+ahob/rJma/6mamv+elJP/lpCN/5OOi/+QjIr/jouH/4yJhv+JhoP/h4SA/4SBfv+BfXr/fnt4/3x5
+        df97d3T/f3t5/4SAff+IhIL/jYqG/5KOi/+clZP/m5KS/4p9fv90ZWb/cGBh/5CBgv+3rq3/wLq4/5mU
+        kv8/PTz/HBwd5ggICB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBUxQD0+/qiin/+oop3/dm1m/4J1
+        bf+1pZ7/zrq1/860tP/LrbD/wqao/7Odn/+jlZT/npWU/6OenP+rp6X/s7Gu/7m3tf+8urj/vry6/728
+        uv+8urj/uri2/7Wzsf+wrqz/qael/6Kfnf+bmJb/l5SR/5qVk/+nnp3/s6Sm/7+prP/Cqaz/xKyu/6uV
+        lf+DcW//i357/7y1sv+noZ//Ojc39hUVFRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsKitPi4aE/4aA
+        fP9yamT/uq6l/9PEuf/YxLz/2b+7/9m4uv/cvcH/38nL/9/T1P/k3d3/5ODg/9bU0v/Cv7z/sK2p/6Kf
+        mv+ZlZD/ko6J/46Lhf+Pi4X/k4+J/5qWkf+koZz/sq+r/8XDwP/Y19X/4+Lh/+Dd3P/Z1NT/1srM/9S8
+        wP/RsLT/0rCx/8+zsf/Lt7L/uqul/4Z4cv+jmZT/gXp3/kU7NiwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AABBPz9re3Z0/4aAe//Bt6//z8C0/9vJu//m1c3/7d7c//Ll5v/fys7/uJyf/5F4d/9tW1b/UUU9/0U8
+        NP9DPDP/Qz00/0M8M/9DPDP/Qjsy/0E6Mf9AOjH/QTox/0I7Mv9DPTT/RD41/0Q+NP9EPjX/UEg//2lg
+        Wf+Lf3v/tKSk/9/R0v/x5OT/69jX/+DHw//UurH/0L2z/829tP+Tg3r/h3x2/0E5NUQAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAABLSUhIenVy/7auqP/FurH/4dbN//Dn4P/i0cf/sJOI/39WU/9kOjv/XDg3/1U6
+        Nv9PPDb/TUE5/01EO/9NRj3/TEU9/0tFPf9JRDz/R0M7/0ZDOv9FQTn/RUA4/0dCOv9LRT3/TkhA/09I
+        P/9MRTz/SkE4/0k+Nv9LPDX/UTo2/189O/+EXFj/t5eQ/+XUzv/u4t3/49LI/9S9sP/GsaX/gnJp+0Y/
+        OyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5dXQop6Ge/sS+uP/l4Nz/3NHJ/56Gcf9xUDf/Z0Uy/2I/
+        M/9gPTX/XDw2/1Q+OP9YT0b/bF1Q/4BkU/+PblX/nXtW/6eIV/+vkVX/spdQ/7GbS/+xmEr/sJNO/6yN
+        VP+mhVn/nXtc/45vWv97ZFX/ZVxQ/1BMRP9MPzf/Uz44/1w+Of9lQDn/akM1/3VNN/+si3f/6NfN/+3f
+        2P/Suq7/tZ6T9J+MgxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtp6Y+v7q4/+Lf3f+6sqr/bltJ/2xV
+        Pv9tUjv/aEs3/2BFNP9iUUT/g2VY/6RsW/+1Z1L/uGhP/7ltUf+6cFH/vHdS/7p6T/+4fUv/tn1G/7V8
+        Qv+1e0D/tXlD/7d4SP+6eFD/vHZW/71zV/+7blT/umhR/7VsWf+fcWL/fGxg/19RSP9jRz3/bEw9/3NO
+        Of93TTP/iFxB/9W+tP/s39v/y7Kr+8utpx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5tbRT3tva/8G8
+        uf9iVEf/allL/25bSv9tWEX/ZFE//4Z4a/+wZ2H/tFtS/7VeUv+3Y1T/u2tZ/79zX//CeWP/w31k/8J9
+        Y//Ael7/vnZZ/7xzVf+8clT/vXNW/751Wf/Ce2H/xoFp/751Yf+6bFv/t2ZW/7VhU/+0XlP/tV1X/6x1
+        b/98em7/alFD/3ZXRf97VkH/elA8/31PQf/eysj/59fX/8+kpjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AADY1dRp4t/e/4h8dv9lVEv/cmBW/3NgVP9sWUz/eoN1/7pyev+6aHD/u2Zq/75oaP/GdXD/04t6/9uY
+        fP/jpob/566Q/+mxlf/qsZn/6q+b/+qsnv/qqaL/6aeq/+ikqP/loJ7/4ZqT/9qQhv/RhXn/xnhv/75r
+        aP+7Z2n/vm1z/75wef+hdHn/en5w/3ddT/9+Xk//fldM/3REQ/+tiY7/7t7h/+bS1UIAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAADl4+Jb5eHh/4V1cv9uVlL/e2Ng/3hgW/9sVk7/eYJ2/8OMmf/Vjpn/3JuT/+m1
+        n//0zrH/+d3B//rkzP/65tP/+uXU//rj0v/64dX/+uDX//rg2//64OD/+uHl//rg5v/63+L/+t3c//na
+        1v/51M3/98u+//K9q//prqL/4qmr/9qUpf+hfof/eX9y/3VgVP9+Y1n/gV5Z/3VHTP+ngYz/8N/k/uvj
+        5TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk4+IQ5+Pj47qur/90VVn/gmJm/3xcXv9xVVT/dF5V/867
+        q//218j//OTX//3o3P/9693//Ovc//zr2P/859L//OLL//vdxf/72MT/+9TF//vPx//7zc7/+83Z//vQ
+        3f/71dr/+9jZ//vc2f/73tj//N7V//zf1P/97OT//vDq//LIt//FrJj/c2BU/3RiWf99ZV7/gWNg/3dO
+        VP/Uv8X/7OHkyOTk4wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+DgOunh4+6znaT/g1tl/4FY
+        Yf+beXf/2sO5/+7f1v/v49n/8ubY//jkz//63Lr//dak//7Tl//+0Zn//dKi//zQqv/7zrH/+8q2//rG
+        uv/6wcH/+r/M//u/z//8wMf//MC///zBuP/9xLX/+8q3//nVw//77uX//Pfz//Tg0v/x08H/1rOg/5Z9
+        cP98aGL/fWZl/8Gxs//p4OLe49/fJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfl
+        5Sbt5ujE1MHI/q2OlP/dycX/7t/Y/+/f0//w1b3/7smi/+nDlP/iwpP/28OY/9jFoP/fza7/49C6/+HN
+        vP/fy8D/38nD/9/Jx//ex8n/3cbL/9rEyf/YwsP/0768/825sf/KtKf/1Lei/+C4nf/qwKP/9M+3//LF
+        qf/z0bz/7tLC/9i/s/+nmZb/19HS/e3q6q/n5eQXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///wH+/v4e9vX1efjx8Of45dz/89bG/+XBqP/Wtpr/y7Oa/8m3ov/Ju6X/zL2n/8u9
+        pP/b0sH/3NTH/7+yof+1qZr/rqOX/6yhl/+soZr/rKCb/62hnP+uoZv/sKOb/7Smnf+5rKH/wrSm/8e4
+        qf/KtqP/07af/9qtkP/ps5T/88Wr//jbzP726ufh9/Pzb/7+/hsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wj///8f////UP738q/+1r3m/c2v8fbdzfri1Mn+z8a6/8K4
+        q/+2q5z/t6qY/7+smP/NtKX/1LWv/86qov/Lppr/yqWV/8ilkf/Ip4//yKiO/8epjf/EqYv/vqeN/7ik
+        kf+yopP/s6eb/7yxpv/HvLD/08a5/+PSwv712cj6/L2Z8P7Hp+P+7eWu/vr6Uv///x7///8BAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////CP///1v///8y////Vf/w5qP/xJzH/sqk0/ze
+        xOX628Ln+Na96PbQvPX3zL789MS8/vbGx//4zdT/+NHc//jV2f/32dX/99zU//ff0//34tL/+OTR//jl
+        z//45sz/+OXK//jix//23sH+9du//fjcw/v12MD09da96fTXvev23MXr/Mij1P7BnMj+7eOk/vr6Vv//
+        /yD///8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////If///6////9b////RP/3
+        8Yv/2Le9/tCm1/3PqOr9zKr1/dK5+v7ZyPz+2c/8/drU+/3a2/v929/7/dvk+/3c4Pz93tn7/eDW+/3i
+        1Pv95dH7/efR+/3q0/v+7dX7/u/Z+v7w3vn+8OD5/vDh+v7x4vz+7eH8/uPS+/zVuvf61LHv/dSv2v/g
+        x77/+faN/v7+Rv///yP///8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        /yH///8k////KP/9/V7/59an/9S47P7bxfv+4Mv8/t7K+/3bzPz91sr8/c/I/f3Jyf39w879/b/Q/fy9
+        w/38v7X9/MSt+/3Hpfv9yp37/c2X+/3Qk/z+05H8/teZ/P7bqvz+4Lr8/ubK/P7s2vz+8OT8/vDl/P7u
+        4fz+5tb8/trB7P/q26r//v1j////Mf///yX///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///wf///8j/v7+Hv7p4FH+4dHP/+TU9P7j0vn93cf8/dC3/f3Grf38waz8+8Gy+frF
+        u/f4y8X2+M/I9PfSw/L41bvw99a27fjXsO352K3t+tmp7fvape382p/u/Nme7/zXnvH91aD0/dWl+P3V
+        rPv92bn9/uHM/f7p3Pz+7eL6/+zg9P7o19D+7+Rc/v7+LP///yb///8GAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wn//v4j/vT2Pv3l4Kz+4NHl/tzI7f3PsPT8yab1+c607Pfa
+        x+j24dHq9+PU7vjk0/H449Lx+OHQ8Pjeye753cHr+dq56fnatOj62rHn+9yw6PvdsOj836/p/OCz6fzg
+        uen84sLp++fO6Pvp1uX65dPm+9zF7fzTtvb+1rv2/uPQ7/7m1ef98uWv/v35Sf///in///8HAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wz+/v4l/vLzYv3k3cb+ya7u/cGd7PfM
+        rtPz3Mm/9ObYsvbs4sP37+bM+fHo0/nx6tj68ure+vLq4Pry6eD68uff+/Hl3vvx5d788eTd/PLk3fzz
+        5Nv88+PY/PPk0fz05Mf79OXA+/TnwPrz6cL58ei+9+vgtfbi0Mj507Dd/cSW8P7MqO797+HF/fz4aP//
+        /lL///8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///w7+/v4m/fT1df7U
+        xbz+rITb+8al4vbPrtv1172+9eDKlPbp2Zv46taq+ufLxfvlx9z85cbp/OTF7/3jw/H948Py/ePD8v3j
+        xPL95MXy/uTG8v7lyPD+58vs/ujN5v3ny9r85sbF+ufIq/nr1Zj36tuW9uDKnffYs833z5bl/MGE5f6o
+        bdr93sW8/f37nv///s3///9H////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        /xH+/v4n/vn6Zf7cz7L+qYjG/Mmn2vnHnOD6yZvn/M2Z6f3Yp+793bD2/uTA+P7oyvn+6c36/urQ+v7r
+        0fn+69L5/uvT+P7s1Pj+7db4/u7Y+P7v2/j+8d74/vLg9/7x3/b+79r1/unN9f3guPT92Knu/MuT6/rJ
+        jev5x4Dm/MF73v6ka8n+38ms/v38a/7+/nX///8YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP///xP+/v4k/v7+Uf7597/+08PC/s605v3QrvP+3sT7/uPM/P7kzf3+48z9/ePM/f3k
+        zf3948z9/eDI/P7exPz+3MD7/tq++v7avfr+2r76/tvC+v7fx/r+48/7/ufW/P7q3Pz96978/urc/P7o
+        2P3+6NX9/uXP/P3ewPv90aX2/s2g6f7Stb3/+PSP/v7+Tv7+/i7///8SAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///xf///8x////fv/+/vL/8Ozk/+Te+P7j3vz+4Nn9/tvU/f3T
+        zP39y8L8/ca8/P3Dt/z9wrT8/cKx+/3Brfr9wqv5/cKp9/3Cqff9wqr3/cKs9/3Cr/j9w7L5/cS2+v3D
+        uPv9w7n7/ce/+/3OyPz919H9/d3W/f7g2P3+4tz9/+Ha+P/i3sX/9vdl//7+LP///yj///8UAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///xn///8j/v79Of74+ND+6e3p/+Xq9/7a
+        4Pr+ydH8/bvH/Py3xPv8vMX5+sTC9PrMv/H61L3v+ti97frZu+r62bjn+tm35frYuOX62Lrk+ti+5PrX
+        weX61sLl+9LA5PvLvuT7w7zo+77A7/y6xPf8uMX7/bvH/P3I0fz92d/7/uTp+P/m6+X+6u+V/v7+M///
+        /yj///8XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Af7+/hv+/v4m/f38a/7w
+        69b+4tvq/tLI8f3Bs/P7xLvn+dPQ2Pjj4tT46ufY+u3m3/vu4ub87d7q/ezZ7P3q1Ov9587o/eXL5v3k
+        y+X95M3l/eTR5f3m1eb95tjm/eba4/3m3N3859/W+unk1Pnp58745OTP+dbT1vvIv+j9w7f0/tPJ9P7g
+        3Oz+7e3T/f39b/7+/iv+/v4Z/v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Av7+
+        /h3+/v4v/f39h/7l1tr+yafx/syt5vfWwLz15NmT9+7qi/r2+KP8+vy1/f3+wv39/sv9/f7R/f3+0/79
+        /dH+/PvO/fv6zP37+sv++/rK/vz7yv78/Mn+/P3F/f3+vv39/rT9/f6r/v3+vfz7/an69/ib9+/tifbo
+        4J/42MvJ/ci77P7EsPH+4tvX/f39iP7+/jH+/v4b/v7+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA/v7+A/7+/h/+/v40/vv6kP7Mq8f+vI3d/diy4PnVsNL74Maj++/nefv5+3v7+/6B/Pz+jfv7
+        /6H8/P+w/Pz/t/39/7b9/f+y/Pz+r/39/679/f+t/f3/rP39/6r8/P+j/Pz/lPz8/378/P5z/v7/zv38
+        /pf89/p0/ObqfvvT2bX6xs7d/cDX5P6lpNv+x7zE/vz8jf7+/jT///8d/v7+AgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAA/v7+BP7+/h/+/v4u/vv5ef7Ut7r+xJnP/dau2v3UrNr+0qXW/tOmz/3f
+        v8H86dSu/PLnoPz39KH8+vqm/Pv8p/z7/aD8+/6W/Pv+jvz7/ov8+/6K/Pv+i/z7/oz7+/2I/Pr8hP36
+        +pP+/PvQ/v7+/f76+vL+397X/r3C1v69ytv9wdPg/bvZ4P6kvND+zM+4/vz8df7+/i7+/v4e/v7+AwAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Bf7+/hz+/v4g/v7+W/7y6Zz+38jP/tzA3/7X
+        tNr+0qXW/tGj1/7Xrtv+2K7d/tuw3/3gud/95MLc/efH1v3nyc3958vD/ebOu/3mz7j95dC3/eTQuv3h
+        zr793cnC/dS+xv7JsMv+yLTY/vHu9v7W0ef+vLnZ/rK41v66yNr+xtjh/s3g5f7P38z+8PSY//7+V/7+
+        /iH+/v4b/v7+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Bf7+/hj+/v4U/v7+JP7+
+        /mb++fWn/u7i2v7l0eb/2rfe/tSp2f7Up9r+06PZ/tWh2/7Xod3+2KDe/tid3v7Vm9z+0pva/s+a2f7O
+        mtj+y5zY/sqf2P7Kodj+yaTY/sWi1v69nNP+s5jQ/sy/4P61q9X+tbHW/ra72f/H0eH+2+bp/ujx2/73
+        +qX+/v5g////Iv///xf+/v4X/v7+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Bf7+
+        /hP+/v4Q/v7+EP7+/h/+/v95/v39s/7488P/7d3R/uPJ3/7btd/+1KXb/s6U1//MiNX/zIHV/st+1f7J
+        gNT+yITU/seG0/7Fh9L/wojS/7+K0v++jdL/vZLS/7uT0f+2k9D+r5PP/rim1f64rtj+wr7e/tDS3f/k
+        58/+9vnF/f3+t/7+/3P///8d////E////xL///8T////BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////Bf///w/+/v4N/v7+EP7+/hX9/f9C/f3/Xf7+/4f+/v6d/vz6pv/27LL+797C/ujPz/7i
+        wNj/3bLc/tmm3f7Wodz+05/b/tCe2v7Ontr/zJ/Z/8ui2f/MqNr/zrDb/9C43P/SwNr+18rV/97Vy//m
+        4rz/8e+r/vv7oP7+/pj+/v+D/Pz/XP39/0H///8V////Ef///w7///8O////BAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAA////BP///wr///8K////Ef///xn+/v8u/v7/L/7+/z/9/f9K/v7/X/7+
+        /3j+/v+Q/v7+mv7+/p/+/Puk/vv3qv7586/+9/Cy/vbvs/717rT+9e60/vbvsv728bD++PWt/vr5qf78
+        /KL+/v6b////lf7+/4j+/v9v/v7/Vf39/0D9/f84/v7/Kf39/yr///8X////EP///wr///8J////AwAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////A////wX+/v4I/v7+Ev7+/h7///8p/v7/Mv7+
+        /zr+/v83/v7/Mf7+/zj+/v9r/f3+Ov39/0f9/f9W/f3/Y/39/2z9/f9z/f3/d/39/3j9/f93/v7/df39
+        /3L9/f9s/f3/Y/39/1X9/f5E/f3/MP39/yT+/v8k/v7/Kf7+/zD+/v8y/v7/Kv///yT///8b////Ef//
+        /wf///8E////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8I////FP//
+        /yL///8u////OP///zr+/v81/v7/Lf7+/0D+/v+A/f3+KP39/x38/P8d/Pz/Hv39/x/8/P8f/Pz/H/z8
+        /x/8/P8f/Pz/Hvz8/x78/P8f/Pz/H/z8/x79/f4d/f3/Hf7+/x/+/v8j/v7/Kf7+/y////8z////MP//
+        /yn///8e////E////wf///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAD+/v4E////Dv7+/hv///8q////Nv///z3///88////Nf7+/y3+/v8q/v7+IP7+/x3+/v8b/v7/Gv7+
+        /xr+/v8Z/f3/Gv7+/xr9/f8a/f3/Gv39/xr+/v8a/v7/Gv7+/xv+/v4d/v7/If7+/yb+/v8s////Mv//
+        /zb///82////L////yT///8Y////Df///wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAA/v7+Av7+/gf///8R////Hv///yr///8z////N////zf///8z/v7+L///
+        /yv///8o////Jv///yX///8l////JP///yT///8l////JP///yX///8k////Jf///yf+/v4r////MP//
+        /zT///83////Nv///zD///8m////Gv///w////8G////AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////A////wj///8O////FP//
+        /xv///8g/v7+Jv///yr///8t////Lv///zD///8x////Mv///zP///8z////Mv///zH///8v////Lf//
+        /yv+/v4p////Jv///yL///8c////Ff///w3///8H////A////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////Af///wH///8D/v7+BP///wb///8I////C////wz///8O////D////xD///8Q////EP//
+        /w7///8M////Cv///wj+/v4G////BP///wP///8B////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAAP//yBP/AAAAD//IE/wAAAAD/8gT8AAAAAD/yBPAA
+        AAAAD/IE4AAAAAAH8gTgAAAAAAfyBOAAAAAAB/IE4AAAAAAH8gTgAAAAAAfyBOAAAAAAB/IE4AAAAAAH
+        8gTgAAAAAAfyBOAAAAAAB/IE4AAAAAAH8gTgAAAAAAfyBOAAAAAAB/IE4AAAAAAH8gTwAAAAAA/yBPgA
+        AAAAH/IE+AAAAAA/8gT4AAAAAB/yBPAAAAAAH/IE4AAAAAAf8gT4AAAAAB/yBPgAAAAAH/IE+AAAAAAf
+        8gT4AAAAAB/yBPgAAAAAD/IE+AAAAAAf8gT4AAAAAB/yBPgAAAAAH/IE8AAAAAAf8gTwAAAAAA/yBPAA
+        AAAAD/IE8AAAAAAP8gTwAAAAAA/yBPAAAAAAD/IE8AAAAAAP8gTwAAAAAA/yBPAAAAAAD/IE8AAAAAAP
+        8gTwAAAAAA/yBPAAAAAAD/IE/AAAAAA/8gT+AAAAAH/yBP+AAAAB//IE//gAAB//8gQoAAAAIAAAAEAA
+        AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0N
+        DQIODg4PCgoKIxERET0TExNRFBQTZxMTE3YVFBSEDg4Ohw4ODocUExSEEhISdhISEmcRERFREBAQPQoK
+        CiMNDg4PDQ0NAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABER
+        EQQPDw8zFxcXcyIhIbAnJibMKSkp5CoqKvAsKir5LCsq/CsqKv0qKSn+KCgo/ignJ/0nJyf8JiUl+SUk
+        JPAlJCTkJSQkzCAgH68WFRVyDw8PMhEREQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABER
+        EQoVFRVXICAgtTIwMPg7OTn/RkRD/01MS/9VU1L/X1xb/2lmZP9tamj/bmtp/2xpZ/9mY2D/X11a/1pX
+        Vf9YVVT/UlBQ/05MTP9MSkn/RkRD/z48O/85Nzb3IiEhtBUVFVYREREKAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAPDw8NExMUbyUlJuo0MjL+X1xb/4B7ev+OiYf/kIuJ/4uGhP99enf/bGln/2FfXf9XVVL/UU5M/0tI
+        R/9JR0X/TktJ/1pXVf9va2n/gX17/4yIh/+OiYj/fHh3/1xZWP85Nzf+KSgp6RMTE2sPDw8MAAAAAAAA
+        AAAAAAAAAAAAABAQEVIlJSbsZ2Ni/6GbmP+mnJj/mYuJ/4J0dP9vZGT/Z2Fg/29raf95dnT/f3x5/4F9
+        e/9+e3j/d3Rx/3JvbP9saGb/amdk/2NhXv9dWlj/ZmFg/3xzc/+Wi4v/ppyc/52Xlv9lYWH/JSQl5g8P
+        D0sAAAAAAAAAAAAAAAAAAAAAHBsccmtnZv6clZH/j4V+/6mYkv+ynJr/uqCi/7Odn/+flJP/nJaU/6Og
+        nf+opqP/q6im/6qopv+npaL/o6Ge/52amP+ZlZP/lJGO/5aSj/+lnJv/rJud/6eSlP+kj5D/l4mH/6mi
+        n/9oZGP6GxoaYQAAAAAAAAAAAAAAAAAAAABOS0uQhYB8/52TjP/Ov7T/3cnD/+DHx//ZvsL/yba3/7mv
+        rf+qpaH/k4+K/4WBe/96dW//dXBq/3Vwaf97dm//hoJ8/5WSjP+qp6P/trGu/8K5uf/TwcP/28DB/9a6
+        uf/Jta//qZqT/5SKhP9YT0t3AAAAAAAAAAAAAAAAAAAAAFhVVI2XkIz/y8C3/+TYzv/Zxbz/r5KO/4Zk
+        Zf9uUlD/VUU+/0tBOf9JQjn/SEI5/0ZBOP9EQDf/Qz42/0Q/Nv9JQzr/S0Q7/0pCOf9RRz//ZlZR/4Fo
+        Z/+zlZH/2sS+/+LRyf/Vwbb/pJKI/llPSnQAAAAAAAAAAAAAAAAAAAAAlpGQdMO+uv/Mw7z/m4d0/2xN
+        Nv9jQzP/Y0U8/2xMQv97Wkv/jmRR/6ByVP+rgFT/sotQ/7KPSf+yjUf/sIdO/6p+V/+gc1n/i2RT/3ZZ
+        TP9lTkX/XkdA/2ZDOf9xSjf/qYh1/9vHvP/Qu7H8spuTYAAAAAAAAAAAAAAAAAAAAAC/urmIzsrI/3hq
+        Xv9sWUf/alM//3JfT/+aX1b/q2FU/7dmVP+8blj/v3dd/797XP+8elb/unZQ/7l1Tv+7dVL/wHtd/793
+        X/+5alf/tmVU/6ljWP+XZl//cGBU/3FSQf97Uzz/kWlZ/+HOzP/TsrFwAAAAAAAAAAAAAAAAAAAAAN7b
+        2pilm5j/bFhR/3RgV/9wZlr/pn1//8R1e//Kfnn/2JmJ/+Otlf/rvaL/7sGo/+/Arf/vvrH/77u5/+64
+        vf/rs7H/5quk/9ubkf/RioL/yn9//8h9h/+TeXn/d2hb/35dUf93S0n/waOp/+rZ3H4AAAAAAAAAAAAA
+        AAAAAAAA5eLiar2ysvl2WVv/fF9f/3FcVv+ulY7/7cO7//TTxf/648//++fT//vl0P/64Mr/+trK//rV
+        zP/609f/+tTf//rY2//62tj/+tnS//nVyP/119D/7cG9/6KLgP90ZFn/fmNc/3lSVf/SvMLz6OLjVgAA
+        AAAAAAAAAAAAAAAAAADj398N5uHif7iiqfKUcHj/wKah/+nYz//v3cz/8tq+//HSqP/xzpz/89Cj//PP
+        rv/xy7f/8ce9//DCxv/wwMz/78DD/+2+uP/swLD/78i0//bi1P/13c3/68u4/7yhkv+Pfnr/vrCx7ebh
+        4XDj398IAAAAAAAAAAAAAAAAAAAAAAAAAAD19PQJ8+/xcOLW2Nbv2tH/68+9/9y+ov/Uup3/0b2g/8+/
+        ov/d0b3/0cKy/8Gypv+9rqb/vK2q/7ysq/+7rKf/vKyk/8Gwo//Mt6T/17uk/+C4nf/uwaf/7s6+/+HX
+        1dH08vJo5+XkBQAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///xn///80/vjzjf7Or9/517/v5dLC99bD
+        tPrLtKb+z7Sm/9y9t//durf/2bes/9i4qP/Xu6X/17yj/9S8oP/OuaL/yLaj/829rP7Zx7f65dC++PfR
+        uPD9w6He/vHrjv79/TD///8BAAAAAAAAAAAAAAAAAAAAAAAAAAD///8J////av///0z/+PN7/tCrx/3S
+        reL70bTy+9XA+PvTyvz609H8+9bd/PvZ3v373db8++DU/Pvk0fz759H8/OvS/Pzr1fv76dX7++nX+/vj
+        0vj52MD0+tSz5v7TtMn+9/R8/v7+MP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8Q/v7+JP75
+        90j+4c7I/tzG9v3dx/z91cL8/M3A/PzIw/v7xcv6+sTG+vrHtPj7y6v2+8+g9vzSmvf91pf3/dmi+P3d
+        tfr948b7/enY/P7r3vz+5dX3/ubUyf76+FD+/v4p////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+        /wb+/Pwo/ezocP7fz+T92MD0+8+y9fnRu/D41sbx+NnK8/jbzfL32snw+Nm87PjYtOr52a/p+tus6vzd
+        quv83a7r/N657fvhxe3738nv/NvE9v7gzPX+5tXl/fXsd/7+/TD///8EAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAA////CP36+jz95d+l/cCf6PjJqdzz3cm39ejbsfft38X57d7W+u3d4/rt3OX77Nrl++zZ5fzs
+        2eT87trj/O/b3Pzv29H779u/+vDgtvfs4K/24czA+cyf5P3Bkun97+Kq/v78e////xUAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAD///8L/fv8Pf3j2pz9tJHS+cmj3vjPp9X62rLQ++K/4Pzmx+3958v1/ejM9v3o
+        zfb96M72/erQ9v7r0/b+7djz/e3Y7v3q0OL75cTY+tqy0fnPndz5xoTk/a5x1f3o2aD+/f2L////GwAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///w7+/v47/vv7q/7ay9j91r/z/t/M/P3fzf392sj9/dnG/f3X
+        wvz91L37/dK4+v3Stvn90rj5/dS9+f3Zx/v93M78/d3R/P3f0vz94tL9/d/L/P3VtvX+1r3P/vn4bP7+
+        /jT///8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP7+/jX++/ut/unq7f7f4fr9zND8/MLI/PvC
+        wvn7x731+8658/vQt/D70bPs+9Cy6/vQter70Lrr+8687PvJvOz7wrzw/MDD9/zDyvz9zND8/d7g+v7k
+        5eT+8/Vp/v7+K////w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4T/f39Qv3x7Lb+1sbt/Mq55fjT
+        y8f45OPC+fDuz/vy7Nr88ufi/fDi4/3t3N/969rd/evd3P3s4dz97eTa/e3m0vzu6sn67+3F+OblvfnW
+        z8n8y7/q/dTK7/3v7rX9/f1G/v7+EQAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Af7+/hX9/f1R/eHPuP3G
+        nuP61LPS+eXVk/r09IX7+/2W+/v+qvz8/r39/P6//fz9uvz8/bj9/P22/fz9tfz8/qr8/P6W/Pz+nP38
+        /qv78vSB+d/gn/rIzdz9tbTk/d7Ytf39/VD+/v4T/v7+AQAAAAAAAAAAAAAAAAAAAAD+/v4B/v7+Ff79
+        /EH+6Nia/dCs0/3WsNv+0qXV/dmyzPzly7v87dy1/PPouPz067L89O2i/PTum/zz7pr88u6c++/qm/3q
+        46L+7+rg/vHw8v7Ky9f+u8XZ/cLW4f23ztX+5OaX/v39P/7+/hT+/v4BAAAAAAAAAAAAAAAAAAAAAP7+
+        /gL+/v4T/v7+Iv77+WL+7eDB/uLM4P7Vrdr+1Kja/tWm2/3YqN393Kvd/duq2P3Yq9H91qvO/dOuzf3S
+        r8/9za7R/cSl0P7EsNr+yL/f/ra11/69x9z+1+Tk/ubvwf77/F7+/v4j/v7+Ev7+/gEAAAAAAAAAAAAA
+        AAAAAAAA/v7+Av7+/g3+/v4P/v7+GP39/nf9+/mn/vDjxP7mzc/+2rLT/tSf1f7Rj9f+zovX/suN1v7I
+        jtX/xJDU/8KU1f/CndX/wKHU/r+q0f7GvND+1dTM/ufpwf36/Kj9/f50////GP///xH///8N////AQAA
+        AAAAAAAAAAAAAAAAAAD///8B////Cf7+/g3+/v4V/f3/OP39/0/9/f5r/vz6hP748qT+9euw/vHguP7u
+        2b3+6tTA/ujTwP7n1MD+59e+/urfvP7t5rb+8u6s/vXznv76+3z9/f5j/f3/Sf39/zT///8U////Df//
+        /wj///8BAAAAAAAAAAAAAAAAAAAAAP///wH///8D/v7+DP7+/hv+/v8u/v7/OP7+/zT+/v83/f3+Xf39
+        /jf8/P9G/Pz/UPz8/1j8/P9a/Pz/Wfz8/1f8/P9Q/Pz/Rv39/jP9/f8l/v7/Jf7+/y3+/v8w/v7/KP//
+        /xn///8L////A////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4J/v7+Gf///y////86/v7/N/7+
+        /zP9/f47/f3+H/39/xz9/f8c/f3/G/39/xz8/P8c/Pz/G/39/xz9/f8c/f3+Hv39/yL+/v8r/v7/Mv//
+        /zP///8p////Fv///wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4E////D///
+        /xv///8o////Lf7+/iz+/v4r////Kf///yn///8p////Kf///yn///8p////KP///yj+/v4r////Lv//
+        /y3///8n////Gf///w3///8DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAD///8B////Av///wb///8J/v7+Dv7+/hH///8V////GP///xr///8b////HP///xr///8X////FP7+
+        /hH///8O////Cf///wX///8C////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAH/4AAAf4AAAB8AA
+        AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPgAAAHwAAAB8AAAAfgAAAH4AAAB+AA
+        AAfgAAAH4AAAB+AAAAfgAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAAD8AAAD/gAAB/8AAA/KAAAABgA
+        AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAg4O
+        DhoPDw9IFhYWbxgXF4oZGRmdFRUVpBQUFKQXFxedFRQUihMTE24ODg5IDQ4OGg0NDQIAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEhYaGRl4KSgozjMxMfk1MzP/Ojk5/0RCQf9HRkX/R0ZF/0NB
+        Qf8+PTz/Ojg4/zIxMf8yMDD/MzIx+SspKc4bGhp3EhISFgAAAAAAAAAAAAAAAAAAAAAAAAAAEhITTCUl
+        JeZCQED/bWlo/4R/fv+NiYb/hIB9/3Rxbv9nZGL/XltY/1ZTUf9TUU7/YF1b/3ZycP+Gg4H/gn59/2tn
+        Zv9GQ0L/KSgo5BISEkkAAAAAAAAAAAAAAAAMDA0OJSUm6H56eP+on5v/koOB/4h5ef93bm3/d3Nw/398
+        ef+DgH3/gH16/3l2c/9xbmv/cG1q/2xqZ/9taGf/f3Z2/46Cg/+pn5//fHh3/yQjJOAMDAwMAAAAAAAA
+        AAAgHyAgfnl3/5KJg/+4qKD/07m3/9K2uf/GuLn/vrm4/7Sxrv+sqaX/pqSg/6ajn/+opqL/sK6r/7u5
+        t/++ubj/x7S3/8qtr/+ynJn/oZWR/4F6ePwtKCURAAAAAAAAAABGREMtjIaC/83BuP/k1cv/w6un/5V2
+        d/9oUk7/TEE5/0dBOP9GQDf/RD42/0I9NP9FPzf/SUM6/0pDOv9iVk//kHt5/8WrqP/hzcf/1cK3/5iI
+        f/5DPDgaAAAAAAAAAACTjo0aw766/7qvpv96X0j/ZEU0/2hLQf+BWEr/l2VQ/6h0U/+yhFH/s4pI/7KH
+        Rv+wgFH/qXRY/5VlUv98Wk3/Yk5G/2dFOv+CXEb/zLSm/8+6sfu1nJULAAAAAAAAAADIxcQvwry5/2hY
+        TP9uW0v/h29m/7ZkY/+8Z1//yoBr/9OSd//Vlnv/05F5/9ONff/TjYD/z4h4/8JzZv+4ZF3/t2ts/4Bv
+        Zv95Wkn/ek5D/9jCw//au70cAAAAAAAAAADk4+Ibwrm5+HdcXP90WVb/n4mD/+i5sv/11cL/+uXQ//vl
+        0f/63sz/+tjP//rW2//62d//+trZ//nWzv/1zcH/6728/5SCef95Yln/e1VW/9XAxvHn4+QOAAAAAAAA
+        AAAAAAAA5uLiVL2nrvCpioz/6djO/+/ZxP/v0az/68yc/+/QqP/tzbX/7Mi+/+vDyP/qwcj/5r65/+W+
+        rf/vzrr/9drJ/+rKt/+kj4b/wLS16ubh4UYAAAAAAAAAAAAAAAAAAAAA////Avz8/EL76N7f8tC6+tTA
+        rf/CtaP/w7Se/9bDt//Dqp3/u6OV/7qklP+5pZP/tqWV/7iqnf/Ftqj/2L6q//PDqPr63s/c/Pr6PgAA
+        AAAAAAAAAAAAAAAAAAAAAAAA////Tf///0r/4Mqs/dGt3vvTuPD608T6+c/M/frV3P362tn9+t/U/frk
+        0f366ND9++nS/Pnm0Pz65NH6+NnB8vrTsuL+4c+u/v39OP///wEAAAAAAAAAAAAAAAAAAAAA////Cv7+
+        /iP+6+GJ/t3I9f3axPz8zrv8+8e/+vrHyvn5yL33+s6u9PvSovT81Zr1/dif9v3csvn94sj8/urb/P7m
+        1vb+7+SO/v7+Kv///wIAAAAAAAAAAAAAAAAAAAAA////Bf74+Tr93M/R+86w6PfWvtT25djY+Ore4vnq
+        3ej559bm+uXN4/vmyuL76Mnh/OnN2vvs19T67N7T+d/K2PzUtOz95NDS/v37S////wUAAAAAAAAAAAAA
+        AAAAAAAA////CP36+kr+wajE+cml3vjTrsj64sHK/ObH5P3nyvP958r1/efL9f3ozvX+69Pz/ezV6/zp
+        zdb648TE+NOn0PrGheT9wpnD/v38k////xgAAAAAAAAAAAAAAAAAAAAA////Cv7+/kn+7unW/tnH8/7f
+        z/z92cn9/dTD/P3Rvvz9z7f6/c6z+P3Otfj90b36/dbI+/3XzPz93dH9/eDP/P7YvvX+6N+e/v7+NP//
+        /woAAAAAAAAAAAAAAAAAAAAA/v7+Dv7+/Tv+7Ore/tTR9fvGyO760NTo+trS6vvhzOz74MXp+97B5fve
+        xeT73szm/NrN4vvUz+D6z9Xk+8jK7v3U0vf+5+jO/v7+Pf7+/gwAAAAAAAAAAAAAAAAAAAAA/v7+EP39
+        /F7+za3c+tOz1fjo3I77+fuV/Pz+r/z8/sP9/P3C/Pv8vf38/Lv9/P23/Pz+of39/qr7+fuU+eTkl/vJ
+        yt7+xLra/f39Xv7+/g8AAAAAAAAAAAAAAAAAAAAA/v7+Ef79/Ej+2sC9/dez2/7SpNT93bvK/OnRwPzw
+        38D88eOy/PDmo/zv56L87eSl/eTZqv7s5uf+2tji/rnD2P3D2eL+y9e7/v39R/7+/hAAAAAAAAAAAAAA
+        AAAAAAAA/v7+Df7+/hb+/Pxp/vLozv7fwdr+1anb/tGX2f7Rj9r+zo7Y/sqQ1v7Fk9X+w5nV/ryZ0v65
+        pNX+ubLY/szR2v3t89D+/P1l////GP7+/gwAAAAAAAAAAAAAAAAAAAAA////CP7+/g7+/v4o/f3/VP39
+        /Xv++PKf/vHiuP7r0sL+5sjG/uLGx/7gx8b+4s/E/ubbwP7s57T+9POY/f39c/39/1D+/v8m////Dv//
+        /wgAAAAAAAAAAAAAAAAAAAAA////Av7+/g7+/v4m/v7/OP7+/zL+/v9Z/f3+Mvz8/z38/P9H/Pz/S/z8
+        /0r8/P9H/Pz/Pf39/iz9/f8i/v7/LP7+/zD///8i////DP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAP7+
+        /gX+/v4X////L////zf+/v8w/v7+Jv7+/yH+/v8f/v7/H/7+/x/+/v8f/v7/IP7+/ib+/v8v////NP//
+        /yn///8U////BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////A////wn///8Q/v7+Fv//
+        /xz///8f////If///yH///8e////Gv7+/hb///8Q////Cf///wIAAAAAAAAAAAAAAAAAAAAAAAAAAPgA
+        H0HgAAdBwAADQYAAAUGAAAFBgAABQYAAAUGAAAFBgAABQcAAA0HAAAdBwAADQcAAA0HAAANBwAADQcAA
+        A0HAAANBwAADQcAAA0HAAANBwAADQcAAA0HgAAdB+AAfQSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABEREQESEhIqGxsbbB4eHpkgHx+0Hh0dwh0cHMIcHBy0GxoamBoa
+        GmsSEhIqERERAQAAAAAAAAAAAAAAABISEiIkIyO9U1BP/W1paP9vbGr/aWZk/2BeXP9WVFL/V1RS/2Rh
+        YP9raGf/VFFQ/SYlJbwREREhAAAAAAAAAAAvLi6rjYaC/6aXk/+YhYb/hH58/5GOi/+VkpD/jYqH/4OA
+        ff96d3X/jYOD/6KSk/+QiYf/LiwsowAAAAAAAAAAcWxqx8e6sf/RurX/pouM/4F2cf9qZV7/XllS/15Z
+        Uf9sZ2D/f3hy/5+Ojf/PtbL/yriw/3pvaLoAAAAAAAAAALm1s76Tg3X/a1A+/4VUSv+fZVL/snlY/7eD
+        T/+1f03/snlb/5xjU/+BWE//blBB/6SDcv/NtrCzAAAAAAAAAADJw8G+dVxY/411b//cop3/7MSw//TR
+        uf/0y73/9MfL//HEwv/otav/3aWk/4h0a/97V1P/2cfLsQAAAAAAAAAA7OnpJcm2us7hysD/5Myy/+HH
+        of/lzbD/2L2w/9a3uv/VtbH/2ryr/+nMuP/hv6z/yL68yebh4R8AAAAAAAAAAP7+/iP++/li/NKy3uzP
+        u/fkxLr97MnK/unLv/7p0br+5tO6/ePRv/3s1cL3+8+w3/759lr+/v4BAAAAAAAAAAD+/v4F/vj2Qf7d
+        yeX81b33+tHE9/nPyvb50bTx+9Wl8PzapPH84L70/OTR9/7k0uf++/hI/v7+AgAAAAAAAAAA/v7+Bf3v
+        7G77wZ/d99y/w/ro0dr86tTt/OrU7v3s1u397trk++vUzPjdv8f7wIrh/fXtlP7+/gwAAAAAAAAAAP7+
+        /gj+/fxy/t7V7P3TzPz8z8P6/NO89/zRtfP80bny/NPD8/zQyfj91M78/tvO6f76+k3+/v4HAAAAAAAA
+        AAD+/v4K/fPtgPzPtOL55N6o+/b1uvz38dD99OzL/fTuyfz08rv89fW1+ePiqvzHw+b98vCA/v7+CQAA
+        AAAAAAAA/v7+C/7381j93cLU/tWr1f3gvcr958rI/eXMt/3izrT928i3/tvS4/6+w9n9zd7X/vb3Vv7+
+        /goAAAAAAAAAAP7+/gb+/v4S/f39af706qH+58u//t+1yf7Zscv+1bTK/tbBx/7b0rv+7e2b/fz+Zv7+
+        /hP+/v4GAAAAAAAAAAD+/v4B/v7+Ev7+/jT+/v41/f3+PP39/jP8/P46/Pz+Ov39/jP9/f4m/v7+LP7+
+        /i3+/v4Q/v7+AQAAAAAAAAAAAAAAAP7+/gH+/v4L/v7+Gf7+/h7+/v4g/v7+Iv7+/iL+/v4f/v7+Hv7+
+        /hn+/v4K/v7+AQAAAAAAAAAAwAOsQYABrEGAAaxBgAGsQYABrEGAAaxBgAGsQYABrEGAAaxBgAGsQYAB
+        rEGAAaxBgAGsQYABrEGAAaxBwAOsQQ==
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/LiquesceTray/FreeSpace.Designer.cs b/LiquesceTray/FreeSpace.Designer.cs
index d68c95a..15b13fa 100644
--- a/LiquesceTray/FreeSpace.Designer.cs
+++ b/LiquesceTray/FreeSpace.Designer.cs
@@ -28,40 +28,44 @@ protected override void Dispose(bool disposing)
         /// </summary>
         private void InitializeComponent()
         {
-            this.components = new System.ComponentModel.Container();
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FreeSpace));
-            this.timer1 = new System.Windows.Forms.Timer(this.components);
-            this.flowLayout = new System.Windows.Forms.FlowLayoutPanel();
-            this.SuspendLayout();
-            // 
-            // timer1
-            // 
-            this.timer1.Enabled = true;
-            this.timer1.Interval = 3000;
-            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
-            // 
-            // flowLayout
-            // 
-            this.flowLayout.AutoScroll = true;
-            this.flowLayout.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.flowLayout.Location = new System.Drawing.Point(0, 0);
-            this.flowLayout.Name = "flowLayout";
-            this.flowLayout.Size = new System.Drawing.Size(791, 440);
-            this.flowLayout.TabIndex = 0;
-            // 
-            // FreeSpace
-            // 
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(791, 440);
-            this.Controls.Add(this.flowLayout);
-            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-            this.MaximumSize = new System.Drawing.Size(807, 99999);
-            this.MinimumSize = new System.Drawing.Size(807, 0);
-            this.Name = "FreeSpace";
-            this.Text = "Liquesce Free Space";
-            this.Load += new System.EventHandler(this.Form1_Load);
-            this.ResumeLayout(false);
+         this.components = new System.ComponentModel.Container();
+         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FreeSpace));
+         this.timer1 = new System.Windows.Forms.Timer(this.components);
+         this.flowLayout = new System.Windows.Forms.FlowLayoutPanel();
+         this.SuspendLayout();
+         // 
+         // timer1
+         // 
+         this.timer1.Enabled = true;
+         this.timer1.Interval = 3000;
+         this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+         // 
+         // flowLayout
+         // 
+         this.flowLayout.AutoScroll = true;
+         this.flowLayout.Dock = System.Windows.Forms.DockStyle.Fill;
+         this.flowLayout.Location = new System.Drawing.Point(0, 0);
+         this.flowLayout.Name = "flowLayout";
+         this.flowLayout.Size = new System.Drawing.Size(814, 362);
+         this.flowLayout.TabIndex = 0;
+         // 
+         // FreeSpace
+         // 
+         this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+         this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+         this.ClientSize = new System.Drawing.Size(814, 362);
+         this.Controls.Add(this.flowLayout);
+         this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+         this.MaximumSize = new System.Drawing.Size(939, 107688);
+         this.MinimizeBox = false;
+         this.MinimumSize = new System.Drawing.Size(830, 40);
+         this.Name = "FreeSpace";
+         this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
+         this.Text = "Liquesce Free Space";
+         this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FreeSpace_FormClosing);
+         this.Load += new System.EventHandler(this.Form1_Load);
+         this.ResumeLayout(false);
 
         }
 
diff --git a/LiquesceTray/FreeSpace.cs b/LiquesceTray/FreeSpace.cs
index 4283f6b..cff7426 100644
--- a/LiquesceTray/FreeSpace.cs
+++ b/LiquesceTray/FreeSpace.cs
@@ -1,4 +1,30 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="FreeSpace.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2011 fpDragon
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.Linq;
 using System.Windows.Forms;
 using LiquesceFacade;
@@ -6,790 +32,754 @@
 using System.Runtime.InteropServices;
 using System.Collections.Generic;
 using System.IO;
-using System.Threading;
 
 
 namespace LiquesceTray
 {
-    public partial class FreeSpace : Form
-    {
-        private const int CONTROL_OFFSET_TOP = 3;
-        private const int CONTROL_OFFSET_TOP_LABEL = 18;
-        private const int CONTROL_OFFSET_LEFT = 3;
-        private const int CONTROL_SPACE = 30;
-
-
-        private const int COLUMN_NAME_SIZE = 120;
-        private const int COLUMN_NAME_INDEX = 0;
-
-        private const int COLUMN_TOTAL_SIZE = 80;
-        private const int COLUMN_TOTAL_INDEX = 1;
-
-        private const int COLUMN_FREE_SIZE = 80;
-        private const int COLUMN_FREE_INDEX = 4;
-
-        private const int COLUMN_BACKUP_SIZE = 80;
-        private const int COLUMN_BACKUP_INDEX = 3;
-
-        private const int COLUMN_DATA_SIZE = 80;
-        private const int COLUMN_DATA_INDEX = 2;
-
-        private const int COLUMN_BAR_SIZE = BAR_SIZE;
-        private const int COLUMN_BAR_INDEX = 5;
-
-        private const int COLUMN_CHECK_1_SIZE = 100;
-        private const int COLUMN_CHECK_1_INDEX = 5;
-        private const int COLUMN_CHECK_2_SIZE = 200;
-        private const int COLUMN_CHECK_2_INDEX = 6;
-
-        private const int TABLE_SIZE = COLUMN_NAME_SIZE + COLUMN_TOTAL_SIZE + COLUMN_FREE_SIZE + COLUMN_BACKUP_SIZE + COLUMN_DATA_SIZE + COLUMN_BAR_SIZE + 24;
-        private const int TABLE_CELL_CNT = 6;
-
-        private const int BAR_SCALE = 1000;
-
-        private ConfigDetails config;
+   public partial class FreeSpace : Form
+   {
+      private const int CONTROL_OFFSET_TOP = 3;
+      private const int CONTROL_OFFSET_TOP_LABEL = 18;
+      private const int CONTROL_OFFSET_LEFT = 3;
+      private const int CONTROL_SPACE = 30;
+
+
+      private const int COLUMN_NAME_SIZE = 120;
+      private const int COLUMN_NAME_INDEX = 0;
+
+      private const int COLUMN_TOTAL_SIZE = 80;
+      private const int COLUMN_TOTAL_INDEX = 1;
+
+      private const int COLUMN_FREE_SIZE = 80;
+      private const int COLUMN_FREE_INDEX = 4;
+
+      private const int COLUMN_DATA_SIZE = 80;
+      private const int COLUMN_DATA_INDEX = 2;
+
+      private const int COLUMN_BAR_SIZE = BAR_SIZE;
+      private const int COLUMN_BAR_INDEX = 5;
+
+      private const int COLUMN_CHECK_1_SIZE = 100;
+      private const int COLUMN_CHECK_1_INDEX = 5;
+      private const int COLUMN_CHECK_2_SIZE = 200;
+      private const int COLUMN_CHECK_2_INDEX = 6;
+
+      private const int TABLE_SIZE = COLUMN_NAME_SIZE + COLUMN_TOTAL_SIZE + COLUMN_FREE_SIZE + COLUMN_DATA_SIZE + COLUMN_BAR_SIZE + 24;
+      private const int TABLE_CELL_CNT = 6;
+
+      private const int BAR_SCALE = 1000;
+
+      private MountDetail mountDetail;
+
+      // bar variables + constants
+      private const int BAR_SIZE = 300;
+      private int barControlOffsetLeft;
+      private ulong maxDiskSize;
+
+      private TextBox[] diskNames;
+      private TextBox[] totalSpace;
+      private TextBox totalSpaceLiquesce;
+      private TextBox[] freeSpace;
+      private TextBox freeSpaceLiquesce;
+      private TextBox[] data;
+      private TextBox dataLiquesce;
+      private DoubleProgressBar[] bars;
+      private DoubleProgressBar barLiquesce;
+      private CheckBox scaledMode;
+      private CheckBox rightAligned;
+      private TableLayoutPanel[] tableLayouts;
+
+      private ulong[] oldFree;
+
+      private List<long>[] averageRate;
+
+      public FreeSpace()
+      {
+         InitializeComponent();
+         WindowLocation.GeometryFromString(Properties.Settings.Default.WindowLocation, this);
+      }
+
+      private void Form1_Load(object sender, EventArgs e)
+      {
+         if (GetConfig())
+         {
+            InitializeControls();
+            RefreshControls();
+         }
+         else
+            Close();
+         // Review comment:
+         // Are you sure calling close in the form OnLoad actually closes the form.. The only way to do this with 
+         // garanteed results is to call it in the OnShown style callback
+      }
+
+
+      private bool GetConfig()
+      {
+         bool value = true;
+         try
+         {
+            EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/LiquesceFacade");
+            NetNamedPipeBinding namedPipeBindingpublish = new NetNamedPipeBinding();
+            LiquesceProxy proxy = new LiquesceProxy(namedPipeBindingpublish, endpointAddress);
+            mountDetail = proxy.ConfigDetails.MountDetails[0];
+         }
+         catch
+         {
+            value = false;
+         }
+         return value;
+      }
+
+
+      private void InitializeControls()
+      {
+         tableLayouts = new TableLayoutPanel[mountDetail.SourceLocations.Count()];
+         diskNames = new TextBox[mountDetail.SourceLocations.Count()];
+         totalSpace = new TextBox[mountDetail.SourceLocations.Count()];
+         freeSpace = new TextBox[mountDetail.SourceLocations.Count()];
+         data = new TextBox[mountDetail.SourceLocations.Count()];
+         bars = new DoubleProgressBar[mountDetail.SourceLocations.Count()];
+
+         oldFree = new ulong[mountDetail.SourceLocations.Count()];
+         averageRate = new List<long>[mountDetail.SourceLocations.Count()];
+         for (int i = 0; i < oldFree.Count(); i++)
+         {
+            oldFree[i] = 0;
+            averageRate[i] = new List<long>();
+         }
+
+         //------------------------------------------------------------------------------------------------
+         // 
+         // tableLayout
+         // 
+         TableLayoutPanel tableLayout = new TableLayoutPanel { ColumnCount = TABLE_CELL_CNT + 1 };
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_NAME_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_TOTAL_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_FREE_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_DATA_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_CHECK_1_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_CHECK_2_SIZE));
+         tableLayout.Location = new System.Drawing.Point(3, 3);
+         tableLayout.Name = "tableLayout";
+         tableLayout.RowCount = 1;
+         tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
+         tableLayout.Size = new System.Drawing.Size(TABLE_SIZE, CONTROL_SPACE);
+         tableLayout.TabIndex = 0;
+         flowLayout.Controls.Add(tableLayout);
+
+
+
+         int leftSpace = 0;
+         // 
+         // labelDiskName
+         // 
+         Label labelDiskName = new Label
+                                  {
+                                     Location =
+                                        new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace, CONTROL_OFFSET_TOP + 2),
+                                     Name = "labelDiskName",
+                                     Size = new System.Drawing.Size(120, CONTROL_OFFSET_TOP_LABEL),
+                                     Text = "Disk Name:",
+                                     Anchor = AnchorStyles.Bottom
+                                  };
+         tableLayout.Controls.Add(labelDiskName, COLUMN_NAME_INDEX, 0);
+         leftSpace += 123;
 
-        // bar variables + constants
-        private const int BAR_SIZE = 300;
-        private int barControlOffsetLeft;
-        private ulong maxDiskSize;
+         // 
+         // labelTotalSpace
+         // 
+         Label labelTotalSpace = new Label
+                                    {
+                                       Location =
+                                          new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                                                   CONTROL_OFFSET_TOP + 2),
+                                       Name = "labelTotalSpace",
+                                       Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
+                                       Text = "Disk Size:",
+                                       Anchor = AnchorStyles.Bottom
+                                    };
+         tableLayout.Controls.Add(labelTotalSpace, COLUMN_TOTAL_INDEX, 0);
+         leftSpace += 83;
+
+         // 
+         // labelFreeSpace
+         // 
+         Label labelFreeSpace = new Label
+         {
+            Location =
+               new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                        CONTROL_OFFSET_TOP + 2),
+            Name = "labelFreeSpace",
+            Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
+            Text = "Free Space:",
+            Anchor = AnchorStyles.Bottom
+         };
+         tableLayout.Controls.Add(labelFreeSpace, COLUMN_FREE_INDEX, 0);
+         leftSpace += 83;
+
+         // 
+         // labelData
+         // 
+         Label labelData = new Label
+         {
+            Location =
+               new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                        CONTROL_OFFSET_TOP + 2),
+            Name = "labelData",
+            Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
+            Text = "Data Size:",
+            Anchor = AnchorStyles.Bottom
+         };
+         tableLayout.Controls.Add(labelData, COLUMN_DATA_INDEX, 0);
+         leftSpace += 83;
+
+         // 
+         // scaledMode
+         // 
+         scaledMode = new CheckBox
+         {
+            AutoSize = true,
+            Location = new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace, CONTROL_OFFSET_TOP),
+            Name = "scaledMode",
+            Size = new System.Drawing.Size(123, CONTROL_OFFSET_TOP_LABEL),
+            TabIndex = 0,
+            Text = "Scaled Mode",
+            UseVisualStyleBackColor = true,
+            Checked = true,
+            Anchor = AnchorStyles.Bottom
+         };
+         tableLayout.Controls.Add(scaledMode, COLUMN_CHECK_1_INDEX, 0);
+
+         // 
+         // rightAligned
+         // 
+         rightAligned = new CheckBox
+         {
+            AutoSize = true,
+            Location = new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace, CONTROL_OFFSET_TOP),
+            Name = "rightAligned",
+            Size = new System.Drawing.Size(123, CONTROL_OFFSET_TOP_LABEL),
+            TabIndex = 0,
+            Text = "Right Aligned",
+            UseVisualStyleBackColor = true,
+            Checked = false,
+            Anchor = (AnchorStyles.Right | AnchorStyles.Bottom)
+         };
+         tableLayout.Controls.Add(rightAligned, COLUMN_CHECK_2_INDEX, 0);
+
+         // This is reset below
+         //leftSpace += 123;
+
+
+
+         //------------------------------------------------------------------------------------------------
+         // 
+         // tableLayout
+         // 
+         tableLayout = new TableLayoutPanel { ColumnCount = TABLE_CELL_CNT };
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_NAME_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_TOTAL_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_FREE_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_DATA_SIZE));
+         tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BAR_SIZE));
+         tableLayout.Location = new System.Drawing.Point(3, 3);
+         tableLayout.Name = "tableLayout";
+         tableLayout.RowCount = 1;
+         tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
+         tableLayout.Size = new System.Drawing.Size(TABLE_SIZE, CONTROL_SPACE);
+         tableLayout.TabIndex = 0;
+         flowLayout.Controls.Add(tableLayout);
+
+         leftSpace = 0;
+         // 
+         // textBox diskLiquesce
+         // 
+         TextBox diskLiquesce = new TextBox
+                                                        {
+                                                           Location =
+                                                              new System.Drawing.Point(
+                                                              CONTROL_OFFSET_LEFT + leftSpace,
+                                                              CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
+                                                           Name = "diskLiquesce",
+                                                           ReadOnly = true,
+                                                           Size = new System.Drawing.Size(120, 20),
+                                                           TabIndex = 0,
+                                                           Text = mountDetail.DriveLetter + ": (Virtual Drive)"
+                                                        };
+         tableLayout.Controls.Add(diskLiquesce, COLUMN_NAME_INDEX, 0);
+
+         leftSpace += 123;
+
+         // 
+         // textBox totalSpaceLiquesce
+         // 
+         totalSpaceLiquesce = new TextBox
+                                 {
+                                    Location =
+                                       new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                                                CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
+                                    Name = "totalSpaceLiquesce",
+                                    ReadOnly = true,
+                                    Size = new System.Drawing.Size(80, 20),
+                                    TabIndex = 0,
+                                    TextAlign = HorizontalAlignment.Right
+                                 };
+         tableLayout.Controls.Add(totalSpaceLiquesce, COLUMN_TOTAL_INDEX, 0);
+
+         leftSpace += 83;
+
+         // 
+         // textBox freeSpaceLiquesce
+         // 
+         freeSpaceLiquesce = new TextBox
+         {
+            Location =
+               new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                        CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
+            Name = "freeSpaceLiquesce",
+            ReadOnly = true,
+            Size = new System.Drawing.Size(80, 20),
+            TabIndex = 0,
+            TextAlign = HorizontalAlignment.Right
+         };
+         tableLayout.Controls.Add(freeSpaceLiquesce, COLUMN_FREE_INDEX, 0);
+
+         leftSpace += 83;
+
+
+         // 
+         // textBox rateLiquesce
+         // 
+         dataLiquesce = new TextBox
+         {
+            Location =
+               new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                        CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
+            Name = "rateLiquesce",
+            ReadOnly = true,
+            Size = new System.Drawing.Size(80, 20),
+            TabIndex = 0,
+            TextAlign = HorizontalAlignment.Right
+         };
+         tableLayout.Controls.Add(dataLiquesce, COLUMN_DATA_INDEX, 0);
+
+         leftSpace += 83;
+
+
+         //
+         // progress barLiquesce
+         //
+         barLiquesce = new DoubleProgressBar
+         {
+            Name = "barLiquesce",
+            //barControlOffsetLeft = CONTROL_OFFSET_LEFT + leftSpace;
+            //barLiquesce.Location = new System.Drawing.Point(barControlOffsetLeft, CONTROL_OFFSET_TOP + CONTROL_OFFSET_TOP_LABEL);
+            //barLiquesce.TabIndex = 0;
+            Size = new System.Drawing.Size(BAR_SIZE, 20)
+         };
+         tableLayout.Controls.Add(barLiquesce, COLUMN_BAR_INDEX, 0);
 
-        private TextBox[] diskNames;
-        private TextBox[] totalSpace;
-        private TextBox totalSpaceLiquesce;
-        private TextBox[] freeSpace;
-        private TextBox freeSpaceLiquesce;
-        private TextBox[] backup;
-        private TextBox[] data;
-        private TextBox dataLiquesce;
-        private DoubleProgressBar[] bars;
-        private DoubleProgressBar barLiquesce;
-        private CheckBox scaledMode;
-        private CheckBox rightAligned;
-        private TableLayoutPanel[] tableLayouts;
 
-        private ulong[] oldFree;
 
-        private List<long>[] averageRate;
+         // 
+         // seperatorPanel
+         // 
+         Panel seperatorPanel = new Panel
+                                   {
+                                      BorderStyle = BorderStyle.Fixed3D,
+                                      Location = new System.Drawing.Point(0, 0),
+                                      Name = "seperatorPanel",
+                                      Size = new System.Drawing.Size(TABLE_SIZE, 4),
+                                      TabIndex = 0
+                                   };
 
+         flowLayout.Controls.Add(seperatorPanel);
 
-        public FreeSpace()
-        {
-            InitializeComponent();
-        }
 
-        private void Form1_Load(object sender, EventArgs e)
-        {
-            if (GetConfig())
-            {
-                InitializeControls();
-                RefreshControls();
-            }
-            else
-                Close();
-            // Review comment:
-            // Are you sure calling close in the form OnLoad actually closes the form.. The only way to do this with 
-            // garanteed resiults is to call it in the OnShown style calback
-        }
 
+         for (int i = 0; i < mountDetail.SourceLocations.Count(); i++)
+         {
+            int ii = i + 1;
+            leftSpace = 0;
 
-        private bool GetConfig()
-        {
-            bool value = true;
-            try
-            {
-                ChannelFactory<ILiquesce> factory = new ChannelFactory<ILiquesce>("LiquesceFacade");
-                ILiquesce remoteIF = factory.CreateChannel();
-
-                config = remoteIF.ConfigDetails;
-            }
-            catch
-            {
-                value = false;
-            }
-            return value;
-        }
-
-
-        private void InitializeControls()
-        {
-            tableLayouts = new TableLayoutPanel[config.SourceLocations.Count()];
-            diskNames = new TextBox[config.SourceLocations.Count()];
-            totalSpace = new TextBox[config.SourceLocations.Count()];
-            freeSpace = new TextBox[config.SourceLocations.Count()];
-            backup = new TextBox[config.SourceLocations.Count()];
-            data = new TextBox[config.SourceLocations.Count()];
-            bars = new DoubleProgressBar[config.SourceLocations.Count()];
-
-            oldFree = new ulong[config.SourceLocations.Count()];
-            averageRate = new List<long>[config.SourceLocations.Count()];
-            for (int i = 0; i < oldFree.Count(); i++)
-            {
-                oldFree[i] = 0;
-                averageRate[i] = new List<long>();
-            }
 
             //------------------------------------------------------------------------------------------------
             // 
             // tableLayout
             // 
-            TableLayoutPanel tableLayout = new TableLayoutPanel {ColumnCount = TABLE_CELL_CNT + 1};
-           tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_NAME_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_TOTAL_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_FREE_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BACKUP_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_DATA_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_CHECK_1_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_CHECK_2_SIZE));
-            tableLayout.Location = new System.Drawing.Point(3, 3);
-            tableLayout.Name = "tableLayout";
-            tableLayout.RowCount = 1;
-            tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
-            tableLayout.Size = new System.Drawing.Size(TABLE_SIZE, CONTROL_SPACE);
-            tableLayout.TabIndex = 0;
-            flowLayout.Controls.Add(tableLayout);
-
-
-
-            int leftSpace = 0;
-            // 
-            // labelDiskName
-            // 
-            Label labelDiskName = new Label
-                                     {
-                                         Location =
-                                            new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace, CONTROL_OFFSET_TOP + 2),
-                                         Name = "labelDiskName",
-                                         Size = new System.Drawing.Size(120, CONTROL_OFFSET_TOP_LABEL),
-                                         Text = "Disk Name:",
-                                         Anchor = AnchorStyles.Bottom
-                                     };
-            tableLayout.Controls.Add(labelDiskName, COLUMN_NAME_INDEX, 0);
-            leftSpace += 123;
-
-            // 
-            // labelTotalSpace
-            // 
-            Label labelTotalSpace = new Label
-                                       {
-                                           Location =
-                                              new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                                       CONTROL_OFFSET_TOP + 2),
-                                           Name = "labelTotalSpace",
-                                           Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
-                                           Text = "Disk Size:",
-                                           Anchor = AnchorStyles.Bottom
-                                       };
-            tableLayout.Controls.Add(labelTotalSpace, COLUMN_TOTAL_INDEX, 0);
-            leftSpace += 83;
-
-            // 
-            // labelFreeSpace
-            // 
-            Label labelFreeSpace = new Label
-            {
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                            CONTROL_OFFSET_TOP + 2),
-                Name = "labelFreeSpace",
-                Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
-                Text = "Free Space:",
-                Anchor = AnchorStyles.Bottom
-            };
-            tableLayout.Controls.Add(labelFreeSpace, COLUMN_FREE_INDEX, 0);
-            leftSpace += 83;
-
-            // 
-            // labelBackup
-            // 
-            Label labelBackup = new Label
-            {
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                            CONTROL_OFFSET_TOP + 2),
-                Name = "labelBackup",
-                Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
-                Text = "Backup Size:",
-                Anchor = AnchorStyles.Bottom
-            };
-            tableLayout.Controls.Add(labelBackup, COLUMN_BACKUP_INDEX, 0);
-            leftSpace += 83;
-
-            // 
-            // labelData
-            // 
-            Label labelData = new Label
-            {
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                            CONTROL_OFFSET_TOP + 2),
-                Name = "labelData",
-                Size = new System.Drawing.Size(80, CONTROL_OFFSET_TOP_LABEL),
-                Text = "Data Size:",
-                Anchor = AnchorStyles.Bottom
-            };
-            tableLayout.Controls.Add(labelData, COLUMN_DATA_INDEX, 0);
-            leftSpace += 83;
-
-            // 
-            // scaledMode
-            // 
-            scaledMode = new CheckBox
-            {
-                AutoSize = true,
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace, CONTROL_OFFSET_TOP),
-                Name = "scaledMode",
-                Size = new System.Drawing.Size(123, CONTROL_OFFSET_TOP_LABEL),
-                TabIndex = 0,
-                Text = "Scaled Mode",
-                UseVisualStyleBackColor = true,
-                Checked = true,
-                Anchor = AnchorStyles.Bottom
-            };
-            tableLayout.Controls.Add(scaledMode, COLUMN_CHECK_1_INDEX, 0);
-
-            // 
-            // rightAligned
-            // 
-            rightAligned = new CheckBox
-            {
-                AutoSize = true,
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace, CONTROL_OFFSET_TOP),
-                Name = "rightAligned",
-                Size = new System.Drawing.Size(123, CONTROL_OFFSET_TOP_LABEL),
-                TabIndex = 0,
-                Text = "Right Aligned",
-                UseVisualStyleBackColor = true,
-                Checked = true,
-                Anchor = (AnchorStyles.Right | AnchorStyles.Bottom)
-            };
-            tableLayout.Controls.Add(rightAligned, COLUMN_CHECK_2_INDEX, 0);
-
-            // This is reset below
-            //leftSpace += 123;
-
+            tableLayouts[i] = new TableLayoutPanel { ColumnCount = TABLE_CELL_CNT };
+            tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_NAME_SIZE));
+            tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_TOTAL_SIZE));
+            tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_FREE_SIZE));
+            tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_DATA_SIZE));
+            tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BAR_SIZE));
+            tableLayouts[i].Location = new System.Drawing.Point(3, 3);
+            tableLayouts[i].Name = "tableLayouts" + i;
+            tableLayouts[i].RowCount = 1;
+            tableLayouts[i].RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
+            tableLayouts[i].Size = new System.Drawing.Size(TABLE_SIZE, CONTROL_SPACE);
+            tableLayouts[i].TabIndex = 0;
+            flowLayout.Controls.Add(tableLayouts[i]);
 
 
-            //------------------------------------------------------------------------------------------------
-            // 
-            // tableLayout
-            // 
-            tableLayout = new TableLayoutPanel {ColumnCount = TABLE_CELL_CNT};
-           tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_NAME_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_TOTAL_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_FREE_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BACKUP_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_DATA_SIZE));
-            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BAR_SIZE));
-            tableLayout.Location = new System.Drawing.Point(3, 3);
-            tableLayout.Name = "tableLayout";
-            tableLayout.RowCount = 1;
-            tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
-            tableLayout.Size = new System.Drawing.Size(TABLE_SIZE, CONTROL_SPACE);
-            tableLayout.TabIndex = 0;
-            flowLayout.Controls.Add(tableLayout);
-
-            leftSpace = 0;
             // 
-            // textBox diskLiquesce
+            // textBox diskName
             // 
-            TextBox diskLiquesce = new TextBox
-                                                           {
-                                                               Location =
-                                                                  new System.Drawing.Point(
-                                                                  CONTROL_OFFSET_LEFT + leftSpace,
-                                                                  CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
-                                                               Name = "diskLiquesce",
-                                                               ReadOnly = true,
-                                                               Size = new System.Drawing.Size(120, 20),
-                                                               TabIndex = 0,
-                                                               Text = config.DriveLetter + ": (Virtual Drive)"
-                                                           };
-            tableLayout.Controls.Add(diskLiquesce, COLUMN_NAME_INDEX, 0);
+            diskNames[i] = new TextBox
+                              {
+                                 Location =
+                                    new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                                             CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
+                                                             CONTROL_OFFSET_TOP_LABEL),
+                                 Name = "diskName" + i,
+                                 ReadOnly = true,
+                                 Size = new System.Drawing.Size(120, 20),
+                                 TabIndex = 0,
+                                 Text = mountDetail.SourceLocations[i].SourcePath
+                              };
+            tableLayouts[i].Controls.Add(diskNames[i], COLUMN_NAME_INDEX, 0);
 
             leftSpace += 123;
 
-            // 
-            // textBox totalSpaceLiquesce
-            // 
-            totalSpaceLiquesce = new TextBox
-                                    {
-                                        Location =
-                                           new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                                    CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
-                                        Name = "totalSpaceLiquesce",
-                                        ReadOnly = true,
-                                        Size = new System.Drawing.Size(80, 20),
-                                        TabIndex = 0,
-                                        TextAlign = HorizontalAlignment.Right
-                                    };
-            tableLayout.Controls.Add(totalSpaceLiquesce, COLUMN_TOTAL_INDEX, 0);
 
-            leftSpace += 83;
-
-            // 
-            // textBox freeSpaceLiquesce
-            // 
-            freeSpaceLiquesce = new TextBox
+            ulong availabel;
+            ulong total;
+            ulong freebytes;
+            if (GetDiskFreeSpaceEx(mountDetail.SourceLocations[i].SourcePath, out availabel, out total, out freebytes))
             {
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                            CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
-                Name = "freeSpaceLiquesce",
-                ReadOnly = true,
-                Size = new System.Drawing.Size(80, 20),
-                TabIndex = 0,
-                TextAlign = HorizontalAlignment.Right
-            };
-            tableLayout.Controls.Add(freeSpaceLiquesce, COLUMN_FREE_INDEX, 0);
-
-            leftSpace += 83;
-
-
-            // 
-            // textBox rateLiquesce
-            // 
-            dataLiquesce = new TextBox
-            {
-                Location =
-                   new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                            CONTROL_OFFSET_TOP + 2 + CONTROL_OFFSET_TOP_LABEL),
-                Name = "rateLiquesce",
-                ReadOnly = true,
-                Size = new System.Drawing.Size(80, 20),
-                TabIndex = 0,
-                TextAlign = HorizontalAlignment.Right
-            };
-            tableLayout.Controls.Add(dataLiquesce, COLUMN_DATA_INDEX, 0);
-
-            leftSpace += 83;
-
-
-            //
-            // progress barLiquesce
-            //
-            barLiquesce = new DoubleProgressBar {Name = "barLiquesce", 
-            //barControlOffsetLeft = CONTROL_OFFSET_LEFT + leftSpace;
-            //barLiquesce.Location = new System.Drawing.Point(barControlOffsetLeft, CONTROL_OFFSET_TOP + CONTROL_OFFSET_TOP_LABEL);
-           //barLiquesce.TabIndex = 0;
-                                                 Size = new System.Drawing.Size(BAR_SIZE, 20)
-            };
-            tableLayout.Controls.Add(barLiquesce, COLUMN_BAR_INDEX, 0);
-
-
+               if (total > maxDiskSize)
+                  maxDiskSize = total;
 
-            // 
-            // seperatorPanel
-            // 
-            System.Windows.Forms.Panel seperatorPanel = new Panel();
-            seperatorPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
-            seperatorPanel.Location = new System.Drawing.Point(0, 0);
-            seperatorPanel.Name = "seperatorPanel";
-            seperatorPanel.Size = new System.Drawing.Size(TABLE_SIZE, 4);
-            seperatorPanel.TabIndex = 0;
-
-            flowLayout.Controls.Add(seperatorPanel);
-
-
-
-            for (int i = 0; i < config.SourceLocations.Count(); i++)
-            {
-                int ii = i + 1;
-                leftSpace = 0;
-
-
-                //------------------------------------------------------------------------------------------------
-                // 
-                // tableLayout
-                // 
-                tableLayouts[i] = new TableLayoutPanel {ColumnCount = TABLE_CELL_CNT};
-                tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_NAME_SIZE));
-                tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, COLUMN_TOTAL_SIZE));
-                tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_FREE_SIZE));
-                tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BACKUP_SIZE));
-                tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_DATA_SIZE));
-                tableLayouts[i].ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, COLUMN_BAR_SIZE));
-                tableLayouts[i].Location = new System.Drawing.Point(3, 3);
-                tableLayouts[i].Name = "tableLayouts" + i;
-                tableLayouts[i].RowCount = 1;
-                tableLayouts[i].RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
-                tableLayouts[i].Size = new System.Drawing.Size(TABLE_SIZE, CONTROL_SPACE);
-                tableLayouts[i].TabIndex = 0;
-                flowLayout.Controls.Add(tableLayouts[i]);
-
-
-                // 
-                // textBox diskName
-                // 
-                diskNames[i] = new TextBox
+               // 
+               // textBox totalSpace
+               // 
+               totalSpace[i] = new TextBox
                                   {
-                                      Location =
-                                         new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                                  CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
-                                                                  CONTROL_OFFSET_TOP_LABEL),
-                                      Name = "diskName" + i,
-                                      ReadOnly = true,
-                                      Size = new System.Drawing.Size(120, 20),
-                                      TabIndex = 0,
-                                      Text = config.SourceLocations[i]
+                                     Location =
+                                        new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                                                 CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
+                                                                 CONTROL_OFFSET_TOP_LABEL),
+                                     Name = "totalSpace" + i,
+                                     ReadOnly = true,
+                                     Size = new System.Drawing.Size(80, 20),
+                                     TabIndex = 0,
+                                     TextAlign = HorizontalAlignment.Right
                                   };
-                tableLayouts[i].Controls.Add(diskNames[i], COLUMN_NAME_INDEX, 0);
-
-                leftSpace += 123;
-
-
-                ulong availabel;
-                ulong total;
-                ulong freebytes;
-                if (GetDiskFreeSpaceEx(config.SourceLocations[i], out availabel, out total, out freebytes))
-                {
-                    if (total > maxDiskSize)
-                        maxDiskSize = total;
-
-                    // 
-                    // textBox totalSpace
-                    // 
-                    totalSpace[i] = new TextBox
-                                       {
-                                           Location =
-                                              new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                                       CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
-                                                                       CONTROL_OFFSET_TOP_LABEL),
-                                           Name = "totalSpace" + i,
-                                           ReadOnly = true,
-                                           Size = new System.Drawing.Size(80, 20),
-                                           TabIndex = 0,
-                                           TextAlign = HorizontalAlignment.Right
-                                       };
-                    tableLayouts[i].Controls.Add(totalSpace[i], COLUMN_TOTAL_INDEX, 0);
-                    leftSpace += 83;
-
-                    // 
-                    // textBox freeSpace
-                    // 
-                    freeSpace[i] = new TextBox
-                    {
-                        Location =
-                           new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                    CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
-                                                    CONTROL_OFFSET_TOP_LABEL),
-                        Name = "freeSpace" + i,
-                        ReadOnly = true,
-                        Size = new System.Drawing.Size(80, 20),
-                        TabIndex = 0,
-                        TextAlign = HorizontalAlignment.Right
-                    };
-                    tableLayouts[i].Controls.Add(freeSpace[i], COLUMN_FREE_INDEX, 0);
-                    leftSpace += 83;
-
-
-                    // 
-                    // textBox backup
-                    // 
-                    backup[i] = new TextBox
-                    {
-                        Location =
-                           new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                    CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
-                                                    CONTROL_OFFSET_TOP_LABEL),
-                        Name = "backup" + i,
-                        ReadOnly = true,
-                        Size = new System.Drawing.Size(80, 20),
-                        TabIndex = 0,
-                        TextAlign = HorizontalAlignment.Right
-                    };
-                    tableLayouts[i].Controls.Add(backup[i], COLUMN_BACKUP_INDEX, 0);
-                    leftSpace += 83;
-
-
-                    // 
-                    // textBox rate
-                    // 
-                    data[i] = new TextBox
-                    {
-                        Location =
-                           new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
-                                                    CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
-                                                    CONTROL_OFFSET_TOP_LABEL),
-                        Name = "freeSpace" + i,
-                        ReadOnly = true,
-                        Size = new System.Drawing.Size(80, 20),
-                        TabIndex = 0,
-                        TextAlign = HorizontalAlignment.Right
-                    };
-                    tableLayouts[i].Controls.Add(data[i], COLUMN_DATA_INDEX, 0);
-                    leftSpace += 83;
-
-
-                    //
-                    // progress bar
-                    //
-                    bars[i] = new DoubleProgressBar();
-                    barControlOffsetLeft = CONTROL_OFFSET_LEFT + leftSpace;
-                    bars[i].Location = new System.Drawing.Point(barControlOffsetLeft, CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + CONTROL_OFFSET_TOP_LABEL);
-                    bars[i].Name = "progressBar" + i;
-                    bars[i].Size = new System.Drawing.Size(BAR_SIZE, 20);
-                    bars[i].TabIndex = 200 + i;
-                    tableLayouts[i].Controls.Add(bars[i], COLUMN_BAR_INDEX, 0);
-                }
+               tableLayouts[i].Controls.Add(totalSpace[i], COLUMN_TOTAL_INDEX, 0);
+               leftSpace += 83;
+
+               // 
+               // textBox freeSpace
+               // 
+               freeSpace[i] = new TextBox
+               {
+                  Location =
+                     new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                              CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
+                                              CONTROL_OFFSET_TOP_LABEL),
+                  Name = "freeSpace" + i,
+                  ReadOnly = true,
+                  Size = new System.Drawing.Size(80, 20),
+                  TabIndex = 0,
+                  TextAlign = HorizontalAlignment.Right
+               };
+               tableLayouts[i].Controls.Add(freeSpace[i], COLUMN_FREE_INDEX, 0);
+               leftSpace += 83;
+
+
+               // 
+               // textBox rate
+               // 
+               data[i] = new TextBox
+               {
+                  Location =
+                     new System.Drawing.Point(CONTROL_OFFSET_LEFT + leftSpace,
+                                              CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + 2 +
+                                              CONTROL_OFFSET_TOP_LABEL),
+                  Name = "freeSpace" + i,
+                  ReadOnly = true,
+                  Size = new System.Drawing.Size(80, 20),
+                  TabIndex = 0,
+                  TextAlign = HorizontalAlignment.Right
+               };
+               tableLayouts[i].Controls.Add(data[i], COLUMN_DATA_INDEX, 0);
+               leftSpace += 83;
+
+
+               //
+               // progress bar
+               //
+               bars[i] = new DoubleProgressBar();
+               barControlOffsetLeft = CONTROL_OFFSET_LEFT + leftSpace;
+               bars[i].Location = new System.Drawing.Point(barControlOffsetLeft, CONTROL_OFFSET_TOP + CONTROL_SPACE * ii + CONTROL_OFFSET_TOP_LABEL);
+               bars[i].Name = "progressBar" + i;
+               bars[i].Size = new System.Drawing.Size(BAR_SIZE, 20);
+               bars[i].TabIndex = 200 + i;
+               tableLayouts[i].Controls.Add(bars[i], COLUMN_BAR_INDEX, 0);
             }
-        }
+         }
+      }
 
 
 
-        private void RefreshControls()
-        {
-            ulong allAvailabel = 0;
-            ulong allTotal = 0;
-            long allRate = 0;
+      private void RefreshControls()
+      {
+         ulong allAvailabel = 0;
+         ulong allTotal = 0;
+         long allRate = 0;
 
-            int writePriority1Disk = -1;
-            int writePriority2Disk = -1;
-            ulong mostFreeSpace1 = 0;
+         int writePriority1Disk = -1;
+         int writePriority2Disk = -1;
+         ulong mostFreeSpace1 = 0;
 
-            for (int i = 0; i < config.SourceLocations.Count(); i++)
-            {
-                ulong availabel;
-                ulong total;
-                ulong freebytes;
-
-                if (GetDiskFreeSpaceEx(config.SourceLocations[i], out availabel, out total, out freebytes))
-                {
-                    allAvailabel += availabel;
-                    allTotal += total;
-
-                    switch (config.PluginMode)
-                    {
-                       case "balanced":
-                          if (availabel > mostFreeSpace1)
-                          {
-                             // current disk is now first write disk
-                             mostFreeSpace1 = availabel;
-                             writePriority1Disk = i;
-                          }
-                          break;
-                       case "priority":
-                          if (writePriority1Disk == -1 && availabel > config.HoldOffBufferBytes)
-                          {
-                             // current disk is now first write disk
-                             writePriority1Disk = i;
-                          }
-                          break;
-                       case "folder":
-                          if (writePriority2Disk == -1 && availabel > config.HoldOffBufferBytes)
-                          {
-                             // current disk is now first write disk
-                             writePriority2Disk = i;
-                          }
-                          break;
-                    }
-
-                    long thisRate = 0;
-                    thisRate = ((long)oldFree[i] - (long)availabel) / 4;
-                    if (oldFree[i] == 0)
-                        thisRate = 0;
-                    averageRate[i].Add(thisRate);
-
-                    thisRate = 0;
-                    for (int ii = 0; ii < averageRate[i].Count; ii++)
-                    {
-                        thisRate += averageRate[i][ii];
-                    }
-                    thisRate /= averageRate[i].Count;
-
-                    // remove oldest value
-                    if (averageRate[i].Count >= 5)
-                        averageRate[i].RemoveAt(0);
-
-                    // save the free space for next calculation
-                    oldFree[i] = freebytes;
-
-                    // summ rate for liquesce drive
-                    allRate += thisRate;
-
-                    // 
-                    // textBox totalSpace
-                    // 
-                    totalSpace[i].Text = FormatBytes((long)total);
-
-                    // 
-                    // textBox freeSpace
-                    // 
-                    freeSpace[i].Text = FormatBytes((long)availabel);
-
-                    // 
-                    // textBox data
-                    // 
-                    data[i].Text = FormatBytes((long)(total - availabel));
-
-                    //
-                    // progress bar
-                    //
-                    if (scaledMode.Checked)
-                    {
-                        if (rightAligned.Checked)
-                            bars[i].Anchor = AnchorStyles.Right | AnchorStyles.Top;
-                        else
-                            bars[i].Anchor = AnchorStyles.Left | AnchorStyles.Top;
-
-                        bars[i].Width = (int)((total * BAR_SIZE) / maxDiskSize);
-                    }
-                    else
-                    {
-                        bars[i].Anchor = AnchorStyles.Left | AnchorStyles.Top;
-                        bars[i].Width = BAR_SIZE;
-                    }
-
-                    bars[i].Maximum = BAR_SCALE;
-                    bars[i].Value1 = (int)(((total - availabel) * BAR_SCALE) / total);
-                    bars[i].Value2 = (int)(((total - availabel) * BAR_SCALE) / total);
-
-                    if (availabel < config.HoldOffBufferBytes)
-                    {
-                        bars[i].ErrorStatus = DoubleProgressBar.ErrorStatusType.Error;
-                    }
-                    else if (availabel < config.HoldOffBufferBytes * 2)
-                    {
-                        bars[i].ErrorStatus = DoubleProgressBar.ErrorStatusType.Warn;
-                    }
-                    else
-                    {
-                        bars[i].ErrorStatus = DoubleProgressBar.ErrorStatusType.NoError;
-                    }
-
-                    if (thisRate < 0)
-                    {
-                        bars[i].Rate = DoubleProgressBar.RateType.Negative;
-                    }
-                    else if (thisRate > 0)
-                    {
-                        bars[i].Rate = DoubleProgressBar.RateType.Positive;
-                    }
-                    else
-                    {
-                        bars[i].Rate = DoubleProgressBar.RateType.No;
-                    }
-                }
-            }
-
-            totalSpaceLiquesce.Text = FormatBytes((long)allTotal);
-            freeSpaceLiquesce.Text = FormatBytes((long)allAvailabel);
-            dataLiquesce.Text = FormatBytes((long)(allTotal - allAvailabel));
-            barLiquesce.Maximum = BAR_SCALE;
-            barLiquesce.Value1 = (int)(((allTotal - allAvailabel) * BAR_SCALE) / allTotal);
-            barLiquesce.Value2 = (int)(((allTotal - allAvailabel) * BAR_SCALE) / allTotal);
+         for (int i = 0; i < mountDetail.SourceLocations.Count(); i++)
+         {
+            ulong availabel;
+            ulong total;
+            ulong freebytes;
 
-            if (allRate < 0)
+            if (GetDiskFreeSpaceEx(mountDetail.SourceLocations[i].SourcePath, out availabel, out total, out freebytes))
             {
-                barLiquesce.Rate = DoubleProgressBar.RateType.Negative;
-            }
-            else if (allRate > 0)
-            {
-                barLiquesce.Rate = DoubleProgressBar.RateType.Positive;
+               allAvailabel += availabel;
+               allTotal += total;
+
+               switch (mountDetail.AllocationMode)
+               {
+                  case MountDetail.AllocationModes.Folder:
+                     if (writePriority2Disk == -1 && availabel > mountDetail.HoldOffBufferBytes)
+                     {
+                        // current disk is now first write disk
+                        writePriority2Disk = i;
+                     }
+                     break;
+                  case MountDetail.AllocationModes.Priority:
+                     if (writePriority1Disk == -1 && availabel > mountDetail.HoldOffBufferBytes)
+                     {
+                        // current disk is now first write disk
+                        writePriority1Disk = i;
+                     }
+                     break;
+                  case MountDetail.AllocationModes.Balanced:
+                     if (availabel > mostFreeSpace1)
+                     {
+                        // current disk is now first write disk
+                        mostFreeSpace1 = availabel;
+                        writePriority1Disk = i;
+                     }
+                     break;
+               }
+
+               long thisRate = 0;
+               thisRate = ((long)oldFree[i] - (long)availabel) / 4;
+               if (oldFree[i] == 0)
+                  thisRate = 0;
+               averageRate[i].Add(thisRate);
+
+               thisRate = 0;
+               for (int ii = 0; ii < averageRate[i].Count; ii++)
+               {
+                  thisRate += averageRate[i][ii];
+               }
+               thisRate /= averageRate[i].Count;
+
+               // remove oldest value
+               if (averageRate[i].Count >= 5)
+                  averageRate[i].RemoveAt(0);
+
+               // save the free space for next calculation
+               oldFree[i] = freebytes;
+
+               // summ rate for liquesce drive
+               allRate += thisRate;
+
+               // 
+               // textBox totalSpace
+               // 
+               totalSpace[i].Text = FormatBytes((long)total);
+
+               // 
+               // textBox freeSpace
+               // 
+               freeSpace[i].Text = FormatBytes((long)availabel);
+
+               // 
+               // textBox data
+               // 
+               data[i].Text = FormatBytes((long)(total - availabel));
+
+               //
+               // progress bar
+               //
+               if (scaledMode.Checked)
+               {
+                  if (rightAligned.Checked)
+                     bars[i].Anchor = AnchorStyles.Right | AnchorStyles.Top;
+                  else
+                     bars[i].Anchor = AnchorStyles.Left | AnchorStyles.Top;
+
+                  bars[i].Width = (int)((total * BAR_SIZE) / maxDiskSize);
+               }
+               else
+               {
+                  bars[i].Anchor = AnchorStyles.Left | AnchorStyles.Top;
+                  bars[i].Width = BAR_SIZE;
+               }
+
+               bars[i].Maximum = BAR_SCALE;
+               bars[i].Value1 = (int)(((total - availabel) * BAR_SCALE) / total);
+               bars[i].Value2 = (int)(((total - availabel) * BAR_SCALE) / total);
+
+               if (availabel < mountDetail.HoldOffBufferBytes)
+               {
+                  bars[i].ErrorStatus = DoubleProgressBar.ErrorStatusType.Error;
+               }
+               else if (availabel < mountDetail.HoldOffBufferBytes * 2)
+               {
+                  bars[i].ErrorStatus = DoubleProgressBar.ErrorStatusType.Warn;
+               }
+               else
+               {
+                  bars[i].ErrorStatus = DoubleProgressBar.ErrorStatusType.NoError;
+               }
+
+               if (thisRate < 0)
+               {
+                  bars[i].Rate = DoubleProgressBar.RateType.Negative;
+               }
+               else if (thisRate > 0)
+               {
+                  bars[i].Rate = DoubleProgressBar.RateType.Positive;
+               }
+               else
+               {
+                  bars[i].Rate = DoubleProgressBar.RateType.No;
+               }
             }
+         }
+
+         totalSpaceLiquesce.Text = FormatBytes((long)allTotal);
+         freeSpaceLiquesce.Text = FormatBytes((long)allAvailabel);
+         dataLiquesce.Text = FormatBytes((long)(allTotal - allAvailabel));
+         barLiquesce.Maximum = BAR_SCALE;
+         barLiquesce.Value1 = (int)(((allTotal - allAvailabel) * BAR_SCALE) / allTotal);
+         barLiquesce.Value2 = (int)(((allTotal - allAvailabel) * BAR_SCALE) / allTotal);
+
+         if (allRate < 0)
+         {
+            barLiquesce.Rate = DoubleProgressBar.RateType.Negative;
+         }
+         else if (allRate > 0)
+         {
+            barLiquesce.Rate = DoubleProgressBar.RateType.Positive;
+         }
+         else
+         {
+            barLiquesce.Rate = DoubleProgressBar.RateType.No;
+         }
+
+         // color the wirte priority
+         for (int i = 0; i < mountDetail.SourceLocations.Count(); i++)
+         {
+            if (writePriority1Disk == i)
+               bars[i].WriteMark = DoubleProgressBar.WriteMarkType.Priority1;
+            else if (writePriority2Disk == i)
+               bars[i].WriteMark = DoubleProgressBar.WriteMarkType.Priority2;
             else
-            {
-                barLiquesce.Rate = DoubleProgressBar.RateType.No;
-            }
+               bars[i].WriteMark = DoubleProgressBar.WriteMarkType.No;
 
-            // color the wirte priority
-            for (int i = 0; i < config.SourceLocations.Count(); i++)
-            {
-                if (writePriority1Disk == i)
-                    bars[i].WriteMark = DoubleProgressBar.WriteMarkType.Priority1;
-                else if (writePriority2Disk == i)
-                    bars[i].WriteMark = DoubleProgressBar.WriteMarkType.Priority2;
-                else
-                    bars[i].WriteMark = DoubleProgressBar.WriteMarkType.No;
+         }
 
-            }
+      }
 
-        }
 
 
+      private string FormatBytes(long bytes)
+      {
+         const int scale = 1024;
+         string[] orders = new[] { "TB", "GB", "MB", "KB", "Bytes" };
+         long max = (long)Math.Pow(scale, orders.Length - 1);
 
-        private string FormatBytes(long bytes)
-        {
-            const int scale = 1024;
-            string[] orders = new[] { "TB", "GB", "MB", "KB", "Bytes" };
-            long max = (long)Math.Pow(scale, orders.Length - 1);
+         foreach (string order in orders)
+         {
+            if (bytes > max)
+               return string.Format("{0:##.##} {1}", decimal.Divide(bytes, max), order);
 
-            foreach (string order in orders)
-            {
-                if (bytes > max)
-                    return string.Format("{0:##.##} {1}", decimal.Divide(bytes, max), order);
+            max /= scale;
+         }
+         return "0 Bytes";
+      }
 
-                max /= scale;
-            }
-            return "0 Bytes";
-        }
+      private string FormatBytesRate(long bytes)
+      {
+         const int scale = 1024;
+         string[] orders = new[] { "TB/s", "GB/s", "MB/s", "KB/s", "Bytes/s" };
+         long max = (long)Math.Pow(scale, orders.Length - 1);
+         string sign = "+";
 
-        private string FormatBytesRate(long bytes)
-        {
-            const int scale = 1024;
-            string[] orders = new[] { "TB/s", "GB/s", "MB/s", "KB/s", "Bytes/s" };
-            long max = (long)Math.Pow(scale, orders.Length - 1);
-            string sign = "+";
+         if (bytes < 0)
+         {
+            // negative number
+            bytes = bytes * -1;
+            sign = "-";
+         }
 
-            if (bytes < 0)
-            {
-                // negative number
-                bytes = bytes * -1;
-                sign = "-";
-            }
+         foreach (string order in orders)
+         {
+            if (bytes > max)
+               return sign + string.Format("{0:##.##} {1}", decimal.Divide(bytes, max), order);
 
-            foreach (string order in orders)
-            {
-                if (bytes > max)
-                    return sign + string.Format("{0:##.##} {1}", decimal.Divide(bytes, max), order);
-
-                max /= scale;
-            }
-            return "0 Bytes/s";
-        }
+            max /= scale;
+         }
+         return "0 Bytes/s";
+      }
 
 
-        #region DLL Imports
+      #region DLL Imports
 
-        /// <summary>
-        /// </summary>
-        /// <param name="lpDirectoryName"></param>
-        /// <param name="lpFreeBytesAvailable"></param>
-        /// <param name="lpTotalNumberOfBytes"></param>
-        /// <param name="lpTotalNumberOfFreeBytes"></param>
-        /// <returns></returns>
-        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
-        private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
+      /// <summary>
+      /// </summary>
+      /// <param name="lpDirectoryName"></param>
+      /// <param name="lpFreeBytesAvailable"></param>
+      /// <param name="lpTotalNumberOfBytes"></param>
+      /// <param name="lpTotalNumberOfFreeBytes"></param>
+      /// <returns></returns>
+      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+      private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
 
-        #endregion
+      #endregion
 
-        private void timer1_Tick(object sender, EventArgs e)
-        {
-            RefreshControls();
-        }
+      private void timer1_Tick(object sender, EventArgs e)
+      {
+         RefreshControls();
+      }
 
 
-        public static long FolderSize(string directory, bool deep)
-        {
-            long sizeInBytes = 0;
-            try
+      public static long FolderSize(string directory, bool deep)
+      {
+         long sizeInBytes = 0;
+         try
+         {
+            if (Directory.Exists(directory))
             {
-                if (Directory.Exists(directory))
-                {
-                    DirectoryInfo dir = new DirectoryInfo(directory);
-                   sizeInBytes += dir.GetFiles().Sum(f => f.Length);
-                   if (deep)
-                    {
-                       sizeInBytes += dir.GetDirectories().Sum(d => FolderSize(d.FullName, deep));
-                    }
-                }
+               DirectoryInfo dir = new DirectoryInfo(directory);
+               sizeInBytes += dir.GetFiles().Sum(f => f.Length);
+               if (deep)
+               {
+                  sizeInBytes += dir.GetDirectories().Sum(d => FolderSize(d.FullName, deep));
+               }
             }
-            catch { }
-            return sizeInBytes;
-        }
-
-
-    }
+         }
+         catch { }
+         return sizeInBytes;
+      }
+
+      private void FreeSpace_FormClosing(object sender, FormClosingEventArgs e)
+      {
+         // persist our geometry string.
+         Properties.Settings.Default.WindowLocation = WindowLocation.GeometryToString(this);
+         Properties.Settings.Default.Save();
+      }
+
+   }
 }
diff --git a/LiquesceTray/HiddenFormToAcceptCloseMessage.cs b/LiquesceTray/HiddenFormToAcceptCloseMessage.cs
index 548629a..e0d799a 100644
--- a/LiquesceTray/HiddenFormToAcceptCloseMessage.cs
+++ b/LiquesceTray/HiddenFormToAcceptCloseMessage.cs
@@ -1,4 +1,29 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="HiddenFormToAcceptCloseMessage.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+using System;
 using System.Windows.Forms;
 
 namespace LiquesceTray
diff --git a/LiquesceTray/Icons/backup.ico b/LiquesceTray/Icons/backup.ico
new file mode 100644
index 0000000..e5207e6
Binary files /dev/null and b/LiquesceTray/Icons/backup.ico differ
diff --git a/LiquesceTray/Icons/drop.ico b/LiquesceTray/Icons/drop.ico
new file mode 100644
index 0000000..1e79e9a
Binary files /dev/null and b/LiquesceTray/Icons/drop.ico differ
diff --git a/LiquesceTray/LiquesceTray.csproj b/LiquesceTray/LiquesceTray.csproj
index aa6d3e1..30a93cf 100644
--- a/LiquesceTray/LiquesceTray.csproj
+++ b/LiquesceTray/LiquesceTray.csproj
@@ -90,23 +90,29 @@
     <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
     <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
   </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationManifest>app.manifest</ApplicationManifest>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
       <HintPath>..\ThirdParty\NLog.dll</HintPath>
     </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Deployment" />
     <Reference Include="System.Drawing" />
-    <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.ServiceModel" />
     <Reference Include="System.ServiceProcess" />
     <Reference Include="System.Windows.Forms" />
-    <Reference Include="System.Xml" />
     <Reference Include="WindowsBase" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="DropZone.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DropZone.Designer.cs">
+      <DependentUpon>DropZone.cs</DependentUpon>
+    </Compile>
     <Compile Include="FreeSpace.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -127,11 +133,6 @@
     </Compile>
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Service References\LiquesceCallbackSvcRef\Reference.cs">
-      <AutoGen>True</AutoGen>
-      <DesignTime>True</DesignTime>
-      <DependentUpon>Reference.svcmap</DependentUpon>
-    </Compile>
     <Compile Include="StateChangeHandler.cs" />
     <Compile Include="DoubleProgressBar.cs">
       <SubType>UserControl</SubType>
@@ -142,9 +143,13 @@
     <Compile Include="TransparentLabel.cs">
       <SubType>Component</SubType>
     </Compile>
+    <Compile Include="WindowLocation.cs" />
     <EmbeddedResource Include="DoubleProgressBar.resx">
       <DependentUpon>DoubleProgressBar.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="DropZone.resx">
+      <DependentUpon>DropZone.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="FreeSpace.resx">
       <DependentUpon>FreeSpace.cs</DependentUpon>
     </EmbeddedResource>
@@ -177,38 +182,19 @@
       <DependentUpon>Settings.settings</DependentUpon>
       <DesignTimeSharedInput>True</DesignTimeSharedInput>
     </Compile>
-    <None Include="Service References\LiquesceCallbackSvcRef\item.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\LiquesceCallbackSvcRef\item1.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\LiquesceCallbackSvcRef\item2.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\LiquesceCallbackSvcRef\LiquesceCallBackFacade.wsdl" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\LiquesceFaçade\LiquesceFacade.csproj">
       <Project>{CFE5DC7B-25FB-45C4-AF18-1963853375E1}</Project>
       <Name>LiquesceFacade</Name>
     </ProjectReference>
-    <ProjectReference Include="..\Liquesce\Liquesce.csproj">
-      <Project>{74447D1D-F52F-485C-BDEE-66B114A45460}</Project>
-      <Name>Liquesce</Name>
-    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
+    <None Include="Icons\backup.ico" />
     <Content Include="Icons\base.ico" />
     <Content Include="Icons\Config.ico" />
+    <None Include="Icons\drop.ico" />
     <Content Include="Icons\Error.ico" />
-    <None Include="Service References\LiquesceCallbackSvcRef\Reference.svcmap">
-      <Generator>WCF Proxy Generator</Generator>
-      <LastGenOutput>Reference.cs</LastGenOutput>
-    </None>
-    <None Include="Service References\LiquesceCallbackSvcRef\configuration.svcinfo" />
-    <None Include="Service References\LiquesceCallbackSvcRef\configuration91.svcinfo" />
-    <None Include="Service References\LiquesceCallbackSvcRef\item.disco" />
     <None Include="Icons\free_space.ico" />
     <Content Include="Icons\info.ico" />
     <Content Include="Icons\Liquesce.ico" />
@@ -245,13 +231,10 @@
       <Install>true</Install>
     </BootstrapperPackage>
   </ItemGroup>
-  <ItemGroup>
-    <WCFMetadataStorage Include="Service References\LiquesceCallbackSvcRef\" />
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
     <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UseGlobalSettings="False" />
+      <UserProperties BuildVersion_UseGlobalSettings="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" />
     </VisualStudio>
   </ProjectExtensions>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
diff --git a/LiquesceTray/NotifyIconHandler.Designer.cs b/LiquesceTray/NotifyIconHandler.Designer.cs
index 0638a8c..04968e5 100644
--- a/LiquesceTray/NotifyIconHandler.Designer.cs
+++ b/LiquesceTray/NotifyIconHandler.Designer.cs
@@ -29,60 +29,50 @@ protected override void Dispose(bool disposing)
       private void InitializeComponent()
       {
          this.components = new System.ComponentModel.Container();
-         this.rightClickContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
-         this.stopServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-         this.startServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.rightClickContextMenuNormal = new System.Windows.Forms.ContextMenuStrip(this.components);
          this.managementApp = new System.Windows.Forms.ToolStripMenuItem();
          this.showFreeDiskSpaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.dropperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
          this.repeatLastMessage = new System.Windows.Forms.ToolStripMenuItem();
          this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
          this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
          this.serviceController1 = new System.ServiceProcess.ServiceController();
          this.timer1 = new System.Windows.Forms.Timer(this.components);
          this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
-         this.rightClickContextMenu.SuspendLayout();
+         this.rightClickContextMenuService = new System.Windows.Forms.ContextMenuStrip(this.components);
+         this.stopServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.startServiceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+         this.managementApp1 = new System.Windows.Forms.ToolStripMenuItem();
+         this.showFreeDiskSpaceToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+         this.dropperToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+         this.repeatLastMessage1 = new System.Windows.Forms.ToolStripMenuItem();
+         this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+         this.exitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+         this.rightClickContextMenuNormal.SuspendLayout();
+         this.rightClickContextMenuService.SuspendLayout();
          this.SuspendLayout();
          // 
-         // rightClickContextMenu
+         // rightClickContextMenuNormal
          // 
-         this.rightClickContextMenu.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-         this.rightClickContextMenu.ImageScalingSize = new System.Drawing.Size(24, 24);
-         this.rightClickContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.stopServiceToolStripMenuItem,
-            this.startServiceToolStripMenuItem,
+         this.rightClickContextMenuNormal.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.rightClickContextMenuNormal.ImageScalingSize = new System.Drawing.Size(24, 24);
+         this.rightClickContextMenuNormal.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.managementApp,
             this.showFreeDiskSpaceToolStripMenuItem,
+            this.dropperToolStripMenuItem,
             this.repeatLastMessage,
             this.toolStripSeparator1,
             this.exitToolStripMenuItem});
-         this.rightClickContextMenu.Name = "rightClickContextMenu";
-         this.rightClickContextMenu.Size = new System.Drawing.Size(223, 212);
-         this.rightClickContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.rightClickContextMenu_Opening);
-         // 
-         // stopServiceToolStripMenuItem
-         // 
-         this.stopServiceToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.Warning;
-         this.stopServiceToolStripMenuItem.Name = "stopServiceToolStripMenuItem";
-         this.stopServiceToolStripMenuItem.Size = new System.Drawing.Size(222, 30);
-         this.stopServiceToolStripMenuItem.Text = "Stop Service";
-         this.stopServiceToolStripMenuItem.ToolTipText = "This will send a \"Stop\" signal to the service";
-         this.stopServiceToolStripMenuItem.Click += new System.EventHandler(this.stopServiceToolStripMenuItem_Click);
-         // 
-         // startServiceToolStripMenuItem
-         // 
-         this.startServiceToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.Config;
-         this.startServiceToolStripMenuItem.Name = "startServiceToolStripMenuItem";
-         this.startServiceToolStripMenuItem.Size = new System.Drawing.Size(222, 30);
-         this.startServiceToolStripMenuItem.Text = "Start Service";
-         this.startServiceToolStripMenuItem.ToolTipText = "This will send a \"Start\" signal to the service";
-         this.startServiceToolStripMenuItem.Click += new System.EventHandler(this.startServiceToolStripMenuItem_Click);
+         this.rightClickContextMenuNormal.Name = "rightClickContextMenu";
+         this.rightClickContextMenuNormal.Size = new System.Drawing.Size(211, 160);
+         this.rightClickContextMenuNormal.Opening += new System.ComponentModel.CancelEventHandler(this.rightClickContextMenu_Opening);
          // 
          // managementApp
          // 
          this.managementApp.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
          this.managementApp.Image = global::LiquesceTray.Properties.Resources.Liquesce;
          this.managementApp.Name = "managementApp";
-         this.managementApp.Size = new System.Drawing.Size(222, 30);
+         this.managementApp.Size = new System.Drawing.Size(210, 30);
          this.managementApp.Text = "&Management App..";
          this.managementApp.Click += new System.EventHandler(this.managementApp_Click);
          // 
@@ -90,28 +80,36 @@ private void InitializeComponent()
          // 
          this.showFreeDiskSpaceToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.free_space;
          this.showFreeDiskSpaceToolStripMenuItem.Name = "showFreeDiskSpaceToolStripMenuItem";
-         this.showFreeDiskSpaceToolStripMenuItem.Size = new System.Drawing.Size(222, 30);
+         this.showFreeDiskSpaceToolStripMenuItem.Size = new System.Drawing.Size(210, 30);
          this.showFreeDiskSpaceToolStripMenuItem.Text = "Show Free Disk Space";
          this.showFreeDiskSpaceToolStripMenuItem.Click += new System.EventHandler(this.showFreeDiskSpaceToolStripMenuItem_Click);
          // 
+         // dropperToolStripMenuItem
+         // 
+         this.dropperToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.drop;
+         this.dropperToolStripMenuItem.Name = "dropperToolStripMenuItem";
+         this.dropperToolStripMenuItem.Size = new System.Drawing.Size(210, 30);
+         this.dropperToolStripMenuItem.Text = "DropZone";
+         this.dropperToolStripMenuItem.Click += new System.EventHandler(this.dropperToolStripMenuItem_Click);
+         // 
          // repeatLastMessage
          // 
          this.repeatLastMessage.Image = global::LiquesceTray.Properties.Resources.Question;
          this.repeatLastMessage.Name = "repeatLastMessage";
-         this.repeatLastMessage.Size = new System.Drawing.Size(222, 30);
+         this.repeatLastMessage.Size = new System.Drawing.Size(210, 30);
          this.repeatLastMessage.Text = "&Repeat Last message...";
          this.repeatLastMessage.Click += new System.EventHandler(this.repeatLastMessage_Click);
          // 
          // toolStripSeparator1
          // 
          this.toolStripSeparator1.Name = "toolStripSeparator1";
-         this.toolStripSeparator1.Size = new System.Drawing.Size(219, 6);
+         this.toolStripSeparator1.Size = new System.Drawing.Size(207, 6);
          // 
          // exitToolStripMenuItem
          // 
          this.exitToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.Stop;
          this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
-         this.exitToolStripMenuItem.Size = new System.Drawing.Size(222, 30);
+         this.exitToolStripMenuItem.Size = new System.Drawing.Size(210, 30);
          this.exitToolStripMenuItem.Text = "&Exit";
          this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
          // 
@@ -126,11 +124,93 @@ private void InitializeComponent()
          // 
          // notifyIcon1
          // 
-         this.notifyIcon1.ContextMenuStrip = this.rightClickContextMenu;
+         this.notifyIcon1.ContextMenuStrip = this.rightClickContextMenuNormal;
          this.notifyIcon1.Icon = global::LiquesceTray.Properties.Resources.LiquesceIcon;
          this.notifyIcon1.Text = "Liquesce Starting up";
          this.notifyIcon1.Visible = true;
          this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick);
+         this.notifyIcon1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.notifyIcon1_MouseDown);
+         // 
+         // rightClickContextMenuService
+         // 
+         this.rightClickContextMenuService.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.rightClickContextMenuService.ImageScalingSize = new System.Drawing.Size(24, 24);
+         this.rightClickContextMenuService.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.stopServiceToolStripMenuItem,
+            this.startServiceToolStripMenuItem,
+            this.managementApp1,
+            this.showFreeDiskSpaceToolStripMenuItem1,
+            this.dropperToolStripMenuItem1,
+            this.repeatLastMessage1,
+            this.toolStripSeparator2,
+            this.exitToolStripMenuItem1});
+         this.rightClickContextMenuService.Name = "rightClickContextMenu";
+         this.rightClickContextMenuService.Size = new System.Drawing.Size(211, 220);
+         this.rightClickContextMenuService.Opening += new System.ComponentModel.CancelEventHandler(this.rightClickContextMenu_Opening);
+         // 
+         // stopServiceToolStripMenuItem
+         // 
+         this.stopServiceToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.Warning;
+         this.stopServiceToolStripMenuItem.Name = "stopServiceToolStripMenuItem";
+         this.stopServiceToolStripMenuItem.Size = new System.Drawing.Size(210, 30);
+         this.stopServiceToolStripMenuItem.Text = "Stop Service";
+         this.stopServiceToolStripMenuItem.ToolTipText = "This will send a \"Stop\" signal to the service";
+         this.stopServiceToolStripMenuItem.Click += new System.EventHandler(this.stopServiceToolStripMenuItem_Click);
+         // 
+         // startServiceToolStripMenuItem
+         // 
+         this.startServiceToolStripMenuItem.Image = global::LiquesceTray.Properties.Resources.Config;
+         this.startServiceToolStripMenuItem.Name = "startServiceToolStripMenuItem";
+         this.startServiceToolStripMenuItem.Size = new System.Drawing.Size(210, 30);
+         this.startServiceToolStripMenuItem.Text = "Start Service";
+         this.startServiceToolStripMenuItem.ToolTipText = "This will send a \"Start\" signal to the service";
+         this.startServiceToolStripMenuItem.Click += new System.EventHandler(this.startServiceToolStripMenuItem_Click);
+         // 
+         // managementApp1
+         // 
+         this.managementApp1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+         this.managementApp1.Image = global::LiquesceTray.Properties.Resources.Liquesce;
+         this.managementApp1.Name = "managementApp1";
+         this.managementApp1.Size = new System.Drawing.Size(210, 30);
+         this.managementApp1.Text = "&Management App..";
+         this.managementApp1.Click += new System.EventHandler(this.managementApp_Click);
+         // 
+         // showFreeDiskSpaceToolStripMenuItem1
+         // 
+         this.showFreeDiskSpaceToolStripMenuItem1.Image = global::LiquesceTray.Properties.Resources.free_space;
+         this.showFreeDiskSpaceToolStripMenuItem1.Name = "showFreeDiskSpaceToolStripMenuItem1";
+         this.showFreeDiskSpaceToolStripMenuItem1.Size = new System.Drawing.Size(210, 30);
+         this.showFreeDiskSpaceToolStripMenuItem1.Text = "Show Free Disk Space";
+         this.showFreeDiskSpaceToolStripMenuItem1.Click += new System.EventHandler(this.showFreeDiskSpaceToolStripMenuItem_Click);
+         // 
+         // dropperToolStripMenuItem1
+         // 
+         this.dropperToolStripMenuItem1.Image = global::LiquesceTray.Properties.Resources.drop;
+         this.dropperToolStripMenuItem1.Name = "dropperToolStripMenuItem1";
+         this.dropperToolStripMenuItem1.Size = new System.Drawing.Size(210, 30);
+         this.dropperToolStripMenuItem1.Text = "DropZone";
+         this.dropperToolStripMenuItem1.Click += new System.EventHandler(this.dropperToolStripMenuItem_Click);
+         // 
+         // repeatLastMessage1
+         // 
+         this.repeatLastMessage1.Image = global::LiquesceTray.Properties.Resources.Question;
+         this.repeatLastMessage1.Name = "repeatLastMessage1";
+         this.repeatLastMessage1.Size = new System.Drawing.Size(210, 30);
+         this.repeatLastMessage1.Text = "&Repeat Last message...";
+         this.repeatLastMessage1.Click += new System.EventHandler(this.repeatLastMessage_Click);
+         // 
+         // toolStripSeparator2
+         // 
+         this.toolStripSeparator2.Name = "toolStripSeparator2";
+         this.toolStripSeparator2.Size = new System.Drawing.Size(207, 6);
+         // 
+         // exitToolStripMenuItem1
+         // 
+         this.exitToolStripMenuItem1.Image = global::LiquesceTray.Properties.Resources.Stop;
+         this.exitToolStripMenuItem1.Name = "exitToolStripMenuItem1";
+         this.exitToolStripMenuItem1.Size = new System.Drawing.Size(210, 30);
+         this.exitToolStripMenuItem1.Text = "&Exit";
+         this.exitToolStripMenuItem1.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
          // 
          // NotifyIconHandler
          // 
@@ -139,14 +219,15 @@ private void InitializeComponent()
          this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
          this.Name = "NotifyIconHandler";
          this.Size = new System.Drawing.Size(175, 162);
-         this.rightClickContextMenu.ResumeLayout(false);
+         this.rightClickContextMenuNormal.ResumeLayout(false);
+         this.rightClickContextMenuService.ResumeLayout(false);
          this.ResumeLayout(false);
 
       }
 
       #endregion
 
-      private System.Windows.Forms.ContextMenuStrip rightClickContextMenu;
+      private System.Windows.Forms.ContextMenuStrip rightClickContextMenuNormal;
       private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
       internal System.Windows.Forms.NotifyIcon notifyIcon1;
       private System.Windows.Forms.ToolStripMenuItem managementApp;
@@ -154,8 +235,16 @@ private void InitializeComponent()
       private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
       private System.ServiceProcess.ServiceController serviceController1;
       private System.Windows.Forms.Timer timer1;
+      private System.Windows.Forms.ToolStripMenuItem showFreeDiskSpaceToolStripMenuItem;
+      private System.Windows.Forms.ToolStripMenuItem dropperToolStripMenuItem;
+      private System.Windows.Forms.ContextMenuStrip rightClickContextMenuService;
       private System.Windows.Forms.ToolStripMenuItem stopServiceToolStripMenuItem;
       private System.Windows.Forms.ToolStripMenuItem startServiceToolStripMenuItem;
-      private System.Windows.Forms.ToolStripMenuItem showFreeDiskSpaceToolStripMenuItem;
+      private System.Windows.Forms.ToolStripMenuItem managementApp1;
+      private System.Windows.Forms.ToolStripMenuItem showFreeDiskSpaceToolStripMenuItem1;
+      private System.Windows.Forms.ToolStripMenuItem dropperToolStripMenuItem1;
+      private System.Windows.Forms.ToolStripMenuItem repeatLastMessage1;
+      private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+      private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem1;
    }
 }
diff --git a/LiquesceTray/NotifyIconHandler.cs b/LiquesceTray/NotifyIconHandler.cs
index 906b6fd..48bf211 100644
--- a/LiquesceTray/NotifyIconHandler.cs
+++ b/LiquesceTray/NotifyIconHandler.cs
@@ -1,10 +1,41 @@
-using System;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="NotifyIconHandler.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.ComponentModel;
 using System.Diagnostics;
-using System.Reflection;
+using System.IO;
 using System.ServiceProcess;
 using System.Windows.Forms;
 using LiquesceFacade;
+using LiquesceTray.Properties;
 using NLog;
+using TimeoutException = System.ServiceProcess.TimeoutException;
 
 namespace LiquesceTray
 {
@@ -17,9 +48,16 @@ public partial class NotifyIconHandler : UserControl
       public NotifyIconHandler()
       {
          InitializeComponent();
-         notifyIcon1.BalloonTipTitle = "Service Status";
+         if (Settings.Default.UpdateRequired)
+         {
+            // Thanks go to http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/12/09/246.aspx
+            Settings.Default.Upgrade();
+            Settings.Default.UpdateRequired = false;
+            Settings.Default.Save();
+         }
+         notifyIcon1.BalloonTipTitle = Resources.NotifyIconHandler_NotifyIconHandler_Service_Status;
          // Use last state to prevent balloon tip showing on start !
-         SetState(lastState, "Application tray is starting");
+         SetState(lastState, Resources.NotifyIconHandler_NotifyIconHandler_Application_tray_is_starting);
          DoStatusCheck(0);
          timer1.Start();
       }
@@ -33,13 +71,33 @@ private void exitToolStripMenuItem_Click(object sender, EventArgs e)
       private void managementApp_Click(object sender, EventArgs e)
       {
          //Application.StartupPath;
-         Process process = new Process { StartInfo = { 
-                                            WorkingDirectory = Application.StartupPath,
-                                            FileName = "Liquesce.exe"
+         try
+         {
+            Process process = new Process
+            {
+               StartInfo =
+               {
+                  WorkingDirectory = Application.StartupPath,
+                  FileName = "Liquesce.exe"
+               }
+            };
+            process.Start();
+         }
+         catch (Win32Exception w32)
+         {
+            if (w32.Message == "The operation was canceled by the user")
+            {
+               Log.InfoException("Attempting to launch Liquesce.exe", w32);
+            }
+            else
+            {
+               Log.ErrorException("Attempting to launch Liquesce.exe", w32);
+            }
+         }
+         catch (Exception ex)
+         {
+            Log.ErrorException("Attempting to launch Liquesce.exe", ex);
          }
-         };
-
-         process.Start();
       }
 
       private void notifyIcon1_DoubleClick(object sender, EventArgs e)
@@ -58,27 +116,32 @@ private void SetState(LiquesceSvcState state, string text)
          switch (state)
          {
             case LiquesceSvcState.InWarning:
-               notifyIcon1.Text = "Liquesce State Warning";
+               notifyIcon1.Text = Resources.NotifyIconHandler_SetState_Liquesce_State_Warning;
                notifyIcon1.BalloonTipIcon = ToolTipIcon.Warning;
                break;
+
             case LiquesceSvcState.Unknown:
-               notifyIcon1.Text = "Liquesce State Unknown";
+               notifyIcon1.Text = Resources.NotifyIconHandler_SetState_Liquesce_State_Unknown;
                notifyIcon1.BalloonTipIcon = ToolTipIcon.Warning;
                break;
+
             case LiquesceSvcState.Running:
-               notifyIcon1.Text = "Liquesce State Running";
+               notifyIcon1.Text = Resources.NotifyIconHandler_SetState_Liquesce_State_Running;
                notifyIcon1.BalloonTipIcon = ToolTipIcon.None;
                break;
+
             case LiquesceSvcState.Stopped:
-               notifyIcon1.Text = "Liquesce State Stopped";
+               notifyIcon1.Text = Resources.NotifyIconHandler_SetState_Liquesce_State_Stopped;
                notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
                break;
+
             case LiquesceSvcState.InError:
-               notifyIcon1.Text = "Liquesce State In Error";
+               notifyIcon1.Text = Resources.NotifyIconHandler_SetState_Liquesce_State_In_Error;
                notifyIcon1.BalloonTipIcon = ToolTipIcon.Error;
                break;
+
             default:
-               notifyIcon1.Text = "Liquesce State Unknown";
+               notifyIcon1.Text = Resources.NotifyIconHandler_SetState_Liquesce_State_Unknown;
                Log.Error("SetState has an unknown state value [{0}]", state);
                notifyIcon1.BalloonTipIcon = ToolTipIcon.None;
                break;
@@ -89,6 +152,7 @@ private void SetState(LiquesceSvcState state, string text)
             notifyIcon1.ShowBalloonTip(5000);
          }
       }
+
       private void timer1_Tick(object sender, EventArgs e)
       {
          DoStatusCheck(timer1.Interval / 2);
@@ -102,20 +166,20 @@ private void DoStatusCheck(int milliseconds)
             serviceController1.WaitForStatus(ServiceControllerStatus.Running, timeSpan);
             if (LiquesceSvcState.Running != lastState)
             {
-               notifyIcon1.Icon = Properties.Resources.OKIcon;
-               SetState(LiquesceSvcState.Running, String.Format("Started @ {0}", DateTime.Now) );
+               notifyIcon1.Icon = Resources.OKIcon;
+               SetState(LiquesceSvcState.Running, String.Format(Resources.NotifyIconHandler_DoStatusCheck_Started____0_, DateTime.Now));
                stateChangeHandler.CreateCallBack(SetState);
             }
          }
-         catch (System.ServiceProcess.TimeoutException tex)
+         catch (TimeoutException tex)
          {
             stateChangeHandler.RemoveCallback();
             // Be nice to the log
             if (LiquesceSvcState.InWarning != lastState)
             {
                Log.WarnException("Service is not in a running state", tex);
-               SetState(LiquesceSvcState.InWarning, "Liquesce service is Stopped");
-               notifyIcon1.Icon = Properties.Resources.StopIcon;
+               SetState(LiquesceSvcState.InWarning, Resources.NotifyIconHandler_DoStatusCheck_Liquesce_service_is_Stopped);
+               notifyIcon1.Icon = Resources.StopIcon;
             }
          }
          catch (Exception ex)
@@ -125,27 +189,59 @@ private void DoStatusCheck(int milliseconds)
             if (LiquesceSvcState.InError != lastState)
             {
                Log.ErrorException("Liquesce service has a general exception", ex);
-               notifyIcon1.Icon = Properties.Resources.ErrorIcon;
+               notifyIcon1.Icon = Resources.ErrorIcon;
                SetState(LiquesceSvcState.InError, ex.Message);
             }
          }
       }
 
-      private void rightClickContextMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
+      private void notifyIcon1_MouseDown(object sender, MouseEventArgs e)
+      {
+         if (e.Button == MouseButtons.Right)
+         {
+            bool visible = ((ModifierKeys & Keys.Control) == Keys.Control);
+            notifyIcon1.ContextMenuStrip = visible ? rightClickContextMenuService : rightClickContextMenuNormal;
+         }
+      }
+
+      private void rightClickContextMenu_Opening(object sender, CancelEventArgs e)
       {
-         bool visible = ((ModifierKeys & Keys.Control) == Keys.Control);
+         if (LiquesceSvcState.Running == lastState)
          {
-            stopServiceToolStripMenuItem.Visible = visible;
-            startServiceToolStripMenuItem.Visible = visible;
+            showFreeDiskSpaceToolStripMenuItem.Enabled = true;
+            dropperToolStripMenuItem.Enabled = true;
+         }
+         else
+         {
+            showFreeDiskSpaceToolStripMenuItem.Enabled = false;
+            dropperToolStripMenuItem.Enabled = false;
          }
-         showFreeDiskSpaceToolStripMenuItem.Enabled = (LiquesceSvcState.Running == lastState);
       }
 
       private void stopServiceToolStripMenuItem_Click(object sender, EventArgs e)
       {
          try
          {
-            CallTrayHelper("stop");
+            ProcessStartInfo startInfo = new ProcessStartInfo
+            {
+               UseShellExecute = true,
+               CreateNoWindow = true,
+               WindowStyle = ProcessWindowStyle.Hidden,
+               FileName = Path.Combine(Application.StartupPath, @"LiquesceTrayHelper.exe"),
+               Arguments = @"stop",
+               // Two lines below make the UAC dialog modal to this app
+               ErrorDialog = true,
+               ErrorDialogParentHandle = Handle
+            };
+
+            //// if the other process did not have a manifest
+            //// then force it to run elevated
+            //startInfo.Verb = "runas";
+            Process p = Process.Start(startInfo);
+
+            // block this UI until the launched process exits
+            // I.e. make it modal
+            p.WaitForExit();
          }
          catch (Exception ex)
          {
@@ -153,33 +249,30 @@ private void stopServiceToolStripMenuItem_Click(object sender, EventArgs e)
          }
       }
 
-      private void CallTrayHelper(string action)
-      {
-         ProcessStartInfo startInfo = new ProcessStartInfo
-                                         {
-                                            UseShellExecute = false,
-                                            CreateNoWindow = true,
-                                            WindowStyle = ProcessWindowStyle.Hidden,
-                                            //WorkingDirectory = Environment.CurrentDirectory,
-                                            FileName = Application.ExecutablePath,
-                                            Arguments = action,
-                                            // Two lines below make the UAC dialog modal to this app
-                                            ErrorDialog = true,
-                                            ErrorDialogParentHandle = this.Handle,
-                                            // if the other process did not have a manifest then force it to run elevated
-                                            Verb = "runas"
-                                         };
-
-         // block this UI until the launched process exits
-         // I.e. make it modal
-         Process.Start(startInfo).WaitForExit();
-      }
-
       private void startServiceToolStripMenuItem_Click(object sender, EventArgs e)
       {
          try
          {
-            CallTrayHelper("start");
+            ProcessStartInfo startInfo = new ProcessStartInfo
+            {
+               UseShellExecute = true,
+               CreateNoWindow = true,
+               WindowStyle = ProcessWindowStyle.Hidden,
+               FileName = Path.Combine(Application.StartupPath, @"LiquesceTrayHelper.exe"),
+               Arguments = @"start",
+               // Two lines below make the UAC dialog modal to this app
+               ErrorDialog = true,
+               ErrorDialogParentHandle = Handle
+            };
+
+            //// if the other process did not have a manifest
+            //// then force it to run elevated
+            //startInfo.Verb = "runas";
+            Process p = Process.Start(startInfo);
+
+            // block this UI until the launched process exits
+            // I.e. make it modal
+            p.WaitForExit();
          }
          catch (Exception ex)
          {
@@ -187,22 +280,35 @@ private void startServiceToolStripMenuItem_Click(object sender, EventArgs e)
          }
       }
 
-
       private FreeSpace fsform = null;
+
       private void showFreeDiskSpaceToolStripMenuItem_Click(object sender, EventArgs e)
       {
-          if (fsform != null)
-          {
-              fsform.Dispose();
-          }
-          fsform = new FreeSpace();
-          fsform.Activate();
-          fsform.Show();
-          fsform.Focus();
-          fsform.BringToFront();
-
+         if (fsform != null)
+         {
+            fsform.Dispose();
+         }
+         fsform = new FreeSpace();
+         fsform.Activate();
+         fsform.Show();
+         fsform.Focus();
+         fsform.BringToFront();
       }
 
+      private DropZone dropperForm = null;
+
+      private void dropperToolStripMenuItem_Click(object sender, EventArgs e)
+      {
+         if (dropperForm != null)
+         {
+            dropperForm.Dispose();
+         }
+         dropperForm = new DropZone();
+         dropperForm.Activate();
+         dropperForm.Show();
+         dropperForm.Focus();
+         dropperForm.BringToFront();
+      }
 
    }
-}
+}
\ No newline at end of file
diff --git a/LiquesceTray/NotifyIconHandler.resx b/LiquesceTray/NotifyIconHandler.resx
index 846b4d4..afadd6b 100644
--- a/LiquesceTray/NotifyIconHandler.resx
+++ b/LiquesceTray/NotifyIconHandler.resx
@@ -117,7 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="rightClickContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="rightClickContextMenuNormal.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
   <metadata name="serviceController1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -129,4 +129,7 @@
   <metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>180, 17</value>
   </metadata>
+  <metadata name="rightClickContextMenuService.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>514, 17</value>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/LiquesceTray/Program.cs b/LiquesceTray/Program.cs
index 48075ff..f9120f2 100644
--- a/LiquesceTray/Program.cs
+++ b/LiquesceTray/Program.cs
@@ -1,25 +1,51 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Program.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
 using System.IO;
 using System.Reflection;
-using System.ServiceProcess;
 using System.Threading;
 using System.Windows.Forms;
+using LiquesceTray.Properties;
 using NLog;
 
 namespace LiquesceTray
 {
-   static class Program
+   internal static class Program
    {
-
       private static readonly Logger Log = LogManager.GetCurrentClassLogger();
       private static NotifyIconHandler nih;
+
       /// <summary>
       /// The main entry point for the application.
       /// </summary>
       [STAThread]
-      static void Main(string[] args)
+      private static void Main()
       {
          try
          {
@@ -39,15 +65,7 @@ static void Main(string[] args)
          {
             Log.Error("=====================================================================");
             Log.Error("File Re-opened: Ver :" + Assembly.GetExecutingAssembly().GetName().Version);
-            if (args.Length > 0)
-            {
-               TrayHelper(args);
-            }
-            else
-            {
-               // Create a mutex name for this App + user.
-               CheckAndRunSingleApp();
-            }
+            CheckAndRunSingleApp();
          }
          catch (Exception ex)
          {
@@ -70,57 +88,25 @@ static void Main(string[] args)
 
       private static void CheckAndRunSingleApp()
       {
-         string MutexName = string.Format("{0} [{1}]", Path.GetFileName(Application.ExecutablePath), Environment.UserName);
-         bool GrantedOwnership;
-         using (Mutex AppUserMutex = new Mutex(true, MutexName, out GrantedOwnership))
+         string mutexName = string.Format("{0} [{1}]", Path.GetFileName(Application.ExecutablePath), Environment.UserName);
+         bool grantedOwnership;
+         using (Mutex appUserMutex = new Mutex(true, mutexName, out grantedOwnership))
          {
-            if (GrantedOwnership)
+            if (grantedOwnership)
             {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
+               Application.DoEvents();
                nih = new NotifyIconHandler();
                Application.Run(new HiddenFormToAcceptCloseMessage());
             }
             else
             {
-               MessageBox.Show(MutexName + " is already running");
+               MessageBox.Show(mutexName + Resources.Program_CheckAndRunSingleApp__is_already_running);
             }
          }
       }
 
-      private static void TrayHelper(IList<string> args)
-      {
-         if (args == null) 
-            throw new ArgumentNullException("args");
-         try
-         {
-            int argsLength = args.Count;
-
-            ServiceController serviceController1 = new ServiceController { ServiceName = "LiquesceSvc" };
-            for (int index = 0; index < argsLength; index++)
-            {
-               Log.Debug("Arg[{0}]={1}", index, args[index]);
-               switch (args[index].ToLower())
-               {
-                  case "-debug":
-                     Debugger.Launch();
-                     break;
-                  case "stop":
-                     serviceController1.Stop();
-                     break;
-                  case "start":
-                     serviceController1.Start();
-                     break;
-               }
-            }
-
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("TrayHelper threw an Exception", ex);
-         }
-      }
-
       private static void logUnhandledException(object sender, UnhandledExceptionEventArgs e)
       {
          try
@@ -141,4 +127,4 @@ private static void logUnhandledException(object sender, UnhandledExceptionEvent
          }
       }
    }
-}
+}
\ No newline at end of file
diff --git a/LiquesceTray/Properties/AssemblyInfo.cs b/LiquesceTray/Properties/AssemblyInfo.cs
index 39121e9..b4dc3ff 100644
--- a/LiquesceTray/Properties/AssemblyInfo.cs
+++ b/LiquesceTray/Properties/AssemblyInfo.cs
@@ -1,4 +1,29 @@
-using System.Reflection;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="AssemblyInfo.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+using System.Reflection;
 using System.Runtime.InteropServices;
 
 // General Information about an assembly is controlled through the following 
@@ -9,7 +34,7 @@
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("Smurf-IV")]
 [assembly: AssemblyProduct("Liquesce")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 2010")]
+[assembly: AssemblyCopyright("Copyright © Simon Coghlan (Aka Smurf-IV) 2010 - 11")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -31,5 +56,5 @@
 // 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("2011.4.27.61")]
-[assembly: AssemblyFileVersion("2011.4.27.61")]
+[assembly: AssemblyVersion("14.8.1004.18")]
+[assembly: AssemblyFileVersion("14.8.1004.18")]
diff --git a/LiquesceTray/Properties/Resources.Designer.cs b/LiquesceTray/Properties/Resources.Designer.cs
index 10a6152..98ad64a 100644
--- a/LiquesceTray/Properties/Resources.Designer.cs
+++ b/LiquesceTray/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.1
+//     Runtime Version:4.0.30319.239
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
@@ -67,6 +67,13 @@ internal static System.Drawing.Bitmap Config {
             }
         }
         
+        internal static System.Drawing.Bitmap drop {
+            get {
+                object obj = ResourceManager.GetObject("drop", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Icon ErrorIcon {
             get {
                 object obj = ResourceManager.GetObject("ErrorIcon", resourceCulture);
@@ -95,6 +102,87 @@ internal static System.Drawing.Icon LiquesceIcon {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Liquesce service is Stopped.
+        /// </summary>
+        internal static string NotifyIconHandler_DoStatusCheck_Liquesce_service_is_Stopped {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_DoStatusCheck_Liquesce_service_is_Stopped", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Started @ {0}.
+        /// </summary>
+        internal static string NotifyIconHandler_DoStatusCheck_Started____0_ {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_DoStatusCheck_Started____0_", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Application tray is starting.
+        /// </summary>
+        internal static string NotifyIconHandler_NotifyIconHandler_Application_tray_is_starting {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_NotifyIconHandler_Application_tray_is_starting", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Service Status.
+        /// </summary>
+        internal static string NotifyIconHandler_NotifyIconHandler_Service_Status {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_NotifyIconHandler_Service_Status", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Liquesce State In Error.
+        /// </summary>
+        internal static string NotifyIconHandler_SetState_Liquesce_State_In_Error {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_SetState_Liquesce_State_In_Error", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Liquesce State Running.
+        /// </summary>
+        internal static string NotifyIconHandler_SetState_Liquesce_State_Running {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_SetState_Liquesce_State_Running", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Liquesce State Stopped.
+        /// </summary>
+        internal static string NotifyIconHandler_SetState_Liquesce_State_Stopped {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_SetState_Liquesce_State_Stopped", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Liquesce State Unknown.
+        /// </summary>
+        internal static string NotifyIconHandler_SetState_Liquesce_State_Unknown {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_SetState_Liquesce_State_Unknown", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Liquesce State Warning.
+        /// </summary>
+        internal static string NotifyIconHandler_SetState_Liquesce_State_Warning {
+            get {
+                return ResourceManager.GetString("NotifyIconHandler_SetState_Liquesce_State_Warning", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Icon OKIcon {
             get {
                 object obj = ResourceManager.GetObject("OKIcon", resourceCulture);
@@ -102,6 +190,15 @@ internal static System.Drawing.Icon OKIcon {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to  is already running.
+        /// </summary>
+        internal static string Program_CheckAndRunSingleApp__is_already_running {
+            get {
+                return ResourceManager.GetString("Program_CheckAndRunSingleApp__is_already_running", resourceCulture);
+            }
+        }
+        
         internal static System.Drawing.Bitmap Question {
             get {
                 object obj = ResourceManager.GetObject("Question", resourceCulture);
diff --git a/LiquesceTray/Properties/Resources.resx b/LiquesceTray/Properties/Resources.resx
index 5cdc8f1..081fd9a 100644
--- a/LiquesceTray/Properties/Resources.resx
+++ b/LiquesceTray/Properties/Resources.resx
@@ -148,4 +148,43 @@
   <data name="Config" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Icons\Config.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="drop" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Icons\drop.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="NotifyIconHandler_SetState_Liquesce_State_Unknown" xml:space="preserve">
+    <value>Liquesce State Unknown</value>
+  </data>
+  <data name="NotifyIconHandler_SetState_Liquesce_State_In_Error" xml:space="preserve">
+    <value>Liquesce State In Error</value>
+  </data>
+  <data name="NotifyIconHandler_SetState_Liquesce_State_Stopped" xml:space="preserve">
+    <value>Liquesce State Stopped</value>
+  </data>
+  <data name="NotifyIconHandler_SetState_Liquesce_State_Running" xml:space="preserve">
+    <value>Liquesce State Running</value>
+  </data>
+  <data name="NotifyIconHandler_SetState_Liquesce_State_Warning" xml:space="preserve">
+    <value>Liquesce State Warning</value>
+  </data>
+  <data name="NotifyIconHandler_NotifyIconHandler_Service_Status" xml:space="preserve">
+    <value>Service Status</value>
+  </data>
+  <data name="NotifyIconHandler_DoStatusCheck_Started____0_" xml:space="preserve">
+    <value>Started @ {0}</value>
+    <comment>
+			Displays the locale start time
+		</comment>
+  </data>
+  <data name="NotifyIconHandler_DoStatusCheck_Liquesce_service_is_Stopped" xml:space="preserve">
+    <value>Liquesce service is Stopped</value>
+  </data>
+  <data name="NotifyIconHandler_NotifyIconHandler_Application_tray_is_starting" xml:space="preserve">
+    <value>Application tray is starting</value>
+  </data>
+  <data name="Program_CheckAndRunSingleApp__is_already_running" xml:space="preserve">
+    <value> is already running</value>
+    <comment>
+			The application name is already running warning
+		</comment>
+  </data>
 </root>
\ No newline at end of file
diff --git a/LiquesceTray/Properties/Settings.Designer.cs b/LiquesceTray/Properties/Settings.Designer.cs
index e277c27..ef02ae6 100644
--- a/LiquesceTray/Properties/Settings.Designer.cs
+++ b/LiquesceTray/Properties/Settings.Designer.cs
@@ -1,30 +1,50 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.1
+//     Runtime Version:4.0.30319.239
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
 //     the code is regenerated.
 // </auto-generated>
 //------------------------------------------------------------------------------
 
-namespace LiquesceTray.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;
-         }
-      }
-   }
+namespace LiquesceTray.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.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string WindowLocation {
+            get {
+                return ((string)(this["WindowLocation"]));
+            }
+            set {
+                this["WindowLocation"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("True")]
+        public bool UpdateRequired {
+            get {
+                return ((bool)(this["UpdateRequired"]));
+            }
+            set {
+                this["UpdateRequired"] = value;
+            }
+        }
+    }
 }
diff --git a/LiquesceTray/Properties/Settings.settings b/LiquesceTray/Properties/Settings.settings
index 8f2fd95..a2d5bd4 100644
--- a/LiquesceTray/Properties/Settings.settings
+++ b/LiquesceTray/Properties/Settings.settings
@@ -1,7 +1,12 @@
 <?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
-  <Profiles>
-    <Profile Name="(Default)" />
-  </Profiles>
-  <Settings />
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="LiquesceTray.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="WindowLocation" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="UpdateRequired" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">True</Value>
+    </Setting>
+  </Settings>
 </SettingsFile>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/LiquesceCallBackFacade.wsdl b/LiquesceTray/Service References/LiquesceCallbackSvcRef/LiquesceCallBackFacade.wsdl
deleted file mode 100644
index 7f9b1ba..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/LiquesceCallBackFacade.wsdl	
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<wsdl:definitions xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://tempuri.org/" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="LiquesceCallBackFacade" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
-  <wsp:Policy wsu:Id="NetTcpBinding_ILiquesceCallBack_policy">
-    <wsp:ExactlyOne>
-      <wsp:All>
-        <msb:BinaryEncoding xmlns:msb="http://schemas.microsoft.com/ws/06/2004/mspolicy/netbinary1" />
-        <wsaw:UsingAddressing />
-      </wsp:All>
-    </wsp:ExactlyOne>
-  </wsp:Policy>
-  <wsdl:types>
-    <xsd:schema targetNamespace="http://tempuri.org/Imports">
-      <xsd:import schemaLocation="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd0" namespace="http://tempuri.org/" />
-      <xsd:import schemaLocation="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
-      <xsd:import schemaLocation="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/LiquesceFacade" />
-    </xsd:schema>
-  </wsdl:types>
-  <wsdl:message name="ILiquesceCallBack_Subscribe_InputMessage">
-    <wsdl:part name="parameters" element="tns:Subscribe" />
-  </wsdl:message>
-  <wsdl:message name="ILiquesceCallBack_Unsubscribe_InputMessage">
-    <wsdl:part name="parameters" element="tns:Unsubscribe" />
-  </wsdl:message>
-  <wsdl:message name="ILiquesceCallBack_Update_OutputCallbackMessage">
-    <wsdl:part name="parameters" element="tns:Update" />
-  </wsdl:message>
-  <wsdl:portType msc:usingSession="true" name="ILiquesceCallBack">
-    <wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="Subscribe">
-      <wsdl:input wsaw:Action="http://tempuri.org/ILiquesceCallBack/Subscribe" message="tns:ILiquesceCallBack_Subscribe_InputMessage" />
-    </wsdl:operation>
-    <wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="Unsubscribe">
-      <wsdl:input wsaw:Action="http://tempuri.org/ILiquesceCallBack/Unsubscribe" message="tns:ILiquesceCallBack_Unsubscribe_InputMessage" />
-    </wsdl:operation>
-    <wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="Update">
-      <wsdl:output wsaw:Action="http://tempuri.org/ILiquesceCallBack/Update" message="tns:ILiquesceCallBack_Update_OutputCallbackMessage" />
-    </wsdl:operation>
-  </wsdl:portType>
-  <wsdl:binding name="NetTcpBinding_ILiquesceCallBack" type="tns:ILiquesceCallBack">
-    <wsp:PolicyReference URI="#NetTcpBinding_ILiquesceCallBack_policy" />
-    <soap12:binding transport="http://schemas.microsoft.com/soap/tcp" />
-    <wsdl:operation name="Subscribe">
-      <soap12:operation soapAction="http://tempuri.org/ILiquesceCallBack/Subscribe" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-    </wsdl:operation>
-    <wsdl:operation name="Unsubscribe">
-      <soap12:operation soapAction="http://tempuri.org/ILiquesceCallBack/Unsubscribe" style="document" />
-      <wsdl:input>
-        <soap12:body use="literal" />
-      </wsdl:input>
-    </wsdl:operation>
-    <wsdl:operation name="Update">
-      <soap12:operation soapAction="http://tempuri.org/ILiquesceCallBack/Update" style="document" />
-      <wsdl:output>
-        <soap12:body use="literal" />
-      </wsdl:output>
-    </wsdl:operation>
-  </wsdl:binding>
-  <wsdl:service name="LiquesceCallBackFacade">
-    <wsdl:port name="NetTcpBinding_ILiquesceCallBack" binding="tns:NetTcpBinding_ILiquesceCallBack">
-      <soap12:address location="net.tcp://localhost:41015/LiquesceCallBackFacade" />
-      <wsa10:EndpointReference>
-        <wsa10:Address>net.tcp://localhost:41015/LiquesceCallBackFacade</wsa10:Address>
-      </wsa10:EndpointReference>
-    </wsdl:port>
-  </wsdl:service>
-</wsdl:definitions>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/Reference.cs b/LiquesceTray/Service References/LiquesceCallbackSvcRef/Reference.cs
deleted file mode 100644
index 991a103..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/Reference.cs	
+++ /dev/null
@@ -1,68 +0,0 @@
-//------------------------------------------------------------------------------
-// <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 LiquesceTray.LiquesceCallbackSvcRef {
-    
-    
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="LiquesceCallbackSvcRef.ILiquesceCallBack", CallbackContract=typeof(LiquesceTray.LiquesceCallbackSvcRef.ILiquesceCallBackCallback), SessionMode=System.ServiceModel.SessionMode.Required)]
-    public interface ILiquesceCallBack {
-        
-        [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/ILiquesceCallBack/Subscribe")]
-        void Subscribe(System.Guid id);
-        
-        [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/ILiquesceCallBack/Unsubscribe")]
-        void Unsubscribe(System.Guid id);
-    }
-    
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    public interface ILiquesceCallBackCallback {
-        
-        [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/ILiquesceCallBack/Update")]
-        void Update(LiquesceFacade.LiquesceSvcState state, string message);
-    }
-    
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    public interface ILiquesceCallBackChannel : LiquesceTray.LiquesceCallbackSvcRef.ILiquesceCallBack, System.ServiceModel.IClientChannel {
-    }
-    
-    [System.Diagnostics.DebuggerStepThroughAttribute()]
-    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
-    public partial class LiquesceCallBackClient : System.ServiceModel.DuplexClientBase<LiquesceTray.LiquesceCallbackSvcRef.ILiquesceCallBack>, LiquesceTray.LiquesceCallbackSvcRef.ILiquesceCallBack {
-        
-        public LiquesceCallBackClient(System.ServiceModel.InstanceContext callbackInstance) : 
-                base(callbackInstance) {
-        }
-        
-        public LiquesceCallBackClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName) : 
-                base(callbackInstance, endpointConfigurationName) {
-        }
-        
-        public LiquesceCallBackClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) : 
-                base(callbackInstance, endpointConfigurationName, remoteAddress) {
-        }
-        
-        public LiquesceCallBackClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
-                base(callbackInstance, endpointConfigurationName, remoteAddress) {
-        }
-        
-        public LiquesceCallBackClient(System.ServiceModel.InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
-                base(callbackInstance, binding, remoteAddress) {
-        }
-        
-        public void Subscribe(System.Guid id) {
-            base.Channel.Subscribe(id);
-        }
-        
-        public void Unsubscribe(System.Guid id) {
-            base.Channel.Unsubscribe(id);
-        }
-    }
-}
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/Reference.svcmap b/LiquesceTray/Service References/LiquesceCallbackSvcRef/Reference.svcmap
deleted file mode 100644
index a03c9e3..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/Reference.svcmap	
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ReferenceGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="db9147c1-5a53-4780-99df-0f0c91c1a2f3" xmlns="urn:schemas-microsoft-com:xml-wcfservicemap">
-  <ClientOptions>
-    <GenerateAsynchronousMethods>false</GenerateAsynchronousMethods>
-    <EnableDataBinding>true</EnableDataBinding>
-    <ExcludedTypes />
-    <ImportXmlTypes>false</ImportXmlTypes>
-    <GenerateInternalTypes>false</GenerateInternalTypes>
-    <GenerateMessageContracts>false</GenerateMessageContracts>
-    <NamespaceMappings />
-    <CollectionMappings />
-    <GenerateSerializableTypes>true</GenerateSerializableTypes>
-    <Serializer>Auto</Serializer>
-    <UseSerializerForFaults>true</UseSerializerForFaults>
-    <ReferenceAllAssemblies>true</ReferenceAllAssemblies>
-    <ReferencedAssemblies />
-    <ReferencedDataContractTypes />
-    <ServiceContractMappings />
-  </ClientOptions>
-  <MetadataSources>
-    <MetadataSource Address="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/" Protocol="http" SourceId="1" />
-  </MetadataSources>
-  <Metadata>
-    <MetadataFile FileName="LiquesceCallBackFacade.wsdl" MetadataType="Wsdl" ID="df9e2041-dc9f-4844-b030-44e7329ffb1e" SourceId="1" SourceUrl="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?wsdl" />
-    <MetadataFile FileName="item.disco" MetadataType="Disco" ID="1a6ed98e-fb98-43ec-b52f-27d0cdc8b094" SourceId="1" SourceUrl="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?disco" />
-    <MetadataFile FileName="item.xsd" MetadataType="Schema" ID="74ba684e-32f3-417c-8573-5b5873197e3c" SourceId="1" SourceUrl="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd1" />
-    <MetadataFile FileName="item1.xsd" MetadataType="Schema" ID="72c645bf-f090-4a24-8d60-22c009a2eb5a" SourceId="1" SourceUrl="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd0" />
-    <MetadataFile FileName="item2.xsd" MetadataType="Schema" ID="2f792ab5-d988-48a0-b052-1d077ce2481e" SourceId="1" SourceUrl="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd2" />
-  </Metadata>
-  <Extensions>
-    <ExtensionFile FileName="configuration91.svcinfo" Name="configuration91.svcinfo" />
-    <ExtensionFile FileName="configuration.svcinfo" Name="configuration.svcinfo" />
-  </Extensions>
-</ReferenceGroup>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/configuration.svcinfo b/LiquesceTray/Service References/LiquesceCallbackSvcRef/configuration.svcinfo
deleted file mode 100644
index 272f24a..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/configuration.svcinfo	
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configurationSnapshot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:xml-wcfconfigurationsnapshot">
-  <behaviors />
-  <bindings>
-    <binding digest="System.ServiceModel.Configuration.NetTcpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; listenBacklog=&quot;10&quot; maxBufferSize=&quot;65536&quot; maxConnections=&quot;10&quot; name=&quot;NetTcpBinding_ILiquesceCallBack&quot; transactionFlow=&quot;false&quot; transactionProtocol=&quot;OleTransactions&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;reliableSession enabled=&quot;false&quot; inactivityTimeout=&quot;00:10:00&quot; ordered=&quot;true&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message clientCredentialType=&quot;Windows&quot; /&gt;&lt;transport clientCredentialType=&quot;Windows&quot; protectionLevel=&quot;EncryptAndSign&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="netTcpBinding" name="NetTcpBinding_ILiquesceCallBack" />
-  </bindings>
-  <endpoints>
-    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;net.tcp://localhost:41015/LiquesceCallBackFacade&quot; binding=&quot;netTcpBinding&quot; bindingConfiguration=&quot;NetTcpBinding_ILiquesceCallBack&quot; contract=&quot;LiquesceCallbackSvcRef.ILiquesceCallBack&quot; name=&quot;NetTcpBinding_ILiquesceCallBack&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;net.tcp://localhost:41015/LiquesceCallBackFacade&quot; binding=&quot;netTcpBinding&quot; bindingConfiguration=&quot;NetTcpBinding_ILiquesceCallBack&quot; contract=&quot;LiquesceCallbackSvcRef.ILiquesceCallBack&quot; name=&quot;NetTcpBinding_ILiquesceCallBack&quot; /&gt;" contractName="LiquesceCallbackSvcRef.ILiquesceCallBack" name="NetTcpBinding_ILiquesceCallBack" />
-  </endpoints>
-</configurationSnapshot>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/configuration91.svcinfo b/LiquesceTray/Service References/LiquesceCallbackSvcRef/configuration91.svcinfo
deleted file mode 100644
index 6f5c20e..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/configuration91.svcinfo	
+++ /dev/null
@@ -1,207 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<SavedWcfConfigurationInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="9.1" CheckSum="aH15zvi9uIse2GCDdVJimuQtUew=">
-  <bindingConfigurations>
-    <bindingConfiguration bindingType="netTcpBinding" name="NetTcpBinding_ILiquesceCallBack">
-      <properties>
-        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>NetTcpBinding_ILiquesceCallBack</serializedValue>
-        </property>
-        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>00:01:00</serializedValue>
-        </property>
-        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>00:01:00</serializedValue>
-        </property>
-        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>00:10:00</serializedValue>
-        </property>
-        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>00:01:00</serializedValue>
-        </property>
-        <property path="/transactionFlow" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>False</serializedValue>
-        </property>
-        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>Buffered</serializedValue>
-        </property>
-        <property path="/transactionProtocol" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransactionProtocol, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>OleTransactions</serializedValue>
-        </property>
-        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>StrongWildcard</serializedValue>
-        </property>
-        <property path="/listenBacklog" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>10</serializedValue>
-        </property>
-        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>524288</serializedValue>
-        </property>
-        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>65536</serializedValue>
-        </property>
-        <property path="/maxConnections" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>10</serializedValue>
-        </property>
-        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>65536</serializedValue>
-        </property>
-        <property path="/portSharingEnabled" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>False</serializedValue>
-        </property>
-        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
-        </property>
-        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>32</serializedValue>
-        </property>
-        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>8192</serializedValue>
-        </property>
-        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>16384</serializedValue>
-        </property>
-        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>4096</serializedValue>
-        </property>
-        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>16384</serializedValue>
-        </property>
-        <property path="/reliableSession" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.StandardBindingOptionalReliableSessionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.StandardBindingOptionalReliableSessionElement</serializedValue>
-        </property>
-        <property path="/reliableSession/ordered" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>True</serializedValue>
-        </property>
-        <property path="/reliableSession/inactivityTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>00:10:00</serializedValue>
-        </property>
-        <property path="/reliableSession/enabled" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>False</serializedValue>
-        </property>
-        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.NetTcpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.NetTcpSecurityElement</serializedValue>
-        </property>
-        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.SecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>None</serializedValue>
-        </property>
-        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.TcpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.TcpTransportSecurityElement</serializedValue>
-        </property>
-        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TcpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>Windows</serializedValue>
-        </property>
-        <property path="/security/transport/protectionLevel" isComplexType="false" isExplicitlyDefined="true" clrType="System.Net.Security.ProtectionLevel, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>EncryptAndSign</serializedValue>
-        </property>
-        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
-        </property>
-        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>Never</serializedValue>
-        </property>
-        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>TransportSelected</serializedValue>
-        </property>
-        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>(Collection)</serializedValue>
-        </property>
-        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.MessageSecurityOverTcpElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.MessageSecurityOverTcpElement</serializedValue>
-        </property>
-        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.MessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>Windows</serializedValue>
-        </property>
-        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="false" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>Default</serializedValue>
-        </property>
-      </properties>
-    </bindingConfiguration>
-  </bindingConfigurations>
-  <endpoints>
-    <endpoint name="NetTcpBinding_ILiquesceCallBack" contract="LiquesceCallbackSvcRef.ILiquesceCallBack" bindingType="netTcpBinding" address="net.tcp://localhost:41015/LiquesceCallBackFacade" bindingConfiguration="NetTcpBinding_ILiquesceCallBack">
-      <properties>
-        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>net.tcp://localhost:41015/LiquesceCallBackFacade</serializedValue>
-        </property>
-        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>netTcpBinding</serializedValue>
-        </property>
-        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>NetTcpBinding_ILiquesceCallBack</serializedValue>
-        </property>
-        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>LiquesceCallbackSvcRef.ILiquesceCallBack</serializedValue>
-        </property>
-        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
-        </property>
-        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>&lt;Header /&gt;</serializedValue>
-        </property>
-        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
-        </property>
-        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
-        </property>
-        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
-        </property>
-        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
-        </property>
-        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
-        </property>
-        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
-        </property>
-        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
-        </property>
-        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>My</serializedValue>
-        </property>
-        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>LocalMachine</serializedValue>
-        </property>
-        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
-        </property>
-        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>False</serializedValue>
-        </property>
-        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue>NetTcpBinding_ILiquesceCallBack</serializedValue>
-        </property>
-        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-          <serializedValue />
-        </property>
-      </properties>
-    </endpoint>
-  </endpoints>
-</SavedWcfConfigurationInformation>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item.disco b/LiquesceTray/Service References/LiquesceCallbackSvcRef/item.disco
deleted file mode 100644
index f93f6c6..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item.disco	
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/">
-  <contractRef ref="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?wsdl" docRef="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
-</discovery>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item.xsd b/LiquesceTray/Service References/LiquesceCallbackSvcRef/item.xsd
deleted file mode 100644
index 32e1c19..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item.xsd	
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
-  <xs:element name="anyType" nillable="true" type="xs:anyType" />
-  <xs:element name="anyURI" nillable="true" type="xs:anyURI" />
-  <xs:element name="base64Binary" nillable="true" type="xs:base64Binary" />
-  <xs:element name="boolean" nillable="true" type="xs:boolean" />
-  <xs:element name="byte" nillable="true" type="xs:byte" />
-  <xs:element name="dateTime" nillable="true" type="xs:dateTime" />
-  <xs:element name="decimal" nillable="true" type="xs:decimal" />
-  <xs:element name="double" nillable="true" type="xs:double" />
-  <xs:element name="float" nillable="true" type="xs:float" />
-  <xs:element name="int" nillable="true" type="xs:int" />
-  <xs:element name="long" nillable="true" type="xs:long" />
-  <xs:element name="QName" nillable="true" type="xs:QName" />
-  <xs:element name="short" nillable="true" type="xs:short" />
-  <xs:element name="string" nillable="true" type="xs:string" />
-  <xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" />
-  <xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" />
-  <xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" />
-  <xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" />
-  <xs:element name="char" nillable="true" type="tns:char" />
-  <xs:simpleType name="char">
-    <xs:restriction base="xs:int" />
-  </xs:simpleType>
-  <xs:element name="duration" nillable="true" type="tns:duration" />
-  <xs:simpleType name="duration">
-    <xs:restriction base="xs:duration">
-      <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" />
-      <xs:minInclusive value="-P10675199DT2H48M5.4775808S" />
-      <xs:maxInclusive value="P10675199DT2H48M5.4775807S" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:element name="guid" nillable="true" type="tns:guid" />
-  <xs:simpleType name="guid">
-    <xs:restriction base="xs:string">
-      <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:attribute name="FactoryType" type="xs:QName" />
-  <xs:attribute name="Id" type="xs:ID" />
-  <xs:attribute name="Ref" type="xs:IDREF" />
-</xs:schema>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item1.xsd b/LiquesceTray/Service References/LiquesceCallbackSvcRef/item1.xsd
deleted file mode 100644
index b22eb10..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item1.xsd	
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xs:schema xmlns:tns="http://tempuri.org/" elementFormDefault="qualified" targetNamespace="http://tempuri.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
-  <xs:import schemaLocation="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
-  <xs:import schemaLocation="http://localhost:8731/Design_Time_Addresses/LiquesceSvc/LiquesceCallBackFacade/?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/LiquesceFacade" />
-  <xs:element name="Subscribe">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="id" type="q1:guid" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="Unsubscribe">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="id" type="q2:guid" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-  <xs:element name="Update">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element xmlns:q3="http://schemas.datacontract.org/2004/07/LiquesceFacade" minOccurs="0" name="state" type="q3:LiquesceSvcState" />
-        <xs:element minOccurs="0" name="message" nillable="true" type="xs:string" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-</xs:schema>
\ No newline at end of file
diff --git a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item2.xsd b/LiquesceTray/Service References/LiquesceCallbackSvcRef/item2.xsd
deleted file mode 100644
index b4daf24..0000000
--- a/LiquesceTray/Service References/LiquesceCallbackSvcRef/item2.xsd	
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/LiquesceFacade" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/LiquesceFacade" xmlns:xs="http://www.w3.org/2001/XMLSchema">
-  <xs:simpleType name="LiquesceSvcState">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Unknown" />
-      <xs:enumeration value="Running" />
-      <xs:enumeration value="InError" />
-      <xs:enumeration value="InWarning" />
-      <xs:enumeration value="Stopped" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:element name="LiquesceSvcState" nillable="true" type="tns:LiquesceSvcState" />
-</xs:schema>
\ No newline at end of file
diff --git a/LiquesceTray/StateChangeHandler.cs b/LiquesceTray/StateChangeHandler.cs
index 5c37f09..7d779ca 100644
--- a/LiquesceTray/StateChangeHandler.cs
+++ b/LiquesceTray/StateChangeHandler.cs
@@ -1,15 +1,41 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="StateChangeHandler.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+using System;
 using System.ServiceModel;
 using LiquesceFacade;
 using NLog;
 
 namespace LiquesceTray
 {
-   public class StateChangeHandler : LiquesceCallbackSvcRef.ILiquesceCallBackCallback
+   public class StateChangeHandler : IStateChange
    {
       private static readonly Logger Log = LogManager.GetCurrentClassLogger();
-      private LiquesceCallbackSvcRef.LiquesceCallBackClient client;
-      private readonly Guid guid = Guid.NewGuid();
+      LiquesceCallBackProxy client;
+      private readonly Client guid = new Client { id = Guid.NewGuid() };
 
       public delegate void SetStateDelegate(LiquesceSvcState state, string text);
       private SetStateDelegate setStateDelegate;
@@ -18,10 +44,12 @@ public void CreateCallBack( SetStateDelegate newDelegate)
       {
          try
          {
+            setStateDelegate = newDelegate;
+            NetNamedPipeBinding namedpipebinding = new NetNamedPipeBinding();
+            EndpointAddress endpointAddress = new EndpointAddress("net.pipe://localhost/LiquesceCallBackFacade");
             InstanceContext context = new InstanceContext(this);
-            client = new LiquesceCallbackSvcRef.LiquesceCallBackClient(context);
+            client = new LiquesceCallBackProxy(context, namedpipebinding, endpointAddress);
             client.Subscribe(guid);
-            setStateDelegate = newDelegate;
          }
          catch (Exception ex)
          {
diff --git a/LiquesceTray/TransparentLabel.cs b/LiquesceTray/TransparentLabel.cs
index bb64463..e53dad9 100644
--- a/LiquesceTray/TransparentLabel.cs
+++ b/LiquesceTray/TransparentLabel.cs
@@ -1,4 +1,29 @@
-using System;
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="TransparentLabel.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2011 fpDragon
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
 using System.Windows.Forms;
 
 
@@ -8,8 +33,8 @@ public class TransparentLabel : Label
     {
         public TransparentLabel()
         {
-            this.SetStyle(ControlStyles.Opaque, true);
-            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
+            SetStyle(ControlStyles.Opaque, true);
+            SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
         }
         protected override CreateParams CreateParams
         {
diff --git a/LiquesceTray/WindowLocation.cs b/LiquesceTray/WindowLocation.cs
new file mode 100644
index 0000000..b6f6677
--- /dev/null
+++ b/LiquesceTray/WindowLocation.cs
@@ -0,0 +1,92 @@
+// Code ideas stolen and adapted from 
+// http://www.codeproject.com/Articles/25510/Restore-Form-Position-and-Size-in-C
+
+using System.Drawing;
+using System.Globalization;
+using System.Windows.Forms;
+
+namespace LiquesceTray
+{
+   internal static class WindowLocation
+   {
+      public static void GeometryFromString(string thisWindowGeometry, Form formIn)
+      {
+         if (string.IsNullOrEmpty(thisWindowGeometry))
+         {
+            return;
+         }
+         string[] numbers = thisWindowGeometry.Split('|');
+         string windowString = numbers[4];
+         switch (windowString)
+         {
+            case "Normal":
+               {
+                  Point windowPoint = new Point(int.Parse(numbers[0], CultureInfo.InvariantCulture),
+                                                int.Parse(numbers[1], CultureInfo.InvariantCulture));
+                  Size windowSize = new Size(int.Parse(numbers[2], CultureInfo.InvariantCulture),
+                                             int.Parse(numbers[3], CultureInfo.InvariantCulture));
+
+                  bool locOkay = GeometryIsBizarreLocation(windowPoint, windowSize);
+                  bool sizeOkay = GeometryIsBizarreSize(windowSize);
+
+                  if (locOkay && sizeOkay)
+                  {
+                     formIn.Location = windowPoint;
+                     formIn.Size = windowSize;
+                     formIn.StartPosition = FormStartPosition.Manual;
+                     formIn.WindowState = FormWindowState.Normal;
+                  }
+                  else if (sizeOkay)
+                  {
+                     formIn.Size = windowSize;
+                  }
+               }
+               break;
+            case "Maximized":
+               formIn.Location = new Point(100, 100);
+               formIn.StartPosition = FormStartPosition.Manual;
+               formIn.WindowState = FormWindowState.Maximized;
+               break;
+         }
+      }
+
+      private static bool GeometryIsBizarreLocation(Point loc, Size size)
+      {
+         bool locOkay;
+         if (loc.X < 0 || loc.Y < 0)
+         {
+            locOkay = false;
+         }
+         else if (loc.X + size.Width > Screen.PrimaryScreen.WorkingArea.Width)
+         {
+            locOkay = false;
+         }
+         else if (loc.Y + size.Height > Screen.PrimaryScreen.WorkingArea.Height)
+         {
+            locOkay = false;
+         }
+         else
+         {
+            locOkay = true;
+         }
+         return locOkay;
+      }
+
+      private static bool GeometryIsBizarreSize(Size size)
+      {
+         return (size.Height <= Screen.PrimaryScreen.WorkingArea.Height &&
+             size.Width <= Screen.PrimaryScreen.WorkingArea.Width);
+      }
+
+      public static string GeometryToString(Form mainForm)
+      {
+         // Use internal string allocated buffer to make the final string, rather than individual string concats.
+         return string.Join( "|", new string[] {mainForm.Location.X.ToString(CultureInfo.InvariantCulture),
+            mainForm.Location.Y.ToString(CultureInfo.InvariantCulture),
+            mainForm.Size.Width.ToString(CultureInfo.InvariantCulture),
+             mainForm.Size.Height.ToString(CultureInfo.InvariantCulture),
+             mainForm.WindowState.ToString()
+         });
+      }
+   }
+}
diff --git a/LiquesceTray/app.manifest b/LiquesceTray/app.manifest
index 8bf7ad4..289b30b 100644
--- a/LiquesceTray/app.manifest
+++ b/LiquesceTray/app.manifest
@@ -24,25 +24,10 @@
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
     <application>
       <!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.-->
-
-      <!-- If your application is designed to work with Windows 7, uncomment the following supportedOS node-->
-      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
-      
+       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- = Windows 8.1 and Windows Server 2012 R2 -->
+       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- = Windows 8 and Windows Server 2012 -->
+       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- = Windows 7 and Windows Server 2008 R2-->
     </application>
   </compatibility>
   
-  <!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
-   <dependency>
-    <dependentAssembly>
-      <assemblyIdentity
-          type="win32"
-          name="Microsoft.Windows.Common-Controls"
-          version="6.0.0.0"
-          processorArchitecture="*"
-          publicKeyToken="6595b64144ccf1df"
-          language="*"
-        />
-    </dependentAssembly>
-  </dependency>
-
 </asmv1:assembly>
diff --git a/LiquesceTrayMEF/LiquesceTrayMEF.csproj b/LiquesceTrayHelper/LiquesceTrayHelper.csproj
similarity index 62%
rename from LiquesceTrayMEF/LiquesceTrayMEF.csproj
rename to LiquesceTrayHelper/LiquesceTrayHelper.csproj
index c1b1a60..9479fbb 100644
--- a/LiquesceTrayMEF/LiquesceTrayMEF.csproj
+++ b/LiquesceTrayHelper/LiquesceTrayHelper.csproj
@@ -2,25 +2,26 @@
 <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>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
     <ProductVersion>8.0.30703</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{8E8DD4DD-0CEE-437B-9D81-1F166C95D09D}</ProjectGuid>
-    <OutputType>Library</OutputType>
+    <ProjectGuid>{F216D80D-2D70-4B3B-8632-813F6C399948}</ProjectGuid>
+    <OutputType>Exe</OutputType>
     <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>LiquesceTrayMEF</RootNamespace>
-    <AssemblyName>LiquesceTrayMEF</AssemblyName>
+    <RootNamespace>LiquesceTrayHelper</RootNamespace>
+    <AssemblyName>LiquesceTrayHelper</AssemblyName>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
     <SccProjectName>SAK</SccProjectName>
     <SccLocalPath>SAK</SccLocalPath>
     <SccAuxPath>SAK</SccAuxPath>
     <SccProvider>SAK</SccProvider>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <PublishUrl>publish\</PublishUrl>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <PublishUrl>http://localhost/LiquesceTrayHelper/</PublishUrl>
     <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
     <UpdateMode>Foreground</UpdateMode>
     <UpdateInterval>7</UpdateInterval>
     <UpdateIntervalUnits>Days</UpdateIntervalUnits>
@@ -32,7 +33,8 @@
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
@@ -41,7 +43,8 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release\</OutputPath>
@@ -49,52 +52,61 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+  <PropertyGroup>
+    <ApplicationManifest>app.manifest</ApplicationManifest>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>Warning.ico</ApplicationIcon>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
+    <OutputPath>bin\Debug\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Debug\LiquesceTrayMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\LiquesceTrayHelper.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
     <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
     <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <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>
   </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>bin\Release\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
     <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Release\LiquesceTrayMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\LiquesceTrayHelper.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
     <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
     <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <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>
   </PropertyGroup>
   <ItemGroup>
     <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" />
+    <Reference Include="System.ServiceProcess" />
+    <Reference Include="System.Windows.Forms" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
-    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
+    <None Include="app.manifest">
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Warning.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client">
       <Visible>False</Visible>
-      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
+      <ProductName>Microsoft .NET Framework 4 Client Profile %28x86 and x64%29</ProductName>
       <Install>true</Install>
     </BootstrapperPackage>
     <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
@@ -114,9 +126,13 @@
     </BootstrapperPackage>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
   <ProjectExtensions>
     <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
+      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UseGlobalSettings="True" />
     </VisualStudio>
   </ProjectExtensions>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
diff --git a/LiquesceSvcMEF/LiquesceSvcMEF.csproj.vspscc b/LiquesceTrayHelper/LiquesceTrayHelper.csproj.vspscc
similarity index 100%
rename from LiquesceSvcMEF/LiquesceSvcMEF.csproj.vspscc
rename to LiquesceTrayHelper/LiquesceTrayHelper.csproj.vspscc
diff --git a/LiquesceTrayHelper/Program.cs b/LiquesceTrayHelper/Program.cs
new file mode 100644
index 0000000..ebc7adf
--- /dev/null
+++ b/LiquesceTrayHelper/Program.cs
@@ -0,0 +1,105 @@
+#region Copyright (C)
+
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="Program.cs" company="Smurf-IV">
+//
+//  Copyright (C) 2010-2014 Simon Coghlan (Aka Smurf-IV)
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+
+#endregion Copyright (C)
+
+using System;
+using System.Diagnostics;
+using System.ServiceProcess;
+using System.Windows.Forms;
+
+namespace LiquesceTrayHelper
+{
+   internal static class Program
+   {
+      private static void Main(string[] args)
+      {
+         try
+         {
+            AppDomain.CurrentDomain.UnhandledException += logUnhandledException;
+         }
+         catch (Exception ex)
+         {
+            try
+            {
+               MessageBox.Show(ex.Message, "Liquesce Service Control", MessageBoxButtons.OK, MessageBoxIcon.Error);
+            }
+            catch
+            {
+            }
+         }
+         try
+         {
+            foreach (string t in args)
+            {
+               switch (t.ToLower())
+               {
+                  case "-debug":
+                     Debugger.Launch();
+                     break;
+
+                  case "stop":
+                     {
+                        ServiceController serviceController1 = new ServiceController { ServiceName = "LiquesceSvc" };
+                        if (serviceController1.Status != ServiceControllerStatus.Stopped)
+                        {
+                           serviceController1.Stop();
+                        }
+                     }
+                     break;
+
+                  case "start":
+                     {
+                        ServiceController serviceController1 = new ServiceController { ServiceName = "LiquesceSvc" };
+                        if (serviceController1.Status != ServiceControllerStatus.Running)
+                        {
+                           serviceController1.Start();
+                        }
+                     }
+                     break;
+               }
+            }
+         }
+         catch (Exception ex)
+         {
+            MessageBox.Show(ex.Message, "Liquesce Service Control", MessageBoxButtons.OK, MessageBoxIcon.Error);
+         }
+      }
+
+      private static void logUnhandledException(object sender, UnhandledExceptionEventArgs e)
+      {
+         try
+         {
+            Exception ex = e.ExceptionObject as Exception;
+            MessageBox.Show(ex != null ? ex.Message : "Unhandled Excpetion", "Liquesce Service Control",
+                            MessageBoxButtons.OK, MessageBoxIcon.Error);
+         }
+         catch
+         {
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/LiquesceTrayHelper/Properties/AssemblyInfo.cs b/LiquesceTrayHelper/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..027f178
--- /dev/null
+++ b/LiquesceTrayHelper/Properties/AssemblyInfo.cs
@@ -0,0 +1,61 @@
+#region Copyright (C)
+// ---------------------------------------------------------------------------------------------------------------
+//  <copyright file="AssemblyInfo.cs" company="Smurf-IV">
+// 
+//  Copyright (C) 2010-2012 Simon Coghlan (Aka Smurf-IV)
+// 
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 2 of the License, or
+//   any later version.
+// 
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+// 
+//  You should have received a copy of the GNU General Public License
+//  along with this program. If not, see http://www.gnu.org/licenses/.
+//  </copyright>
+//  <summary>
+//  Url: http://Liquesce.codeplex.com/
+//  Email: http://www.codeplex.com/site/users/view/smurfiv
+//  </summary>
+// --------------------------------------------------------------------------------------------------------------------
+#endregion
+
+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("LiquesceTrayHelper")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Smurf-IV")]
+[assembly: AssemblyProduct("LiquesceTrayHelper")]
+[assembly: AssemblyCopyright("Copyright © Simon Coghlan (Aka Smurf-IV) 2011-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("820c82d3-6e5d-4e06-9838-e8b449d8e774")]
+
+// 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("14.8.993.18")]
+[assembly: AssemblyFileVersion("14.8.993.18")]
diff --git a/LiquesceTrayHelper/Warning.ico b/LiquesceTrayHelper/Warning.ico
new file mode 100644
index 0000000..cc89b1a
Binary files /dev/null and b/LiquesceTrayHelper/Warning.ico differ
diff --git a/LiquesceTrayHelper/app.manifest b/LiquesceTrayHelper/app.manifest
new file mode 100644
index 0000000..77dbb62
--- /dev/null
+++ b/LiquesceTrayHelper/app.manifest
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <assemblyIdentity version="1.0.0.0" name="LiquesceTrayHelper.app"/>
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
+    <security>
+      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
+        <!-- UAC Manifest Options
+            If you want to change the Windows User Account Control level replace the 
+            requestedExecutionLevel node with one of the following.
+
+        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
+        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
+        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
+
+            Specifying requestedExecutionLevel node will disable file and registry virtualization.
+            If you want to utilize File and Registry Virtualization for backward 
+            compatibility then delete the requestedExecutionLevel node.
+        -->
+        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
+      </requestedPrivileges>
+    </security>
+  </trustInfo>
+  
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+    <application>
+      <!-- A list of all Windows versions that this application is designed to work with. Windows will automatically select the most compatible environment.-->
+       <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- = Windows 8.1 and Windows Server 2012 R2 -->
+       <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- = Windows 8 and Windows Server 2012 -->
+       <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- = Windows 7 and Windows Server 2008 R2-->
+    </application>
+  </compatibility>
+
+</asmv1:assembly>
diff --git a/LiquesceTrayMEF/Properties/AssemblyInfo.cs b/LiquesceTrayMEF/Properties/AssemblyInfo.cs
deleted file mode 100644
index d9a0874..0000000
--- a/LiquesceTrayMEF/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-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("LiquesceTrayMEF")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Smurf-IV")]
-[assembly: AssemblyProduct("Liquesce")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 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("f66074ea-8430-4010-b4c6-43f2836ea4dd")]
-
-// 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("2011.4.27.3")]
-[assembly: AssemblyFileVersion("2011.4.27.3")]
diff --git a/Liquesce_Setup/CBFS.wxs b/Liquesce_Setup/CBFS.wxs
new file mode 100644
index 0000000..73839c4
--- /dev/null
+++ b/Liquesce_Setup/CBFS.wxs
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+   <?define x64=$(sys.SOURCEFILEDIR)..\ThirdParty\CBFS\x64 ?>
+   <?define x86=$(sys.SOURCEFILEDIR)..\ThirdParty\CBFS\32bit ?>
+   <?define IcoSource=$(sys.SOURCEFILEDIR)..\Liquesce\Resources ?>
+
+   <Fragment>
+      <DirectoryRef Id="ServiceDIR" />
+
+      <ComponentGroup Id="CBFS">
+
+         <Component Id="Liquesce.ico" Directory="ServiceDIR">
+            <File Id="Liquesce.ico" Source="$(var.IcoSource)\Liquesce.ico" KeyPath="yes" />
+         </Component>
+         <Component Directory="ServiceDIR">
+            <Condition><![CDATA[VersionNT64]]></Condition>
+            <File Id="CBFS5Net.dll_x64" Source="$(var.x64)\CBFS5Net.dll" KeyPath="yes" />
+         </Component>
+         <Component  Directory="ServiceDIR">
+            <File Id="CBFS5Net.dll_x86" Source="$(var.x86)\CBFS5Net.dll" KeyPath="yes" />
+            <Condition><![CDATA[Not VersionNT64]]></Condition>
+         </Component>
+
+         <Component Directory="ServiceDIR">
+            <File Id="msvcp100.dll_x64" Source="$(var.x64)\msvcp100.dll" KeyPath="yes" />
+            <Condition><![CDATA[VersionNT64]]></Condition>
+         </Component>
+         <Component  Directory="ServiceDIR">
+            <File Id="msvcp100.dll_x86" Source="$(var.x86)\msvcp100.dll" KeyPath="yes" />
+            <Condition><![CDATA[Not VersionNT64]]></Condition>
+         </Component>
+
+         <Component Directory="ServiceDIR">
+            <File Id="msvcr100.dll_x64" Source="$(var.x64)\msvcr100.dll" KeyPath="yes" />
+            <Condition><![CDATA[VersionNT64]]></Condition>
+         </Component>
+         <Component  Directory="ServiceDIR">
+            <File Id="msvcr100.dll_x86" Source="$(var.x86)\msvcr100.dll" KeyPath="yes" />
+            <Condition><![CDATA[Not VersionNT64]]></Condition>
+         </Component>
+
+      </ComponentGroup>
+
+      <!-- Name to be used for the registration key of the CBFS application -->
+      <Property Id="PRODUCTNAME" Value="LiquesceSvc" />
+      <!--Values of ModulesToInstall
+      [Pascal] [C++ (VCL)] [C++ (Lib)] [C++ (.NET)] [C#] [VB.NET] [Java] Value Meaning
+      CBFS_MODULE_DRIVER 1 The driver (.sys file)
+      CBFS_MODULE_NET_REDIRECTOR_DLL 65536 (0x00010000) Network redirector DLL (CbFsNetRdr3.dll)
+      CBFS_MODULE_MOUNT_NOTIFIER_DLL 131072 (0x00020000) Mount Notifier DLL (CbFsMntNtf3.dll)
+      http://www.eldos.com/documentation/cbfs/ref_gen_helper_dlls.html
+      //CBFSModule( 1UL + 0x00010000 + 0x00020000);
+      -->
+      <Property Id="CBFSMODULESTOINSTALL" Value="196609" />
+
+      <Binary Id="CBFSWixCA.dll" SourceFile="$(var.CBFSWixCA.TargetDir)$(var.CBFSWixCA.TargetName).dll" />
+      <CustomAction Id="SetCBFS_CA_Values" Return="check" Property="InstallCBFS_CA" Value="[PRODUCTNAME];[CBFSMODULESTOINSTALL];[#Liquesce.ico];Liquesce.ico" />
+      <CustomAction Id="InstallCBFS_CA" BinaryKey="CBFSWixCA.dll" DllEntry="InstallCBFS_CA" Execute="deferred" Impersonate="no" Return="check" />
+      <CustomAction Id="SetUnCBFS_CA_Value" Return="check" Property="UninstallCBFS_CA" Value="[PRODUCTNAME];Liquesce.ico" />
+      <CustomAction Id="UninstallCBFS_CA" BinaryKey="CBFSWixCA.dll" DllEntry="UninstallCBFS_CA" Execute="deferred" Impersonate="no" Return="check" />
+
+      <InstallExecuteSequence>
+         <Custom Action="SetCBFS_CA_Values" Before="InstallCBFS_CA">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+         <Custom Action="InstallCBFS_CA" Before="InstallServices" >NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+
+         <Custom Action="SetUnCBFS_CA_Value" After="MsiUnpublishAssemblies" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+         <Custom Action="UninstallCBFS_CA" After="SetUnCBFS_CA_Value" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+      </InstallExecuteSequence>
+
+      <UI>
+         <ProgressText Action="InstallCBFS_CA">Installing CBFS</ProgressText>
+         <ProgressText Action="UninstallCBFS_CA">Uninstalling CBFS</ProgressText>
+      </UI>
+      </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/Liquesce_Setup/Client.wxs b/Liquesce_Setup/Client.wxs
new file mode 100644
index 0000000..8cbbd33
--- /dev/null
+++ b/Liquesce_Setup/Client.wxs
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
+     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
+     xmlns:fire="http://schemas.microsoft.com/wix/FirewallExtension"
+     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
+     >
+
+   <?define MgtSource=$(sys.SOURCEFILEDIR)..\Liquesce\bin\Release ?>
+   <?define TraySource=$(sys.SOURCEFILEDIR)..\LiquesceTray\bin\Release ?>
+
+   <Fragment>
+
+      <DirectoryRef Id="ProgramMenuDir">
+         <Component Id="ProgramMenuDir2" Guid="11234567-7E98-44CE-B049-C477CC0A2B01">
+            <Shortcut Id="Liquesce_Shortcut" Name="Liquesce MGT" Description="Liquesce Management Application" Target="[ClientDIR]Liquesce.exe" WorkingDirectory="ClientDIR" Icon="InstallerIcon" IconIndex="0" />
+            <Shortcut Id="LiquesceTray_Shortcut" Name="Liquesce Tray" Description="Liquesce Tray Application" Target="[ClientDIR]LiquesceTray.exe" WorkingDirectory="ClientDIR" Icon="InstallerIcon" IconIndex="0" />
+            <Shortcut Id="LiquesceTray_Start" Name="Liquesce Tray" Directory="StartupFolder" Description="Liquesce Tray Application" Target="[ClientDIR]LiquesceTray.exe" WorkingDirectory="ClientDIR" Icon="InstallerIcon" IconIndex="0" />
+            <util:InternetShortcut Type="url" Id="Home" Name="Liquesce Forum" Target="[ARPHELPLINK]" />
+            <util:InternetShortcut Type="link" Id="Change" Name="Change Log" Target="[ClientDIR]ChangeLog.rtf"/>
+            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
+            <RegistryValue Root="HKCU" Key="Software\Microsoft\Liquesce" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
+         </Component>
+      </DirectoryRef>
+
+      <DirectoryRef Id="ClientDIR" />
+      
+      <ComponentGroup Id="Client" >
+         <Component Id="Client" Guid="5EBF3F29-9CF1-44FE-A94C-CC1B4FE09367" Directory="ClientDIR">
+            <File Id="InstallerIcon" Name="Liquesce.ico" Source="$(sys.SOURCEFILEDIR)..\Liquesce\Resources\Liquesce.ico" />
+            <File Id="Liquesce.exe" Name="Liquesce.exe" Source="$(var.MgtSource)\Liquesce.exe" KeyPath="yes">
+               <fire:FirewallException Id="LiquesceFWX1" Name="Liquesce Mount Management" Scope="localSubnet" IgnoreFailure="yes" />
+               <netfx:NativeImage Id="ngen_Liquesce.exe" Platform="all" Priority="1" AppBaseDirectory="ClientDIR"/>
+            </File>
+         </Component>
+         <Component Id="ChangeLog" Directory="ClientDIR">
+            <File Source="$(sys.SOURCEFILEDIR)..\Liquesce\ChangeLog.rtf" KeyPath="yes" />
+         </Component>
+         <Component Id="Liquesce.exe.config" Directory="ClientDIR">
+            <File Source="$(var.MgtSource)\Liquesce.exe.config" KeyPath="yes" />
+         </Component>
+         <Component Id="C_NLog.dll" Directory="ClientDIR">
+            <File Id="C_NLog.dll" Source="$(var.MgtSource)\NLog.dll" KeyPath="yes" />
+         </Component>
+         <Component Id="C_LiquesceFacade.dll" Directory="ClientDIR">
+            <File Id="C_LiquesceFacade.dll" Source="$(var.MgtSource)\LiquesceFacade.dll" KeyPath="yes" >
+               <netfx:NativeImage Id="ngen_C_LiquesceFacade.dll" Platform="all" Priority="1" AppBaseDirectory="ClientDIR"/>
+            </File>
+         </Component>
+         <Component Id="LiquesceTray.exe.config" Directory="ClientDIR">
+            <File Source="$(var.TraySource)\LiquesceTray.exe.config" KeyPath="yes" />
+         </Component>
+         <Component Id="LiquesceTray.exe" Directory="ClientDIR">
+            <File Source="$(var.TraySource)\LiquesceTray.exe" KeyPath="yes" >
+               <netfx:NativeImage Id="ngen_LiquesceTray.exe" Platform="all" Priority="1" AppBaseDirectory="ClientDIR"/>
+            </File>
+         </Component>
+         <Component Id="LiquesceTrayHelper.exe" Directory="ClientDIR">
+            <File Source="$(sys.SOURCEFILEDIR)..\LiquesceTrayHelper\bin\Release\LiquesceTrayHelper.exe" KeyPath="yes" />
+         </Component>
+      </ComponentGroup>
+
+      <!--Custom Actions to start stop Application tray-->
+      <CustomAction Id="StartTrayApp" FileKey="LiquesceTray.exe" ExeCommand="" Return="asyncNoWait" />
+      <util:CloseApplication CloseMessage="yes" Id="CloseServerTray" Target="LiquesceTray.exe" RebootPrompt="no"/>
+      <CustomAction Id="MgtApp" FileKey="Liquesce.exe" ExeCommand="" Return="asyncNoWait" />
+      <util:CloseApplication CloseMessage="yes" Id="CloseMgtAppTray" Target="Liquesce.exe" RebootPrompt="no"/>
+
+
+      <InstallUISequence>
+         <Custom Action="WixCloseApplications" Before="LaunchConditions" />
+      </InstallUISequence>
+
+      <!-- Now to sequence these Custom Actions in the execute sequence -->
+      <InstallExecuteSequence>
+         <Custom Action="WixCloseApplications" Before="LaunchConditions" />
+
+         <Custom Action="StartTrayApp" After="InstallFinalize">Not Installed</Custom>
+         <Custom Action="MgtApp" After="StartTrayApp">Not Installed</Custom>
+      </InstallExecuteSequence>
+
+   </Fragment>
+   
+</Wix>
\ No newline at end of file
diff --git a/Liquesce_Setup/GPL.rtf b/Liquesce_Setup/GPLv2.rtf
similarity index 98%
rename from Liquesce_Setup/GPL.rtf
rename to Liquesce_Setup/GPLv2.rtf
index b3bc458..2edd5ce 100644
--- a/Liquesce_Setup/GPL.rtf
+++ b/Liquesce_Setup/GPLv2.rtf
@@ -1,6 +1,7 @@
 {\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Tahoma;}}
 {\colortbl ;\red192\green192\blue192;}
-{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\sl240\slmult1\highlight1\lang1033\f0\fs20 License: GNU General Public License version 2 (GPLv2)\par
+{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sl240\slmult1\lang1033\f0\fs20 Some components in DLL's are covered by other GPL compatible licenses.\par
+\highlight1 License: GNU General Public License version 2 (GPLv2)\par
 \highlight0\par
 \pard\sa200\sl240\slmult1 Copyright (C) 1989, 1991 Free Software Foundation, Inc.\line 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\par
 Everyone is permitted to copy and distribute verbatim copies\line of this license document, but changing it is not allowed.\par
@@ -47,4 +48,3 @@ Each version is given a distinguishing version number. If the Program specifies
 \b 11.\b0  BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\par
 \b 12.\b0  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\par
 }
-�
\ No newline at end of file
diff --git a/Liquesce_Setup/Liquesce_Setup.wixproj b/Liquesce_Setup/Liquesce_Setup.wixproj
index 1b637bb..6414f94 100644
--- a/Liquesce_Setup/Liquesce_Setup.wixproj
+++ b/Liquesce_Setup/Liquesce_Setup.wixproj
@@ -10,7 +10,7 @@
     <OutputType>Package</OutputType>
     <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
     <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
-    <SccProjectName>$/Liquesce/Liquesce/Liquesce_Setup</SccProjectName>
+    <SccProjectName>$/Liquesce/Liquesce-PhaseII/Liquesce_Setup</SccProjectName>
     <SccProvider>{4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}</SccProvider>
     <SccAuxPath>https://tfs.codeplex.com/tfs/tfs08</SccAuxPath>
     <SccLocalPath>.</SccLocalPath>
@@ -25,11 +25,20 @@
     <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
     <SuppressAllWarnings>False</SuppressAllWarnings>
     <Pedantic>True</Pedantic>
+    <SuppressIces>ICE30</SuppressIces>
+    <SuppressSpecificWarnings>1137;1076</SuppressSpecificWarnings>
   </PropertyGroup>
   <ItemGroup>
+    <Compile Include="CBFS.wxs" />
+    <Compile Include="Client.wxs" />
     <Compile Include="Product.wxs" />
+    <Compile Include="Service.wxs" />
   </ItemGroup>
   <ItemGroup>
+    <WixExtension Include="WixUIExtension">
+      <HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
+      <Name>WixUIExtension</Name>
+    </WixExtension>
     <WixExtension Include="WixUtilExtension">
       <HintPath>$(WixExtDir)\WixUtilExtension.dll</HintPath>
       <Name>WixUtilExtension</Name>
@@ -42,14 +51,20 @@
       <HintPath>$(WixExtDir)\WixFirewallExtension.dll</HintPath>
       <Name>WixFirewallExtension</Name>
     </WixExtension>
-    <WixExtension Include="WixUIExtension">
-      <HintPath>C:\Program Files\Windows Installer XML v3.5\bin\WixUIExtension.dll</HintPath>
-      <Name>WixUIExtension</Name>
-    </WixExtension>
   </ItemGroup>
   <ItemGroup>
     <Content Include="Banner.bmp" />
-    <Content Include="GPL.rtf" />
+    <Content Include="GPLv2.rtf" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ThirdParty\CBFSWixCA\CBFSWixCA.vcxproj">
+      <Name>CBFSWixCA</Name>
+      <Project>{2bf998a5-8bed-4975-91c5-7893dd138320}</Project>
+      <Private>True</Private>
+      <DoNotHarvest>True</DoNotHarvest>
+      <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
+      <RefTargetDir>INSTALLFOLDER</RefTargetDir>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(WixTargetsPath)" />
   <!--
diff --git a/Liquesce_Setup/Product.wxs b/Liquesce_Setup/Product.wxs
index 708f0ee..3ad43e4 100644
--- a/Liquesce_Setup/Product.wxs
+++ b/Liquesce_Setup/Product.wxs
@@ -1,20 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
-     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
-     xmlns:fire="http://schemas.microsoft.com/wix/FirewallExtension"
      xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
      >
 
-   <?define MgtSource=$(sys.SOURCEFILEDIR)..\Liquesce\bin\Release ?>
-   <?define SvcSource=$(sys.SOURCEFILEDIR)..\LiquesceSvc\bin\Release ?>
-   <?define TraySource=$(sys.SOURCEFILEDIR)..\LiquesceTray\bin\Release ?>
-
-
    <!-- do not change this ever !-->
    <?define UpgradeCode = "F6F94F17-A05F-4824-8DD9-9F5E8267D783" ?>
 
-   <!-- Change this when creating new release YY-MM-DD -->
-   <?define Version = "11.03.14" ?>
+   <!-- Change this when creating new release YY-MM-REV-DD -->
+   <?define Version = "!(bind.FileVersion.LiquesceSvc.File)" ?>
    
    <?define ProductName = "Liquesce Windows HDD Pooling Suite"?>
 
@@ -26,7 +19,8 @@
                Description="$(var.ProductName)"
                Comments="Liquesce" InstallerVersion="301" Compressed="yes"
                AdminImage='no'
-               Platform='x86'
+               InstallPrivileges='elevated'
+                 Platform='x86'
                />
 
       <MajorUpgrade DowngradeErrorMessage="Downgrades are not allowed - Use add/remove from the control panel" />
@@ -34,41 +28,16 @@
       <!-- Support Information shown in Add/Remove programs (this is optional) -->
       <Property Id="ARPHELPLINK" Value="http://liquesce.codeplex.com/documentation" />
       <Property Id="ARPCOMMENTS" Value="http://liquesce.codeplex.com/discussions"/>
-      <Property Id="ARPCONTACT" Value="Smurf-IV" />
+      <Property Id="ARPCONTACT" Value="Simon Coghlan (Aka Smurf-IV)" />
       <Property Id="ARPURLINFOABOUT" Value="http://liquesce.codeplex.com/" />
       <Icon Id="InstallerIcon" SourceFile="$(sys.SOURCEFILEDIR)..\Liquesce\Resources\Liquesce.ico" />
       <Property Id="ARPPRODUCTICON" Value="InstallerIcon" />
-
+      <WixVariable Id="WixUILicenseRtf" Value="GPLv2.rtf" />
+      
       <!-- Properties to allow detection of .Net installation -->
       <PropertyRef Id="NETFRAMEWORK40FULL"/>
       <PropertyRef Id="NETFRAMEWORK40FULLINSTALLROOTDIR" />
 
-      <Property Id="DOKANINSTALLED" >
-         <RegistrySearch Id="IsDokanServiceInstalled" Root="HKLM" Key="SYSTEM\CurrentControlSet\services\Dokan" Name="DisplayName" Type="raw" />
-      </Property>
-
-      <Property Id="DOKANVERCHECK32">
-         <DirectorySearch Id="Dokan.sys.version" Path="[SystemFolder]\Drivers">
-            <!--Make sure that the min / max _straddle_ the actual version..  Check for 0.6.0 x32 Size -->
-            <!-- It appears that there is yet another version for Windows 7 x32 !! -->
-            <FileSearch Name="Dokan.sys" MinSize="91903" MaxSize="95745" />
-         </DirectorySearch>
-      </Property>
-      <Property Id="DOKANVERCHECK64">
-         <DirectorySearch Id="Dokan.sys64.version" Path="[System64Folder]\Drivers">
-            <!--Make sure that the min / max _straddle_ the actual version.. Check for 0.6.0 x64 Size -->
-            <FileSearch Name="Dokan.sys" MinSize="120407" MaxSize="120409" />
-         </DirectorySearch>
-      </Property>
-
-      <Condition Message="This application requires Dokan Ver 0.6.0.">
-         <![CDATA[Installed OR (DOKANVERCHECK64 AND VersionNT64) OR (DOKANVERCHECK32 AND NOT VersionNT64)]]>
-      </Condition>
-
-      <!--Some test conditions to allow the installer to run-->
-      <Condition Message="Dokan.sys Driver Is Not Installed in the SYSTEM\CurrentControlSet\services registry correctly!">
-         <![CDATA[Installed OR DOKANINSTALLED]]>
-      </Condition>
       <Condition Message="[ProductName] Requires .NET Framework 4.0 Main profile to be installed">
          <![CDATA[Installed OR NETFRAMEWORK40FULL]]>
       </Condition>
@@ -76,20 +45,14 @@
          Privileged
       </Condition>
 
-      <!--<Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
-         <![CDATA[NOT NEWERVERSIONDETECTED OR Installed]]>
-      </Condition>-->
-
-      <!--Allow 7z / zip compression to squeeze this tighter -->
-      <Media Id="1" Cabinet="Setup.cab" EmbedCab="yes" CompressionLevel="high" />
+      <!--Allow 7z / zip compression to squeeze this tighter afterwards -->
+      <Media Id="1" Cabinet="Setup.cab" EmbedCab="yes" CompressionLevel="none" />
 
       <Directory Id="TARGETDIR" Name="SourceDir">
          <Directory Id="ProgramFilesFolder">
             <Directory Id="INSTALLDIR" Name="Liquesce">
-               <Directory Id="ClientDIR" Name="Liquesce Client">
-               </Directory>
-               <Directory Id="ServiceDIR" Name="Liquesce Service">
-               </Directory>
+               <Directory Id="ClientDIR" Name="Liquesce Client" />
+               <Directory Id="ServiceDIR" Name="Liquesce Service" />
             </Directory>
          </Directory>
          <Directory Id="ProgramMenuFolder">
@@ -105,119 +68,16 @@
 
       </Directory>
 
-      <ComponentGroup Id="Client" >
-         <Component Id="Client" Guid="5EBF3F29-9CF1-44FE-A94C-CC1B4FE09367" Directory="ClientDIR">
-            <File Id="InstallerIcon" Name="Liquesce.ico" Source="$(sys.SOURCEFILEDIR)..\Liquesce\Resources\Liquesce.ico" />
-            <File Id="Liquesce.exe" Name="Liquesce.exe" Source="$(var.MgtSource)\Liquesce.exe" KeyPath="yes">
-               <fire:FirewallException Id="LiquesceFWX1" Name="Liquesce Mount Management" Scope="localSubnet" IgnoreFailure="yes" />
-            </File>
-         </Component>
-         <Component Id="ChangeLog" Directory="ClientDIR">
-            <File Source="$(sys.SOURCEFILEDIR)..\Liquesce\ChangeLog.rtf" KeyPath="yes" />
-         </Component>
-         <Component Id="Liquesce.exe.config" Directory="ClientDIR">
-            <File Source="$(var.MgtSource)\Liquesce.exe.config" KeyPath="yes" />
-         </Component>
-         <Component Id="C_NLog.dll" Directory="ClientDIR">
-            <File Id="C_NLog.dll" Source="$(var.MgtSource)\NLog.dll" KeyPath="yes" />
-         </Component>
-         <Component Id="C_LiquesceFacade.dll" Directory="ClientDIR">
-            <File Id="C_LiquesceFacade.dll" Source="$(var.MgtSource)\LiquesceFacade.dll" KeyPath="yes" />
-         </Component>
-         <Component Id="LiquesceTray.exe.config" Directory="ClientDIR">
-            <File Source="$(var.TraySource)\LiquesceTray.exe.config" KeyPath="yes" />
-         </Component>
-         <Component Id="LiquesceTray.exe" Directory="ClientDIR">
-            <File Source="$(var.TraySource)\LiquesceTray.exe" KeyPath="yes" />
-         </Component>
-      </ComponentGroup>
-      <ComponentGroup Id="Service">
-         <Component Id="LiquesceSvc" Guid="BEBF3F29-9CF1-44FE-A94C-CC1B4FE09367" Directory="ServiceDIR">
-            <File Id="LiquesceSvc.File" Name="LiquesceSvc.exe" Source="$(var.SvcSource)\LiquesceSvc.exe" KeyPath="yes">
-               <fire:FirewallException Id="LiquesceFWX2" Name="LiquesceSvc" Scope="localSubnet" IgnoreFailure="yes" />
-               <!-- Why Use NGen ? http://msdn.microsoft.com/en-gb/magazine/cc163610.aspx -->
-               <netfx:NativeImage Id="ngen_LiquesceSvc.exe" Platform="32bit" Priority="1" AppBaseDirectory="ServiceDIR"/>
-            </File>
-            <File Id="LiquesceSvc.exe.config.File" Name="LiquesceSvc.exe.config" Source="$(var.SvcSource)\LiquesceSvc.exe.config"/>
-            <ServiceControl Id='LiquesceSvcControl' Name='LiquesceSvc' Start='install' Stop='both' Remove='uninstall' Wait='yes' />
-         </Component>
-         <Component Id="DokanNet.dll" Directory="ServiceDIR">
-            <File Source="$(var.SvcSource)\DokanNet.dll" KeyPath="yes" />
-         </Component>
-         <Component Id="LiquesceFacade.dll" Directory="ServiceDIR">
-            <File Source="$(var.SvcSource)\LiquesceFacade.dll" KeyPath="yes" />
-         </Component>
-         <Component Id="NLog.dll" Directory="ServiceDIR">
-            <File Source="$(var.SvcSource)\NLog.dll" KeyPath="yes" />
-         </Component>
-      </ComponentGroup>
-      <DirectoryRef Id="ProgramMenuDir">
-         <Component Id="ProgramMenuDir2" Guid="11234567-7E98-44CE-B049-C477CC0A2B01">
-            <Shortcut Id="Liquesce_Shortcut" Name="Liquesce MGT" Description="Liquesce Management Application" Target="[ClientDIR]Liquesce.exe" WorkingDirectory="ClientDIR" Icon="InstallerIcon" IconIndex="0" />
-            <Shortcut Id="LiquesceTray_Shortcut" Name="Liquesce Tray" Description="Liquesce Tray Application" Target="[ClientDIR]LiquesceTray.exe" WorkingDirectory="ClientDIR" Icon="InstallerIcon" IconIndex="0" />
-            <Shortcut Id="LiquesceTray_Start" Name="Liquesce Tray" Directory="StartupFolder" Description="Liquesce Tray Application" Target="[ClientDIR]LiquesceTray.exe" WorkingDirectory="ClientDIR" Icon="InstallerIcon" IconIndex="0" />
-            <util:InternetShortcut Type="url" Id="Home" Name="Liquesce Forum" Target="[ARPHELPLINK]" />
-            <util:InternetShortcut Type="link" Id="Change" Name="Change Log" Target="[ClientDIR]ChangeLog.rtf"/>
-            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
-            <RegistryValue Root="HKCU" Key="Software\Microsoft\Liquesce" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
-         </Component>
-      </DirectoryRef>
 
       <Feature Id="ProductFeature" Title="Liquesce_Setup" Level="1">
          <ComponentGroupRef Id="Service" />
+         <ComponentGroupRef Id="CBFS" />
          <ComponentRef Id="DataDir" />
          <ComponentGroupRef Id="Client" />
          <ComponentRef Id='ProgramMenuDir2'/>
       </Feature>
 
 
-      <!--Write custom actions to install, uninstall, commit and rollback the changes-->
-      <CustomAction Id="LiquesceSvc.commit.SetProperty" Property="LiquesceSvc.commit"
-        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=commit /LogFile="[LiquesceSvc_Data]LiquesceSvc.commit.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
-
-      <CustomAction Id="LiquesceSvc.rollback.SetProperty" Property="LiquesceSvc.rollback"
-        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=rollback /LogFile="[LiquesceSvc_Data]LiquesceSvc.rollback.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
-
-      <CustomAction Id="LiquesceSvc.install.SetProperty" Property="LiquesceSvc.install"
-        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=install /LogFile="[LiquesceSvc_Data]LiquesceSvc.install.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
-
-      <CustomAction Id="LiquesceSvc.uninstall.SetProperty" Property="LiquesceSvc.uninstall"
-        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=uninstall /LogFile="[LiquesceSvc_Data]LiquesceSvc.uninstall.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
-
-      <CustomAction Id="LiquesceSvc.commit" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="commit" Impersonate="no" Return="check" />
-      <CustomAction Id="LiquesceSvc.rollback" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="rollback" Impersonate="no" Return="check" />
-      <CustomAction Id="LiquesceSvc.install" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />
-      <CustomAction Id="LiquesceSvc.uninstall" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />
-
-      <!--Custom Actions to start stop Application tray-->
-      <CustomAction Id="StartTrayApp" FileKey="LiquesceTray.exe" ExeCommand="" Return="asyncNoWait" />
-      <util:CloseApplication CloseMessage="yes" Id="CloseServerTray" Target="LiquesceTray.exe" RebootPrompt="no"/>
-      <CustomAction Id="MgtApp" FileKey="Liquesce.exe" ExeCommand="" Return="asyncNoWait" />
-      <util:CloseApplication CloseMessage="yes" Id="CloseMgtAppTray" Target="Liquesce.exe" RebootPrompt="no"/>
-
-      <InstallUISequence>
-         <Custom Action="WixCloseApplications" Before="LaunchConditions" />
-      </InstallUISequence>
-
-      <!-- Now to sequence these Custom Actions in the execute sequence -->
-      <InstallExecuteSequence>
-         <Custom Action="WixCloseApplications" Before="LaunchConditions" />
-
-         <Custom Action="LiquesceSvc.commit.SetProperty" After="InstallServices"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
-         <Custom Action="LiquesceSvc.commit" After="LiquesceSvc.commit.SetProperty"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
-
-         <Custom Action="LiquesceSvc.rollback.SetProperty" After="LiquesceSvc.commit"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
-         <Custom Action="LiquesceSvc.rollback" After="LiquesceSvc.rollback.SetProperty"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
-
-         <Custom Action="LiquesceSvc.install.SetProperty" After="LiquesceSvc.rollback"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
-         <Custom Action="LiquesceSvc.install" After="LiquesceSvc.install.SetProperty"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
-
-         <Custom Action="LiquesceSvc.uninstall.SetProperty" After="MsiUnpublishAssemblies"><![CDATA[ $LiquesceSvc = 2 ]]></Custom>
-         <Custom Action="LiquesceSvc.uninstall" After="LiquesceSvc.uninstall.SetProperty"><![CDATA[ $LiquesceSvc = 2 ]]></Custom>
-         <Custom Action="StartTrayApp" After="InstallFinalize">Not Installed</Custom>
-         <Custom Action="MgtApp" After="StartTrayApp">Not Installed</Custom>
-      </InstallExecuteSequence>
-
       <!-- Get the install to skip a few steps -->
       <UIRef Id="WixUI_Common" />
       <WixVariable Id="WixUIBannerBmp" Value="banner.bmp" />
diff --git a/Liquesce_Setup/Service.wxs b/Liquesce_Setup/Service.wxs
new file mode 100644
index 0000000..27cb4ff
--- /dev/null
+++ b/Liquesce_Setup/Service.wxs
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
+     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
+     xmlns:fire="http://schemas.microsoft.com/wix/FirewallExtension"
+     >
+
+   <?define SvcSource=$(sys.SOURCEFILEDIR)..\LiquesceSvc\bin\Release ?>
+
+   <Fragment>
+
+      <DirectoryRef Id="ServiceDIR" />
+                 
+      <ComponentGroup Id="Service">
+         <Component Id="LiquesceSvc" Guid="BEBF3F29-9CF1-44FE-A94C-CC1B4FE09367" Directory="ServiceDIR">
+            <File Id="LiquesceSvc.File" Name="LiquesceSvc.exe" Source="$(var.SvcSource)\LiquesceSvc.exe" KeyPath="yes">
+               <fire:FirewallException Id="LiquesceFWX2" Name="LiquesceSvc" Scope="localSubnet" IgnoreFailure="yes" />
+               <!-- Why Use NGen ? http://msdn.microsoft.com/en-gb/magazine/cc163610.aspx -->
+               <netfx:NativeImage Id="ngen_LiquesceSvc.exe" Platform="all" Priority="1" AppBaseDirectory="ServiceDIR"/>
+            </File>
+            <File Id="LiquesceSvc.exe.config.File" Name="LiquesceSvc.exe.config" Source="$(var.SvcSource)\LiquesceSvc.exe.config"/>
+            <ServiceControl Id='LiquesceSvcControl' Name='LiquesceSvc' Stop='both' Remove='uninstall' Wait='yes' />
+         </Component>
+         <Component Id="LiquesceFacade.dll" Directory="ServiceDIR">
+            <File Source="$(var.SvcSource)\LiquesceFacade.dll" KeyPath="yes">
+               <netfx:NativeImage Id="ngen_LiquesceFacade.dll" Platform="all" Priority="1" AppBaseDirectory="ServiceDIR"/>
+            </File>
+         </Component>
+         <Component Id="NLog.dll" Directory="ServiceDIR">
+            <File Source="$(var.SvcSource)\NLog.dll" KeyPath="yes" />
+         </Component>
+
+      </ComponentGroup>
+
+      <!--Write custom actions to install, uninstall, commit and rollback the changes-->
+      <CustomAction Id="LiquesceSvc.commit.SetProperty" Property="LiquesceSvc.commit"
+        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=commit /LogFile="[LiquesceSvc_Data]LiquesceSvc.commit.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
+
+      <CustomAction Id="LiquesceSvc.rollback.SetProperty" Property="LiquesceSvc.rollback"
+        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=rollback /LogFile="[LiquesceSvc_Data]LiquesceSvc.rollback.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
+
+      <CustomAction Id="LiquesceSvc.install.SetProperty" Property="LiquesceSvc.install"
+        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=install /LogFile="[LiquesceSvc_Data]LiquesceSvc.install.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
+
+      <CustomAction Id="LiquesceSvc.uninstall.SetProperty" Property="LiquesceSvc.uninstall"
+        Value='"[NETFRAMEWORK40FULLINSTALLROOTDIR]InstallUtil.exe" /installtype=notransaction /action=uninstall /LogFile="[LiquesceSvc_Data]LiquesceSvc.uninstall.log" /InstallStateDir="[CommonAppDataFolder]LiquesceSvc" "[#LiquesceSvc.File]"' />
+
+      <CustomAction Id="LiquesceSvc.commit" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="commit" Impersonate="no" Return="check" />
+      <CustomAction Id="LiquesceSvc.rollback" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="rollback" Impersonate="no" Return="check" />
+      <CustomAction Id="LiquesceSvc.install" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />
+      <CustomAction Id="LiquesceSvc.uninstall" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Impersonate="no" Return="check" />
+
+      <!-- Now to sequence these Custom Actions in the execute sequence -->
+      <InstallExecuteSequence>
+
+         <Custom Action="LiquesceSvc.commit.SetProperty" After="InstallServices"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
+         <Custom Action="LiquesceSvc.commit" After="LiquesceSvc.commit.SetProperty"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
+
+         <Custom Action="LiquesceSvc.rollback.SetProperty" After="LiquesceSvc.commit"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
+         <Custom Action="LiquesceSvc.rollback" After="LiquesceSvc.rollback.SetProperty"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
+
+         <Custom Action="LiquesceSvc.install.SetProperty" After="LiquesceSvc.rollback"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
+         <Custom Action="LiquesceSvc.install" After="LiquesceSvc.install.SetProperty"><![CDATA[ $LiquesceSvc > 2 ]]></Custom>
+
+         <Custom Action="LiquesceSvc.uninstall.SetProperty" After="MsiUnpublishAssemblies"><![CDATA[ $LiquesceSvc = 2 ]]></Custom>
+         <Custom Action="LiquesceSvc.uninstall" After="LiquesceSvc.uninstall.SetProperty"><![CDATA[ $LiquesceSvc = 2 ]]></Custom>
+      </InstallExecuteSequence>
+
+   </Fragment>
+</Wix>
\ No newline at end of file
diff --git a/ServiceMEFs/FolderMEF/FolderMEF.cs b/ServiceMEFs/FolderMEF/FolderMEF.cs
deleted file mode 100644
index 586978b..0000000
--- a/ServiceMEFs/FolderMEF/FolderMEF.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System.ComponentModel.Composition;
-using LiquesceSvcMEF;
-
-namespace FolderMEF
-{
-   [Export(typeof(ICreateFactory))]
-   [ExportMetadata("Description", "Folder")]
-   public class FolderMEF : ICreateFactory
-   {
-      #region Implementation of ICreateFactory
-
-      /// <summary>
-      /// Creates a new class object that implements IServicePlugin
-      /// </summary>
-      /// <returns></returns>
-      public IServicePlugin Create()
-      {
-         return new FolderMEFImpl();
-      }
-
-      #endregion
-   }
-}
diff --git a/ServiceMEFs/FolderMEF/FolderMEF.csproj b/ServiceMEFs/FolderMEF/FolderMEF.csproj
deleted file mode 100644
index c6a2a70..0000000
--- a/ServiceMEFs/FolderMEF/FolderMEF.csproj
+++ /dev/null
@@ -1,156 +0,0 @@
-<?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>{8D071FB8-5E7B-43F4-81D4-839D2203D6AF}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>FolderMEF</RootNamespace>
-    <AssemblyName>FolderMEF</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
-    <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>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <PlatformTarget>AnyCPU</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>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>Liquesce.ico</ApplicationIcon>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Debug\FolderMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Release\FolderMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="NLog">
-      <HintPath>..\..\ThirdParty\NLog.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.ComponentModel.Composition" />
-    <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="FolderMEF.cs" />
-    <Compile Include="FolderMEFImpl.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\LiquesceFaçade\LiquesceFacade.csproj">
-      <Project>{CFE5DC7B-25FB-45C4-AF18-1963853375E1}</Project>
-      <Name>LiquesceFacade</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\LiquesceSvcMEF\LiquesceSvcMEF.csproj">
-      <Project>{E39910A2-C72A-4D3C-BFD0-4356906B86A7}</Project>
-      <Name>LiquesceSvcMEF</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="Liquesce.ico" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
-      <Visible>False</Visible>
-      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <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>false</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" />
-  <PropertyGroup>
-    <PostBuildEvent>Time /t</PostBuildEvent>
-  </PropertyGroup>
-  <ProjectExtensions>
-    <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
-    </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
diff --git a/ServiceMEFs/FolderMEF/FolderMEFImpl.cs b/ServiceMEFs/FolderMEF/FolderMEFImpl.cs
deleted file mode 100644
index 57e20e8..0000000
--- a/ServiceMEFs/FolderMEF/FolderMEFImpl.cs
+++ /dev/null
@@ -1,1029 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.ComponentModel.Composition;
-using System.Linq;
-using System.Threading;
-using LiquesceFacade;
-using LiquesceSvcMEF;
-using NLog;
-
-namespace FolderMEF
-{
-   [Export(typeof(IServicePlugin))]
-   public class FolderMEFImpl : CommonStorage, IServicePlugin
-   {
-      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-
-
-      #region Implementation of ILocations
-
-      /// <summary>
-      /// Return location of the new file, does not open it
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>.</returns>
-      public string CreateLocation(string dokanPath)
-      {
-         string location = String.Empty;
-         try
-         {
-            Log.Debug("CreateLocation([{0}])", dokanPath);
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("Create", ex);
-            location = GetPath(dokanPath, true);
-         }
-         finally
-         {
-            Log.Debug("Create returning([{0}])", location);
-         }
-         return location;
-      }
-
-      /// <summary>
-      /// Return location an existing file
-      /// </summary>
-      /// <param name="path">DokanPath passed in</param>
-      /// <returns>.</returns>
-      public override string OpenLocation(string path)
-      {
-         throw new NotImplementedException();
-      }
-
-
-      #endregion
-
-      #region Implementation of IFileEventHandlers
-
-      /// <summary>
-      /// To be used after a file has been updated and closed.
-      /// Can be used to create the directory tree as well
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      public void FileClosed(List<string> actualLocations)
-      {
-      }
-
-      /// <summary>
-      /// To be used after a file has been updated and closed.
-      /// </summary>
-      /// <param name="actualLocation"></param>
-      public void FileClosed(string actualLocation)
-      {
-      }
-
-      /// <summary>
-      /// A file has been removed from the system
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      public void FileDeleted(List<string> dokanPath)
-      {
-      }
-
-      /// <summary>
-      /// When a directory is deleted (i.e. is empty), this will be called
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      public void DirectoryDeleted(List<string> actualLocations)
-      {
-      }
-
-      #endregion
-
-      #region Location stuff
-      private string GetPath(string dokanPath, bool isDirectory, bool isCreate = false)
-      {
-         string foundPath = root;
-         try
-         {
-            if (!String.IsNullOrWhiteSpace(dokanPath) // Win 7 (x64) passes in a blank
-               && (dokanPath != PathDirectorySeparatorChar)
-               )
-            {
-               bool isAShare = false;
-               if (!dokanPath.StartsWith(PathDirectorySeparatorChar))
-               {
-                  isAShare = true;
-                  dokanPath = Path.DirectorySeparatorChar + dokanPath;
-               }
-               if (dokanPath.EndsWith(PathDirectorySeparatorChar))
-                  isDirectory = isAShare = true;
-
-               dokanPath = dokanPath.TrimEnd(Path.DirectorySeparatorChar);
-               using (rootPathsSync.UpgradableReadLock())
-               {
-                  if (!rootPaths.TryGetValue(dokanPath, out foundPath))
-                  {
-                     bool found = false;
-                     if (String.IsNullOrWhiteSpace(dokanPath))
-                        throw new ArgumentNullException(dokanPath, "Not allowed to pass this length 2");
-                     if (dokanPath[0] != Path.DirectorySeparatorChar)
-                        dokanPath = PathDirectorySeparatorChar + dokanPath;
-
-                     if (!isAShare
-                        && (sourceLocations != null)
-                        )
-                     {
-                        foreach (string newTarget in
-                           sourceLocations.Select(sourceLocation => sourceLocation + dokanPath))
-                        {
-                           Log.Trace("Try and GetPath from [{0}]", newTarget);
-                           //Now here's a kicker.. The User might have copied a file directly onto one of the drives while
-                           // this has been running, So this ought to try and find if it exists that way.
-                           if (Directory.Exists(newTarget)
-                              || File.Exists(newTarget)
-                              )
-                           {
-                              TrimAndAddUnique(newTarget);
-                              found = rootPaths.TryGetValue(dokanPath, out foundPath);
-                              break;
-                           }
-                        }
-                     }
-                     else if (isAShare
-                        && (knownSharePaths != null)
-                        )
-                     {
-                        found = knownSharePaths.Exists(delegate(string sharePath)
-                                                              {
-                                                                 Log.Trace("Try and find from [{0}][{1}]", sharePath, dokanPath);
-                                                                 return rootPaths.TryGetValue(sharePath + dokanPath, out foundPath);
-                                                              });
-
-                     }
-                     if (!found)
-                     {
-                        Log.Trace("was this a failed redirect thing from a network share ? [{0}]", dokanPath);
-                        //if (isCreate)
-                        //{
-                        //   int lastDir = dokanPath.LastIndexOf(Path.DirectorySeparatorChar);
-                        //   if (lastDir > -1)
-                        //   {
-                        //      Log.Trace("Perform search for path: {0}", dokanPath);
-                        //      string newPart = dokanPath.Substring(lastDir);
-                        //      foundPath = GetPath(dokanPath.Substring(0, lastDir), false) + newPart;
-                        //      Log.Trace("Now make sure it can be found when it tries to repopen via the share");
-                        //      TrimAndAddUnique(foundPath);
-                        //   }
-                        //   else
-                        //      foundPath = root + dokanPath; // This is used when creating new directory / file
-                        //}
-                        //else
-                           foundPath = root + dokanPath; // This is used when creating new directory / file
-                     }
-                  }
-               }
-            }
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("GetPath threw: ", ex);
-         }
-         finally
-         {
-            Log.Debug("GetPath from [{0}] found [{1}]", dokanPath, foundPath);
-         }
-         return foundPath;
-      }
-
-      #endregion
-
-
-      #region Code to be shared
-
-      #endregion
-
-      #region Implementation of IMoveManager
-
-      /// <summary>
-      /// Move directories depends on the scatter pattern beig used by the plugin.
-      /// Therefore if a priority is implemented, then it could be that some files from a remote part are
-      /// being collasced into a single location, but that location may already exist
-      /// There are other difficult scenrios that each of the plugins will need to solve.
-      /// When they have done, they must inform the other plugin's of their actions.
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="dokanTarget"></param>
-      /// <param name="replaceIfExisting"></param>
-      /// <param name="actualFileNewLocations"></param>
-      /// <param name="actualFileDeleteLocations"></param>
-      /// <param name="actualDirectoryDeleteLocations"></param>
-      public void MoveDirectory(string dokanPath, string dokanTarget, bool replaceIfExisting, out List<string> actualFileNewLocations, out List<string> actualFileDeleteLocations, out List<string> actualDirectoryDeleteLocations)
-      {
-         DeleteLocation(dokanPath, true);
-         throw new NotImplementedException();
-      }
-
-      #endregion
-   }
-}
-
-
-//namespace LiquesceSvc
-//{
-//   internal class LiquesceOps : IDokanOperations
-//   {
-//      static private readonly string PathDirectorySeparatorChar = Path.DirectorySeparatorChar.ToString();
-//      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-//      private readonly ConfigDetails configDetails;
-//      private readonly ReaderWriterLockSlim openFilesSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-//      private readonly Dictionary<UInt64, FileStream> openFiles = new Dictionary<UInt64, FileStream>();
-
-//      private readonly Dictionary<string, List<string>> foundDirectories = new Dictionary<string, List<string>>();
-//      private readonly ReaderWriterLockSlim foundDirectoriesSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-
-//      private UInt64 openFilesLastKey;
-//      private readonly string root;
-//      // This would normally be static, but then there should only ever be one of these classes present from the Dokan Lib callback.
-//      private readonly ReaderWriterLockSlim rootPathsSync = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-//      private readonly Dictionary<string, string> rootPaths = new Dictionary<string, string>();
-
-//      public LiquesceOps(ConfigDetails configDetails)
-//      {
-//         root = configDetails.SourceLocations[0]; // Already been trimmed in ReadConfigDetails()
-//         this.configDetails = configDetails;
-//      }
-
-//      #region IDokanOperations Implementation
-
-//      /// <summary>
-//      /// The information given in the Dokan info is a bit misleading about the return codes
-//      /// This is what the Win OS suystem is expecting http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx
-//      /// So.. Everything succeeds but the Return code is ERROR_ALREADY_EXISTS
-//      /// </summary>
-//      /// <param name="filename"></param>
-//      /// <param name="rawFlagsAndAttributes"></param>
-//      /// <param name="info"></param>
-//      /// <param name="rawAccessMode"></param>
-//      /// <param name="rawShare"></param>
-//      /// <param name="rawCreationDisposition"></param>
-//      /// <returns></returns>
-//      public int CreateFile(string filename, uint rawAccessMode, uint rawShare, uint rawCreationDisposition, uint rawFlagsAndAttributes, DokanFileInfo info)
-//      {
-//         int actualErrorCode = Dokan.DOKAN_SUCCESS;
-//         try
-//         {
-//            Log.Debug(
-//               "CreateFile IN filename [{0}], rawAccessMode[{1}], rawShare[{2}], rawCreationDisposition[{3}], rawFlagsAndAttributes[{4}], ProcessId[{5}]",
-//               filename, rawAccessMode, rawShare, rawCreationDisposition, rawFlagsAndAttributes, info.ProcessId);
-//            string path = GetPath(filename, (rawCreationDisposition == Proxy.CREATE_NEW) || (rawCreationDisposition == Proxy.CREATE_ALWAYS));
-
-//            if (Directory.Exists(path))
-//            {
-//               actualErrorCode = OpenDirectory(filename, info);
-//               return actualErrorCode;
-//            }
-
-//            // Stop using exceptions to throw ERROR_FILE_NOT_FOUND
-//            bool fileExists = File.Exists(path);
-//            switch (rawCreationDisposition)
-//            {
-//               //case FileMode.Create:
-//               //case FileMode.OpenOrCreate:
-//               //   if (fileExists)
-//               //      actualErrorCode = Dokan.ERROR_ALREADY_EXISTS;
-//               //   break;
-//               //case FileMode.CreateNew:
-//               //   if (fileExists)
-//               //      return Dokan.ERROR_FILE_EXISTS;
-//               //   break;
-//               case Proxy.OPEN_EXISTING:
-//               //case FileMode.Append:
-//               case Proxy.TRUNCATE_EXISTING:
-//                  if (!fileExists)
-//                  {
-//                     Log.Debug("filename [{0}] ERROR_FILE_NOT_FOUND", filename);
-//                     // Probably someone has removed this on the actual drive
-//                     RemoveFromLookup(filename);
-//                     actualErrorCode = Dokan.ERROR_FILE_NOT_FOUND;
-//                     return actualErrorCode;
-//                  }
-//                  break;
-//            }
-//            //if (!fileExists)
-//            //{
-//            //   if (fileAccess == FileAccess.Read)
-//            //   {
-//            //      actualErrorCode = Dokan.ERROR_FILE_NOT_FOUND;
-//            //   }
-//            //}
-
-//            bool writeable = (((rawAccessMode & Proxy.FILE_WRITE_DATA) == Proxy.FILE_WRITE_DATA));
-//            if (!fileExists
-//               && writeable
-//               )
-//            {
-//               // Find Quota
-//               string newDir = Path.GetDirectoryName(path);
-//               ulong lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes;
-//               // Check to see if the location has enough space 
-//               if (GetDiskFreeSpaceEx(newDir, out lpFreeBytesAvailable, out lpTotalNumberOfBytes, out lpTotalNumberOfFreeBytes)
-//                  && (lpFreeBytesAvailable < configDetails.HoldOffBufferBytes))
-//               {
-//                  string newDirLocation = configDetails.SourceLocations.Find(str =>
-//                    (GetDiskFreeSpaceEx(str, out lpFreeBytesAvailable, out lpTotalNumberOfBytes, out lpTotalNumberOfFreeBytes)
-//                           && (lpFreeBytesAvailable > configDetails.HoldOffBufferBytes))
-//                 );
-//                  if (!String.IsNullOrEmpty(newDirLocation))
-//                  {
-//                     path = newDirLocation + filename;
-//                     newDir = Path.GetDirectoryName(path);
-//                  }
-//                  else
-//                  {
-//                     // MessageText: Not enough quota is available to process this command.
-//                     // #define ERROR_NOT_ENOUGH_QUOTA           1816L 
-
-//                     // unchecked stolen from Microsoft.Win32.Win32Native.MakeHRFromErrorCode
-//                     Marshal.ThrowExceptionForHR(unchecked(((int)2147942400u) | 1816), new IntPtr(-1));
-//                     // The above function justs make the whole exception stack dissappear up it's own pipe !!
-//                     // _BUT_ Sticking the new IntPtr(-1) forces a new IErrorInfo and stops it reusing the
-//                     // last one it auto-created !
-//                  }
-//               }
-//               if (!String.IsNullOrWhiteSpace(newDir))
-//                  Directory.CreateDirectory(newDir);
-//            }
-
-//            SafeFileHandle handle = CreateFile(path, rawAccessMode, rawShare, IntPtr.Zero, rawCreationDisposition, rawFlagsAndAttributes, IntPtr.Zero);
-//            if (handle.IsInvalid)
-//            {
-//               Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error(), new IntPtr(-1));
-//            }
-//            FileStream fs = new FileStream(handle, writeable ? FileAccess.ReadWrite : FileAccess.Read, (int)configDetails.BufferReadSize);
-
-//            info.Context = ++openFilesLastKey; // never be Zero !
-//            try
-//            {
-//               openFilesSync.EnterWriteLock();
-//               openFiles.Add(openFilesLastKey, fs);
-//            }
-//            finally
-//            {
-//               openFilesSync.ExitWriteLock();
-//            }
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("CreateFile threw: ", ex);
-//            actualErrorCode = (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("CreateFile OUT actualErrorCode=[{0}] context[{1}]", actualErrorCode, openFilesLastKey);
-//         }
-//         return actualErrorCode;
-//      }
-
-//      public int OpenDirectory(string filename, DokanFileInfo info)
-//      {
-//         int dokanError = Dokan.DOKAN_ERROR;
-//         try
-//         {
-//            Log.Trace("OpenDirectory IN DokanProcessId[{0}]", info.ProcessId);
-//            string path = GetPath(filename);
-//            int start = path.IndexOf(Path.DirectorySeparatorChar );
-//            path = start > 0 ? path.Substring(start) : PathDirectorySeparatorChar;
-
-//            List<string> currentMatchingDirs = new List<string>(configDetails.SourceLocations.Count);
-//            foreach (string newTarget in
-//                           configDetails.SourceLocations.Select(sourceLocation => sourceLocation + path))
-//            {
-//               Log.Trace("Try and OpenDirectory from [{0}]", newTarget);
-//               if (Directory.Exists(newTarget))
-//               {
-//                  Log.Trace("Directory.Exists[{0}] Adding details", newTarget);
-//                  currentMatchingDirs.Add(newTarget);
-//               }
-//            }
-//            if (currentMatchingDirs.Count > 0)
-//            {
-//               info.IsDirectory = true;
-//               try
-//               {
-//                  foundDirectoriesSync.TryEnterWriteLock(configDetails.LockTimeout);
-//                  foundDirectories[filename] = currentMatchingDirs;
-//               }
-//               finally
-//               {
-//                  foundDirectoriesSync.ExitWriteLock();
-//               }
-//               dokanError = Dokan.DOKAN_SUCCESS;
-//            }
-//            else
-//            {
-//               Log.Warn("Probably someone has removed this from the actual mounts.");
-//               RemoveFromLookup(filename);
-//               dokanError = Dokan.ERROR_PATH_NOT_FOUND;
-//            }
-
-//         }
-//         finally
-//         {
-//            Log.Trace("OpenDirectory OUT. dokanError[{0}]", dokanError);
-//         }
-//         return dokanError;
-//      }
-
-
-//      public int CreateDirectory(string filename, DokanFileInfo info)
-//      {
-//         int dokanError = Dokan.DOKAN_ERROR;
-//         try
-//         {
-//            Log.Trace("CreateDirectory IN DokanProcessId[{0}]", info.ProcessId);
-//            string path = GetPath(filename, true);
-//            if (Directory.Exists(path))
-//            {
-//               info.IsDirectory = true;
-//               dokanError = Dokan.ERROR_ALREADY_EXISTS;
-//            }
-//            else if (Directory.CreateDirectory(path).Exists)
-//            {
-//               info.IsDirectory = true;
-//               TrimAndAddUnique(path);
-//               dokanError = Dokan.DOKAN_SUCCESS;
-//            }
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("CreateDirectory threw: ", ex);
-//            dokanError = (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("CreateDirectory OUT dokanError[{0}]", dokanError);
-//         }
-//         return dokanError;
-//      }
-//      static bool IsNullOrDefault<T>(T value)
-//      {
-//         return object.Equals(value, default(T));
-//      }
-
-//      /*
-//      Cleanup is invoked when the function CloseHandle in Windows API is executed. 
-//      If the file system application stored file handle in the Context variable when the function CreateFile is invoked, 
-//      this should be closed in the Cleanup function, not in CloseFile function. If the user application calls CloseHandle
-//      and subsequently open the same file, the CloseFile function of the file system application may not be invoked 
-//      before the CreateFile API is called. This may cause sharing violation error. 
-//      Note: when user uses memory mapped file, WriteFile or ReadFile function may be invoked after Cleanup in order to 
-//      complete the I/O operations. The file system application should also properly work in this case.
-//      */
-//      /// <summary>
-//      /// When info->DeleteOnClose is true, you must delete the file in Cleanup.
-//      /// </summary>
-//      /// <param name="filename"></param>
-//      /// <param name="info"></param>
-//      /// <returns></returns>
-//      public int Cleanup(string filename, DokanFileInfo info)
-//      {
-//         try
-//         {
-//            Log.Trace("Cleanup IN DokanProcessId[{0}]", info.ProcessId);
-//            CloseAndRemove(info);
-//            if (info.DeleteOnClose)
-//            {
-//               if (info.IsDirectory)
-//               {
-//                  Log.Trace("DeleteOnClose Directory");
-//                  try
-//                  {
-//                     // Only delete the directories that this knew about before the delet was called 
-//                     // (As the user may be moving files into the sources from the mount !!)
-//                     foundDirectoriesSync.TryEnterUpgradeableReadLock(configDetails.LockTimeout);
-//                     List<string> targetDeletes = foundDirectories[filename];
-//                     if (targetDeletes != null)
-//                        for (int index = 0; index < targetDeletes.Count; index++)
-//                        {
-//                           // Use an index for speed (It all counts !)
-//                           string fullPath = targetDeletes[index];
-//                           Log.Trace("Deleting matched dir [{0}]", fullPath);
-//                           Directory.Delete(fullPath, false);
-//                        }
-//                     foundDirectoriesSync.TryEnterWriteLock(configDetails.LockTimeout);
-//                     foundDirectories.Remove(filename);
-//                  }
-//                  finally
-//                  {
-//                     foundDirectoriesSync.ExitUpgradeableReadLock();
-//                  }
-//               }
-//               else
-//               {
-//                  Log.Trace("DeleteOnClose File");
-//                  string path = GetPath(filename);
-//                  File.Delete(path);
-//               }
-//               RemoveFromLookup(filename);
-//            }
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("Cleanup threw: ", ex);
-//            return (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("Cleanup OUT");
-//         }
-//         return Dokan.DOKAN_SUCCESS;
-//      }
-
-//      private void RemoveTargetFromLookup(string realFilename)
-//      {
-//         try
-//         {
-//            rootPathsSync.TryEnterUpgradeableReadLock(configDetails.LockTimeout);
-//            string key = string.Empty;
-//            foreach (KeyValuePair<string, string> kvp in rootPaths.Where(kvp => kvp.Value == realFilename))
-//            {
-//               key = kvp.Key;
-//               break;
-//            }
-//            if (!String.IsNullOrEmpty(key))
-//            {
-//               rootPathsSync.TryEnterWriteLock(configDetails.LockTimeout);
-//               rootPaths.Remove(key);
-//            }
-//         }
-//         finally
-//         {
-//            rootPathsSync.ExitUpgradeableReadLock();
-//         }
-//      }
-
-//      private void RemoveFromLookup(string filename)
-//      {
-//         try
-//         {
-//            rootPathsSync.TryEnterWriteLock(configDetails.LockTimeout);
-//            rootPaths.Remove(filename);
-//         }
-//         finally
-//         {
-//            rootPathsSync.ExitWriteLock();
-//         }
-//      }
-
-//      public int CloseFile(string filename, DokanFileInfo info)
-//      {
-//         try
-//         {
-//            Log.Trace("CloseFile IN DokanProcessId[{0}]", info.ProcessId);
-//            CloseAndRemove(info);
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("CloseFile threw: ", ex);
-//            return (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("CloseFile OUT");
-//         }
-//         return Dokan.DOKAN_SUCCESS;
-//      }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//      /// <summary>
-//      /// You should not delete file on DeleteFile or DeleteDirectory.
-//      // When DeleteFile or DeleteDirectory, you must check whether
-//      // you can delete or not, and return 0 (when you can delete it)
-//      // or appropriate error codes such as -ERROR_DIR_NOT_EMPTY,
-//      // -ERROR_SHARING_VIOLATION.
-//      // When you return 0 (ERROR_SUCCESS), you get Cleanup with
-//      // FileInfo->DeleteOnClose set TRUE, you delete the file.
-//      //
-//      /// </summary>
-//      /// <param name="filename"></param>
-//      /// <param name="info"></param>
-//      /// <returns></returns>
-//      public int DeleteFile(string filename, DokanFileInfo info)
-//      {
-//         int dokanReturn = Dokan.DOKAN_ERROR;
-//         try
-//         {
-//            Log.Trace("DeleteFile IN DokanProcessId[{0}]", info.ProcessId);
-//            dokanReturn = (File.Exists(GetPath(filename)) ? Dokan.DOKAN_SUCCESS : Dokan.ERROR_FILE_NOT_FOUND);
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("DeleteFile threw: ", ex);
-//            dokanReturn = (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("DeleteFile OUT dokanReturn[(0}]", dokanReturn);
-//         }
-//         return dokanReturn;
-//      }
-
-//      public int DeleteDirectory(string filename, DokanFileInfo info)
-//      {
-//         int dokanReturn = Dokan.DOKAN_ERROR;
-//         try
-//         {
-//            Log.Trace("DeleteDirectory IN DokanProcessId[{0}]", info.ProcessId);
-//            DirectoryInfo dirInfo = new DirectoryInfo(GetPath(filename));
-//            if (dirInfo.Exists)
-//            {
-//               FileSystemInfo[] fileInfos = dirInfo.GetFileSystemInfos();
-//               dokanReturn = (fileInfos.Length > 0) ? Dokan.ERROR_DIR_NOT_EMPTY : Dokan.DOKAN_SUCCESS;
-//            }
-//            else
-//               dokanReturn = Dokan.ERROR_FILE_NOT_FOUND;
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("DeleteDirectory threw: ", ex);
-//            dokanReturn = (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("DeleteDirectory OUT dokanReturn[(0}]", dokanReturn);
-//         }
-//         return dokanReturn;
-//      }
-
-
-//      // As this has an order of preference set by the user, and there may be duplicates that will need to be 
-//      // removed / ignored. There has to be a way of making sure that the (older) duplicate does not overwrite the shared visible
-//      private void XMoveDirectory(string filename, string pathTarget, bool replaceIfExisting)
-//      {
-//         try
-//         {
-//            Dictionary<string, int> hasPathBeenUsed = new Dictionary<string, int>();
-//            foundDirectoriesSync.TryEnterUpgradeableReadLock(configDetails.LockTimeout);
-//            List<string> targetMoves = foundDirectories[filename];
-//            if (targetMoves != null)
-//               for (int i = targetMoves.Count - 1; i >= 0; i--)
-//               {
-//                  XMoveDirContents(targetMoves[i], pathTarget, hasPathBeenUsed, replaceIfExisting);
-//               }
-//            foundDirectoriesSync.TryEnterWriteLock(configDetails.LockTimeout);
-//            foundDirectories.Remove(filename);
-//         }
-//         finally
-//         {
-//            foundDirectoriesSync.ExitUpgradeableReadLock();
-//         }
-
-//         //string pathSource = GetPath(filename);
-//         //Dictionary<string, int> hasPathBeenUsed = new Dictionary<string, int>();
-//         //while (Directory.Exists(pathSource))
-//         //{
-//         //   XMoveDirContents(pathSource, pathTarget, hasPathBeenUsed, replaceIfExisting);
-//         //   // Remove the above so that it is not found in the next try !
-//         //   RemoveTargetFromLookup(pathSource);
-//         //   pathSource = GetPath(filename);
-//         //}
-//      }
-
-//      private void XMoveDirContents(string pathSource, string pathTarget, Dictionary<string, int> hasPathBeenUsed, bool replaceIfExisting)
-//      {
-//         Log.Info("XMoveDirContents pathSource: [{0}] pathTarget: [{1}]", pathSource, pathTarget);
-//         DirectoryInfo currentDirectory = new DirectoryInfo(pathSource);
-//         if (!Directory.Exists(pathTarget))
-//            Directory.CreateDirectory(pathTarget);
-//         foreach (FileInfo filein in currentDirectory.GetFiles())
-//         {
-//            string fileTarget = pathTarget + Path.DirectorySeparatorChar + filein.Name;
-//            if (!hasPathBeenUsed.ContainsKey(fileTarget))
-//            {
-//               XMoveFile(filein.FullName, fileTarget, replaceIfExisting);
-//               hasPathBeenUsed[fileTarget] = 1;
-//            }
-//            else
-//            {
-//               filein.Delete();
-//            }
-//         }
-//         foreach (DirectoryInfo dr in currentDirectory.GetDirectories())
-//         {
-//             XMoveDirContents(dr.FullName, pathTarget + Path.DirectorySeparatorChar + dr.Name, hasPathBeenUsed, replaceIfExisting);
-//         }
-//         Directory.Delete(pathSource);
-//      }
-
-//      private void XMoveFile(string pathSource, string pathTarget, bool replaceIfExisting)
-//      {
-//         // http://msdn.microsoft.com/en-us/library/aa365240%28VS.85%29.aspx
-//         UInt32 dwFlags = (uint)(replaceIfExisting ? 1 : 0);
-//         // If the file is to be moved to a different volume, the function simulates the move by using the 
-//         // CopyFile and DeleteFile functions.
-//         dwFlags += 2; // MOVEFILE_COPY_ALLOWED 
-
-//         // The function does not return until the file is actually moved on the disk.
-//         // Setting this value guarantees that a move performed as a copy and delete operation 
-//         // is flushed to disk before the function returns. The flush occurs at the end of the copy operation.
-//         dwFlags += 8; // MOVEFILE_WRITE_THROUGH
-
-//         if (!MoveFileEx(pathSource, pathTarget, dwFlags))
-//            Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
-//      }
-
-
-//      public int MoveFile(string filename, string newname, bool replaceIfExisting, DokanFileInfo info)
-//      {
-//         try
-//         {
-//            Log.Trace("MoveFile IN DokanProcessId[{0}]", info.ProcessId);
-//            Log.Info("MoveFile replaceIfExisting [{0}] filename: [{1}] newname: [{2}]", replaceIfExisting, filename, newname);
-//            string pathTarget = GetPath(newname, true);
-
-//            CloseAndRemove(info);
-
-//            if (!info.IsDirectory)
-//            {
-//               string pathSource = GetPath(filename);
-//               Log.Info("MoveFile pathSource: [{0}] pathTarget: [{1}]", pathSource, pathTarget);
-//               XMoveFile(pathSource, pathTarget, replaceIfExisting);
-//               RemoveTargetFromLookup(pathSource);
-//            }
-//            else
-//            {
-//               XMoveDirectory(filename, pathTarget, replaceIfExisting);
-//            }
-//         }
-//         catch (Exception ex)
-//         {
-//            int win32 = ((short)Marshal.GetHRForException(ex) * -1);
-//            Log.ErrorException("MoveFile threw: ", ex);
-//            return (win32 != 0) ? win32 : Dokan.ERROR_ACCESS_DENIED;
-//         }
-//         finally
-//         {
-//            Log.Trace("MoveFile OUT");
-//         }
-//         return Dokan.DOKAN_SUCCESS;
-//      }
-
-
-//      #endregion
-//      private string GetPath(string filename, bool isCreate = false)
-//      {
-//         string foundPath = root;
-//         try
-//         {
-//            if (!String.IsNullOrWhiteSpace(filename) // Win 7 (x64) passes in a blank
-//               && (filename != PathDirectorySeparatorChar)
-//               )
-//            {
-//               try
-//               {
-//                  bool isAShare = false;
-//                  if (!filename.StartsWith(PathDirectorySeparatorChar))
-//                  {
-//                     isAShare = true;
-//                     filename = Path.DirectorySeparatorChar + filename;
-//                  }
-//                  if (filename.EndsWith(PathDirectorySeparatorChar))
-//                     isAShare = true;
-
-//                  filename = filename.TrimEnd(Path.DirectorySeparatorChar);
-//                  rootPathsSync.TryEnterUpgradeableReadLock(configDetails.LockTimeout);
-//                  if (!rootPaths.TryGetValue(filename, out foundPath))
-//                  {
-//                     bool found = false;
-//                     if (String.IsNullOrWhiteSpace(filename))
-//                        throw new ArgumentNullException(filename, "Not allowed to pass this length 2");
-//                     if (filename[0] != Path.DirectorySeparatorChar)
-//                        filename = PathDirectorySeparatorChar + filename;
-
-//                     if (!isAShare
-//                        && (configDetails.SourceLocations != null)
-//                        )
-//                     {
-//                        foreach (string newTarget in
-//                           configDetails.SourceLocations.Select(sourceLocation => sourceLocation + filename))
-//                        {
-//                           Log.Trace("Try and GetPath from [{0}]", newTarget);
-//                           //Now here's a kicker.. The User might have copied a file directly onto one of the drives while
-//                           // this has been running, So this ought to try and find if it exists that way.
-//                           if (Directory.Exists(newTarget)
-//                              || File.Exists(newTarget)
-//                              )
-//                           {
-//                              TrimAndAddUnique(newTarget);
-//                              found = rootPaths.TryGetValue(filename, out foundPath);
-//                              break;
-//                           }
-//                        }
-//                     }
-//                     else if ( isAShare
-//                        && (configDetails.KnownSharePaths != null)
-//                        )
-//                     {
-//                        found = configDetails.KnownSharePaths.Exists(delegate(string sharePath)
-//                                                              {
-//                                                                 Log.Trace("Try and find from [{0}][{1}]", sharePath, filename);
-//                                                                 return rootPaths.TryGetValue(sharePath + filename, out foundPath);
-//                                                              });
-
-//                     }
-//                     if (!found)
-//                     {
-//                        Log.Trace("was this a failed redirect thing from a network share ? [{0}]", filename);
-//                        if (isCreate)
-//                        {
-//                           int lastDir = filename.LastIndexOf(Path.DirectorySeparatorChar);
-//                           if (lastDir > -1)
-//                           {
-//                              Log.Trace("Perform search for path: {0}", filename);
-//                              string newPart = filename.Substring(lastDir);
-//                              foundPath = GetPath(filename.Substring(0, lastDir), false) + newPart;
-//                              Log.Trace("Now make sure it can be found when it tries to repopen via the share");
-//                              TrimAndAddUnique(foundPath);
-//                           }
-//                           else
-//                              foundPath = root + filename; // This is used when creating new directory / file
-//                        }
-//                        else
-//                           foundPath = root + filename; // This is used when creating new directory / file
-//                     }
-//                  }
-//               }
-//               finally
-//               {
-//                  rootPathsSync.ExitUpgradeableReadLock();
-//               }
-//            }
-//         }
-//         catch (Exception ex)
-//         {
-//            Log.ErrorException("GetPath threw: ", ex);
-//         }
-//         finally
-//         {
-//            Log.Debug("GetPath from [{0}] found [{1}]", filename, foundPath);
-//         }
-//         return foundPath;
-//      }
-
-//      private void AddFiles(string path, Dictionary<string, FileInformation> files, string pattern)
-//      {
-//         try
-//         {
-//            DirectoryInfo dirInfo = new DirectoryInfo(path);
-//            if (dirInfo.Exists)
-//            {
-//               FileSystemInfo[] fileSystemInfos = dirInfo.GetFileSystemInfos(pattern, SearchOption.TopDirectoryOnly);
-//               foreach (FileSystemInfo info2 in fileSystemInfos)
-//               {
-//                  AddToUniqueLookup(info2, files);
-//               }
-//            }
-//         }
-//         catch (Exception ex)
-//         {
-//            Log.ErrorException("AddFiles threw: ", ex);
-//         }
-//      }
-
-//      private void AddToUniqueLookup(FileSystemInfo info2, Dictionary<string, FileInformation> files)
-//      {
-//         bool isDirectoy = (info2.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
-//         FileInformation item = new FileInformation
-//                                   {
-//                                      // Prevent expensive time spent allowing indexing == FileAttributes.NotContentIndexed
-//                                      // Prevent the system from timing out due to slow access through the driver == FileAttributes.Offline
-//                                      Attributes = info2.Attributes | FileAttributes.NotContentIndexed,
-//                                      CreationTime = info2.CreationTime,
-//                                      LastAccessTime = info2.LastAccessTime,
-//                                      LastWriteTime = info2.LastWriteTime,
-//                                      Length = (isDirectoy) ? 0L : ((FileInfo)info2).Length,
-//                                      FileName = info2.Name
-//                                   };
-//         if (Log.IsTraceEnabled)
-//            item.Attributes |= FileAttributes.Offline;
-//         files[TrimAndAddUnique(info2.FullName)] = item;
-//      }
-
-//      private string TrimAndAddUnique(string fullFilePath)
-//      {
-//         int index = configDetails.SourceLocations.FindIndex(fullFilePath.StartsWith);
-//         if (index >= 0)
-//         {
-//            string key = fullFilePath.Remove(0, configDetails.SourceLocations[index].Length);
-//            try
-//            {
-//               Log.Trace("Adding [{0}] to [{1}]", key, fullFilePath);
-//               rootPathsSync.TryEnterWriteLock(configDetails.LockTimeout);
-//               // TODO: Add the collisions / duplicate feedback from here
-//               rootPaths[key] = fullFilePath;
-//            }
-//            finally
-//            {
-//               rootPathsSync.ExitWriteLock();
-//            }
-//            return key;
-//         }
-//         throw new ArgumentException("Unable to find BelongTo Path: " + fullFilePath, fullFilePath);
-//      }
-
-
-//      private void CloseAndRemove(DokanFileInfo info)
-//      {
-//         UInt64 context = Convert.ToUInt64(info.Context);
-//         if (!IsNullOrDefault(context))
-//         {
-//            Log.Trace("context [{0}]", context);
-//            FileStream fileStream;
-//            try
-//            {
-//               openFilesSync.EnterWriteLock();
-//               fileStream = openFiles[context];
-//               openFiles.Remove(context);
-//            }
-//            finally
-//            {
-//               openFilesSync.ExitWriteLock();
-//            }
-//            Log.Trace("CloseAndRemove [{0}] context[{1}]", fileStream.Name, context);
-//            fileStream.Flush();
-//            fileStream.Close();
-//            info.Context = 0;
-//         }
-//      }
-
-//      #region DLL Imports
-
-//      [DllImport("kernel32.dll", SetLastError = true)]
-//      private static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, UInt32 dwFlags);
-
-//      #endregion
-
-//      public void InitialiseShares(object state)
-//      {
-//         Log.Debug("InitialiseShares IN");
-//         try
-//         {
-//            Thread.Sleep(250); // Give the driver some time to mount
-//            // Now check (in 2 phases) the existence of the drive
-//            string path = configDetails.DriveLetter + ":" + PathDirectorySeparatorChar;
-//            while (!Directory.Exists(path))
-//            {
-//               Log.Info("Waiting for Dokan to create the drive letter before reapplying the shares");
-//               Thread.Sleep(1000);
-//            }
-//            // 2nd phase as the above is supposed to be cheap but can return false +ves
-//            do
-//            {
-//               string[] drives = Environment.GetLogicalDrives();
-//               if (Array.Exists(drives, dr => dr.Remove(1) == configDetails.DriveLetter))
-//                  break;
-//               Log.Info("Waiting for Dokan to create the drive letter before reapplying the shares (Phase 2)");
-//               Thread.Sleep(100);
-//            } while (ManagementLayer.Instance.State == LiquesceSvcState.Running);
-
-//            configDetails.KnownSharePaths = new List<string>(configDetails.SharesToRestore.Count);
-//            foreach (LanManShareDetails shareDetails in configDetails.SharesToRestore)
-//            {
-//               configDetails.KnownSharePaths.Add(shareDetails.Path);
-//               try
-//               {
-//                  Log.Info("Restore share for : [{0}] [{1} : {2}]", shareDetails.Path, shareDetails.Name, shareDetails.Description);
-//                  LanManShareHandler.SetLanManShare(shareDetails);
-//               }
-//               catch (Exception ex)
-//               {
-//                  Log.ErrorException("Unable to restore share for : " + shareDetails.Path, ex);
-//               }
-//            }
-//            ManagementLayer.Instance.FireStateChange(LiquesceSvcState.Running, "Shares restored - good to go");
-//         }
-//         catch (Exception ex)
-//         {
-//            Log.ErrorException("Init shares threw: ", ex);
-//            ManagementLayer.Instance.FireStateChange(LiquesceSvcState.InError, "Init shares reports: " + ex.Message);
-//         }
-//         finally
-//         {
-//            Log.Debug("InitialiseShares OUT");
-//         }
-//      }
-//   }
-//}
diff --git a/ServiceMEFs/FolderMEF/Liquesce.ico b/ServiceMEFs/FolderMEF/Liquesce.ico
deleted file mode 100644
index 184a228..0000000
Binary files a/ServiceMEFs/FolderMEF/Liquesce.ico and /dev/null differ
diff --git a/ServiceMEFs/FolderMEF/Properties/AssemblyInfo.cs b/ServiceMEFs/FolderMEF/Properties/AssemblyInfo.cs
deleted file mode 100644
index 3e4068a..0000000
--- a/ServiceMEFs/FolderMEF/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-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("FolderMEF")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Smurf-IV")]
-[assembly: AssemblyProduct("Liquesce")]
-[assembly: AssemblyCopyright("Copyright © Smurf-IV 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("18bb2b26-de9d-411e-a845-50e94befeee2")]
-
-// 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("2011.4.27.13")]
-[assembly: AssemblyFileVersion("2011.4.27.13")]
diff --git a/ServiceMEFs/MEFLibrary/MEFLibrary.csproj b/ServiceMEFs/MEFLibrary/MEFLibrary.csproj
deleted file mode 100644
index a1e420b..0000000
--- a/ServiceMEFs/MEFLibrary/MEFLibrary.csproj
+++ /dev/null
@@ -1,58 +0,0 @@
-<?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>{F78024AE-4AD2-4EE2-95A8-12AB6B64331F}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>MEFLibrary</RootNamespace>
-    <AssemblyName>MEFLibrary</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
-  </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.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Util.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
diff --git a/ServiceMEFs/MEFLibrary/MEFLibrary.csproj.vspscc b/ServiceMEFs/MEFLibrary/MEFLibrary.csproj.vspscc
deleted file mode 100644
index feffdec..0000000
--- a/ServiceMEFs/MEFLibrary/MEFLibrary.csproj.vspscc
+++ /dev/null
@@ -1,10 +0,0 @@
-""
-{
-"FILE_VERSION" = "9237"
-"ENLISTMENT_CHOICE" = "NEVER"
-"PROJECT_FILE_RELATIVE_PATH" = ""
-"NUMBER_OF_EXCLUDED_FILES" = "0"
-"ORIGINAL_PROJECT_FILE_PATH" = ""
-"NUMBER_OF_NESTED_PROJECTS" = "0"
-"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
-}
diff --git a/ServiceMEFs/MEFLibrary/Properties/AssemblyInfo.cs b/ServiceMEFs/MEFLibrary/Properties/AssemblyInfo.cs
deleted file mode 100644
index 794ccdc..0000000
--- a/ServiceMEFs/MEFLibrary/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-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("MEFLibrary")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("TTV")]
-[assembly: AssemblyProduct("MEFLibrary")]
-[assembly: AssemblyCopyright("Copyright © TTV 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("15a71483-c895-4a3e-87ba-1fb383853cb0")]
-
-// 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")]
diff --git a/ServiceMEFs/MEFLibrary/Util.cs b/ServiceMEFs/MEFLibrary/Util.cs
deleted file mode 100644
index 696a20c..0000000
--- a/ServiceMEFs/MEFLibrary/Util.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-namespace MEFLibrary
-{
-   public class Util
-   {
-      #region Code to be shared
-      // adds the root path to rootPaths dicionary for a specific file
-      private string TrimAndAddUnique(string fullFilePath)
-      {
-         int index = sourceLocations.FindIndex(fullFilePath.StartsWith);
-         if (index >= 0)
-         {
-            string key = fullFilePath.Remove(0, sourceLocations[index].Length);
-            Log.Trace("Adding [{0}] to [{1}]", key, fullFilePath);
-            using (rootPathsSync.WriteLock())
-            {
-               rootPaths[key] = fullFilePath;
-            }
-            return key;
-         }
-         throw new ArgumentException("Unable to find BelongTo Path: " + fullFilePath, fullFilePath);
-      }
-
-      #endregion
-   }
-}
diff --git a/ServiceMEFs/PriorityMEF/PriorityMEF.cs b/ServiceMEFs/PriorityMEF/PriorityMEF.cs
deleted file mode 100644
index 09ad18f..0000000
--- a/ServiceMEFs/PriorityMEF/PriorityMEF.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System.ComponentModel.Composition;
-using LiquesceSvcMEF;
-
-namespace PriorityMEF
-{
-   [Export(typeof(ICreateFactory))]
-   [ExportMetadata("Description", "Priority")]
-   public class PriorityMEF : ICreateFactory
-   {
-      #region Implementation of ICreateFactory
-
-      /// <summary>
-      /// Creates a new class object that implements IServicePlugin
-      /// </summary>
-      /// <returns></returns>
-      public IServicePlugin Create()
-      {
-         return new PriorityMEFImpl();
-      }
-
-      #endregion
-   }
-}
diff --git a/ServiceMEFs/PriorityMEF/PriorityMEF.csproj b/ServiceMEFs/PriorityMEF/PriorityMEF.csproj
deleted file mode 100644
index ed40103..0000000
--- a/ServiceMEFs/PriorityMEF/PriorityMEF.csproj
+++ /dev/null
@@ -1,145 +0,0 @@
-<?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>{0B134E04-A1C8-4BA3-A5D6-E83AD26A73ED}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>PriorityMEF</RootNamespace>
-    <AssemblyName>PriorityMEF</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
-    <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>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>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Debug\PriorityMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Release\PriorityMEF.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="NLog">
-      <HintPath>..\..\ThirdParty\NLog.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.ComponentModel.Composition" />
-    <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="PriorityMEF.cs" />
-    <Compile Include="PriorityMEFImpl.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
-      <Visible>False</Visible>
-      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <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>false</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="..\..\LiquesceFaçade\LiquesceFacade.csproj">
-      <Project>{CFE5DC7B-25FB-45C4-AF18-1963853375E1}</Project>
-      <Name>LiquesceFacade</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\LiquesceSvcMEF\LiquesceSvcMEF.csproj">
-      <Project>{E39910A2-C72A-4D3C-BFD0-4356906B86A7}</Project>
-      <Name>LiquesceSvcMEF</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <ProjectExtensions>
-    <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
-    </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
diff --git a/ServiceMEFs/PriorityMEF/PriorityMEF.csproj.vspscc b/ServiceMEFs/PriorityMEF/PriorityMEF.csproj.vspscc
deleted file mode 100644
index feffdec..0000000
--- a/ServiceMEFs/PriorityMEF/PriorityMEF.csproj.vspscc
+++ /dev/null
@@ -1,10 +0,0 @@
-""
-{
-"FILE_VERSION" = "9237"
-"ENLISTMENT_CHOICE" = "NEVER"
-"PROJECT_FILE_RELATIVE_PATH" = ""
-"NUMBER_OF_EXCLUDED_FILES" = "0"
-"ORIGINAL_PROJECT_FILE_PATH" = ""
-"NUMBER_OF_NESTED_PROJECTS" = "0"
-"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
-}
diff --git a/ServiceMEFs/PriorityMEF/PriorityMEFImpl.cs b/ServiceMEFs/PriorityMEF/PriorityMEFImpl.cs
deleted file mode 100644
index 8c9102f..0000000
--- a/ServiceMEFs/PriorityMEF/PriorityMEFImpl.cs
+++ /dev/null
@@ -1,186 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Threading;
-using LiquesceFacade;
-using LiquesceSvcMEF;
-using NLog;
-
-namespace PriorityMEF
-{
-   /// <summary>
-   /// This will the default if nothing has been recognised by the mode variable
-   /// </summary>
-   public class PriorityMEFImpl : CommonStorage, IServicePlugin
-   {
-      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-
-
-
-      #region Implementation of ILocations
-
-      /// <summary>
-      /// Return possible Physical Location of the new file, does not create it
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>New Physical Location to create the new object</returns>
-      public string CreateLocation(string dokanPath)
-      {
-         Log.Debug("CreateLocation([{0}])", dokanPath);
-         string pathToCheck = Path.GetDirectoryName(dokanPath);
-         if (String.IsNullOrEmpty(pathToCheck))
-            throw new DirectoryNotFoundException("Lookup directory not found");
-         ulong num = 0, num2, num3;
-         foreach (string t in from t in sourceLocations
-                              where !t.Contains(pathToCheck)
-                              where GetDiskFreeSpaceEx(t, out num, out num2, out num3)
-                              where num > HoldOffBufferBytes
-                              select t)
-         {
-            return (pathToCheck == dokanPath) ? t : Path.Combine(t, Path.GetFileName(dokanPath));
-         }
-
-         throw new DirectoryNotFoundException(string.Format("No more individual space usages allowed; holdOffBufferBytes=[{0}]", HoldOffBufferBytes));
-      }
-
-      /// <summary>
-      /// Return Physical Location of an existing file
-      /// </summary>
-      /// <param name="dokanPath">DokanPath passed in</param>
-      /// <returns>Physical Location</returns>
-      public override string OpenLocation(string dokanPath)
-      {
-         string foundPath = String.Empty;
-         try
-         {
-            Log.Info("OpenLocation([{0}])", dokanPath);
-            //if (dokanPath != PathDirectorySeparatorChar)
-            {
-               //dokanPath = dokanPath.TrimEnd(Path.DirectorySeparatorChar);
-               if (String.IsNullOrWhiteSpace(dokanPath))
-                  throw new ArgumentNullException(dokanPath, "Not allowed to pass this length 2");
-               if (dokanPath[0] != Path.DirectorySeparatorChar)
-                  dokanPath = PathDirectorySeparatorChar + dokanPath;
-               using (rootPathsSync.UpgradableReadLock())
-               {
-                  if (!rootPaths.TryGetValue(dokanPath, out foundPath))
-                  {
-                     foreach (string newTarget in sourceLocations.Select(sourceLocation => sourceLocation + dokanPath))
-                     {
-                        Log.Trace("Try and GetPath from [{0}]", newTarget);
-                        //Now here's a kicker.. The User might have copied a file directly onto one of the drives while
-                        // this has been running, So this ought to try and find if it exists that way.
-                        if (File.Exists(newTarget)
-                           || Directory.Exists(newTarget))
-                        {
-                           TrimAndAddUnique(newTarget);
-                           rootPaths.TryGetValue(dokanPath, out foundPath);
-                           break;
-                        }
-                     }
-                  }
-               }
-            }
-         }
-         finally
-         {
-            Log.Debug("OpenLocation Out(foundPath=[{0}])", foundPath);
-         }
-         return foundPath;
-      }
-
-
-      #endregion
-
-      #region Implementation of IFileEventHandlers
-
-      /// <summary>
-      /// To be used after a file has been updated and closed.
-      /// Can be used to create the directory tree as well
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      public void FileClosed(List<string> actualLocations)
-      {
-      }
-
-      /// <summary>
-      /// To be used after a file has been updated and closed.
-      /// </summary>
-      /// <param name="actualLocation"></param>
-      public void FileClosed(string actualLocation)
-      {
-      }
-
-      /// <summary>
-      /// A file has been removed from the system
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      public void FileDeleted(List<string> dokanPath)
-      {
-      }
-
-      /// <summary>
-      /// When a directory is deleted (i.e. is empty), this will be called
-      /// </summary>
-      /// <param name="actualLocations"></param>
-      public void DirectoryDeleted(List<string> actualLocations)
-      {
-      }
-
-      #endregion
-
-
-      #region DLL Imports
-
-      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
-      private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
-         out ulong lpFreeBytesAvailable, out ulong lpTotalNumberOfBytes, out ulong lpTotalNumberOfFreeBytes);
-
-      #endregion
-
-      #region Code to be shared
-      // adds the root path to rootPaths dicionary for a specific file
-      private string TrimAndAddUnique(string fullFilePath)
-      {
-         int index = sourceLocations.FindIndex(fullFilePath.StartsWith);
-         if (index >= 0)
-         {
-            string key = fullFilePath.Remove(0, sourceLocations[index].Length);
-            Log.Trace("Adding [{0}] to [{1}]", key, fullFilePath);
-            using (rootPathsSync.WriteLock())
-            {
-               rootPaths[key] = fullFilePath;
-            }
-            return key;
-         }
-         throw new ArgumentException("Unable to find BelongTo Path: " + fullFilePath, fullFilePath);
-      }
-
-      #endregion
-
-      #region Implementation of IMoveManager
-
-      /// <summary>
-      /// Move directories depends on the scatter pattern beig used by the plugin.
-      /// Therefore if a priority is implemented, then it could be that some files from a remote part are
-      /// being collasced into a single location, but that location may already exist
-      /// There are other difficult scenrios that each of the plugins will need to solve.
-      /// When they have done, they must inform the other plugin's of their actions.
-      /// </summary>
-      /// <param name="dokanPath"></param>
-      /// <param name="dokanTarget"></param>
-      /// <param name="replaceIfExisting"></param>
-      /// <param name="actualFileNewLocations"></param>
-      /// <param name="actualFileDeleteLocations"></param>
-      /// <param name="actualDirectoryDeleteLocations"></param>
-      public void MoveDirectory(string dokanPath, string dokanTarget, bool replaceIfExisting, out List<string> actualFileNewLocations, out List<string> actualFileDeleteLocations, out List<string> actualDirectoryDeleteLocations)
-      {
-         DeleteLocation(dokanPath, true);
-         throw new NotImplementedException();
-      }
-
-      #endregion
-   }
-}
\ No newline at end of file
diff --git a/ServiceMEFs/PriorityMEF/Properties/AssemblyInfo.cs b/ServiceMEFs/PriorityMEF/Properties/AssemblyInfo.cs
deleted file mode 100644
index 993d3d2..0000000
--- a/ServiceMEFs/PriorityMEF/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-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("PriorityMEF")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("TTV")]
-[assembly: AssemblyProduct("PriorityMEF")]
-[assembly: AssemblyCopyright("Copyright © TTV 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("cc638a9c-62a1-4544-80b9-eb0e64c249f3")]
-
-// 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("2011.4.27.15")]
-[assembly: AssemblyFileVersion("2011.4.27.15")]
diff --git a/ThirdParty/CBFS/32bit/CBFS5Net.dll b/ThirdParty/CBFS/32bit/CBFS5Net.dll
new file mode 100644
index 0000000..e3581a3
Binary files /dev/null and b/ThirdParty/CBFS/32bit/CBFS5Net.dll differ
diff --git a/ThirdParty/CBFS/32bit/msvcp100.dll b/ThirdParty/CBFS/32bit/msvcp100.dll
new file mode 100644
index 0000000..0285593
Binary files /dev/null and b/ThirdParty/CBFS/32bit/msvcp100.dll differ
diff --git a/ThirdParty/CBFS/32bit/msvcr100.dll b/ThirdParty/CBFS/32bit/msvcr100.dll
new file mode 100644
index 0000000..6d6af7e
Binary files /dev/null and b/ThirdParty/CBFS/32bit/msvcr100.dll differ
diff --git a/ThirdParty/CBFS/x64/CBFS5Net.dll b/ThirdParty/CBFS/x64/CBFS5Net.dll
new file mode 100644
index 0000000..f155ca7
Binary files /dev/null and b/ThirdParty/CBFS/x64/CBFS5Net.dll differ
diff --git a/ThirdParty/CBFS/x64/msvcp100.dll b/ThirdParty/CBFS/x64/msvcp100.dll
new file mode 100644
index 0000000..26ac137
Binary files /dev/null and b/ThirdParty/CBFS/x64/msvcp100.dll differ
diff --git a/ThirdParty/CBFS/x64/msvcr100.dll b/ThirdParty/CBFS/x64/msvcr100.dll
new file mode 100644
index 0000000..329b111
Binary files /dev/null and b/ThirdParty/CBFS/x64/msvcr100.dll differ
diff --git a/ThirdParty/CBFSWixCA/CBFS Installer/32bit/CBFSInst.dll b/ThirdParty/CBFSWixCA/CBFS Installer/32bit/CBFSInst.dll
new file mode 100644
index 0000000..4c4124e
Binary files /dev/null and b/ThirdParty/CBFSWixCA/CBFS Installer/32bit/CBFSInst.dll differ
diff --git a/ThirdParty/CBFSWixCA/CBFS Installer/Drivers/cbfs.cab b/ThirdParty/CBFSWixCA/CBFS Installer/Drivers/cbfs.cab
new file mode 100644
index 0000000..70fe8ed
Binary files /dev/null and b/ThirdParty/CBFSWixCA/CBFS Installer/Drivers/cbfs.cab differ
diff --git a/ThirdParty/CBFSWixCA/CBFS Installer/cbfsinst.h b/ThirdParty/CBFSWixCA/CBFS Installer/cbfsinst.h
new file mode 100644
index 0000000..eb97e60
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CBFS Installer/cbfsinst.h	
@@ -0,0 +1,94 @@
+// The following ifdef block is the standard way of creating macros which make exporting 
+// from a DLL simpler. All files within this DLL are compiled with the CBFSISTALL_EXPORTS
+// symbol defined on the command line. this symbol should not be defined on any project
+// that uses this DLL. This way any other project whose source files include this file see 
+// CBFSISTALL_API functions as being imported from a DLL, whereas this DLL sees symbols
+// defined with this macro as being exported.
+#ifdef CBFSINST_EXPORTS
+#ifdef __cplusplus
+#define CBFSINST_API extern "C" __declspec(dllexport)
+#else
+#define CBFSINST_API __declspec(dllexport)
+#endif
+#else
+#define CBFSINST_API __declspec(dllimport)
+#endif
+
+#define CBFS_MODULE_PNP_BUS                0x00000001
+#define CBFS_MODULE_DRIVER                 0x00000002
+#define CBFS_MODULE_NET_REDIRECTOR_DLL     0x00010000
+#define CBFS_MODULE_MOUNT_NOTIFIER_DLL     0x00020000
+
+CBFSINST_API BOOL __stdcall InstallA(
+    IN LPCSTR  CabPathName, 
+    IN LPCSTR  ProductName,
+    IN LPCSTR PathToInstall,
+	IN BOOL SupportPnP,
+	IN DWORD ModulesToInstall,
+    OUT LPDWORD RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall InstallW(
+    IN LPCWSTR  CabPathName, 
+    IN LPCWSTR ProductName,
+    IN LPCWSTR PathToInstall,
+	IN BOOL SupportPnP,
+    IN DWORD ModulesToInstall,
+    OUT LPDWORD RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall UninstallA(
+    IN LPCSTR  CabPathName, 
+    IN LPCSTR   ProductName,
+    IN LPCSTR InstalledPath OPTIONAL,
+    OUT LPDWORD  RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall UninstallW(
+    IN LPCWSTR  CabPathName, 
+    IN LPCWSTR  ProductName,
+    IN LPCWSTR InstalledPath OPTIONAL,
+    OUT LPDWORD  RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall GetModuleStatusA(
+    IN LPCSTR   ProductName,
+    IN DWORD    Module,
+    OUT LPBOOL  Installed,
+    OUT LPDWORD FileVersionHigh OPTIONAL,
+    OUT LPDWORD FileVersionLow OPTIONAL
+    );
+
+CBFSINST_API BOOL __stdcall GetModuleStatusW(
+    IN LPCWSTR  ProductName,
+    IN DWORD    Module,
+    OUT LPBOOL  Installed,
+    OUT LPDWORD FileVersionHigh OPTIONAL,
+    OUT LPDWORD FileVersionLow OPTIONAL
+    );
+
+CBFSINST_API BOOL __stdcall InstallIconA(
+	IN LPCSTR ProductName,
+	IN LPCSTR IconPath,
+    IN LPCSTR IconId,
+    OUT LPBOOL  RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall InstallIconW(
+	IN LPCWSTR ProductName,
+	IN LPCWSTR IconPath,
+    IN LPCWSTR IconId,
+    OUT LPBOOL  RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall UninstallIconA(
+	IN LPCSTR ProductName,
+    IN LPCSTR IconId,
+    OUT LPBOOL  RebootNeeded
+    );
+
+CBFSINST_API BOOL __stdcall UninstallIconW(
+	IN LPCWSTR ProductName,
+    IN LPCWSTR IconId,
+    OUT LPBOOL  RebootNeeded
+    );
diff --git a/ThirdParty/CBFSWixCA/CBFSInstWrapper.cpp b/ThirdParty/CBFSWixCA/CBFSInstWrapper.cpp
new file mode 100644
index 0000000..508faef
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CBFSInstWrapper.cpp
@@ -0,0 +1,72 @@
+#include "StdAfx.h"
+#include "CBFSInstWrapper.h"
+
+// explicit 
+CBFSInstWrapper::CBFSInstWrapper(LPCTSTR const cpszDllName)
+   : CDLLWrapper( cpszDllName )
+   ,m_lpfnInstall( NULL )
+   ,m_lpfnUninstall( NULL )
+   ,m_lpfnGetModuleStatus( NULL )
+   ,m_lpfnInstallIcon( NULL )
+   ,m_lpfnUninstallIcon( NULL )
+{
+}
+
+//virtual 
+CBFSInstWrapper::~CBFSInstWrapper()
+{
+}
+
+// The call to 'is valid' will attempt to load all the wanted function pointers
+// and then check if we had an error.
+//virtual 
+const bool CBFSInstWrapper::IsValid(void)
+{
+   return( GetFunctionPointer( m_lpfnInstall, STR( Install) )
+      && GetFunctionPointer( m_lpfnUninstall, STR( Uninstall ) )
+      && GetFunctionPointer( m_lpfnGetModuleStatus, STR( GetModuleStatus ) )
+      && GetFunctionPointer( m_lpfnInstallIcon, STR( InstallIcon ) )
+      && GetFunctionPointer( m_lpfnUninstallIcon, STR( UninstallIcon ) )
+      && CDLLWrapper::IsValid() 
+      );
+}
+
+BOOL CBFSInstWrapper::Install( IN LPCTSTR CabPathName, IN LPCTSTR ProductName, IN LPCTSTR PathToInstall, IN BOOL SupportPnP, IN DWORD ModulesToInstall, OUT LPDWORD RebootNeeded )
+{
+   if ( NULL == m_lpfnInstall ) 
+      return( FALSE );
+   else 
+      return( m_lpfnInstall( CabPathName, ProductName, PathToInstall, SupportPnP, ModulesToInstall, RebootNeeded ) );
+}
+
+BOOL CBFSInstWrapper::Uninstall( IN LPCTSTR CabPathName, IN LPCTSTR ProductName, IN LPCTSTR InstalledPath, OUT LPDWORD RebootNeeded )
+{
+   if ( NULL == m_lpfnUninstall ) 
+      return( FALSE );
+   else 
+      return( m_lpfnUninstall( CabPathName, ProductName, InstalledPath, RebootNeeded ) );
+}
+
+BOOL CBFSInstWrapper::GetModuleStatus( IN LPCTSTR ProductName, IN DWORD Module, OUT LPBOOL Installed, OUT LPDWORD FileVersionHigh OPTIONAL, OUT LPDWORD FileVersionLow OPTIONAL )
+{
+   if ( NULL == m_lpfnGetModuleStatus ) 
+      return( FALSE );
+   else 
+      return( m_lpfnGetModuleStatus( ProductName, Module, Installed, FileVersionHigh, FileVersionLow ) );
+}
+
+BOOL CBFSInstWrapper::InstallIcon( IN LPCTSTR ProductName, IN LPCTSTR IconPath, IN LPCTSTR IconId, OUT LPBOOL RebootNeeded )
+{
+   if ( NULL == m_lpfnInstallIcon ) 
+      return( FALSE );
+   else 
+      return( m_lpfnInstallIcon( ProductName, IconPath, IconId, RebootNeeded ) );
+}
+
+BOOL CBFSInstWrapper::UninstallIcon( IN LPCTSTR ProductName, IN LPCTSTR IconId, OUT LPBOOL RebootNeeded )
+{
+   if ( NULL == m_lpfnUninstallIcon ) 
+      return( FALSE );
+   else 
+      return( m_lpfnUninstallIcon( ProductName, IconId, RebootNeeded ) );
+}
diff --git a/ThirdParty/CBFSWixCA/CBFSInstWrapper.h b/ThirdParty/CBFSWixCA/CBFSInstWrapper.h
new file mode 100644
index 0000000..fdc3596
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CBFSInstWrapper.h
@@ -0,0 +1,161 @@
+#pragma once
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef STDDLLAPIPTR_
+#define STDDLLAPIPTR_( ret_type, PTRName ) typedef ret_type (* PTRName)
+#endif //
+
+//////////////////////////////////////////////////////////////////////////////
+
+STDDLLAPIPTR_( BOOL, InstallAFN)( IN LPCSTR CabPathName, IN LPCSTR ProductName, IN LPCWSTR PathToInstall, IN BOOL SupportPnP, IN DWORD ModulesToInstall, OUT LPDWORD RebootNeeded );
+STDDLLAPIPTR_( BOOL, InstallWFN)( IN LPCWSTR CabPathName, IN LPCWSTR ProductName, IN LPCWSTR PathToInstall, IN BOOL SupportPnP, IN DWORD ModulesToInstall, OUT LPDWORD RebootNeeded );
+ 
+STDDLLAPIPTR_( BOOL, UninstallAFN)( IN LPCSTR CabPathName, IN LPCSTR ProductName, IN LPCWSTR InstalledPath, OUT LPDWORD RebootNeeded );
+STDDLLAPIPTR_( BOOL, UninstallWFN)( IN LPCWSTR CabPathName, IN LPCWSTR ProductName, IN LPCWSTR InstalledPath, OUT LPDWORD RebootNeeded );
+
+STDDLLAPIPTR_( BOOL, GetModuleStatusAFN)( IN LPCSTR ProductName, IN DWORD Module, OUT LPBOOL Installed, OUT LPDWORD FileVersionHigh OPTIONAL, OUT LPDWORD FileVersionLow OPTIONAL );
+STDDLLAPIPTR_( BOOL, GetModuleStatusWFN)( IN LPCWSTR ProductName, IN DWORD Module, OUT LPBOOL Installed, OUT LPDWORD FileVersionHigh OPTIONAL, OUT LPDWORD FileVersionLow OPTIONAL );
+
+STDDLLAPIPTR_( BOOL, InstallIconAFN)( IN LPCSTR ProductName, IN LPCSTR IconPath, IN LPCSTR IconId, OUT LPBOOL RebootNeeded );
+STDDLLAPIPTR_( BOOL, InstallIconWFN)( IN LPCWSTR ProductName, IN LPCWSTR IconPath, IN LPCWSTR IconId, OUT LPBOOL RebootNeeded );
+
+STDDLLAPIPTR_( BOOL, UninstallIconAFN)( IN LPCSTR ProductName, IN LPCSTR IconId, OUT LPBOOL RebootNeeded );
+STDDLLAPIPTR_( BOOL, UninstallIconWFN)( IN LPCWSTR ProductName, IN LPCWSTR IconId, OUT LPBOOL RebootNeeded );
+
+#ifdef _UNICODE
+#define Install         InstallW
+#define Uninstall       UninstallW
+#define GetModuleStatus GetModuleStatusW
+#define InstallIcon     InstallIconW
+#define UninstallIcon   UninstallIconW
+#else
+#define Install         InstallA
+#define Uninstall       UninstallA
+#define GetModuleStatus GetModuleStatusA
+#define InstallIcon     InstallIconA
+#define UninstallIcon   UninstallIconA
+#endif 
+
+// will need to use "double expansion" trick:
+#define STR1(x)  #x
+#define STR(x)  STR1(x)
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Base class to handle the loading and unloading of dlls when
+// necessary e.g. guaranteed to free the loaded library.
+//
+// also defines a template member function which generates appropriate
+// instances of any wanted function pointers.
+//
+//*****************************************************************************
+// IsValid() :	Call this function to ensure that the dll has successfully loaded
+//*****************************************************************************
+// GetErrorCode() : Call this function to find out why the dll is NOT valid
+//*****************************************************************************
+// asHinstance() : Operator overloading to allow you to use a 'CDll' as a HINSTANCE wherever
+//   needed.
+//*****************************************************************************
+
+class CDLLWrapper
+{
+public:
+   explicit CDLLWrapper(LPCTSTR const cpszName)
+      : m_hrErrorNum(NO_ERROR)
+      ,m_hInstance(NULL) 
+   { 
+      m_hInstance = LoadLibrary(cpszName);
+      if ( NULL == m_hInstance )
+         SetErrorCode( GetLastError() );
+   }
+
+   //   Virtual destructor - ensures the loaded dll is freed
+   virtual ~CDLLWrapper(void)
+   {
+      if( NULL != m_hInstance )
+      {
+         FreeLibrary(m_hInstance);
+         m_hInstance=NULL;
+      }
+   }
+   virtual const bool IsValid( void )       { return( (m_hrErrorNum == NO_ERROR) ); };
+   virtual const HRESULT GetErrorCode( void ) const { return( m_hrErrorNum ); };
+   const HINSTANCE asHinstance( void )      { return( m_hInstance ); };
+
+   // Allowed to perform cast on ordinal because this is 32 bit
+   template <class T> bool GetFunctionPointer( T &rlpfnTFN, INT ciProcNameOrOrdinal )
+   { return( GetFunctionPointer( rlpfnTFN, reinterpret_cast<LPCSTR>(cpszProcNameOrOrdinal) ) ); };
+   // This template function generates an appropriate function pointer accessor which
+   // provides an appropriate function pointer as needed.
+   template <class T> bool GetFunctionPointer( T &rlpfnTFN, LPCSTR cpszProcNameOrOrdinal )
+   {	
+      bool bGetFunctionPointer_OK( false );
+      // have we successfully loaded the dll
+      if ( NULL != asHinstance() )
+      {	// try and get the function pointer (Allowed to perform cast on ordinal because this is 32 bit
+         rlpfnTFN = reinterpret_cast<T>( GetProcAddress( m_hInstance, cpszProcNameOrOrdinal ) );
+         // did we fail
+         if ( NULL == rlpfnTFN )
+            SetErrorCode( GetLastError() );
+         else
+            bGetFunctionPointer_OK = true;
+      }
+      else  // haven't managed to load the dll
+         SetErrorCode(ERROR_INVALID_HANDLE);
+      return( bGetFunctionPointer_OK );
+   };
+
+protected:
+   // Convert Win32 error code into HResult wqe can use
+   void SetErrorCode(CONST DWORD cdwError) { m_hrErrorNum = HRESULT_FROM_WIN32(static_cast<long>(cdwError)); };
+   CDLLWrapper(void){/*Don't use constructor." );*/}	// force CDll to load a 'named' library (or fail trying)
+
+private:
+   HRESULT m_hrErrorNum;    // last error number encountered
+   HINSTANCE m_hInstance;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+class CBFSInstWrapper : public CDLLWrapper
+{
+public:
+   // Just provide the name of the dll to load
+   explicit CBFSInstWrapper(LPCTSTR const cpszDllName);
+   virtual ~CBFSInstWrapper();
+    // The call to 'is valid' will attempt to load all the wanted function pointers
+    // and then check if we had an error.
+   virtual const bool IsValid(void);
+
+   BOOL Install( IN LPCTSTR CabPathName, IN LPCTSTR ProductName, IN LPCTSTR PathToInstall, IN BOOL SupportPnP, IN DWORD ModulesToInstall, OUT LPDWORD RebootNeeded );
+   BOOL Uninstall( IN LPCTSTR CabPathName, IN LPCTSTR ProductName, IN LPCTSTR InstalledPath, OUT LPDWORD RebootNeeded );
+   BOOL GetModuleStatus( IN LPCTSTR ProductName, IN DWORD Module, OUT LPBOOL Installed, OUT LPDWORD FileVersionHigh OPTIONAL, OUT LPDWORD FileVersionLow OPTIONAL );
+   BOOL InstallIcon( IN LPCTSTR ProductName, IN LPCTSTR IconPath, IN LPCTSTR IconId, OUT LPBOOL RebootNeeded );
+   BOOL UninstallIcon( IN LPCTSTR ProductName, IN LPCTSTR IconId, OUT LPBOOL RebootNeeded );
+
+private:
+   public:
+#ifdef _UNICODE
+    InstallWFN         m_lpfnInstall;
+    UninstallWFN       m_lpfnUninstall;
+    GetModuleStatusWFN m_lpfnGetModuleStatus;
+   InstallIconWFN     m_lpfnInstallIcon;
+   UninstallIconWFN   m_lpfnUninstallIcon;
+#else
+   InstallAFN         m_lpfnInstall;
+   UninstallAFN       m_lpfnUninstall;
+   GetModuleStatusAFN m_lpfnGetModuleStatus;
+   InstallIconAFN     m_lpfnInstallIcon;
+   UninstallIconAFN   m_lpfnUninstallIcon;
+#endif 
+
+   // Disable Copy Constructor
+   CBFSInstWrapper( const CBFSInstWrapper&  )
+   {};
+   // Disable assignment operator
+   CBFSInstWrapper& operator=(const CBFSInstWrapper& rs_)
+   {   if ( this != &rs_) {} return( *this ); };
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
\ No newline at end of file
diff --git a/ThirdParty/CBFSWixCA/CBFSWixCA.rc b/ThirdParty/CBFSWixCA/CBFSWixCA.rc
new file mode 100644
index 0000000..97a4aff
Binary files /dev/null and b/ThirdParty/CBFSWixCA/CBFSWixCA.rc differ
diff --git a/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj b/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj
new file mode 100644
index 0000000..851ce3c
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj
@@ -0,0 +1,132 @@
+<?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>{2BF998A5-8BED-4975-91C5-7893DD138320}</ProjectGuid>
+    <RootNamespace>CBFSWixCA</RootNamespace>
+    <Keyword>Win32Proj</Keyword>
+    <SccProjectName>SAK</SccProjectName>
+    <SccAuxPath>SAK</SccAuxPath>
+    <SccLocalPath>SAK</SccLocalPath>
+    <SccProvider>SAK</SccProvider>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">bin\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">obj\$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">bin\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">obj\$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>$(WIX)sdk\VS2010\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CUSTOMACTIONTEST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>$(WIX)sdk\VS2010\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <ModuleDefinitionFile>CustomAction.def</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <AdditionalIncludeDirectories>$(WIX)sdk\VS2010\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CUSTOMACTIONTEST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+    </ClCompile>
+    <Link>
+      <AdditionalDependencies>msi.lib;dutil.lib;wcautil.lib;Version.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>$(WIX)sdk\VS2010\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <ModuleDefinitionFile>CustomAction.def</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="CBFSInstWrapper.cpp" />
+    <ClCompile Include="CustomAction.cpp" />
+    <ClCompile Include="DllMain.cpp" />
+    <ClCompile Include="ExtractUtils.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="CBFS Installer\32bit\cbfsinst.dll" />
+    <None Include="CBFS Installer\Drivers\cbfs.cab" />
+    <None Include="CustomAction.def" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="CBFS Installer\cbfsinst.h" />
+    <ClInclude Include="CBFSInstWrapper.h" />
+    <ClInclude Include="ExtractUtils.h" />
+    <ClInclude Include="resource.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="CBFSWixCA.rc" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj.filters b/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj.filters
new file mode 100644
index 0000000..1ca135c
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj.filters
@@ -0,0 +1,79 @@
+<?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</Extensions>
+    </Filter>
+    <Filter Include="Resource Files\CBFS Installer">
+      <UniqueIdentifier>{85dfb99b-af8a-4182-bd1e-bdd8f4fa2e4e}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Resource Files\CBFS Installer\x86">
+      <UniqueIdentifier>{206e6a82-cb25-441d-9422-5557cfa6e78a}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Resource Files\CBFS Installer\Driver">
+      <UniqueIdentifier>{0b80d71b-d54f-403b-ac0c-2d63897a8560}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="CustomAction.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="DllMain.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="CBFSInstWrapper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ExtractUtils.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="CustomAction.def">
+      <Filter>Source Files</Filter>
+    </None>
+    <None Include="CBFS Installer\Drivers\cbfs.cab">
+      <Filter>Resource Files\CBFS Installer\Driver</Filter>
+    </None>
+    <None Include="CBFS Installer\32bit\cbfsinst.dll">
+      <Filter>Resource Files\CBFS Installer\x86</Filter>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="CBFS Installer\cbfsinst.h">
+      <Filter>Resource Files\CBFS Installer</Filter>
+    </ClInclude>
+    <ClInclude Include="CBFSInstWrapper.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="ExtractUtils.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="resource.h">
+      <Filter>Resource Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="CBFSWixCA.rc">
+      <Filter>Resource Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/LiquesceTrayMEF/LiquesceTrayMEF.csproj.vspscc b/ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj.vspscc
similarity index 100%
rename from LiquesceTrayMEF/LiquesceTrayMEF.csproj.vspscc
rename to ThirdParty/CBFSWixCA/CBFSWixCA.vcxproj.vspscc
diff --git a/ThirdParty/CBFSWixCA/CustomAction.cpp b/ThirdParty/CBFSWixCA/CustomAction.cpp
new file mode 100644
index 0000000..e6c461d
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CustomAction.cpp
@@ -0,0 +1,218 @@
+#include "stdafx.h"
+#include "resource.h"
+#include "ExtractUtils.h"
+#include "CBFSInstWrapper.h"
+
+// Follow the steps in here
+// https://blogs.technet.com/b/alexshev/archive/2009/05/15/from-msi-to-wix-part-22-dll-custom-actions-introduction.aspx?Redirected=true
+//
+
+// initialised fromthe DllMain
+extern HINSTANCE g_hInst;
+
+#define GetCAData( pwzData )\
+{\
+   WcaLog(LOGMSG_STANDARD, "Initialized.");\
+   hr = WcaGetProperty( __TEXT("CustomActionData"), &pwzData);\
+   ExitOnFailure(hr, "failed to get CustomActionData");\
+   WcaLog(LOGMSG_STANDARD, "CustomActionData: %ls", pwzData); \
+}
+
+UINT __stdcall InstallCBFS_CA(MSIHANDLE hInstall)
+{
+   UINT er = ERROR_SUCCESS;
+
+   HRESULT hr = WcaInitialize(hInstall, "InstallCBFS_CA");
+   ExitOnFailure(hr, "Failed to initialize");
+   {
+      LPWSTR pwzData = NULL;
+      GetCAData( pwzData );
+      LPWSTR pszwProductName = wcstok( pwzData, L";" );
+      int iModulesToInstall = _wtoi(wcstok( NULL, L";" ));
+      LPWSTR pszwIconPath = wcstok( NULL, L";" );
+      LPWSTR pszwIconName = wcstok( NULL, L";" );
+
+      USES_CONVERSION;
+      if ( wcslen(pszwProductName) == 0 )
+      {
+         WcaLogError(SCHED_E_NAMESPACE, "ProductName value is not set");
+      }
+      else
+      {
+         WcaLog(LOGMSG_STANDARD, "ProductName = %ls", pszwProductName);
+         WcaLog(LOGMSG_STANDARD, "IconName = %ls", pszwIconName);
+      }
+
+      WcaLog(LOGMSG_STANDARD, "CBFSModulesToInstall = %i", iModulesToInstall);
+      if ( iModulesToInstall == 0 )
+      {
+         WcaLogError(SCHED_E_INVALIDVALUE, "CBFSModulesToInstall value is not set");
+      }
+
+      // TODO: Add your custom action code here.
+      WcaLog(LOGMSG_STANDARD, "CBFSCab(g_hInst,IDR_CBFS_CAB1)");
+      CExtractUtils CBFSCab(g_hInst,IDR_CBFS_CAB1);
+      if ( !CBFSCab.ExtractResource() )
+      {
+         ExitWithLastError(hr, "Failed CBFSCab.ExtractResource");
+      }
+      WcaLog(LOGMSG_STANDARD, "CBFSCab(g_hInst,IDR_CBFSINST_X32_DLL1)");
+      {
+         WcaLog(LOGMSG_STANDARD, "CBFSCab.m_szOutputFilename");
+         WcaLog(LOGMSG_STANDARD, T2CA(CBFSCab.m_szOutputFilename) );
+         CExtractUtils CBFSInstaller(g_hInst,IDR_CBFSINST_X32_DLL1);
+         if ( !CBFSInstaller.ExtractResource() )
+         {
+            ExitWithLastError(hr, "Failed CBFSInstaller.ExtractResource");
+         }
+         {
+            WcaLog(LOGMSG_STANDARD, "InstWrapper(CBFSInstaller.m_szOutputFilename)-> [%s]", T2CA(CBFSInstaller.m_szOutputFilename));
+            CBFSInstWrapper InstWrapper(CBFSInstaller.m_szOutputFilename);
+            if ( !InstWrapper.IsValid() )
+            {
+               WcaLog(LOGMSG_STANDARD, "Following list shows the functions that failed to be found:");
+               if ( !InstWrapper.GetFunctionPointer( InstWrapper.m_lpfnInstall, STR(Install) ) )
+               {
+                  WcaLog(LOGMSG_STANDARD, STR(Install));
+               }
+               if ( !InstWrapper.GetFunctionPointer( InstWrapper.m_lpfnUninstall, STR( Uninstall ) ) )
+               {
+                  WcaLog(LOGMSG_STANDARD, STR(Uninstall));
+               }
+               if ( !InstWrapper.GetFunctionPointer( InstWrapper.m_lpfnGetModuleStatus, STR( GetModuleStatus ) ) )
+               {
+                  WcaLog(LOGMSG_STANDARD, STR(GetModuleStatus));
+               }
+               if ( !InstWrapper.GetFunctionPointer( InstWrapper.m_lpfnInstallIcon, STR( InstallIcon ) ) )
+               {
+                  WcaLog(LOGMSG_STANDARD, STR(InstallIcon));
+               }
+               if ( !InstWrapper.GetFunctionPointer( InstWrapper.m_lpfnUninstallIcon, STR( UninstallIcon ) ) )
+               {
+                  WcaLog(LOGMSG_STANDARD, STR(UninstallIcon));
+               }
+               if ( !InstWrapper.CDLLWrapper::IsValid() )
+               {
+                  WcaLog(LOGMSG_STANDARD, "CDLLWrapper::IsValid()");
+               }
+
+               ExitOnFailure(hr=InstWrapper.GetErrorCode(), "Failed InstWrapper.IsValid");
+            }
+            {
+               WcaLog(LOGMSG_STANDARD, "Call InstWrapper.Install(%s, %ls, TRUE, %i, out)", CBFSCab.m_szOutputFilename, pszwProductName,  iModulesToInstall);
+               DWORD dwRebootNeeded(0UL);
+               if ( FALSE == InstWrapper.Install(CBFSCab.m_szOutputFilename, W2CT(pszwProductName), NULL /* here you can put custom location if needed*/, TRUE, iModulesToInstall, &dwRebootNeeded) )
+               {
+                  ExitWithLastError(hr, "Failed InstWrapper.Install");
+               }
+               else if ( dwRebootNeeded != 0 )
+               {
+                  WcaDeferredActionRequiresReboot();
+               }
+               WcaLog(LOGMSG_STANDARD, "Success InstWrapper.Install");
+
+               // If doing icons then possibly use
+               if ( pszwIconPath != NULL)
+               {
+                  BOOL bRebootNeeded(FALSE);
+                  WcaLog(LOGMSG_STANDARD, "InstWrapper.InstallIcon");
+                  if ( FALSE == InstWrapper.InstallIcon(W2CT(pszwProductName), W2CT(pszwIconPath), W2CT(pszwIconName), &bRebootNeeded) )
+                  {
+                     ExitWithLastError(hr, "Failed InstWrapper.Install");
+                  }
+                  else if ( bRebootNeeded != FALSE )
+                  {
+                     WcaLog(LOGMSG_STANDARD, "bRebootNeeded");
+                     WcaDeferredActionRequiresReboot();
+                  }
+               }
+               // Following brakets due to the macros and
+               // http://msdn.microsoft.com/en-us/library/s6s80d9f%28v=vs.71%29.aspx
+            }
+         }
+      }
+   }
+LExit:
+   WcaLog(LOGMSG_STANDARD, "Out hr[%i]", hr);
+
+   er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
+   return WcaFinalize(er);
+}
+
+
+UINT __stdcall UninstallCBFS_CA(MSIHANDLE hInstall)
+{
+   UINT er = ERROR_SUCCESS;
+
+   HRESULT hr = WcaInitialize(hInstall, "UninstallCBFS_CA");
+   ExitOnFailure(hr, "Failed to initialize");
+   {
+      LPWSTR pwzData = NULL;
+      GetCAData( pwzData );
+      LPWSTR pszwProductName = wcstok( pwzData, L";" );
+      LPWSTR pszwIconName = wcstok( NULL, L";" );
+
+      WcaLog(LOGMSG_STANDARD, "ProductName = %ls", pszwProductName);
+      WcaLog(LOGMSG_STANDARD, "IconName = %ls", pszwIconName);
+
+      WcaLog(LOGMSG_STANDARD, "CBFSCab(g_hInst,IDR_CBFS_CAB1)");
+      CExtractUtils CBFSCab(g_hInst,IDR_CBFS_CAB1);
+      if ( !CBFSCab.ExtractResource() )
+      {
+         ExitWithLastError(hr, "Failed CBFSCab.ExtractResource");
+      }
+      // Following brakets due to the macros and
+      // http://msdn.microsoft.com/en-us/library/s6s80d9f%28v=vs.71%29.aspx
+      {
+         WcaLog(LOGMSG_STANDARD, "CBFSInstaller(g_hInst,IDR_CBFSINST_X32_DLL1)");
+         CExtractUtils CBFSInstaller(g_hInst,IDR_CBFSINST_X32_DLL1);
+         if ( !CBFSInstaller.ExtractResource() )
+         {
+            ExitWithLastError(hr, "Failed CBFSInstaller.ExtractResource");
+         }
+         {
+            WcaLog(LOGMSG_STANDARD, "InstWrapper(CBFSInstaller.m_szOutputFilename: %ls)", CBFSInstaller.m_szOutputFilename);
+            CBFSInstWrapper InstWrapper(CBFSInstaller.m_szOutputFilename);
+            if ( !InstWrapper.IsValid() )
+            {
+               ExitOnFailure(hr=InstWrapper.GetErrorCode(), "Failed InstWrapper.IsValid");
+            }
+            USES_CONVERSION;
+            if ( pszwIconName != NULL)
+            {
+               WcaLog(LOGMSG_STANDARD, "InstWrapper.UninstallIcon");
+               BOOL bRebootNeeded(FALSE);
+               if ( FALSE == InstWrapper.UninstallIcon(W2CT(pszwProductName), W2CT(pszwIconName), &bRebootNeeded) )
+               {
+                  ExitWithLastError(hr, "Failed InstWrapper.Install");
+               }
+               else if ( bRebootNeeded != FALSE )
+               {
+                  WcaLog(LOGMSG_STANDARD, "bRebootNeeded");
+                  WcaDeferredActionRequiresReboot();
+               }
+            }
+            {
+               WcaLog(LOGMSG_STANDARD, "InstWrapper.Uninstall");
+               DWORD dwRebootNeeded(0UL);
+
+               if ( FALSE == InstWrapper.Uninstall(CBFSCab.m_szOutputFilename, W2CT(pszwProductName), NULL /* here you can put custom location if needed*/, &dwRebootNeeded) )
+               {
+                  ExitWithLastError(hr, "Failed InstWrapper.Install");
+               }
+               else if ( dwRebootNeeded != 0 )
+               {
+                  WcaLog(LOGMSG_STANDARD, "dwRebootNeeded");
+                  WcaDeferredActionRequiresReboot();
+               }
+            }
+            WcaLog(LOGMSG_STANDARD, "End of CBFSInstWrapper");
+         }
+         WcaLog(LOGMSG_STANDARD, "End of CExtractUtils");
+      }
+   }
+LExit:
+   er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
+   WcaLog(LOGMSG_STANDARD, "WcaFinalize(er:0x%08x)", er);
+   return WcaFinalize(er);
+}
diff --git a/ThirdParty/CBFSWixCA/CustomAction.def b/ThirdParty/CBFSWixCA/CustomAction.def
new file mode 100644
index 0000000..788ccd1
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/CustomAction.def
@@ -0,0 +1,6 @@
+LIBRARY "CBFSWixCA"
+
+EXPORTS
+
+InstallCBFS_CA
+UninstallCBFS_CA
diff --git a/ThirdParty/CBFSWixCA/DllMain.cpp b/ThirdParty/CBFSWixCA/DllMain.cpp
new file mode 100644
index 0000000..068a654
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/DllMain.cpp
@@ -0,0 +1,32 @@
+
+#include "stdafx.h"
+
+/*
+hInst : A handle to the DLL module. The value is the base address of the DLL. 
+The HINSTANCE of a DLL is the same as the HMODULE of the DLL, so hinstDLL 
+can be used in calls to functions that require a module handle.
+*/
+HINSTANCE g_hInst = NULL;
+
+// DllMain - Initialize and cleanup WiX custom action utils.
+extern "C" BOOL WINAPI DllMain(
+   __in HINSTANCE hInst,
+   __in ULONG ulReason,
+   __in LPVOID
+   )
+{
+   switch(ulReason)
+   {
+   case DLL_PROCESS_ATTACH:
+      g_hInst = hInst;
+      WcaGlobalInitialize(hInst);
+      break;
+
+   case DLL_PROCESS_DETACH:
+      g_hInst = NULL;
+      WcaGlobalFinalize();
+      break;
+   }
+
+   return TRUE;
+}
diff --git a/ThirdParty/CBFSWixCA/ExtractUtils.cpp b/ThirdParty/CBFSWixCA/ExtractUtils.cpp
new file mode 100644
index 0000000..16eb235
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/ExtractUtils.cpp
@@ -0,0 +1,94 @@
+#include "StdAfx.h"
+#include "ExtractUtils.h"
+
+
+CExtractUtils::CExtractUtils(const HINSTANCE hInstance, const WORD & resourceID)
+   : m_hInstance( hInstance )
+   , m_wResourceID( resourceID )
+//   , m_szOutputFilename()
+{
+   m_szOutputFilename[0] = NULL;
+}
+
+// virtual 
+CExtractUtils::~CExtractUtils()
+{
+   // TODO: owner application will need to delete the file once it has finished with it (i.e. not when this class loses scope)
+   //if ( m_szOutputFilename[0] != NULL )
+   //   RemoveResource();
+}
+
+
+//
+bool CExtractUtils::ExtractResource()
+{
+   bool bSuccess = CreateTempFile(); 
+   if ( bSuccess )
+      try
+   {
+      // First find and load the required resource
+      HRSRC hResource = FindResource(m_hInstance, MAKEINTRESOURCE(m_wResourceID), TEXT("BIN"));
+      HGLOBAL hFileResource = LoadResource(m_hInstance, hResource);
+
+      // Now open and map this to a disk file
+      LPBYTE lpFileData = (LPBYTE)LockResource(hFileResource);
+      CONST DWORD cdwSize( SizeofResource(m_hInstance, hResource));
+
+      // Open the file and filemap
+      HANDLE hFile = CreateFile(m_szOutputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+      HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, cdwSize, NULL);
+      LPBYTE lpBaseAddress = (LPBYTE )MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);            
+
+      // Write the file
+      CopyMemory(lpBaseAddress, lpFileData, cdwSize);            
+
+      // Unmap the file and close the handles
+      UnmapViewOfFile(lpBaseAddress);
+
+      CloseHandle(hFilemap);
+      CloseHandle(hFile);
+      bSuccess = true;
+   }
+   catch(...)
+   {
+      // Ignore all type of errors
+      m_szOutputFilename[0] = NULL;
+      bSuccess = false;
+   } 
+   return bSuccess;
+}
+
+
+
+
+bool CExtractUtils::CreateTempFile( )
+{
+   bool bSuccess = false; 
+   try
+   {
+      TCHAR lpTempPathBuffer[MAX_PATH];
+      //  Gets the temp path env string (no guarantee it's a valid path).
+      DWORD dwRetVal = GetTempPath(MAX_PATH,          // length of the buffer
+         lpTempPathBuffer); // buffer for path 
+      if ( (dwRetVal > (MAX_PATH-14))
+         || (dwRetVal == 0)
+         )   
+      {
+      }
+      else
+      {
+         //  Generates a temporary file name. 
+         UINT uRetVal = GetTempFileName(lpTempPathBuffer, // directory for tmp files
+            TEXT("Extract"),     // temp file name prefix 
+            0,                // create unique name 
+            m_szOutputFilename);  // buffer for name     
+         bSuccess = (uRetVal != 0);
+      }
+   }
+   catch(...)
+   {
+      // Ignore all type of errors
+      bSuccess = false;
+   } 
+   return bSuccess;
+}
diff --git a/ThirdParty/CBFSWixCA/ExtractUtils.h b/ThirdParty/CBFSWixCA/ExtractUtils.h
new file mode 100644
index 0000000..18d7888
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/ExtractUtils.h
@@ -0,0 +1,19 @@
+#pragma once
+
+// Scoping class to ensure that the extracted resource is tidied up
+class CExtractUtils
+{
+public:
+   CExtractUtils(const HINSTANCE hInstance, const WORD & resourceID);
+   virtual ~CExtractUtils();
+
+   bool ExtractResource();
+
+   TCHAR m_szOutputFilename[MAX_PATH+1];
+
+private:
+   bool CreateTempFile();
+   const HINSTANCE m_hInstance;
+   const WORD m_wResourceID;
+};
+
diff --git a/ThirdParty/CBFSWixCA/TestTheCBFSInstall/AnyCPU/LiquesceSvc.exe b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/AnyCPU/LiquesceSvc.exe
new file mode 100644
index 0000000..16c6cea
Binary files /dev/null and b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/AnyCPU/LiquesceSvc.exe differ
diff --git a/ThirdParty/CBFSWixCA/TestTheCBFSInstall/Product.wxs b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/Product.wxs
new file mode 100644
index 0000000..15feb6c
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/Product.wxs
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+   
+   <Product Id="*" Name="TestTheCBFSInstall" 
+            Language="1033" 
+            Version="1.0.0.0" 
+            Manufacturer="TestTheCBFSInstall"
+            UpgradeCode="7F8E12BB-C6F2-4534-881C-285595936996">
+      <Package Id="*" 
+               InstallerVersion="301"
+               InstallScope='perMachine'
+               Platform='x86'
+               AdminImage='no'
+               InstallPrivileges='elevated'
+              Compressed="yes" />
+
+      <Condition Message="You need to be an administrator to install this product.">
+         Privileged
+      </Condition>
+
+      <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
+
+      <Directory Id="TARGETDIR" Name="SourceDir">
+         <Directory Id="ProgramFilesFolder">
+            <Directory Id="INSTALLLOCATION" Name="TestTheCBFSInstall" />
+         </Directory>
+      </Directory>
+
+      <?define MgtSource=$(sys.SOURCEFILEDIR).\AnyCPU ?>
+      <?define x64=$(sys.SOURCEFILEDIR)..\..\CBFS\x64 ?>
+      <?define x86=$(sys.SOURCEFILEDIR)..\..\CBFS\32bit ?>
+      <?define IcoSource=$(sys.SOURCEFILEDIR)..\..\..\Liquesce\Resources ?>
+
+
+      <ComponentGroup Id="Client" >
+         <Component Directory="INSTALLLOCATION">
+            <File Id="LiquesceSvc.exe" Source="$(var.MgtSource)\LiquesceSvc.exe" KeyPath="yes" />
+         </Component>
+         <Component Id="Liquesce.ico" Directory="INSTALLLOCATION">
+            <File Id="Liquesce.ico" Source="$(var.IcoSource)\Liquesce.ico" KeyPath="yes" />
+         </Component>
+
+         
+         <Component Directory="INSTALLLOCATION">
+            <Condition><![CDATA[VersionNT64]]></Condition>
+            <File Id="CBFS5Net.dll_x64" Source="$(var.x64)\CBFS5Net.dll" KeyPath="yes" />
+         </Component>
+         <Component  Directory="INSTALLLOCATION">
+            <File Id="CBFS5Net.dll_x86" Source="$(var.x86)\CBFS5Net.dll" KeyPath="yes" />
+            <Condition><![CDATA[Not VersionNT64]]></Condition>
+         </Component>
+
+         <Component Directory="INSTALLLOCATION">
+            <File Id="msvcp100.dll_x64" Source="$(var.x64)\msvcp100.dll" KeyPath="yes" />
+            <Condition><![CDATA[VersionNT64]]></Condition>
+         </Component>
+         <Component  Directory="INSTALLLOCATION">
+            <File Id="msvcp100.dll_x86" Source="$(var.x86)\msvcp100.dll" KeyPath="yes" />
+            <Condition><![CDATA[Not VersionNT64]]></Condition>
+         </Component>
+
+         <Component Directory="INSTALLLOCATION">
+            <File Id="msvcr100.dll_x64" Source="$(var.x64)\msvcr100.dll" KeyPath="yes" />
+            <Condition><![CDATA[VersionNT64]]></Condition>
+         </Component>
+         <Component  Directory="INSTALLLOCATION">
+            <File Id="msvcr100.dll_x86" Source="$(var.x86)\msvcr100.dll" KeyPath="yes" />
+            <Condition><![CDATA[Not VersionNT64]]></Condition>
+         </Component>
+
+      </ComponentGroup>
+      
+      <Feature Id="ProductFeature" Title="WixCBFSInstall" Level="1">
+         <ComponentGroupRef Id='Client'/>
+         </Feature>
+
+      <!-- Name to be used for the registration key of the CBFS application -->
+      <Property Id="PRODUCTNAME" Value="LiquesceSvc" />
+      <!--Values of ModulesToInstall
+      [Pascal] [C++ (VCL)] [C++ (Lib)] [C++ (.NET)] [C#] [VB.NET] [Java] Value Meaning
+      CBFS_MODULE_DRIVER 1 The driver (.sys file)
+      CBFS_MODULE_NET_REDIRECTOR_DLL  65536 (0x00010000) Network redirector DLL (CbFsNetRdr3.dll)
+      CBFS_MODULE_MOUNT_NOTIFIER_DLL 131072 (0x00020000) Mount Notifier DLL (CbFsMntNtf3.dll)
+      http://www.eldos.com/documentation/cbfs/ref_gen_helper_dlls.html
+      //CBFSModule( 1UL + 0x00010000 + 0x00020000);
+      -->
+      <Property Id="CBFSMODULESTOINSTALL" Value="196609" />
+
+      <Binary Id="CBFSWixCA.dll" SourceFile="$(var.CBFSWixCA.TargetDir)$(var.CBFSWixCA.TargetName).dll" />
+      <CustomAction Id="SetCBFS_CA_Values" Return="check" Property="InstallCBFS_CA" Value="[PRODUCTNAME];[CBFSMODULESTOINSTALL];[#Liquesce.ico];Liquesce.ico" />
+      <CustomAction Id="InstallCBFS_CA" BinaryKey="CBFSWixCA.dll" DllEntry="InstallCBFS_CA" Execute="deferred" Impersonate="no" Return="check" />
+      <CustomAction Id="SetUnCBFS_CA_Value" Return="check" Property="UninstallCBFS_CA" Value="[PRODUCTNAME];Liquesce.ico" />
+      <CustomAction Id="UninstallCBFS_CA" BinaryKey="CBFSWixCA.dll" DllEntry="UninstallCBFS_CA" Execute="deferred" Impersonate="no" Return="check" />
+
+      <UI>
+         <ProgressText Action="InstallCBFS_CA">Installing CBFS</ProgressText>
+         <ProgressText Action="UninstallCBFS_CA">Uninstalling CBFS</ProgressText>
+      </UI>
+
+      <InstallExecuteSequence>
+         <Custom Action="SetCBFS_CA_Values" Before="InstallCBFS_CA">NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+         <Custom Action="InstallCBFS_CA" Before="InstallServices" >NOT Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+
+         <Custom Action="SetUnCBFS_CA_Value" After="MsiUnpublishAssemblies" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+         <Custom Action="UninstallCBFS_CA" After="SetUnCBFS_CA_Value" >Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
+      </InstallExecuteSequence>
+
+
+   </Product>
+</Wix>
diff --git a/ThirdParty/CBFSWixCA/TestTheCBFSInstall/TestTheCBFSInstall.wixproj b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/TestTheCBFSInstall.wixproj
new file mode 100644
index 0000000..067ed20
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/TestTheCBFSInstall.wixproj
@@ -0,0 +1,75 @@
+<?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)' == '' ">x86</Platform>
+    <ProductVersion>3.6</ProductVersion>
+    <ProjectGuid>{3737e08f-ff33-4483-93eb-b71200af17fa}</ProjectGuid>
+    <SchemaVersion>2.0</SchemaVersion>
+    <OutputName>TestTheCBFSInstall</OutputName>
+    <OutputType>Package</OutputType>
+    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
+    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
+    <SccProjectName>SAK</SccProjectName>
+    <SccProvider>SAK</SccProvider>
+    <SccAuxPath>SAK</SccAuxPath>
+    <SccLocalPath>SAK</SccLocalPath>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <OutputPath>bin\$(Configuration)\</OutputPath>
+    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
+    <DefineConstants>Debug</DefineConstants>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\$(Configuration)\</OutputPath>
+    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
+    <SuppressAllWarnings>False</SuppressAllWarnings>
+    <Pedantic>True</Pedantic>
+    <SuppressSpecificWarnings>1137;1076</SuppressSpecificWarnings>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="Product.wxs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\CBFSWixCA.vcxproj">
+      <Name>CBFSWixCA</Name>
+      <Project>{2bf998a5-8bed-4975-91c5-7893dd138320}</Project>
+      <Private>True</Private>
+      <DoNotHarvest>True</DoNotHarvest>
+      <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
+      <RefTargetDir>INSTALLFOLDER</RefTargetDir>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="AnyCPU" />
+    <Folder Include="x64" />
+    <Folder Include="x86" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\..\Liquesce\Resources\Liquesce.ico">
+      <Link>Liquesce.ico</Link>
+    </Content>
+    <Content Include="..\..\CBFS\32bit\msvcp100.dll">
+      <Link>x86\msvcp100.dll</Link>
+    </Content>
+    <Content Include="..\..\CBFS\32bit\msvcr100.dll">
+      <Link>x86\msvcr100.dll</Link>
+    </Content>
+    <Content Include="..\..\CBFS\x64\msvcp100.dll">
+      <Link>x64\msvcp100.dll</Link>
+    </Content>
+    <Content Include="..\..\CBFS\x64\msvcr100.dll">
+      <Link>x64\msvcr100.dll</Link>
+    </Content>
+    <Content Include="AnyCPU\LiquesceSvc.exe" />
+  </ItemGroup>
+  <Import Project="$(WixTargetsPath)" />
+  <!--
+	To modify your build process, add your task inside one of the targets below and uncomment it.
+	Other similar extension points exist, see Wix.targets.
+	<Target Name="BeforeBuild">
+	</Target>
+	<Target Name="AfterBuild">
+	</Target>
+	-->
+</Project>
\ No newline at end of file
diff --git a/ServiceMEFs/FolderMEF/FolderMEF.csproj.vspscc b/ThirdParty/CBFSWixCA/TestTheCBFSInstall/TestTheCBFSInstall.wixproj.vspscc
similarity index 100%
rename from ServiceMEFs/FolderMEF/FolderMEF.csproj.vspscc
rename to ThirdParty/CBFSWixCA/TestTheCBFSInstall/TestTheCBFSInstall.wixproj.vspscc
diff --git a/ThirdParty/CBFSWixCA/resource.h b/ThirdParty/CBFSWixCA/resource.h
new file mode 100644
index 0000000..15bf5dc
Binary files /dev/null and b/ThirdParty/CBFSWixCA/resource.h differ
diff --git a/ThirdParty/CBFSWixCA/stdafx.cpp b/ThirdParty/CBFSWixCA/stdafx.cpp
new file mode 100644
index 0000000..5bc10e3
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// CBFSWixCA.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/ThirdParty/CBFSWixCA/stdafx.h b/ThirdParty/CBFSWixCA/stdafx.h
new file mode 100644
index 0000000..1c88d85
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/stdafx.h
@@ -0,0 +1,24 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
+// Windows Header Files:
+#include <windows.h>
+#include <msiquery.h>
+#include <WinNT.h>
+#include <WinDef.h>
+
+// WiX Header Files:
+#include <wcautil.h>
+
+#include <AtlBase.h>
+#include <AtlConv.h>
+// TODO: reference additional headers your program requires here
+
+#include <strsafe.h>
diff --git a/ThirdParty/CBFSWixCA/targetver.h b/ThirdParty/CBFSWixCA/targetver.h
new file mode 100644
index 0000000..c51bf77
--- /dev/null
+++ b/ThirdParty/CBFSWixCA/targetver.h
@@ -0,0 +1,24 @@
+#pragma once
+
+// The following macros define the minimum required platform.  The minimum required platform
+// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run 
+// your application.  The macros work by enabling all features available on platform versions up to and 
+// including the version specified.
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef WINVER                  // Specifies that the minimum required platform is Windows 2000.
+#define WINVER 0x0500           // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_WINNT            // Specifies that the minimum required platform is Windows 2000.
+#define _WIN32_WINNT 0x0500     // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+#ifndef _WIN32_IE               // Specifies that the minimum required platform is Internet Explorer 5.0.
+#define _WIN32_IE 0x0500        // Change this to the appropriate value to target other versions of IE.
+#endif
+
+#ifndef _WIN32_MSI              // Specifies that the minimum required MSI version is MSI 3.1
+#define _WIN32_MSI 310          // Change this to the appropriate value to target other versions of MSI.
+#endif
diff --git a/ThirdParty/DokanNet/Dokan.cs b/ThirdParty/DokanNet/Dokan.cs
deleted file mode 100644
index d6c2e11..0000000
--- a/ThirdParty/DokanNet/Dokan.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using System;
-using NLog;
-
-namespace DokanNet
-{
-   public class DokanOptions
-   {
-      public ushort Version; 
-      public ushort ThreadCount;
-      public bool DebugMode;
-      public bool UseStdErr;
-      public bool UseAltStream;
-      public bool UseKeepAlive;
-      public bool NetworkDrive;
-      public bool RemovableDrive;
-      public string VolumeLabel;
-      public string MountPoint;
-   }
-
-
-   public static class Dokan
-   {
-      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-
-// ReSharper disable InconsistentNaming
-#pragma warning disable 169
-      #region File Operation Errors 
-      // From WinError.h -> http://msdn.microsoft.com/en-us/library/ms819773.aspx
-      public const int ERROR_FILE_NOT_FOUND = -2;  // MessageText: The system cannot find the file specified.
-      public const int ERROR_PATH_NOT_FOUND = -3;  // MessageText: The system cannot find the path specified.
-      public const int ERROR_ACCESS_DENIED = -5;   // MessageText: Access is denied.
-      public const int ERROR_SHARING_VIOLATION = -32;
-      public const int ERROR_FILE_EXISTS = -80;
-      public const int ERROR_DISK_FULL = -112;     // There is not enough space on the disk.
-      public const int ERROR_INVALID_NAME = -123;
-      public const int ERROR_DIR_NOT_EMPTY = -145; // MessageText: The directory is not empty.
-      public const int ERROR_ALREADY_EXISTS = -183;// MessageText: Cannot create a file when that file already exists.
-      public const int ERROR_EXCEPTION_IN_SERVICE = -1064;//  An exception occurred in the service when handling thecontrol request.
-
-      #endregion
-
-      #region Dokan Driver Errors
-      public const int DOKAN_SUCCESS = 0;
-      public const int DOKAN_ERROR = -1; // General Error
-      public const int DOKAN_DRIVE_LETTER_ERROR = -2; // Bad Drive letter
-      public const int DOKAN_DRIVER_INSTALL_ERROR = -3; // Can't install driver
-      public const int DOKAN_START_ERROR = -4; // Driver something wrong
-      public const int DOKAN_MOUNT_ERROR = -5; // Can't assign drive letter
-      #endregion
-
-      private const ushort DOKAN_VERSION = 600; // ver 0.6.0
-
-      #region Dokan Driver Options
-      private const uint DOKAN_OPTION_DEBUG = 1;
-      private const uint DOKAN_OPTION_STDERR = 2;
-      private const uint DOKAN_OPTION_ALT_STREAM = 4;
-      private const uint DOKAN_OPTION_KEEP_ALIVE = 8;
-      private const uint DOKAN_OPTION_NETWORK = 16;
-      private const uint DOKAN_OPTION_REMOVABLE = 32;
-      #endregion
-#pragma warning restore 169
-// ReSharper restore InconsistentNaming
-
-
-
-      public static int DokanMain(DokanOptions options, IDokanOperations operations)
-      {
-         Log.Info("Start DokanMain");
-         if (String.IsNullOrEmpty(options.VolumeLabel) )
-         {
-            options.VolumeLabel = "DOKAN";
-         }
-
-         Proxy proxy = new Proxy(options, operations);
-
-         var dokanOptions = new DOKAN_OPTIONS
-                                         {
-                                            Version = options.Version != 0 ? options.Version : DOKAN_VERSION,
-                                            MountPoint = options.MountPoint,
-                                            ThreadCount = options.ThreadCount
-                                         };
-
-         dokanOptions.Options |= options.RemovableDrive ? DOKAN_OPTION_REMOVABLE : 0;
-         dokanOptions.Options |= options.DebugMode ? DOKAN_OPTION_DEBUG : 0;
-         dokanOptions.Options |= options.UseStdErr ? DOKAN_OPTION_STDERR : 0;
-         dokanOptions.Options |= options.UseAltStream ? DOKAN_OPTION_ALT_STREAM : 0;
-         dokanOptions.Options |= options.UseKeepAlive ? DOKAN_OPTION_KEEP_ALIVE : 0;
-         dokanOptions.Options |= options.NetworkDrive ? DOKAN_OPTION_NETWORK : 0;
-
-         var dokanOperations = new DOKAN_OPERATIONS
-                                               {
-                                                  CreateFile = proxy.CreateFileProxy,
-                                                  OpenDirectory = proxy.OpenDirectoryProxy,
-                                                  CreateDirectory = proxy.CreateDirectoryProxy,
-                                                  Cleanup = proxy.CleanupProxy,
-                                                  CloseFile = proxy.CloseFileProxy,
-                                                  ReadFile = proxy.ReadFileProxy,
-                                                  WriteFile = proxy.WriteFileProxy,
-                                                  FlushFileBuffers = proxy.FlushFileBuffersProxy,
-                                                  GetFileInformation = proxy.GetFileInformationProxy,
-                                                  FindFiles = proxy.FindFilesProxy,
-                                                  FindFilesWithPattern = proxy.FindFilesWithPatternProxy,
-                                                  SetFileAttributes = proxy.SetFileAttributesProxy,
-                                                  SetFileTime = proxy.SetFileTimeProxy,
-                                                  DeleteFile = proxy.DeleteFileProxy,
-                                                  DeleteDirectory = proxy.DeleteDirectoryProxy,
-                                                  MoveFile = proxy.MoveFileProxy,
-                                                  SetEndOfFile = proxy.SetEndOfFileProxy,
-                                                  SetAllocationSize = proxy.SetAllocationSizeProxy,
-                                                  LockFile = proxy.LockFileProxy,
-                                                  UnlockFile = proxy.UnlockFileProxy,
-                                                  GetDiskFreeSpace = proxy.GetDiskFreeSpaceProxy,
-                                                  GetVolumeInformation = proxy.GetVolumeInformationProxy,
-                                                  Unmount = proxy.UnmountProxy,
-                                                  GetFileSecurity = proxy.GetFileSecurity,
-                                                  SetFileSecurity = proxy.SetFileSecurity
-                                               };
-
-         return DokanDll.DokanMain(ref dokanOptions, ref dokanOperations);
-      }
-
-
-      public static int DokanUnmount(char driveLetter)
-      {
-         return DokanDll.DokanUnmount(driveLetter);
-      }
-
-      public static int DokanRemoveMountPoint(string mountPoint)
-      {
-         return Dokan.DokanRemoveMountPoint(mountPoint);
-      }
-
-      public static uint DokanVersion()
-      {
-         return DokanDll.DokanVersion();
-      }
-
-      public static uint DokanDriverVersion()
-      {
-         return DokanDll.DokanDriverVersion();
-      }
-
-      //public static bool DokanResetTimeout(uint timeout, DokanFileInfo fileinfo)
-      //{
-      //   var rawFileInfo = new DOKAN_FILE_INFO { DokanContext = fileinfo.DokanContext };
-      //   return DokanDll.DokanResetTimeout(timeout, ref rawFileInfo);
-      //}
-   }
-}
diff --git a/ThirdParty/DokanNet/DokanDll.cs b/ThirdParty/DokanNet/DokanDll.cs
deleted file mode 100644
index 2e3e6cd..0000000
--- a/ThirdParty/DokanNet/DokanDll.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using System;
-using System.Runtime.InteropServices;
-
-namespace DokanNet
-{
-   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)]
-   struct DOKAN_OPTIONS
-   {
-      public ushort Version;
-      public ushort ThreadCount; // number of threads to be used
-      public uint Options;
-      public ulong Dummy1;
-      [MarshalAs(UnmanagedType.LPWStr)]
-      public string MountPoint;
-   }
-
-   // this struct must be the same layout as DOKAN_OPERATIONS
-   [StructLayout(LayoutKind.Sequential, Pack = 4)]
-   struct DOKAN_OPERATIONS
-   {
-      public Proxy.CreateFileDelegate CreateFile;
-      public Proxy.OpenDirectoryDelegate OpenDirectory;
-      public Proxy.CreateDirectoryDelegate CreateDirectory;
-      public Proxy.CleanupDelegate Cleanup;
-      public Proxy.CloseFileDelegate CloseFile;
-      public Proxy.ReadFileDelegate ReadFile;
-      public Proxy.WriteFileDelegate WriteFile;
-      public Proxy.FlushFileBuffersDelegate FlushFileBuffers;
-      public Proxy.GetFileInformationDelegate GetFileInformation;
-      public Proxy.FindFilesDelegate FindFiles;
-      public Proxy.FindFilesWithPatternDelegate FindFilesWithPattern; // this is not used in DokanNet
-      public Proxy.SetFileAttributesDelegate SetFileAttributes;
-      public Proxy.SetFileTimeDelegate SetFileTime;
-      public Proxy.DeleteFileDelegate DeleteFile;
-      public Proxy.DeleteDirectoryDelegate DeleteDirectory;
-      public Proxy.MoveFileDelegate MoveFile;
-      public Proxy.SetEndOfFileDelegate SetEndOfFile;
-      public Proxy.SetAllocationSizeDelegate SetAllocationSize;
-      public Proxy.LockFileDelegate LockFile;
-      public Proxy.UnlockFileDelegate UnlockFile;
-      public Proxy.GetDiskFreeSpaceDelegate GetDiskFreeSpace;
-      public Proxy.GetVolumeInformationDelegate GetVolumeInformation;
-      public Proxy.UnmountDelegate Unmount;
-      public Proxy.GetFileSecurityDelegate GetFileSecurity;
-      public Proxy.SetFileSecurityDelegate SetFileSecurity;
-   }
-
-   static class DokanDll
-   {
-      [DllImport("dokan.dll")]
-      public static extern int DokanMain(ref DOKAN_OPTIONS options, ref DOKAN_OPERATIONS operations);
-
-      [DllImport("dokan.dll")]
-      public static extern int DokanUnmount(char driveLetter);
-
-      [DllImport("dokan.dll")]
-      public static extern uint DokanVersion();
-
-      [DllImport("dokan.dll")]
-      public static extern uint DokanDriverVersion();
-
-      [DllImport("dokan.dll")]
-      public static extern int DokanRemoveMountPoint([MarshalAs(UnmanagedType.LPWStr)] string mountPoint);
-
-      [DllImport("dokan.dll")]
-      public static extern bool DokanResetTimeout(uint timeout, ref DOKAN_FILE_INFO rawFileInfo);
-
-      [DllImport("dokan.dll", CharSet = CharSet.Unicode)]
-      public static extern bool DokanIsNameInExpression(string Expression, // matching pattern
-         string Name, // file name
-         bool IgnoreCase);
-
-
-   }
-}
\ No newline at end of file
diff --git a/ThirdParty/DokanNet/DokanNet.csproj b/ThirdParty/DokanNet/DokanNet.csproj
deleted file mode 100644
index c95cc80..0000000
--- a/ThirdParty/DokanNet/DokanNet.csproj
+++ /dev/null
@@ -1,142 +0,0 @@
-<?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>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{A09B408A-26A0-4FF8-83D5-6E1B1DA5F63C}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>DokanNet</RootNamespace>
-    <AssemblyName>DokanNet</AssemblyName>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-    <SccProjectName>SAK</SccProjectName>
-    <SccLocalPath>SAK</SccLocalPath>
-    <SccAuxPath>SAK</SccAuxPath>
-    <SccProvider>SAK</SccProvider>
-    <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>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>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-  </PropertyGroup>
-  <PropertyGroup>
-    <ApplicationIcon>Liquesce.ico</ApplicationIcon>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Debug\DokanNet.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>x86</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Release\DokanNet.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;E:\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="NLog">
-      <HintPath>..\NLog.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Runtime.Serialization" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="DokanDll.cs" />
-    <Compile Include="Dokan.cs" />
-    <Compile Include="IDokanOperations.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Proxy.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>
-    <Content Include="Liquesce.ico" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <ProjectExtensions>
-    <VisualStudio>
-      <UserProperties BuildVersion_BuildVersioningStyle="YearStamp.MonthStamp.DayStamp.Increment" BuildVersion_UseGlobalSettings="False" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" />
-    </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
diff --git a/ThirdParty/DokanNet/DokanNet.csproj.vspscc b/ThirdParty/DokanNet/DokanNet.csproj.vspscc
deleted file mode 100644
index feffdec..0000000
--- a/ThirdParty/DokanNet/DokanNet.csproj.vspscc
+++ /dev/null
@@ -1,10 +0,0 @@
-""
-{
-"FILE_VERSION" = "9237"
-"ENLISTMENT_CHOICE" = "NEVER"
-"PROJECT_FILE_RELATIVE_PATH" = ""
-"NUMBER_OF_EXCLUDED_FILES" = "0"
-"ORIGINAL_PROJECT_FILE_PATH" = ""
-"NUMBER_OF_NESTED_PROJECTS" = "0"
-"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
-}
diff --git a/ThirdParty/DokanNet/IDokanOperations.cs b/ThirdParty/DokanNet/IDokanOperations.cs
deleted file mode 100644
index 3c11300..0000000
--- a/ThirdParty/DokanNet/IDokanOperations.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using System.Runtime.Serialization;
-using System.IO;
-using ComTypes = System.Runtime.InteropServices.ComTypes;
-
-namespace DokanNet
-{
-   public class DokanFileInfo
-   {
-      public ulong refFileHandleContext; // Used by the ops.cs files to store a lookup to the FileStream etc.
-      public bool IsDirectory;
-      public uint ProcessId;
-      public bool DeleteOnClose;
-      public bool PagingIo;
-      public bool SynchronousIo;
-      public bool Nocache;
-      public bool WriteToEndOfFile;
-   }
-
-   // Now used by the client service via WCF
-   [DataContract]
-   public class FileInformation
-   {
-      [DataMember]
-      public FileAttributes Attributes;
-      [DataMember]
-      public DateTime CreationTime;
-      [DataMember]
-      public DateTime LastAccessTime;
-      [DataMember]
-      public DateTime LastWriteTime;
-      [DataMember]
-      public long Length;
-      [DataMember]
-      public string FileName;
-   }
-
-   public interface IDokanOperations
-   {
-      int CreateFile(string dokanPath, uint rawAccessMode, uint rawShare, uint rawCreationDisposition, uint rawFlagsAndAttributes, DokanFileInfo info);
-
-      int OpenDirectory( string dokanPath, DokanFileInfo info);
-
-      int CreateDirectory( string dokanPath, DokanFileInfo info);
-
-      int Cleanup( string dokanPath, DokanFileInfo info);
-
-      int CloseFile( string dokanPath, DokanFileInfo info);
-
-      int ReadFileNative(string file, IntPtr rawBuffer, uint rawBufferLength, ref uint rawReadLength, long rawOffset, DokanFileInfo convertFileInfo);
-
-      int WriteFileNative(string dokanPath, IntPtr rawBuffer, uint rawNumberOfBytesToWrite, ref uint rawNumberOfBytesWritten, long rawOffset, DokanFileInfo info);
-
-      int FlushFileBuffers( string dokanPath, DokanFileInfo info);
-
-      int GetFileInformation( string dokanPath, ref FileInformation fileinfo, DokanFileInfo info);
-
-      int FindFiles(string filename, out FileInformation[] files, DokanFileInfo info);
-
-      int FindFilesWithPattern(string filename, string pattern, out FileInformation[] files, DokanFileInfo info);
-
-      int SetFileAttributes(string filename, FileAttributes attr, DokanFileInfo info);
-
-      int SetFileTimeNative(string filename, ref ComTypes.FILETIME rawCreationTime, ref ComTypes.FILETIME rawLastAccessTime,
-          ref ComTypes.FILETIME rawLastWriteTime, DokanFileInfo info);
-
-      int DeleteFile( string filename, DokanFileInfo info);
-
-      int DeleteDirectory( string filename, DokanFileInfo info);
-
-      int MoveFile( string filename, string newname, bool replace, DokanFileInfo info);
-
-      int SetEndOfFile( string filename, long length, DokanFileInfo info);
-
-      int SetAllocationSize( string filename, long length, DokanFileInfo info);
-
-      int LockFile( string filename, long offset, long length, DokanFileInfo info);
-
-      int UnlockFile( string filename, long offset, long length, DokanFileInfo info);
-
-      int GetDiskFreeSpace( ref ulong freeBytesAvailable, ref ulong totalBytes, ref ulong totalFreeBytes, DokanFileInfo info);
-
-      int Unmount( DokanFileInfo info);
-
-      int GetFileSecurityNative(string file, ref SECURITY_INFORMATION rawRequestedInformation, ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, ref uint rawSecurityDescriptorLengthNeeded, DokanFileInfo info);
-
-      int SetFileSecurityNative(string file, ref SECURITY_INFORMATION rawSecurityInformation, ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, DokanFileInfo info);
-   }
-}
\ No newline at end of file
diff --git a/ThirdParty/DokanNet/Liquesce.ico b/ThirdParty/DokanNet/Liquesce.ico
deleted file mode 100644
index 05856b0..0000000
Binary files a/ThirdParty/DokanNet/Liquesce.ico and /dev/null differ
diff --git a/ThirdParty/DokanNet/Properties/AssemblyInfo.cs b/ThirdParty/DokanNet/Properties/AssemblyInfo.cs
deleted file mode 100644
index 6802952..0000000
--- a/ThirdParty/DokanNet/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-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("DokanNet")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("DokanNet")]
-[assembly: AssemblyCopyright("Copyright (C) 2007")]
-[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("faf94eee-9bae-4ada-8f96-614ca17f7854")]
-
-
-//
-// 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("2011.4.27.266")]
-[assembly: AssemblyFileVersion("2011.4.27.266")]
diff --git a/ThirdParty/DokanNet/Proxy.cs b/ThirdParty/DokanNet/Proxy.cs
deleted file mode 100644
index 809b414..0000000
--- a/ThirdParty/DokanNet/Proxy.cs
+++ /dev/null
@@ -1,869 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using NLog;
-using ComTypes = System.Runtime.InteropServices.ComTypes;
-
-namespace DokanNet
-{
-   [StructLayout(LayoutKind.Sequential, Pack = 4)]
-   public struct BY_HANDLE_FILE_INFORMATION
-   {
-      public uint dwFileAttributes;
-      public ComTypes.FILETIME ftCreationTime;
-      public ComTypes.FILETIME ftLastAccessTime;
-      public ComTypes.FILETIME ftLastWriteTime;
-      internal uint dwVolumeSerialNumber;
-      public uint nFileSizeHigh;
-      public uint nFileSizeLow;
-      internal uint dwNumberOfLinks;
-      internal uint nFileIndexHigh;
-      internal uint nFileIndexLow;
-   }
-
-   [StructLayout(LayoutKind.Sequential, Pack = 4)]
-   public struct DOKAN_FILE_INFO
-   {
-      public ulong Context;
-      private readonly ulong DokanContext;
-      private readonly IntPtr DokanOptions;
-      public readonly uint ProcessId;
-      public byte IsDirectory;
-      public readonly byte DeleteOnClose;
-      public readonly byte PagingIo;
-      public readonly byte SynchronousIo;
-      public readonly byte Nocache;
-      public readonly byte WriteToEndOfFile;
-   }
-
-   /// <summary>
-   /// Check http://msdn.microsoft.com/en-us/library/cc230369%28v=prot.13%29.aspx
-   /// and usage http://msdn.microsoft.com/en-us/library/ff556635%28v=vs.85%29.aspx
-   /// </summary>
-   [Flags] 
-   public enum SECURITY_INFORMATION : uint
-   {
-      /// <summary>
-      /// Structure taken from http://www.pinvoke.net/default.aspx/Enums/SECURITY_INFORMATION.html
-      /// </summary>
-      OWNER_SECURITY_INFORMATION = 0x00000001,
-      GROUP_SECURITY_INFORMATION = 0x00000002,
-      DACL_SECURITY_INFORMATION = 0x00000004,
-      SACL_SECURITY_INFORMATION = 0x00000008,
-      // Dokan may not be passing Label ?? 0x00000010
-      UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
-      UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
-      PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000,
-      PROTECTED_DACL_SECURITY_INFORMATION = 0x80000000
-   }
-
-   /// <summary>
-   /// See http://www.pinvoke.net/search.aspx?search=SECURITY_DESCRIPTOR&namespace=[All]
-   /// </summary>
-   [StructLayoutAttribute(LayoutKind.Sequential, Pack = 4)]
-   public struct SECURITY_DESCRIPTOR
-   {
-      /// <summary>
-      /// Structure taken from http://msdn.microsoft.com/en-us/library/ff556610%28v=vs.85%29.aspx
-      /// </summary>
-      public byte revision;
-      public byte size;
-      public short control;   // == SECURITY_DESCRIPTOR_CONTROL
-      public IntPtr owner;    // == PSID  
-      public IntPtr group;    // == PSID  
-      public IntPtr sacl;     // == PACL  
-      public IntPtr dacl;     // == PACL  
-   }
-
-   public class Proxy
-   {
-      static private readonly Logger Log = LogManager.GetCurrentClassLogger();
-      private readonly IDokanOperations operations;
-      private readonly DokanOptions options;
-      private const uint volumeSerialNumber = 0x20101112;
-
-      public Proxy(DokanOptions options, IDokanOperations operations)
-      {
-         this.operations = operations;
-         this.options = options;
-      }
-
-      /// <summary>
-      /// DOKAN_FILE_INFO is a struct so pass byref to keep things the same (Speed etc)
-      /// </summary>
-      /// <param name="rawInfo">DOKAN_FILE_INFO struct</param>
-      /// <returns>new internal DokanFileInfo class</returns>
-      private static DokanFileInfo ConvertFileInfo(ref DOKAN_FILE_INFO rawInfo)
-      {
-         // TODO: If this proves to be expensive in the GC, then perhaps just pass the rawInfo around as a ref !!
-         return new DokanFileInfo
-         {
-            refFileHandleContext = rawInfo.Context,
-            IsDirectory = rawInfo.IsDirectory == 1,
-            ProcessId = rawInfo.ProcessId,
-            DeleteOnClose = rawInfo.DeleteOnClose == 1,
-            PagingIo = rawInfo.PagingIo == 1,
-            SynchronousIo = rawInfo.SynchronousIo == 1,
-            Nocache = rawInfo.Nocache == 1,
-            WriteToEndOfFile = rawInfo.WriteToEndOfFile == 1
-         };
-      }
-
-      private static string GetFileName(IntPtr fileName)
-      {
-         return Marshal.PtrToStringUni(fileName);
-      }
-
-
-
-      #region Win32 Constants fro file controls
-      // ReSharper disable InconsistentNaming
-#pragma warning disable 169
-      public const uint GENERIC_READ = 0x80000000;
-      public const uint GENERIC_WRITE = 0x40000000;
-      private const uint GENERIC_EXECUTE = 0x20000000;
-
-      private const uint FILE_READ_DATA = 0x00000001;
-      public const uint FILE_WRITE_DATA = 0x00000002;
-      private const uint FILE_APPEND_DATA = 0x00000004;
-      private const uint FILE_READ_EA = 0x00000008;
-      private const uint FILE_WRITE_EA = 0x00000010;
-      private const uint FILE_EXECUTE = 0x00000020;
-      private const uint FILE_READ_ATTRIBUTES = 0x00000080;
-      private const uint FILE_WRITE_ATTRIBUTES = 0x00000100;
-      private const uint DELETE = 0x00010000;
-      private const uint READ_CONTROL = 0x00020000;
-      private const uint WRITE_DAC = 0x00040000;
-      private const uint WRITE_OWNER = 0x00080000;
-      private const uint SYNCHRONIZE = 0x00100000;
-
-      private const uint STANDARD_RIGHTS_REQUIRED = 0x000F0000;
-
-      private const uint STANDARD_RIGHTS_READ = READ_CONTROL;
-      private const uint STANDARD_RIGHTS_WRITE = READ_CONTROL;
-      private const uint STANDARD_RIGHTS_EXECUTE = READ_CONTROL;
-
-      public const uint FILE_SHARE_READ = 0x00000001;
-      public const uint FILE_SHARE_WRITE = 0x00000002;
-      private const uint FILE_SHARE_DELETE = 0x00000004;
-
-      public const uint CREATE_NEW = 1;
-      public const uint CREATE_ALWAYS = 2;
-      public const uint OPEN_EXISTING = 3;
-      private const uint OPEN_ALWAYS = 4;
-      public const uint TRUNCATE_EXISTING = 5;
-
-      private const uint FILE_ATTRIBUTE_READONLY           =  0x00000001;
-      private const uint FILE_ATTRIBUTE_HIDDEN             =  0x00000002;
-      private const uint FILE_ATTRIBUTE_SYSTEM             =  0x00000004;
-      private const uint FILE_ATTRIBUTE_DIRECTORY          =  0x00000010;
-      private const uint FILE_ATTRIBUTE_ARCHIVE            =  0x00000020;
-      private const uint FILE_ATTRIBUTE_ENCRYPTED          =  0x00000040;
-      private const uint FILE_ATTRIBUTE_NORMAL             =  0x00000080;
-      private const uint FILE_ATTRIBUTE_TEMPORARY          =  0x00000100;
-      private const uint FILE_ATTRIBUTE_SPARSE_FILE        =  0x00000200;
-      private const uint FILE_ATTRIBUTE_REPARSE_POINT      =  0x00000400;
-      private const uint FILE_ATTRIBUTE_COMPRESSED         =  0x00000800;
-      private const uint FILE_ATTRIBUTE_OFFLINE            =  0x00001000;
-      private const uint FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000;
-      private const uint FILE_ATTRIBUTE_VIRTUAL            =  0x00010000;
-         
-         //
-      // File creation flags must start at the high end since they
-      // are combined with the attributes
-      //
-
-      public const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;
-      public const uint FILE_FLAG_OVERLAPPED = 0x40000000;
-      public const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
-      public const uint FILE_FLAG_RANDOM_ACCESS = 0x10000000;
-      public const uint FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000;
-      private const uint FILE_FLAG_DELETE_ON_CLOSE = 0x04000000;
-      public const uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000;
-      private const uint FILE_FLAG_POSIX_SEMANTICS = 0x01000000;
-      private const uint FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000;
-      private const uint FILE_FLAG_OPEN_NO_RECALL = 0x00100000;
-      private const uint FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000;
-#pragma warning restore 169
-      // ReSharper restore InconsistentNaming
-      #endregion
-
-      public delegate int CreateFileDelegate(IntPtr rawFilName, uint rawAccessMode, uint rawShare, uint rawCreationDisposition, uint rawFlagsAndAttributes, ref DOKAN_FILE_INFO dokanFileInfo);
-
-      public int CreateFileProxy(IntPtr rawFileName, uint rawAccessMode, uint rawShare, uint rawCreationDisposition, uint rawFlagsAndAttributes, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            Log.Trace("CreateFileProxy IN  rawFileName[{0}], rawAccessMode[{1}], rawShare[{2}], rawCreationDisposition[{3}], rawFlagsAndAttributes[{4}]",
-                        rawFileName, rawAccessMode, rawShare, rawCreationDisposition, rawFlagsAndAttributes);
-            string file = GetFileName(rawFileName);
-
-            DokanFileInfo info = ConvertFileInfo(ref rawFileInfo);
-
-            int ret = operations.CreateFile(file, rawAccessMode, rawShare, rawCreationDisposition, rawFlagsAndAttributes, info);
-
-            rawFileInfo.Context = info.refFileHandleContext;
-            rawFileInfo.IsDirectory = Convert.ToByte(info.IsDirectory);
-
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CreateFileProxy threw:", ex);
-            return Dokan.ERROR_FILE_NOT_FOUND;
-         }
-
-      }
-
-      ////
-
-      public delegate int OpenDirectoryDelegate(IntPtr fileName, ref DOKAN_FILE_INFO fileInfo);
-
-      public int OpenDirectoryProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            DokanFileInfo info = ConvertFileInfo(ref rawFileInfo);
-            int ret = operations.OpenDirectory(file, info);
-            rawFileInfo.Context = info.refFileHandleContext;
-            rawFileInfo.IsDirectory = Convert.ToByte(info.IsDirectory);
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("OpenDirectoryProxy threw:", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int CreateDirectoryDelegate(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int CreateDirectoryProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            DokanFileInfo info = ConvertFileInfo(ref rawFileInfo);
-            int ret = operations.CreateDirectory(file, info);
-            rawFileInfo.Context = info.refFileHandleContext;
-            rawFileInfo.IsDirectory = Convert.ToByte(info.IsDirectory);
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CreateDirectoryProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int CleanupDelegate(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int CleanupProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            int ret = operations.Cleanup(file, ConvertFileInfo(ref rawFileInfo));
-            rawFileInfo.Context = 0;
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CleanupProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int CloseFileDelegate(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int CloseFileProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            int ret = operations.CloseFile(file, ConvertFileInfo(ref rawFileInfo));
-            rawFileInfo.Context = 0;
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("CloseFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int ReadFileDelegate(IntPtr rawFileName, IntPtr rawBuffer, uint rawBufferLength, ref uint rawReadLength, long rawOffset, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int ReadFileProxy(IntPtr rawFileName, IntPtr rawBuffer, uint rawBufferLength, ref uint rawReadLength, long rawOffset, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            // Need to reduce memory footprint from Dokan to .Net !!
-            // http://code.google.com/p/dokan/issues/detail?id=174
-            return operations.ReadFileNative(file, rawBuffer, rawBufferLength, ref rawReadLength, rawOffset, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("ReadFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int WriteFileDelegate(IntPtr rawFileName, IntPtr rawBuffer, uint rawNumberOfBytesToWrite, ref uint rawNumberOfBytesWritten, long rawOffset, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int WriteFileProxy(IntPtr rawFileName, IntPtr rawBuffer, uint rawNumberOfBytesToWrite, ref uint rawNumberOfBytesWritten, long rawOffset, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            // Need to reduce memory footprint from Dokan to .Net !!
-            // http://code.google.com/p/dokan/issues/detail?id=174
-            return operations.WriteFileNative(file, rawBuffer, rawNumberOfBytesToWrite, ref rawNumberOfBytesWritten, rawOffset, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("WriteFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int FlushFileBuffersDelegate(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int FlushFileBuffersProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            int ret = operations.FlushFileBuffers(file, ConvertFileInfo(ref rawFileInfo));
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("FlushFileBuffersProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int GetFileInformationDelegate(IntPtr fileName, ref BY_HANDLE_FILE_INFORMATION handleFileInfo, ref DOKAN_FILE_INFO fileInfo);
-
-      public int GetFileInformationProxy(IntPtr rawFileName, ref BY_HANDLE_FILE_INFORMATION rawHandleFileInformation, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            FileInformation fi = new FileInformation();
-
-            int ret = operations.GetFileInformation(file, ref fi, ConvertFileInfo(ref rawFileInfo));
-
-            if (ret == 0)
-            {
-               rawHandleFileInformation.dwFileAttributes = (uint)fi.Attributes/* + FILE_ATTRIBUTE_VIRTUAL*/;
-
-               rawHandleFileInformation.ftCreationTime.dwHighDateTime = (int)(fi.CreationTime.ToFileTime() >> 32);
-               rawHandleFileInformation.ftCreationTime.dwLowDateTime = (int)(fi.CreationTime.ToFileTime() & 0xffffffff);
-
-               rawHandleFileInformation.ftLastAccessTime.dwHighDateTime = (int)(fi.LastAccessTime.ToFileTime() >> 32);
-               rawHandleFileInformation.ftLastAccessTime.dwLowDateTime = (int)(fi.LastAccessTime.ToFileTime() & 0xffffffff);
-
-               rawHandleFileInformation.ftLastWriteTime.dwHighDateTime = (int)(fi.LastWriteTime.ToFileTime() >> 32);
-               rawHandleFileInformation.ftLastWriteTime.dwLowDateTime = (int)(fi.LastWriteTime.ToFileTime() & 0xffffffff);
-
-               rawHandleFileInformation.dwVolumeSerialNumber = volumeSerialNumber;
-
-               rawHandleFileInformation.nFileSizeLow = (uint)(fi.Length & 0xffffffff);
-               rawHandleFileInformation.nFileSizeHigh = (uint)(fi.Length >> 32);
-               rawHandleFileInformation.dwNumberOfLinks = 1;
-               rawHandleFileInformation.nFileIndexHigh = 0;
-               rawHandleFileInformation.nFileIndexLow = (uint)fi.FileName.GetHashCode();
-            }
-
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("GetFileInformationProxy threw: ", ex);
-            return -1;
-         }
-
-      }
-
-      ////
-
-      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)]
-      struct WIN32_FIND_DATA
-      {
-         public FileAttributes dwFileAttributes;
-         public ComTypes.FILETIME ftCreationTime;
-         public ComTypes.FILETIME ftLastAccessTime;
-         public ComTypes.FILETIME ftLastWriteTime;
-         public uint nFileSizeHigh;
-         public uint nFileSizeLow;
-         private readonly uint dwReserved0;
-         private readonly uint dwReserved1;
-         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
-         public string cFileName;
-         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
-         private readonly string cAlternateFileName;
-      }
-
-      private delegate int FILL_FIND_DATA(ref WIN32_FIND_DATA rawFindData, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public delegate int FindFilesDelegate(IntPtr rawFileName, IntPtr rawFillFindData, // function pointer
-          ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int FindFilesProxy(IntPtr rawFileName, IntPtr rawFillFindData, // function pointer
-          ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            FileInformation[] files;
-            int ret = operations.FindFiles(file, out files, ConvertFileInfo(ref rawFileInfo));
-
-            FILL_FIND_DATA fill = (FILL_FIND_DATA)Marshal.GetDelegateForFunctionPointer(rawFillFindData, typeof(FILL_FIND_DATA));
-
-            if ((ret == 0)
-               && (files != null)
-               )
-            {
-               // ReSharper disable ForCanBeConvertedToForeach
-               // Used a single entry call to speed up the "enumeration" of the list
-               for (int index = 0; index < files.Length; index++)
-               // ReSharper restore ForCanBeConvertedToForeach
-               {
-                  Addto(fill, ref rawFileInfo, files[index]);
-               }
-            }
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("FindFilesProxy threw: ", ex);
-            return -1;
-         }
-
-      }
-
-      public delegate int FindFilesWithPatternDelegate(IntPtr rawFileName, IntPtr rawSearchPattern,
-          IntPtr rawFillFindData, // function pointer
-          ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int FindFilesWithPatternProxy(IntPtr rawFileName, IntPtr rawSearchPattern, IntPtr rawFillFindData, // function pointer
-          ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            string pattern = GetFileName(rawSearchPattern);
-            int ret;
-            FileInformation[] files = null;
-            char[] matchDOS = ("\"<>?").ToCharArray();
-            if (-1 != pattern.IndexOfAny(matchDOS))  // See http://liquesce.codeplex.com/workitem/7556
-            {
-               Log.Info("An Application is using DOS_STAR style pattern matching[{0}], Will switch to compatible mode matching", pattern);
-               // PureSync (And maybe others) use the following to get this and / or the subdir contents
-               // DirName<"*
-               // But there is an issue with the code inside dokan see http://code.google.com/p/dokan/issues/detail?id=192 
-               FileInformation[] nonPatternFiles;
-               ret = operations.FindFiles(file, out nonPatternFiles, ConvertFileInfo(ref rawFileInfo));
-               if (ret == Dokan.DOKAN_SUCCESS)
-               {
-                  List<FileInformation> matchedFiles = new List<FileInformation>();
-                  matchedFiles.AddRange(nonPatternFiles.Where(patternFile => DokanDll.DokanIsNameInExpression(pattern, patternFile.FileName, false)));
-                  files = matchedFiles.ToArray();
-               }
-               // * (asterisk) Matches zero or more characters.
-               // ? (question mark) Matches a single character.
-               // #define DOS_DOT (L'"') -  Matches either a period or zero characters beyond the name string.
-               // #define DOS_QM (L'>') - Matches any single character or, upon encountering a period or end of name string, 
-               // advances the expression to the end of the set of contiguous DOS_QMs.
-               // #define DOS_STAR (L'<') - Matches zero or more characters until encountering and matching the final . in the name. 
-               Log.Debug("DOS_STAR style pattern OUT [found {0}]", (files != null) ? files.Length : 0);
-               if (Log.IsTraceEnabled)
-               {
-                  if (files != null)
-                  {
-                     StringBuilder sb = new StringBuilder();
-                     sb.AppendLine();
-                     for (int index = 0; index < files.Length; index++)
-                     {
-                        FileInformation fileInformation = files[index];
-                        sb.AppendLine(fileInformation.FileName);
-                     }
-                     Log.Trace(sb.ToString());
-                  }
-               }
-            }
-            else
-               ret = operations.FindFilesWithPattern(file, pattern, out files, ConvertFileInfo(ref rawFileInfo));
-
-            FILL_FIND_DATA fill = (FILL_FIND_DATA)Marshal.GetDelegateForFunctionPointer(rawFillFindData, typeof(FILL_FIND_DATA));
-
-            if ((ret == 0)
-               && (files != null)
-               )
-            {
-               // ReSharper disable ForCanBeConvertedToForeach
-               // Used a single entry call to speed up the "enumeration" of the list
-               for (int index = 0; index < files.Length; index++)
-               // ReSharper restore ForCanBeConvertedToForeach
-               {
-                  Addto(fill, ref rawFileInfo, files[index]);
-               }
-            }
-            return ret;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("FindFilesProxy threw: ", ex);
-            return -1;
-         }
-
-      }
-
-      private void Addto(FILL_FIND_DATA fill, ref DOKAN_FILE_INFO rawFileInfo, FileInformation fi)
-      {
-         WIN32_FIND_DATA data = new WIN32_FIND_DATA
-         {
-            dwFileAttributes = fi.Attributes,
-            ftCreationTime =
-            {
-               dwHighDateTime = (int)(fi.CreationTime.ToFileTime() >> 32),
-               dwLowDateTime = (int)(fi.CreationTime.ToFileTime() & 0xffffffff)
-            },
-            ftLastAccessTime =
-            {
-               dwHighDateTime = (int)(fi.LastAccessTime.ToFileTime() >> 32),
-               dwLowDateTime = (int)(fi.LastAccessTime.ToFileTime() & 0xffffffff)
-            },
-            ftLastWriteTime =
-            {
-               dwHighDateTime = (int)(fi.LastWriteTime.ToFileTime() >> 32),
-               dwLowDateTime = (int)(fi.LastWriteTime.ToFileTime() & 0xffffffff)
-            },
-            nFileSizeLow = (uint)(fi.Length & 0xffffffff),
-            nFileSizeHigh = (uint)(fi.Length >> 32),
-            cFileName = fi.FileName
-         };
-         //ZeroMemory(&data, sizeof(WIN32_FIND_DATAW));
-
-         fill(ref data, ref rawFileInfo);
-
-      }
-
-      ////
-
-      public delegate int SetEndOfFileDelegate(IntPtr rawFileName, long rawByteOffset, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int SetEndOfFileProxy(IntPtr rawFileName, long rawByteOffset, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            return operations.SetEndOfFile(file, rawByteOffset, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetEndOfFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-
-      public delegate int SetAllocationSizeDelegate(IntPtr rawFileName, long rawLength, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int SetAllocationSizeProxy(IntPtr rawFileName, long rawLength, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            return operations.SetAllocationSize(file, rawLength, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetAllocationSizeProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-
-      ////
-
-      public delegate int SetFileAttributesDelegate(IntPtr rawFileName, uint rawAttributes, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int SetFileAttributesProxy(IntPtr rawFileName, uint rawAttributes, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            FileAttributes attr = (FileAttributes)rawAttributes;
-            return operations.SetFileAttributes(file, attr, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetFileAttributesProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int SetFileTimeDelegate(IntPtr rawFileName, ref ComTypes.FILETIME rawCreationTime, ref ComTypes.FILETIME rawLastAccessTime,
-         ref ComTypes.FILETIME rawLastWriteTime, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int SetFileTimeProxy(IntPtr rawFileName, ref ComTypes.FILETIME rawCreationTime, ref ComTypes.FILETIME rawLastAccessTime,
-          ref ComTypes.FILETIME rawLastWriteTime, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            // http://liquesce.codeplex.com/workitem/8488
-            return operations.SetFileTimeNative(file, ref rawCreationTime, ref rawLastAccessTime, ref rawLastWriteTime, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetFileTimeProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int DeleteFileDelegate(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int DeleteFileProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-
-            return operations.DeleteFile(file, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("DeleteFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int DeleteDirectoryDelegate(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int DeleteDirectoryProxy(IntPtr rawFileName, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            return operations.DeleteDirectory(file, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("DeleteDirectoryProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int MoveFileDelegate(IntPtr rawFileName, IntPtr rawNewFileName, int rawReplaceIfExisting, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int MoveFileProxy(IntPtr rawFileName, IntPtr rawNewFileName, int rawReplaceIfExisting, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            string newfile = GetFileName(rawNewFileName);
-
-            return operations.MoveFile(file, newfile, (rawReplaceIfExisting != 0), ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("MoveFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int LockFileDelegate(IntPtr rawFileName, long rawByteOffset, long rawLength, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int LockFileProxy(IntPtr rawFileName, long rawByteOffset, long rawLength, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            return operations.LockFile(file, rawByteOffset, rawLength, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("LockFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int UnlockFileDelegate(IntPtr rawFileName, long rawByteOffset, long rawLength, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int UnlockFileProxy(IntPtr rawFileName, long rawByteOffset, long rawLength, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            return operations.UnlockFile(file, rawByteOffset, rawLength, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("UnlockFileProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      ////
-
-      public delegate int GetDiskFreeSpaceDelegate(ref ulong rawFreeBytesAvailable, ref ulong rawTotalNumberOfBytes,
-          ref ulong rawTotalNumberOfFreeBytes, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int GetDiskFreeSpaceProxy(ref ulong rawFreeBytesAvailable, ref ulong rawTotalNumberOfBytes,
-          ref ulong rawTotalNumberOfFreeBytes, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            return operations.GetDiskFreeSpace(ref rawFreeBytesAvailable, ref rawTotalNumberOfBytes,
-                ref rawTotalNumberOfFreeBytes, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("GetDiskFreeSpaceProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      public delegate int GetVolumeInformationDelegate(IntPtr rawVolumeNameBuffer, uint rawVolumeNameSize, ref uint rawVolumeSerialNumber,
-          ref uint rawMaximumComponentLength, ref uint rawFileSystemFlags, IntPtr rawFileSystemNameBuffer, uint rawFileSystemNameSize, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int GetVolumeInformationProxy(IntPtr rawVolumeNameBuffer, uint rawVolumeNameSize, ref uint rawVolumeSerialNumber,
-          ref uint rawMaximumComponentLength, ref uint rawFileSystemFlags, IntPtr rawFileSystemNameBuffer, uint rawFileSystemNameSize, ref DOKAN_FILE_INFO fileInfo)
-      {
-         try
-         {
-            byte[] volume = Encoding.Unicode.GetBytes(options.VolumeLabel);
-            int length = volume.Length;
-            byte[] volumeNull = new byte[length + 2];
-            Array.Copy(volume, volumeNull, length);
-            Marshal.Copy(volumeNull, 0, rawVolumeNameBuffer, Math.Min((int)rawVolumeNameSize, length + 2));
-            rawVolumeSerialNumber = volumeSerialNumber;
-            rawMaximumComponentLength = 256;
-
-            //#define FILE_CASE_SENSITIVE_SEARCH      0x00000001  
-            //#define FILE_CASE_PRESERVED_NAMES       0x00000002  
-            //#define FILE_UNICODE_ON_DISK            0x00000004  
-            //#define FILE_PERSISTENT_ACLS            0x00000008  // This sends the data to the Recycler and not Recycled
-            // See http://msdn.microsoft.com/en-us/library/aa364993%28VS.85%29.aspx for more flags
-            //
-            // FILE_FILE_COMPRESSION      0x00000010     // Don't do this.. It causes lot's of problems later on
-            // And the Dokan code does not support it
-            //case FileStreamInformation:
-            //            //DbgPrint("FileStreamInformation\n");
-            //            status = STATUS_NOT_IMPLEMENTED;
-            //            break;
-            rawFileSystemFlags = 0x0f;
-
-            byte[] sys = Encoding.Unicode.GetBytes("DOKAN");
-            length = sys.Length;
-            byte[] sysNull = new byte[length + 2];
-            Array.Copy(sys, sysNull, length);
-
-            Marshal.Copy(sysNull, 0, rawFileSystemNameBuffer, Math.Min((int)rawFileSystemNameSize, length + 2));
-            return 0;
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("GetVolumeInformationProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-
-      public delegate int UnmountDelegate(ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int UnmountProxy(ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            return operations.Unmount(ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("UnmountProxy threw: ", ex);
-            return -1;
-         }
-      }
-
-      public delegate int GetFileSecurityDelegate( IntPtr rawFileName, ref SECURITY_INFORMATION rawRequestedInformation,
-          ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, ref uint rawSecurityDescriptorLengthNeeded,
-          ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int GetFileSecurity( IntPtr rawFileName, ref SECURITY_INFORMATION rawRequestedInformation,
-          ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, ref uint rawSecurityDescriptorLengthNeeded,
-          ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            return operations.GetFileSecurityNative(file, ref rawRequestedInformation, ref rawSecurityDescriptor, rawSecurityDescriptorLength, ref rawSecurityDescriptorLengthNeeded, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("GetFileSecurity threw: ", ex);
-            return -1;
-         }
-      }
-
-      public delegate int SetFileSecurityDelegate( IntPtr rawFileName, ref SECURITY_INFORMATION rawSecurityInformation,
-          ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, ref DOKAN_FILE_INFO rawFileInfo);
-
-      public int SetFileSecurity( IntPtr rawFileName, ref SECURITY_INFORMATION rawSecurityInformation,
-          ref SECURITY_DESCRIPTOR rawSecurityDescriptor, uint rawSecurityDescriptorLength, ref DOKAN_FILE_INFO rawFileInfo)
-      {
-         try
-         {
-            string file = GetFileName(rawFileName);
-            return operations.SetFileSecurityNative(file, ref rawSecurityInformation, ref rawSecurityDescriptor, rawSecurityDescriptorLength, ConvertFileInfo(ref rawFileInfo));
-         }
-         catch (Exception ex)
-         {
-            Log.ErrorException("SetFileSecurity threw: ", ex);
-            return -1;
-         }
-      }
-   }
-}
diff --git a/ThirdParty/NLog.dll b/ThirdParty/NLog.dll
index 039a9f6..92952ef 100644
Binary files a/ThirdParty/NLog.dll and b/ThirdParty/NLog.dll differ
diff --git a/ThirdParty/dokan.dll b/ThirdParty/dokan.dll
deleted file mode 100644
index 67aaefd..0000000
Binary files a/ThirdParty/dokan.dll and /dev/null differ