[mapguide-commits] r5481 - in sandbox/maestro-3.0: . ExtendedModels ExtendedModels/LayerDefinition-1.1.0 ExtendedModels/LayerDefinition-1.2.0 ExtendedModels/LayerDefinition-1.3.0 ExtendedModels/LoadProcedure-1.1.0 ExtendedModels/LoadProcedure-2.2.0 ExtendedModels/Properties ExtendedModels/SymbolDefinition-1.1.0 ExtendedModels/WebLayout-1.1.0 Maestro Maestro.Base/Editor Maestro.Base/UI Maestro.Editors Maestro.Editors/Common Maestro.Editors/FeatureSource Maestro.Editors/FeatureSource/Extensions Maestro.Editors/FeatureSource/Preview Maestro.Editors/LayerDefinition Maestro.Editors/LayerDefinition/Vector Maestro.Editors/LayerDefinition/Vector/StyleEditors Maestro.Editors/LayerDefinition/Vector/Thematics Maestro.Editors/MapDefinition Maestro.Editors/Properties Maestro.Editors/WebLayout/Commands MaestroAPITests MaestroBaseTests OSGeo.MapGuide.MaestroAPI OSGeo.MapGuide.MaestroAPI/Commands OSGeo.MapGuide.MaestroAPI/CoordinateSystem OSGeo.MapGuide.MaestroAPI/Expression OSGeo.MapGuide.MaestroAPI/ Feature OSGeo.MapGuide.MaestroAPI/ObjectModels OSGeo.MapGuide.MaestroAPI/Properties OSGeo.MapGuide.MaestroAPI/Resource/Validation OSGeo.MapGuide.MaestroAPI/Schema OSGeo.MapGuide.MaestroAPI/SchemaOverrides OSGeo.MapGuide.MaestroAPI/Services OSGeo.MapGuide.MaestroAPI.Http OSGeo.MapGuide.MaestroAPI.Http/Properties OSGeo.MapGuide.MaestroAPI.Native OSGeo.MapGuide.MaestroAPI.Native/Properties Properties TestData

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Tue Dec 21 23:40:34 EST 2010


Author: jng
Date: 2010-12-21 20:40:33 -0800 (Tue, 21 Dec 2010)
New Revision: 5481

Added:
   sandbox/maestro-3.0/ExtendedModels/Properties/
   sandbox/maestro-3.0/ExtendedModels/Properties/explanation.txt
   sandbox/maestro-3.0/ExtendedModels/Properties/maestroapi.key
   sandbox/maestro-3.0/MaestroAPITests/ConfigurationTests.cs
   sandbox/maestro-3.0/MaestroAPITests/SchemaTests.cs
   sandbox/maestro-3.0/MaestroAPITests/UserTestData/
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlRecord.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSchema.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSourceDescription.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/IFdoSerializable.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/RasterPropertyDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/XmlNamespaces.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GdalConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GenericConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterConfigurationDocument.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterFileItem.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterItem.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterWmsItem.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/WmsConfigurationDocument.cs
   sandbox/maestro-3.0/Properties/SignedAssemblyInfo.cs
   sandbox/maestro-3.0/TestData/
   sandbox/maestro-3.0/TestData/gen_default1_MySql_master.xml
   sandbox/maestro-3.0/TestData/gen_default1_Oracle_master.xml
   sandbox/maestro-3.0/TestData/gen_default1_SQLServerSpatial_master.xml
   sandbox/maestro-3.0/TestData/gen_default1_SqlServer2005_master.xml
   sandbox/maestro-3.0/TestData/gen_default1_SqlServer2008_master.xml
   sandbox/maestro-3.0/TestData/gen_default1_SqlServer_master.xml
Removed:
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlAggregateSetReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureSetReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureSetReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClassDefinition.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSetReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSourceDescription.cs
Modified:
   sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.1.0.csproj
   sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.2.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.2.0.csproj
   sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.3.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.3.0.csproj
   sandbox/maestro-3.0/ExtendedModels/LoadProcedure-1.1.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-1.1.0.csproj
   sandbox/maestro-3.0/ExtendedModels/LoadProcedure-2.2.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-2.2.0.csproj
   sandbox/maestro-3.0/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj
   sandbox/maestro-3.0/ExtendedModels/WebLayout-1.1.0/OSGeo.MapGuide.ObjectModels.WebLayout-1.1.0.csproj
   sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx
   sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.designer.cs
   sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.resx
   sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/Common/ResourcePicker.resx
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/CalculationSettings.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/ExtendedClassSettings.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/JoinSettings.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/SelectJoinKeyDialog.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/ExtensionsCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/IQueryControl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/LocalFeatureSourcePreviewCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/PreviewPane.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/SqlQueryCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/StandardQueryCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/LayerPropertiesSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/AreaFeatureStyleEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/FontStyleEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/LineFeatureStyleEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/PointFeatureStyleEditor.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
   sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
   sandbox/maestro-3.0/Maestro.Editors/WebLayout/Commands/SearchCmdCtrl.cs
   sandbox/maestro-3.0/Maestro/changelog.txt
   sandbox/maestro-3.0/MaestroAPITests/ExpressionTests.cs
   sandbox/maestro-3.0/MaestroAPITests/FeatureReaderTests.cs
   sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj
   sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs
   sandbox/maestro-3.0/MaestroAPITests/ValidationTests.cs
   sandbox/maestro-3.0/MaestroBaseTests/MaestroBaseTests.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCoordinateSystemCatalog.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/Properties/AssemblyInfo.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/CoordinateSystem/ActualCoordinateSystem.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionEngine.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Platform.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Properties/AssemblyInfo.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseLayerDefinitionValidator.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
   sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs
Log:
This big and potentially destructive submission contains the following changes:
 - #1574: Rewrite MaestroAPI schema classes. These classes are now modelled on the corresponding FDO and MapGuide versions.
 - Add some sample schemas to test schema/class XML serialization
 - Throw out the existing reader classes and interfaces and replace them with a set of classes and interfaces that are modelled on the corresponding FDO and MapGuide ones
 - #1495: Add a set of purely managed schema override APIs. This is modelled on the proposed MapGuide RFC30 APIs, covering basic override scenarios. Unit tests included for testing persistence.
 - Fix a whole lot of breakage as a result of replacing these classes.
 - Add unit tests to verify these new classes
 - Make Validation results dialog freely resizeable
 - Fix extents not auto-updating in Map Definition Editor due to recent databinding changes.
 - Resource Properties dialog fixes
  - Fix non-functional fields and buttons in WFS/WMS tabs 
  - Remove the first time lag (somewhat) in the WFS tab by using the Coordinate System Picker to set EPSG codes. Thus the only lag is the normal first time loading of the Coordinate System Picker
 - Fix small databinding problem with GenericItemSelectionDialog
 - Search Command Editor: Add prompt to specify layer if attempting to set filter without a layer being set.
 - Sign all relevant projects using our maestroapi.key file
 - Add some new stub command types

Modified: sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.1.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.1.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.1.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.LayerDefinition-1.1.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -52,6 +55,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="LayerDefinitionValidator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">

Modified: sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.2.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.2.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.2.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.2.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.2.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.2.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.LayerDefinition-1.2.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -52,6 +55,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="LayerDefinitionValidator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">

Modified: sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.3.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.3.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.3.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.3.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/LayerDefinition-1.3.0/OSGeo.MapGuide.ObjectModels.LayerDefinition-1.3.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.LayerDefinition-1.3.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -52,6 +55,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="LayerDefinitionValidator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">

Modified: sandbox/maestro-3.0/ExtendedModels/LoadProcedure-1.1.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-1.1.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/LoadProcedure-1.1.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-1.1.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/LoadProcedure-1.1.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-1.1.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.LoadProcedure-1.1.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -48,6 +51,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="LoadProcedureValidator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>

Modified: sandbox/maestro-3.0/ExtendedModels/LoadProcedure-2.2.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-2.2.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/LoadProcedure-2.2.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-2.2.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/LoadProcedure-2.2.0/OSGeo.MapGuide.ObjectModels.LoadProcedure-2.2.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.LoadProcedure-2.2.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -48,6 +51,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="LoadProcedureValidator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>

Added: sandbox/maestro-3.0/ExtendedModels/Properties/explanation.txt
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/Properties/explanation.txt	                        (rev 0)
+++ sandbox/maestro-3.0/ExtendedModels/Properties/explanation.txt	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1 @@
+This is satisfy the relative path of SignedAssemblyInfo.cs
\ No newline at end of file

Added: sandbox/maestro-3.0/ExtendedModels/Properties/maestroapi.key
===================================================================
(Binary files differ)


Property changes on: sandbox/maestro-3.0/ExtendedModels/Properties/maestroapi.key
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: sandbox/maestro-3.0/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/SymbolDefinition-1.1.0/OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.SymbolDefinition-1.1.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -42,6 +45,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>

Modified: sandbox/maestro-3.0/ExtendedModels/WebLayout-1.1.0/OSGeo.MapGuide.ObjectModels.WebLayout-1.1.0.csproj
===================================================================
--- sandbox/maestro-3.0/ExtendedModels/WebLayout-1.1.0/OSGeo.MapGuide.ObjectModels.WebLayout-1.1.0.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/ExtendedModels/WebLayout-1.1.0/OSGeo.MapGuide.ObjectModels.WebLayout-1.1.0.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.ObjectModels.WebLayout-1.1.0</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -45,6 +48,9 @@
     <Compile Include="..\..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="WebLayout2Impl.cs" />
     <Compile Include="WebLayoutValidator.cs" />

Modified: sandbox/maestro-3.0/Maestro/changelog.txt
===================================================================
--- sandbox/maestro-3.0/Maestro/changelog.txt	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro/changelog.txt	2010-12-22 04:40:33 UTC (rev 5481)
@@ -8,6 +8,7 @@
  - Fix layer up/down drag/drop reordering in Map Definition editor
  - Fix Coodinate System not being set in SHP load procedure editor
  - Fix feature source extension nodes not being deleted on remove
+ - Improve validation performance by skipping already validated resources and caching commonly accessed objects.
  - More fusion editor progress:
     - Drag/drop map support
     - Remaining missing functionality:

Modified: sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Base/Editor/ResourceEditorService.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -30,6 +30,7 @@
 using System.IO;
 using Maestro.Editors.Common;
 using Maestro.Base.UI;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Base.Editor
 {
@@ -54,7 +55,7 @@
 
         public event EventHandler DirtyStateChanged;
 
-        public string EditExpression(string currentExpr, OSGeo.MapGuide.MaestroAPI.ClassDefinition schema, string providerName, string featureSourceId)
+        public string EditExpression(string currentExpr, ClassDefinition schema, string providerName, string featureSourceId)
         {
             var ed = new ExpressionEditor();
             var caps = this.FeatureService.GetProviderCapabilities(providerName);

Modified: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.Designer.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -30,9 +30,9 @@
         {
             this.components = new System.ComponentModel.Container();
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourcePropertiesDialog));
-            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
-            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
-            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle();
             this.tabControl1 = new System.Windows.Forms.TabControl();
             this.SecurityTab = new System.Windows.Forms.TabPage();
             this.UseInherited = new System.Windows.Forms.CheckBox();
@@ -62,15 +62,17 @@
             this.WFSTab = new System.Windows.Forms.TabPage();
             this.WFSClearHeaderButton = new System.Windows.Forms.Button();
             this.groupBox4 = new System.Windows.Forms.GroupBox();
+            this.btnOtherSRS = new System.Windows.Forms.Button();
+            this.btnPrimarySRS = new System.Windows.Forms.Button();
+            this.txtOtherSRS = new System.Windows.Forms.TextBox();
+            this.txtPrimarySRS = new System.Windows.Forms.TextBox();
             this.AutoGenerateWFSBounds = new System.Windows.Forms.Button();
-            this.WFSOtherSRS = new System.Windows.Forms.ComboBox();
-            this.WFSPrimarySRS = new System.Windows.Forms.ComboBox();
             this.label12 = new System.Windows.Forms.Label();
             this.label11 = new System.Windows.Forms.Label();
             this.EditWFSBounds = new System.Windows.Forms.Button();
             this.WFSBounds = new System.Windows.Forms.TextBox();
             this.label10 = new System.Windows.Forms.Label();
-            this.WFSAvalible = new System.Windows.Forms.CheckBox();
+            this.WFSAvailable = new System.Windows.Forms.CheckBox();
             this.groupBox3 = new System.Windows.Forms.GroupBox();
             this.WFSMetadata = new System.Windows.Forms.TextBox();
             this.WFSAbstract = new System.Windows.Forms.TextBox();
@@ -192,6 +194,7 @@
             resources.ApplyResources(this.WMSClearHeaderButton, "WMSClearHeaderButton");
             this.WMSClearHeaderButton.Name = "WMSClearHeaderButton";
             this.WMSClearHeaderButton.UseVisualStyleBackColor = true;
+            this.WMSClearHeaderButton.Click += new System.EventHandler(this.ClearHeaderButton_Click);
             // 
             // groupBox2
             // 
@@ -211,12 +214,14 @@
             resources.ApplyResources(this.AutoGenerateWMSBounds, "AutoGenerateWMSBounds");
             this.AutoGenerateWMSBounds.Name = "AutoGenerateWMSBounds";
             this.AutoGenerateWMSBounds.UseVisualStyleBackColor = true;
+            this.AutoGenerateWMSBounds.Click += new System.EventHandler(this.AutoGenerateWMSBounds_Click);
             // 
             // EditWMSBounds
             // 
             resources.ApplyResources(this.EditWMSBounds, "EditWMSBounds");
             this.EditWMSBounds.Name = "EditWMSBounds";
             this.EditWMSBounds.UseVisualStyleBackColor = true;
+            this.EditWMSBounds.Click += new System.EventHandler(this.EditWMSBounds_Click);
             // 
             // WMSBounds
             // 
@@ -327,37 +332,55 @@
             // groupBox4
             // 
             resources.ApplyResources(this.groupBox4, "groupBox4");
+            this.groupBox4.Controls.Add(this.btnOtherSRS);
+            this.groupBox4.Controls.Add(this.btnPrimarySRS);
+            this.groupBox4.Controls.Add(this.txtOtherSRS);
+            this.groupBox4.Controls.Add(this.txtPrimarySRS);
             this.groupBox4.Controls.Add(this.AutoGenerateWFSBounds);
-            this.groupBox4.Controls.Add(this.WFSOtherSRS);
-            this.groupBox4.Controls.Add(this.WFSPrimarySRS);
             this.groupBox4.Controls.Add(this.label12);
             this.groupBox4.Controls.Add(this.label11);
             this.groupBox4.Controls.Add(this.EditWFSBounds);
             this.groupBox4.Controls.Add(this.WFSBounds);
             this.groupBox4.Controls.Add(this.label10);
-            this.groupBox4.Controls.Add(this.WFSAvalible);
+            this.groupBox4.Controls.Add(this.WFSAvailable);
             this.groupBox4.Name = "groupBox4";
             this.groupBox4.TabStop = false;
             // 
+            // btnOtherSRS
+            // 
+            resources.ApplyResources(this.btnOtherSRS, "btnOtherSRS");
+            this.btnOtherSRS.Name = "btnOtherSRS";
+            this.btnOtherSRS.UseVisualStyleBackColor = true;
+            this.btnOtherSRS.Click += new System.EventHandler(this.btnOtherSRS_Click);
+            // 
+            // btnPrimarySRS
+            // 
+            resources.ApplyResources(this.btnPrimarySRS, "btnPrimarySRS");
+            this.btnPrimarySRS.Name = "btnPrimarySRS";
+            this.btnPrimarySRS.UseVisualStyleBackColor = true;
+            this.btnPrimarySRS.Click += new System.EventHandler(this.btnPrimarySRS_Click);
+            // 
+            // txtOtherSRS
+            // 
+            resources.ApplyResources(this.txtOtherSRS, "txtOtherSRS");
+            this.txtOtherSRS.Name = "txtOtherSRS";
+            this.txtOtherSRS.ReadOnly = true;
+            this.txtOtherSRS.TextChanged += new System.EventHandler(this.WFSOtherSRS_TextChanged);
+            // 
+            // txtPrimarySRS
+            // 
+            resources.ApplyResources(this.txtPrimarySRS, "txtPrimarySRS");
+            this.txtPrimarySRS.Name = "txtPrimarySRS";
+            this.txtPrimarySRS.ReadOnly = true;
+            this.txtPrimarySRS.TextChanged += new System.EventHandler(this.WFSPrimarySRS_TextChanged);
+            // 
             // AutoGenerateWFSBounds
             // 
             resources.ApplyResources(this.AutoGenerateWFSBounds, "AutoGenerateWFSBounds");
             this.AutoGenerateWFSBounds.Name = "AutoGenerateWFSBounds";
             this.AutoGenerateWFSBounds.UseVisualStyleBackColor = true;
+            this.AutoGenerateWFSBounds.Click += new System.EventHandler(this.AutoGenerateWFSBounds_Click);
             // 
-            // WFSOtherSRS
-            // 
-            this.WFSOtherSRS.FormattingEnabled = true;
-            resources.ApplyResources(this.WFSOtherSRS, "WFSOtherSRS");
-            this.WFSOtherSRS.Name = "WFSOtherSRS";
-            this.WFSOtherSRS.TextChanged += new System.EventHandler(this.WFSOtherSRS_TextChanged);
-            // 
-            // WFSPrimarySRS
-            // 
-            this.WFSPrimarySRS.FormattingEnabled = true;
-            resources.ApplyResources(this.WFSPrimarySRS, "WFSPrimarySRS");
-            this.WFSPrimarySRS.Name = "WFSPrimarySRS";
-            // 
             // label12
             // 
             resources.ApplyResources(this.label12, "label12");
@@ -373,6 +396,7 @@
             resources.ApplyResources(this.EditWFSBounds, "EditWFSBounds");
             this.EditWFSBounds.Name = "EditWFSBounds";
             this.EditWFSBounds.UseVisualStyleBackColor = true;
+            this.EditWFSBounds.Click += new System.EventHandler(this.EditWFSBounds_Click);
             // 
             // WFSBounds
             // 
@@ -385,11 +409,12 @@
             resources.ApplyResources(this.label10, "label10");
             this.label10.Name = "label10";
             // 
-            // WFSAvalible
+            // WFSAvailable
             // 
-            resources.ApplyResources(this.WFSAvalible, "WFSAvalible");
-            this.WFSAvalible.Name = "WFSAvalible";
-            this.WFSAvalible.UseVisualStyleBackColor = true;
+            resources.ApplyResources(this.WFSAvailable, "WFSAvailable");
+            this.WFSAvailable.Name = "WFSAvailable";
+            this.WFSAvailable.UseVisualStyleBackColor = true;
+            this.WFSAvailable.CheckedChanged += new System.EventHandler(this.WFSAvailable_CheckedChanged);
             // 
             // groupBox3
             // 
@@ -409,21 +434,25 @@
             // 
             resources.ApplyResources(this.WFSMetadata, "WFSMetadata");
             this.WFSMetadata.Name = "WFSMetadata";
+            this.WFSMetadata.TextChanged += new System.EventHandler(this.WFSMetadata_TextChanged);
             // 
             // WFSAbstract
             // 
             resources.ApplyResources(this.WFSAbstract, "WFSAbstract");
             this.WFSAbstract.Name = "WFSAbstract";
+            this.WFSAbstract.TextChanged += new System.EventHandler(this.WFSAbstract_TextChanged);
             // 
             // WFSKeywords
             // 
             resources.ApplyResources(this.WFSKeywords, "WFSKeywords");
             this.WFSKeywords.Name = "WFSKeywords";
+            this.WFSKeywords.TextChanged += new System.EventHandler(this.WFSKeywords_TextChanged);
             // 
             // WFSTitle
             // 
             resources.ApplyResources(this.WFSTitle, "WFSTitle");
             this.WFSTitle.Name = "WFSTitle";
+            this.WFSTitle.TextChanged += new System.EventHandler(this.WFSTitle_TextChanged);
             // 
             // label6
             // 
@@ -463,35 +492,35 @@
             // dataGridView1
             // 
             resources.ApplyResources(this.dataGridView1, "dataGridView1");
-            dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
-            dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
-            dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
-            dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
-            dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
-            dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
-            this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
+            dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
+            dataGridViewCellStyle7.BackColor = System.Drawing.SystemColors.Control;
+            dataGridViewCellStyle7.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            dataGridViewCellStyle7.ForeColor = System.Drawing.SystemColors.WindowText;
+            dataGridViewCellStyle7.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+            dataGridViewCellStyle7.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+            dataGridViewCellStyle7.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
+            this.dataGridView1.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle7;
             this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
             this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
             this.ItemKey,
             this.ItemValue});
-            dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
-            dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
-            dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
-            dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
-            dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
-            dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
-            this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle2;
+            dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
+            dataGridViewCellStyle8.BackColor = System.Drawing.SystemColors.Window;
+            dataGridViewCellStyle8.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            dataGridViewCellStyle8.ForeColor = System.Drawing.SystemColors.ControlText;
+            dataGridViewCellStyle8.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+            dataGridViewCellStyle8.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+            dataGridViewCellStyle8.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
+            this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle8;
             this.dataGridView1.Name = "dataGridView1";
-            dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
-            dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Control;
-            dataGridViewCellStyle3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.WindowText;
-            dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight;
-            dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
-            dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
-            this.dataGridView1.RowHeadersDefaultCellStyle = dataGridViewCellStyle3;
+            dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
+            dataGridViewCellStyle9.BackColor = System.Drawing.SystemColors.Control;
+            dataGridViewCellStyle9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            dataGridViewCellStyle9.ForeColor = System.Drawing.SystemColors.WindowText;
+            dataGridViewCellStyle9.SelectionBackColor = System.Drawing.SystemColors.Highlight;
+            dataGridViewCellStyle9.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
+            dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
+            this.dataGridView1.RowHeadersDefaultCellStyle = dataGridViewCellStyle9;
             this.dataGridView1.Leave += new System.EventHandler(this.dataGridView1_Leave);
             // 
             // ItemKey
@@ -723,14 +752,12 @@
         private System.Windows.Forms.Button WFSClearHeaderButton;
         private System.Windows.Forms.GroupBox groupBox4;
         private System.Windows.Forms.Button AutoGenerateWFSBounds;
-        private System.Windows.Forms.ComboBox WFSOtherSRS;
-        private System.Windows.Forms.ComboBox WFSPrimarySRS;
         private System.Windows.Forms.Label label12;
         private System.Windows.Forms.Label label11;
         private System.Windows.Forms.Button EditWFSBounds;
         private System.Windows.Forms.TextBox WFSBounds;
         private System.Windows.Forms.Label label10;
-        private System.Windows.Forms.CheckBox WFSAvalible;
+        private System.Windows.Forms.CheckBox WFSAvailable;
         private System.Windows.Forms.GroupBox groupBox3;
         private System.Windows.Forms.TextBox WFSMetadata;
         private System.Windows.Forms.TextBox WFSAbstract;
@@ -766,5 +793,9 @@
         private System.Windows.Forms.ToolStripMenuItem denyAccessToolStripMenuItem;
         private System.Windows.Forms.ToolStripMenuItem inheritedAccessRightsToolStripMenuItem;
         private System.Windows.Forms.ToolTip toolTip;
+        private System.Windows.Forms.Button btnOtherSRS;
+        private System.Windows.Forms.Button btnPrimarySRS;
+        private System.Windows.Forms.TextBox txtOtherSRS;
+        private System.Windows.Forms.TextBox txtPrimarySRS;
     }
 }
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -34,6 +34,8 @@
 using OSGeo.MapGuide.ObjectModels.Common;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using Maestro.Editors.Common;
 
 namespace Maestro.Base.UI
 {
@@ -198,9 +200,9 @@
                     WFSAbstract.Text = props["_Abstract"];
                     WFSMetadata.Text = props["_ExtendedMetadata"];
 
-                    WFSPrimarySRS.Text = props["_PrimarySRS"];
-                    WFSOtherSRS.Text = props["_OtherSRS"];
-                    WFSAvalible.Checked = props["_IsPublished"] == "1";
+                    txtPrimarySRS.Text = props["_PrimarySRS"];
+                    txtOtherSRS.Text = props["_OtherSRS"];
+                    WFSAvailable.Checked = props["_IsPublished"] == "1";
                     WFSBounds.Text = props["_Bounds"];
                 }
                 else
@@ -210,10 +212,10 @@
                     WFSAbstract.Text =
                     WFSMetadata.Text = "";
 
-                    WFSPrimarySRS.Text =
-                    WFSOtherSRS.Text =
+                    txtPrimarySRS.Text =
+                    txtOtherSRS.Text =
                     WFSBounds.Text = "";
-                    WFSAvalible.Checked = false;
+                    WFSAvailable.Checked = false;
                 }
             }
             finally
@@ -337,9 +339,10 @@
         {
             if (m_resourceHeader != null)
             {
+                if (m_resourceHeader.Metadata == null)
+                    m_resourceHeader.Metadata = ObjectFactory.CreateMetadata();
+
                 /*
-                if (m_resourceHeader.Metadata == null)
-                    m_resourceHeader.Metadata = new ResourceDocumentHeaderTypeMetadata();
                 if (m_resourceHeader.Metadata.Simple == null)
                     m_resourceHeader.Metadata.Simple = new ResourceDocumentHeaderTypeMetadataSimple();
                 if (m_resourceHeader.Metadata.Simple.Property == null)
@@ -348,9 +351,6 @@
 
                 if (m_resourceId.Extension == "LayerDefinition")
                 {
-                    if (m_resourceHeader.Metadata == null)
-                        m_resourceHeader.Metadata = ObjectFactory.CreateMetadata();
-
                     var props = m_resourceHeader.Metadata.GetProperties();
                     bool apply = false;
 
@@ -472,7 +472,6 @@
                 UpdateWMSDisplay();
             else if (tabControl1.SelectedTab == WFSTab)
             {
-                FillCoordSysLists();
                 UpdateWFSDisplay();
             }
             else if (tabControl1.SelectedTab == ReferenceTab)
@@ -485,46 +484,6 @@
             }
         }
 
-        private void FillCoordSysLists()
-        {
-            if (WFSPrimarySRS.Items.Count == 0)
-            {
-                try
-                {
-                    List<string> items = new List<string>();
-                    foreach (OSGeo.MapGuide.MaestroAPI.CoordinateSystem.CoordinateSystemDefinitionBase c in m_connection.CoordinateSystemCatalog.Coordsys)
-                    {
-                        if (c.Code.StartsWith("EPSG:"))
-                            items.Add(c.Code);
-                    }
-
-                    m_srslist = items.ToArray();
-                    try
-                    {
-                        WFSPrimarySRS.BeginUpdate();
-                        WFSPrimarySRS.Items.AddRange(m_srslist);
-                    }
-                    finally
-                    {
-                        WFSPrimarySRS.EndUpdate();
-                    }
-
-                    try
-                    {
-                        WFSOtherSRS.BeginUpdate();
-                        WFSOtherSRS.Items.AddRange(m_srslist);
-                    }
-                    finally
-                    {
-                        WFSOtherSRS.EndUpdate();
-                    }
-                }
-                catch
-                {
-                }
-            }
-        }
-
         private void WFSTitle_TextChanged(object sender, EventArgs e)
         {
             if (m_isUpdating)
@@ -557,12 +516,12 @@
             m_resourceHeader.Metadata.SetProperty("_ExtendedMetadata", WFSMetadata.Text);
         }
 
-        private void checkBox3_CheckedChanged(object sender, EventArgs e)
+        private void WFSAvailable_CheckedChanged(object sender, EventArgs e)
         {
             if (m_isUpdating)
                 return;
             EnsureMetaData();
-            m_resourceHeader.Metadata.SetProperty("_IsPublished", Convert.ToInt32(WFSAvalible.Checked).ToString());
+            m_resourceHeader.Metadata.SetProperty("_IsPublished", Convert.ToInt32(WFSAvailable.Checked).ToString());
         }
 
         private void WFSPrimarySRS_TextChanged(object sender, EventArgs e)
@@ -570,7 +529,7 @@
             if (m_isUpdating)
                 return;
             EnsureMetaData();
-            m_resourceHeader.Metadata.SetProperty("_PrimarySRS", WFSPrimarySRS.Text);
+            m_resourceHeader.Metadata.SetProperty("_PrimarySRS", txtPrimarySRS.Text);
         }
 
         private void WFSOtherSRS_TextChanged(object sender, EventArgs e)
@@ -578,7 +537,7 @@
             if (m_isUpdating)
                 return;
             EnsureMetaData();
-            m_resourceHeader.Metadata.SetProperty("_OtherSRS", WFSOtherSRS.Text);
+            m_resourceHeader.Metadata.SetProperty("_OtherSRS", txtOtherSRS.Text);
         }
 
         private void WFSBounds_TextChanged(object sender, EventArgs e)
@@ -803,6 +762,7 @@
         {
             try
             {
+                m_isUpdating = true;
                 string srs = "EPSG:????";
                 string bounds = WMSBounds.Text;
                 bool warnedEPSG = false;
@@ -843,6 +803,7 @@
                 bounds += " SRS=\"" + srs + "\"";
                 bounds += " />";
 
+                m_isUpdating = false;
                 WMSBounds.Text = bounds;
 
                 if ((srs == "" || srs == "EPSG:????") && !warnedEPSG)
@@ -859,22 +820,28 @@
                 string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
                 MessageBox.Show(this, string.Format(Properties.Resources.ResProp_WMSBoundsReadError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
+            finally
+            {
+                m_isUpdating = false;
+            }
         }
 
         private void AutoGenerateWFSBounds_Click(object sender, EventArgs e)
         {
             try
             {
+                m_isUpdating = true;
                 System.Globalization.CultureInfo ic = System.Globalization.CultureInfo.InvariantCulture;
                 IFeatureSource fs = (IFeatureSource)m_connection.ResourceService.GetResource(m_resourceId);
                 bool failures = false;
 
                 IEnvelope env = null;
-                foreach (ClassDefinition scm in fs.Describe().Classes)
+                foreach (ClassDefinition scm in fs.Describe().AllClasses)
                 {
-                    foreach (FeatureSetColumn col in scm.Columns)
+                    foreach (var col in scm.Properties)
                     {
-                        if (col.Type == Utility.GeometryType || col.Type == Utility.RasterType)
+                        if (col.Type == OSGeo.MapGuide.MaestroAPI.Schema.PropertyDefinitionType.Geometry ||
+                            col.Type == OSGeo.MapGuide.MaestroAPI.Schema.PropertyDefinitionType.Raster)
                         {
                             try
                             {
@@ -895,6 +862,7 @@
                 if (env == null)
                     throw new Exception(failures ? Properties.Resources.ResProp_NoSpatialDataWithFailuresError : Properties.Resources.ResProp_NoSpatialDataError);
 
+                m_isUpdating = false;
                 WFSBounds.Text = "<Bounds west=\"" + env.MinX.ToString(ic) + "\" east=\"" + env.MaxX.ToString(ic) + "\" south=\"" + env.MinY.ToString(ic) + "\" north=\"" + env.MaxY.ToString(ic) + "\" />";
             }
             catch (Exception ex)
@@ -902,6 +870,10 @@
                 string msg = NestedExceptionMessageProcessor.GetFullMessage(ex);
                 MessageBox.Show(this, string.Format(Properties.Resources.ResProp_WFSBoundsReadError, msg), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
+            finally
+            {
+                m_isUpdating = false;
+            }
         }
 
         private void ReferenceWorker_DoWork(object sender, DoWorkEventArgs e)
@@ -1013,5 +985,35 @@
                 }
             }
         }
+
+        private void btnPrimarySRS_Click(object sender, EventArgs e)
+        {
+            using (var picker = new CoordinateSystemPicker(m_connection.CoordinateSystemCatalog))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    var cs = picker.SelectedCoordSys;
+                    if (!string.IsNullOrEmpty(cs.EPSG))
+                    {
+                        txtPrimarySRS.Text = cs.EPSG;
+                    }
+                }
+            }
+        }
+
+        private void btnOtherSRS_Click(object sender, EventArgs e)
+        {
+            using (var picker = new CoordinateSystemPicker(m_connection.CoordinateSystemCatalog))
+            {
+                if (picker.ShowDialog() == DialogResult.OK)
+                {
+                    var cs = picker.SelectedCoordSys;
+                    if (!string.IsNullOrEmpty(cs.EPSG))
+                    {
+                        txtOtherSRS.Text = cs.EPSG;
+                    }
+                }
+            }
+        }
     }
 }

Modified: sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ResourcePropertiesDialog.resx	2010-12-22 04:40:33 UTC (rev 5481)
@@ -117,27 +117,6 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="UseInherited.AutoSize" type="System.Boolean, mscorlib">
-    <value>True</value>
-  </data>
-  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-  <data name="UseInherited.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
-    <value>NoControl</value>
-  </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="UseInherited.Location" type="System.Drawing.Point, System.Drawing">
-    <value>16, 16</value>
-  </data>
-  <data name="UseInherited.Size" type="System.Drawing.Size, System.Drawing">
-    <value>166, 17</value>
-  </data>
-  <data name="UseInherited.TabIndex" type="System.Int32, mscorlib">
-    <value>1</value>
-  </data>
-  <data name="UseInherited.Text" xml:space="preserve">
-    <value>Use inherited security settings</value>
-  </data>
   <data name="&gt;&gt;UseInherited.Name" xml:space="preserve">
     <value>UseInherited</value>
   </data>
@@ -150,39 +129,6 @@
   <data name="&gt;&gt;UseInherited.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
-  <data name="UsersAndGroups.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Top, Bottom, Left, Right</value>
-  </data>
-  <data name="columnHeader1.Text" xml:space="preserve">
-    <value>Name</value>
-  </data>
-  <data name="columnHeader1.Width" type="System.Int32, mscorlib">
-    <value>88</value>
-  </data>
-  <data name="columnHeader2.Text" xml:space="preserve">
-    <value>Description</value>
-  </data>
-  <data name="columnHeader2.Width" type="System.Int32, mscorlib">
-    <value>104</value>
-  </data>
-  <data name="columnHeader3.Text" xml:space="preserve">
-    <value>Access</value>
-  </data>
-  <data name="columnHeader3.Width" type="System.Int32, mscorlib">
-    <value>93</value>
-  </data>
-  <data name="UsersAndGroups.Enabled" type="System.Boolean, mscorlib">
-    <value>False</value>
-  </data>
-  <data name="UsersAndGroups.Location" type="System.Drawing.Point, System.Drawing">
-    <value>16, 40</value>
-  </data>
-  <data name="UsersAndGroups.Size" type="System.Drawing.Size, System.Drawing">
-    <value>316, 310</value>
-  </data>
-  <data name="UsersAndGroups.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="&gt;&gt;UsersAndGroups.Name" xml:space="preserve">
     <value>UsersAndGroups</value>
   </data>
@@ -195,15 +141,18 @@
   <data name="&gt;&gt;UsersAndGroups.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="SecurityTab.Location" type="System.Drawing.Point, System.Drawing">
     <value>4, 22</value>
   </data>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="SecurityTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
     <value>3, 3, 3, 3</value>
   </data>
   <data name="SecurityTab.Size" type="System.Drawing.Size, System.Drawing">
     <value>346, 361</value>
   </data>
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
   <data name="SecurityTab.TabIndex" type="System.Int32, mscorlib">
     <value>0</value>
   </data>
@@ -446,13 +395,13 @@
     <value>8, 24</value>
   </data>
   <data name="WMSAvalible.Size" type="System.Drawing.Size, System.Drawing">
-    <value>63, 17</value>
+    <value>69, 17</value>
   </data>
   <data name="WMSAvalible.TabIndex" type="System.Int32, mscorlib">
     <value>4</value>
   </data>
   <data name="WMSAvalible.Text" xml:space="preserve">
-    <value>Avalible</value>
+    <value>Available</value>
   </data>
   <data name="&gt;&gt;WMSAvalible.Name" xml:space="preserve">
     <value>WMSAvalible</value>
@@ -493,6 +442,414 @@
   <data name="groupBox1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
+  <data name="&gt;&gt;WMSMetadata.Name" xml:space="preserve">
+    <value>WMSMetadata</value>
+  </data>
+  <data name="&gt;&gt;WMSMetadata.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WMSMetadata.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;WMSMetadata.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;WMSAbstract.Name" xml:space="preserve">
+    <value>WMSAbstract</value>
+  </data>
+  <data name="&gt;&gt;WMSAbstract.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WMSAbstract.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;WMSAbstract.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;WMSKeyWords.Name" xml:space="preserve">
+    <value>WMSKeyWords</value>
+  </data>
+  <data name="&gt;&gt;WMSKeyWords.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WMSKeyWords.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;WMSKeyWords.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;WMSTitle.Name" xml:space="preserve">
+    <value>WMSTitle</value>
+  </data>
+  <data name="&gt;&gt;WMSTitle.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WMSTitle.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;WMSTitle.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;label1.Name" xml:space="preserve">
+    <value>label1</value>
+  </data>
+  <data name="&gt;&gt;label1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label1.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;label5.Name" xml:space="preserve">
+    <value>label5</value>
+  </data>
+  <data name="&gt;&gt;label5.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label5.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="&gt;&gt;label2.Name" xml:space="preserve">
+    <value>label2</value>
+  </data>
+  <data name="&gt;&gt;label2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label2.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;label3.Name" xml:space="preserve">
+    <value>label3</value>
+  </data>
+  <data name="&gt;&gt;label3.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label3.Parent" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>8, 8</value>
+  </data>
+  <data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>332, 160</value>
+  </data>
+  <data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
+    <value>8</value>
+  </data>
+  <data name="groupBox1.Text" xml:space="preserve">
+    <value>Description</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.Name" xml:space="preserve">
+    <value>groupBox1</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.Parent" xml:space="preserve">
+    <value>WMSTab</value>
+  </data>
+  <data name="&gt;&gt;groupBox1.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="WMSTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="WMSTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="WMSTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>346, 361</value>
+  </data>
+  <data name="WMSTab.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="WMSTab.Text" xml:space="preserve">
+    <value>WMS</value>
+  </data>
+  <data name="&gt;&gt;WMSTab.Name" xml:space="preserve">
+    <value>WMSTab</value>
+  </data>
+  <data name="&gt;&gt;WMSTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WMSTab.Parent" xml:space="preserve">
+    <value>tabControl1</value>
+  </data>
+  <data name="&gt;&gt;WMSTab.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;WFSClearHeaderButton.Name" xml:space="preserve">
+    <value>WFSClearHeaderButton</value>
+  </data>
+  <data name="&gt;&gt;WFSClearHeaderButton.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WFSClearHeaderButton.Parent" xml:space="preserve">
+    <value>WFSTab</value>
+  </data>
+  <data name="&gt;&gt;WFSClearHeaderButton.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.Name" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.Parent" xml:space="preserve">
+    <value>WFSTab</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.Name" xml:space="preserve">
+    <value>groupBox3</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.Parent" xml:space="preserve">
+    <value>WFSTab</value>
+  </data>
+  <data name="&gt;&gt;groupBox3.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="WFSTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="WFSTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="WFSTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>346, 361</value>
+  </data>
+  <data name="WFSTab.TabIndex" type="System.Int32, mscorlib">
+    <value>2</value>
+  </data>
+  <data name="WFSTab.Text" xml:space="preserve">
+    <value>WFS</value>
+  </data>
+  <data name="&gt;&gt;WFSTab.Name" xml:space="preserve">
+    <value>WFSTab</value>
+  </data>
+  <data name="&gt;&gt;WFSTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WFSTab.Parent" xml:space="preserve">
+    <value>tabControl1</value>
+  </data>
+  <data name="&gt;&gt;WFSTab.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="&gt;&gt;ClearHeaderButton.Name" xml:space="preserve">
+    <value>ClearHeaderButton</value>
+  </data>
+  <data name="&gt;&gt;ClearHeaderButton.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ClearHeaderButton.Parent" xml:space="preserve">
+    <value>CustomTab</value>
+  </data>
+  <data name="&gt;&gt;ClearHeaderButton.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;dataGridView1.Name" xml:space="preserve">
+    <value>dataGridView1</value>
+  </data>
+  <data name="&gt;&gt;dataGridView1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;dataGridView1.Parent" xml:space="preserve">
+    <value>CustomTab</value>
+  </data>
+  <data name="&gt;&gt;dataGridView1.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="CustomTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="CustomTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>346, 361</value>
+  </data>
+  <data name="CustomTab.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="CustomTab.Text" xml:space="preserve">
+    <value>Custom Metadata</value>
+  </data>
+  <data name="&gt;&gt;CustomTab.Name" xml:space="preserve">
+    <value>CustomTab</value>
+  </data>
+  <data name="&gt;&gt;CustomTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;CustomTab.Parent" xml:space="preserve">
+    <value>tabControl1</value>
+  </data>
+  <data name="&gt;&gt;CustomTab.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;LoadingReferences.Name" xml:space="preserve">
+    <value>LoadingReferences</value>
+  </data>
+  <data name="&gt;&gt;LoadingReferences.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;LoadingReferences.Parent" xml:space="preserve">
+    <value>ReferenceTab</value>
+  </data>
+  <data name="&gt;&gt;LoadingReferences.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Name" xml:space="preserve">
+    <value>splitContainer1</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.Parent" xml:space="preserve">
+    <value>ReferenceTab</value>
+  </data>
+  <data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="ReferenceTab.Location" type="System.Drawing.Point, System.Drawing">
+    <value>4, 22</value>
+  </data>
+  <data name="ReferenceTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
+    <value>3, 3, 3, 3</value>
+  </data>
+  <data name="ReferenceTab.Size" type="System.Drawing.Size, System.Drawing">
+    <value>346, 361</value>
+  </data>
+  <data name="ReferenceTab.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="ReferenceTab.Text" xml:space="preserve">
+    <value>References</value>
+  </data>
+  <data name="&gt;&gt;ReferenceTab.Name" xml:space="preserve">
+    <value>ReferenceTab</value>
+  </data>
+  <data name="&gt;&gt;ReferenceTab.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ReferenceTab.Parent" xml:space="preserve">
+    <value>tabControl1</value>
+  </data>
+  <data name="&gt;&gt;ReferenceTab.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="tabControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
+  </data>
+  <data name="tabControl1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 32</value>
+  </data>
+  <data name="tabControl1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>354, 387</value>
+  </data>
+  <data name="tabControl1.TabIndex" type="System.Int32, mscorlib">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;tabControl1.Name" xml:space="preserve">
+    <value>tabControl1</value>
+  </data>
+  <data name="&gt;&gt;tabControl1.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;tabControl1.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;tabControl1.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="UseInherited.AutoSize" type="System.Boolean, mscorlib">
+    <value>True</value>
+  </data>
+  <data name="UseInherited.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="UseInherited.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 16</value>
+  </data>
+  <data name="UseInherited.Size" type="System.Drawing.Size, System.Drawing">
+    <value>166, 17</value>
+  </data>
+  <data name="UseInherited.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
+  </data>
+  <data name="UseInherited.Text" xml:space="preserve">
+    <value>Use inherited security settings</value>
+  </data>
+  <data name="&gt;&gt;UseInherited.Name" xml:space="preserve">
+    <value>UseInherited</value>
+  </data>
+  <data name="&gt;&gt;UseInherited.Type" xml:space="preserve">
+    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;UseInherited.Parent" xml:space="preserve">
+    <value>SecurityTab</value>
+  </data>
+  <data name="&gt;&gt;UseInherited.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="UsersAndGroups.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
+  <data name="UsersAndGroups.Enabled" type="System.Boolean, mscorlib">
+    <value>False</value>
+  </data>
+  <data name="UsersAndGroups.Location" type="System.Drawing.Point, System.Drawing">
+    <value>16, 40</value>
+  </data>
+  <data name="UsersAndGroups.Size" type="System.Drawing.Size, System.Drawing">
+    <value>316, 310</value>
+  </data>
+  <data name="UsersAndGroups.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;UsersAndGroups.Name" xml:space="preserve">
+    <value>UsersAndGroups</value>
+  </data>
+  <data name="&gt;&gt;UsersAndGroups.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;UsersAndGroups.Parent" xml:space="preserve">
+    <value>SecurityTab</value>
+  </data>
+  <data name="&gt;&gt;UsersAndGroups.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="columnHeader1.Text" xml:space="preserve">
+    <value>Name</value>
+  </data>
+  <data name="columnHeader1.Width" type="System.Int32, mscorlib">
+    <value>88</value>
+  </data>
+  <data name="columnHeader2.Text" xml:space="preserve">
+    <value>Description</value>
+  </data>
+  <data name="columnHeader2.Width" type="System.Int32, mscorlib">
+    <value>104</value>
+  </data>
+  <data name="columnHeader3.Text" xml:space="preserve">
+    <value>Access</value>
+  </data>
+  <data name="columnHeader3.Width" type="System.Int32, mscorlib">
+    <value>93</value>
+  </data>
   <data name="WMSMetadata.Location" type="System.Drawing.Point, System.Drawing">
     <value>80, 112</value>
   </data>
@@ -709,90 +1066,303 @@
   <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
     <value>7</value>
   </data>
-  <data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
-    <value>8, 8</value>
+  <data name="WFSClearHeaderButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Bottom, Right</value>
   </data>
-  <data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
-    <value>332, 160</value>
+  <data name="WFSClearHeaderButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
   </data>
-  <data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
-    <value>8</value>
+  <data name="WFSClearHeaderButton.Location" type="System.Drawing.Point, System.Drawing">
+    <value>220, 324</value>
   </data>
-  <data name="groupBox1.Text" xml:space="preserve">
-    <value>Description</value>
+  <data name="WFSClearHeaderButton.Size" type="System.Drawing.Size, System.Drawing">
+    <value>119, 23</value>
   </data>
-  <data name="&gt;&gt;groupBox1.Name" xml:space="preserve">
-    <value>groupBox1</value>
+  <data name="WFSClearHeaderButton.TabIndex" type="System.Int32, mscorlib">
+    <value>11</value>
   </data>
-  <data name="&gt;&gt;groupBox1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="WFSClearHeaderButton.Text" xml:space="preserve">
+    <value>Clear all WFS data</value>
   </data>
-  <data name="&gt;&gt;groupBox1.Parent" xml:space="preserve">
-    <value>WMSTab</value>
+  <data name="&gt;&gt;WFSClearHeaderButton.Name" xml:space="preserve">
+    <value>WFSClearHeaderButton</value>
   </data>
-  <data name="&gt;&gt;groupBox1.ZOrder" xml:space="preserve">
-    <value>2</value>
+  <data name="&gt;&gt;WFSClearHeaderButton.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="WMSTab.Location" type="System.Drawing.Point, System.Drawing">
-    <value>4, 22</value>
+  <data name="&gt;&gt;WFSClearHeaderButton.Parent" xml:space="preserve">
+    <value>WFSTab</value>
   </data>
-  <data name="WMSTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
-    <value>3, 3, 3, 3</value>
+  <data name="&gt;&gt;WFSClearHeaderButton.ZOrder" xml:space="preserve">
+    <value>0</value>
   </data>
-  <data name="WMSTab.Size" type="System.Drawing.Size, System.Drawing">
-    <value>346, 361</value>
+  <data name="groupBox4.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
   </data>
-  <data name="WMSTab.TabIndex" type="System.Int32, mscorlib">
+  <data name="&gt;&gt;btnOtherSRS.Name" xml:space="preserve">
+    <value>btnOtherSRS</value>
+  </data>
+  <data name="&gt;&gt;btnOtherSRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnOtherSRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;btnOtherSRS.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.Name" xml:space="preserve">
+    <value>btnPrimarySRS</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
-  <data name="WMSTab.Text" xml:space="preserve">
-    <value>WMS</value>
+  <data name="&gt;&gt;txtOtherSRS.Name" xml:space="preserve">
+    <value>txtOtherSRS</value>
   </data>
-  <data name="&gt;&gt;WMSTab.Name" xml:space="preserve">
-    <value>WMSTab</value>
+  <data name="&gt;&gt;txtOtherSRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;WMSTab.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="&gt;&gt;txtOtherSRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
   </data>
-  <data name="&gt;&gt;WMSTab.Parent" xml:space="preserve">
-    <value>tabControl1</value>
+  <data name="&gt;&gt;txtOtherSRS.ZOrder" xml:space="preserve">
+    <value>2</value>
   </data>
-  <data name="&gt;&gt;WMSTab.ZOrder" xml:space="preserve">
+  <data name="&gt;&gt;txtPrimarySRS.Name" xml:space="preserve">
+    <value>txtPrimarySRS</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;AutoGenerateWFSBounds.Name" xml:space="preserve">
+    <value>AutoGenerateWFSBounds</value>
+  </data>
+  <data name="&gt;&gt;AutoGenerateWFSBounds.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;AutoGenerateWFSBounds.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;AutoGenerateWFSBounds.ZOrder" xml:space="preserve">
+    <value>4</value>
+  </data>
+  <data name="&gt;&gt;label12.Name" xml:space="preserve">
+    <value>label12</value>
+  </data>
+  <data name="&gt;&gt;label12.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label12.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;label12.ZOrder" xml:space="preserve">
+    <value>5</value>
+  </data>
+  <data name="&gt;&gt;label11.Name" xml:space="preserve">
+    <value>label11</value>
+  </data>
+  <data name="&gt;&gt;label11.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label11.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;label11.ZOrder" xml:space="preserve">
+    <value>6</value>
+  </data>
+  <data name="&gt;&gt;EditWFSBounds.Name" xml:space="preserve">
+    <value>EditWFSBounds</value>
+  </data>
+  <data name="&gt;&gt;EditWFSBounds.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;EditWFSBounds.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;EditWFSBounds.ZOrder" xml:space="preserve">
+    <value>7</value>
+  </data>
+  <data name="&gt;&gt;WFSBounds.Name" xml:space="preserve">
+    <value>WFSBounds</value>
+  </data>
+  <data name="&gt;&gt;WFSBounds.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WFSBounds.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;WFSBounds.ZOrder" xml:space="preserve">
+    <value>8</value>
+  </data>
+  <data name="&gt;&gt;label10.Name" xml:space="preserve">
+    <value>label10</value>
+  </data>
+  <data name="&gt;&gt;label10.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label10.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;label10.ZOrder" xml:space="preserve">
+    <value>9</value>
+  </data>
+  <data name="&gt;&gt;WFSAvailable.Name" xml:space="preserve">
+    <value>WFSAvailable</value>
+  </data>
+  <data name="&gt;&gt;WFSAvailable.Type" xml:space="preserve">
+    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;WFSAvailable.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;WFSAvailable.ZOrder" xml:space="preserve">
+    <value>10</value>
+  </data>
+  <data name="groupBox4.Location" type="System.Drawing.Point, System.Drawing">
+    <value>7, 176</value>
+  </data>
+  <data name="groupBox4.Size" type="System.Drawing.Size, System.Drawing">
+    <value>332, 144</value>
+  </data>
+  <data name="groupBox4.TabIndex" type="System.Int32, mscorlib">
+    <value>10</value>
+  </data>
+  <data name="groupBox4.Text" xml:space="preserve">
+    <value>Functionality</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.Name" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.Type" xml:space="preserve">
+    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.Parent" xml:space="preserve">
+    <value>WFSTab</value>
+  </data>
+  <data name="&gt;&gt;groupBox4.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
-  <data name="WFSClearHeaderButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
-    <value>Bottom, Right</value>
+  <data name="btnOtherSRS.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
   </data>
-  <data name="WFSClearHeaderButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+  <data name="btnOtherSRS.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>NoControl</value>
   </data>
-  <data name="WFSClearHeaderButton.Location" type="System.Drawing.Point, System.Drawing">
-    <value>220, 324</value>
+  <data name="btnOtherSRS.Location" type="System.Drawing.Point, System.Drawing">
+    <value>304, 68</value>
   </data>
-  <data name="WFSClearHeaderButton.Size" type="System.Drawing.Size, System.Drawing">
-    <value>119, 23</value>
+  <data name="btnOtherSRS.Size" type="System.Drawing.Size, System.Drawing">
+    <value>24, 20</value>
   </data>
-  <data name="WFSClearHeaderButton.TabIndex" type="System.Int32, mscorlib">
-    <value>11</value>
+  <data name="btnOtherSRS.TabIndex" type="System.Int32, mscorlib">
+    <value>19</value>
   </data>
-  <data name="WFSClearHeaderButton.Text" xml:space="preserve">
-    <value>Clear all WFS data</value>
+  <data name="btnOtherSRS.Text" xml:space="preserve">
+    <value>...</value>
   </data>
-  <data name="&gt;&gt;WFSClearHeaderButton.Name" xml:space="preserve">
-    <value>WFSClearHeaderButton</value>
+  <data name="&gt;&gt;btnOtherSRS.Name" xml:space="preserve">
+    <value>btnOtherSRS</value>
   </data>
-  <data name="&gt;&gt;WFSClearHeaderButton.Type" xml:space="preserve">
+  <data name="&gt;&gt;btnOtherSRS.Type" xml:space="preserve">
     <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;WFSClearHeaderButton.Parent" xml:space="preserve">
-    <value>WFSTab</value>
+  <data name="&gt;&gt;btnOtherSRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
   </data>
-  <data name="&gt;&gt;WFSClearHeaderButton.ZOrder" xml:space="preserve">
+  <data name="&gt;&gt;btnOtherSRS.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
-  <data name="groupBox4.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+  <data name="btnPrimarySRS.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
+  <data name="btnPrimarySRS.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+    <value>NoControl</value>
+  </data>
+  <data name="btnPrimarySRS.Location" type="System.Drawing.Point, System.Drawing">
+    <value>304, 44</value>
+  </data>
+  <data name="btnPrimarySRS.Size" type="System.Drawing.Size, System.Drawing">
+    <value>24, 20</value>
+  </data>
+  <data name="btnPrimarySRS.TabIndex" type="System.Int32, mscorlib">
+    <value>18</value>
+  </data>
+  <data name="btnPrimarySRS.Text" xml:space="preserve">
+    <value>...</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.Name" xml:space="preserve">
+    <value>btnPrimarySRS</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;btnPrimarySRS.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="txtOtherSRS.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtOtherSRS.Location" type="System.Drawing.Point, System.Drawing">
+    <value>88, 69</value>
+  </data>
+  <data name="txtOtherSRS.Size" type="System.Drawing.Size, System.Drawing">
+    <value>210, 20</value>
+  </data>
+  <data name="txtOtherSRS.TabIndex" type="System.Int32, mscorlib">
+    <value>17</value>
+  </data>
+  <data name="&gt;&gt;txtOtherSRS.Name" xml:space="preserve">
+    <value>txtOtherSRS</value>
+  </data>
+  <data name="&gt;&gt;txtOtherSRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;txtOtherSRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;txtOtherSRS.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
+  <data name="txtPrimarySRS.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Left, Right</value>
+  </data>
+  <data name="txtPrimarySRS.Location" type="System.Drawing.Point, System.Drawing">
+    <value>88, 45</value>
+  </data>
+  <data name="txtPrimarySRS.Size" type="System.Drawing.Size, System.Drawing">
+    <value>210, 20</value>
+  </data>
+  <data name="txtPrimarySRS.TabIndex" type="System.Int32, mscorlib">
+    <value>16</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.Name" xml:space="preserve">
+    <value>txtPrimarySRS</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.Parent" xml:space="preserve">
+    <value>groupBox4</value>
+  </data>
+  <data name="&gt;&gt;txtPrimarySRS.ZOrder" xml:space="preserve">
+    <value>3</value>
+  </data>
   <data name="AutoGenerateWFSBounds.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -828,50 +1398,8 @@
     <value>groupBox4</value>
   </data>
   <data name="&gt;&gt;AutoGenerateWFSBounds.ZOrder" xml:space="preserve">
-    <value>0</value>
+    <value>4</value>
   </data>
-  <data name="WFSOtherSRS.Location" type="System.Drawing.Point, System.Drawing">
-    <value>88, 72</value>
-  </data>
-  <data name="WFSOtherSRS.Size" type="System.Drawing.Size, System.Drawing">
-    <value>240, 21</value>
-  </data>
-  <data name="WFSOtherSRS.TabIndex" type="System.Int32, mscorlib">
-    <value>14</value>
-  </data>
-  <data name="&gt;&gt;WFSOtherSRS.Name" xml:space="preserve">
-    <value>WFSOtherSRS</value>
-  </data>
-  <data name="&gt;&gt;WFSOtherSRS.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;WFSOtherSRS.Parent" xml:space="preserve">
-    <value>groupBox4</value>
-  </data>
-  <data name="&gt;&gt;WFSOtherSRS.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
-  <data name="WFSPrimarySRS.Location" type="System.Drawing.Point, System.Drawing">
-    <value>88, 48</value>
-  </data>
-  <data name="WFSPrimarySRS.Size" type="System.Drawing.Size, System.Drawing">
-    <value>240, 21</value>
-  </data>
-  <data name="WFSPrimarySRS.TabIndex" type="System.Int32, mscorlib">
-    <value>13</value>
-  </data>
-  <data name="&gt;&gt;WFSPrimarySRS.Name" xml:space="preserve">
-    <value>WFSPrimarySRS</value>
-  </data>
-  <data name="&gt;&gt;WFSPrimarySRS.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;WFSPrimarySRS.Parent" xml:space="preserve">
-    <value>groupBox4</value>
-  </data>
-  <data name="&gt;&gt;WFSPrimarySRS.ZOrder" xml:space="preserve">
-    <value>2</value>
-  </data>
   <data name="label12.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
@@ -900,7 +1428,7 @@
     <value>groupBox4</value>
   </data>
   <data name="&gt;&gt;label12.ZOrder" xml:space="preserve">
-    <value>3</value>
+    <value>5</value>
   </data>
   <data name="label11.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -930,7 +1458,7 @@
     <value>groupBox4</value>
   </data>
   <data name="&gt;&gt;label11.ZOrder" xml:space="preserve">
-    <value>4</value>
+    <value>6</value>
   </data>
   <data name="EditWFSBounds.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>NoControl</value>
@@ -957,7 +1485,7 @@
     <value>groupBox4</value>
   </data>
   <data name="&gt;&gt;EditWFSBounds.ZOrder" xml:space="preserve">
-    <value>5</value>
+    <value>7</value>
   </data>
   <data name="WFSBounds.Location" type="System.Drawing.Point, System.Drawing">
     <value>88, 96</value>
@@ -984,7 +1512,7 @@
     <value>groupBox4</value>
   </data>
   <data name="&gt;&gt;WFSBounds.ZOrder" xml:space="preserve">
-    <value>6</value>
+    <value>8</value>
   </data>
   <data name="label10.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
@@ -1014,62 +1542,38 @@
     <value>groupBox4</value>
   </data>
   <data name="&gt;&gt;label10.ZOrder" xml:space="preserve">
-    <value>7</value>
+    <value>9</value>
   </data>
-  <data name="WFSAvalible.AutoSize" type="System.Boolean, mscorlib">
+  <data name="WFSAvailable.AutoSize" type="System.Boolean, mscorlib">
     <value>True</value>
   </data>
-  <data name="WFSAvalible.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
+  <data name="WFSAvailable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>NoControl</value>
   </data>
-  <data name="WFSAvalible.Location" type="System.Drawing.Point, System.Drawing">
+  <data name="WFSAvailable.Location" type="System.Drawing.Point, System.Drawing">
     <value>8, 24</value>
   </data>
-  <data name="WFSAvalible.Size" type="System.Drawing.Size, System.Drawing">
-    <value>63, 17</value>
+  <data name="WFSAvailable.Size" type="System.Drawing.Size, System.Drawing">
+    <value>69, 17</value>
   </data>
-  <data name="WFSAvalible.TabIndex" type="System.Int32, mscorlib">
+  <data name="WFSAvailable.TabIndex" type="System.Int32, mscorlib">
     <value>4</value>
   </data>
-  <data name="WFSAvalible.Text" xml:space="preserve">
-    <value>Avalible</value>
+  <data name="WFSAvailable.Text" xml:space="preserve">
+    <value>Available</value>
   </data>
-  <data name="&gt;&gt;WFSAvalible.Name" xml:space="preserve">
-    <value>WFSAvalible</value>
+  <data name="&gt;&gt;WFSAvailable.Name" xml:space="preserve">
+    <value>WFSAvailable</value>
   </data>
-  <data name="&gt;&gt;WFSAvalible.Type" xml:space="preserve">
+  <data name="&gt;&gt;WFSAvailable.Type" xml:space="preserve">
     <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;WFSAvalible.Parent" xml:space="preserve">
+  <data name="&gt;&gt;WFSAvailable.Parent" xml:space="preserve">
     <value>groupBox4</value>
   </data>
-  <data name="&gt;&gt;WFSAvalible.ZOrder" xml:space="preserve">
-    <value>8</value>
-  </data>
-  <data name="groupBox4.Location" type="System.Drawing.Point, System.Drawing">
-    <value>7, 176</value>
-  </data>
-  <data name="groupBox4.Size" type="System.Drawing.Size, System.Drawing">
-    <value>332, 144</value>
-  </data>
-  <data name="groupBox4.TabIndex" type="System.Int32, mscorlib">
+  <data name="&gt;&gt;WFSAvailable.ZOrder" xml:space="preserve">
     <value>10</value>
   </data>
-  <data name="groupBox4.Text" xml:space="preserve">
-    <value>Functionality</value>
-  </data>
-  <data name="&gt;&gt;groupBox4.Name" xml:space="preserve">
-    <value>groupBox4</value>
-  </data>
-  <data name="&gt;&gt;groupBox4.Type" xml:space="preserve">
-    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;groupBox4.Parent" xml:space="preserve">
-    <value>WFSTab</value>
-  </data>
-  <data name="&gt;&gt;groupBox4.ZOrder" xml:space="preserve">
-    <value>1</value>
-  </data>
   <data name="groupBox3.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
@@ -1313,33 +1817,6 @@
   <data name="&gt;&gt;groupBox3.ZOrder" xml:space="preserve">
     <value>2</value>
   </data>
-  <data name="WFSTab.Location" type="System.Drawing.Point, System.Drawing">
-    <value>4, 22</value>
-  </data>
-  <data name="WFSTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
-    <value>3, 3, 3, 3</value>
-  </data>
-  <data name="WFSTab.Size" type="System.Drawing.Size, System.Drawing">
-    <value>346, 361</value>
-  </data>
-  <data name="WFSTab.TabIndex" type="System.Int32, mscorlib">
-    <value>2</value>
-  </data>
-  <data name="WFSTab.Text" xml:space="preserve">
-    <value>WFS</value>
-  </data>
-  <data name="&gt;&gt;WFSTab.Name" xml:space="preserve">
-    <value>WFSTab</value>
-  </data>
-  <data name="&gt;&gt;WFSTab.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;WFSTab.Parent" xml:space="preserve">
-    <value>tabControl1</value>
-  </data>
-  <data name="&gt;&gt;WFSTab.ZOrder" xml:space="preserve">
-    <value>2</value>
-  </data>
   <data name="ClearHeaderButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Right</value>
   </data>
@@ -1406,30 +1883,6 @@
   <data name="&gt;&gt;dataGridView1.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
-  <data name="CustomTab.Location" type="System.Drawing.Point, System.Drawing">
-    <value>4, 22</value>
-  </data>
-  <data name="CustomTab.Size" type="System.Drawing.Size, System.Drawing">
-    <value>346, 361</value>
-  </data>
-  <data name="CustomTab.TabIndex" type="System.Int32, mscorlib">
-    <value>3</value>
-  </data>
-  <data name="CustomTab.Text" xml:space="preserve">
-    <value>Custom Metadata</value>
-  </data>
-  <data name="&gt;&gt;CustomTab.Name" xml:space="preserve">
-    <value>CustomTab</value>
-  </data>
-  <data name="&gt;&gt;CustomTab.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;CustomTab.Parent" xml:space="preserve">
-    <value>tabControl1</value>
-  </data>
-  <data name="&gt;&gt;CustomTab.ZOrder" xml:space="preserve">
-    <value>3</value>
-  </data>
   <data name="LoadingReferences.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
     <value>NoControl</value>
   </data>
@@ -1463,18 +1916,6 @@
   <data name="splitContainer1.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
     <value>Horizontal</value>
   </data>
-  <data name="OutReferenceList.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <data name="OutReferenceList.Location" type="System.Drawing.Point, System.Drawing">
-    <value>3, 16</value>
-  </data>
-  <data name="OutReferenceList.Size" type="System.Drawing.Size, System.Drawing">
-    <value>334, 156</value>
-  </data>
-  <data name="OutReferenceList.TabIndex" type="System.Int32, mscorlib">
-    <value>0</value>
-  </data>
   <data name="&gt;&gt;OutReferenceList.Name" xml:space="preserve">
     <value>OutReferenceList</value>
   </data>
@@ -1529,18 +1970,6 @@
   <data name="&gt;&gt;splitContainer1.Panel1.ZOrder" xml:space="preserve">
     <value>0</value>
   </data>
-  <data name="InReferenceList.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Fill</value>
-  </data>
-  <data name="InReferenceList.Location" type="System.Drawing.Point, System.Drawing">
-    <value>3, 16</value>
-  </data>
-  <data name="InReferenceList.Size" type="System.Drawing.Size, System.Drawing">
-    <value>334, 157</value>
-  </data>
-  <data name="InReferenceList.TabIndex" type="System.Int32, mscorlib">
-    <value>1</value>
-  </data>
   <data name="&gt;&gt;InReferenceList.Name" xml:space="preserve">
     <value>InReferenceList</value>
   </data>
@@ -1616,57 +2045,102 @@
   <data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
-  <data name="ReferenceTab.Location" type="System.Drawing.Point, System.Drawing">
-    <value>4, 22</value>
+  <data name="OutReferenceList.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Fill</value>
   </data>
-  <data name="ReferenceTab.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
-    <value>3, 3, 3, 3</value>
+  <data name="OutReferenceList.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 16</value>
   </data>
-  <data name="ReferenceTab.Size" type="System.Drawing.Size, System.Drawing">
-    <value>346, 361</value>
+  <data name="OutReferenceList.Size" type="System.Drawing.Size, System.Drawing">
+    <value>334, 156</value>
   </data>
-  <data name="ReferenceTab.TabIndex" type="System.Int32, mscorlib">
-    <value>4</value>
+  <data name="OutReferenceList.TabIndex" type="System.Int32, mscorlib">
+    <value>0</value>
   </data>
-  <data name="ReferenceTab.Text" xml:space="preserve">
-    <value>References</value>
+  <data name="&gt;&gt;OutReferenceList.Name" xml:space="preserve">
+    <value>OutReferenceList</value>
   </data>
-  <data name="&gt;&gt;ReferenceTab.Name" xml:space="preserve">
-    <value>ReferenceTab</value>
+  <data name="&gt;&gt;OutReferenceList.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;ReferenceTab.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="&gt;&gt;OutReferenceList.Parent" xml:space="preserve">
+    <value>OutReferences</value>
   </data>
-  <data name="&gt;&gt;ReferenceTab.Parent" xml:space="preserve">
-    <value>tabControl1</value>
+  <data name="&gt;&gt;OutReferenceList.ZOrder" xml:space="preserve">
+    <value>0</value>
   </data>
-  <data name="&gt;&gt;ReferenceTab.ZOrder" xml:space="preserve">
-    <value>4</value>
-  </data>
-  <data name="tabControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+  <data name="InReferenceList.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
     <value>Fill</value>
   </data>
-  <data name="tabControl1.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 32</value>
+  <data name="InReferenceList.Location" type="System.Drawing.Point, System.Drawing">
+    <value>3, 16</value>
   </data>
-  <data name="tabControl1.Size" type="System.Drawing.Size, System.Drawing">
-    <value>354, 387</value>
+  <data name="InReferenceList.Size" type="System.Drawing.Size, System.Drawing">
+    <value>334, 157</value>
   </data>
-  <data name="tabControl1.TabIndex" type="System.Int32, mscorlib">
-    <value>4</value>
+  <data name="InReferenceList.TabIndex" type="System.Int32, mscorlib">
+    <value>1</value>
   </data>
-  <data name="&gt;&gt;tabControl1.Name" xml:space="preserve">
-    <value>tabControl1</value>
+  <data name="&gt;&gt;InReferenceList.Name" xml:space="preserve">
+    <value>InReferenceList</value>
   </data>
-  <data name="&gt;&gt;tabControl1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  <data name="&gt;&gt;InReferenceList.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;tabControl1.Parent" xml:space="preserve">
-    <value>$this</value>
+  <data name="&gt;&gt;InReferenceList.Parent" xml:space="preserve">
+    <value>InReferences</value>
   </data>
-  <data name="&gt;&gt;tabControl1.ZOrder" xml:space="preserve">
+  <data name="&gt;&gt;InReferenceList.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;ResourceID.Name" xml:space="preserve">
+    <value>ResourceID</value>
+  </data>
+  <data name="&gt;&gt;ResourceID.Type" xml:space="preserve">
+    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;ResourceID.Parent" xml:space="preserve">
+    <value>panel2</value>
+  </data>
+  <data name="&gt;&gt;ResourceID.ZOrder" xml:space="preserve">
+    <value>0</value>
+  </data>
+  <data name="&gt;&gt;label13.Name" xml:space="preserve">
+    <value>label13</value>
+  </data>
+  <data name="&gt;&gt;label13.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;label13.Parent" xml:space="preserve">
+    <value>panel2</value>
+  </data>
+  <data name="&gt;&gt;label13.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
+  <data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Top</value>
+  </data>
+  <data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 0</value>
+  </data>
+  <data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
+    <value>354, 32</value>
+  </data>
+  <data name="panel2.TabIndex" type="System.Int32, mscorlib">
+    <value>5</value>
+  </data>
+  <data name="&gt;&gt;panel2.Name" xml:space="preserve">
+    <value>panel2</value>
+  </data>
+  <data name="&gt;&gt;panel2.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;panel2.Parent" xml:space="preserve">
+    <value>$this</value>
+  </data>
+  <data name="&gt;&gt;panel2.ZOrder" xml:space="preserve">
+    <value>2</value>
+  </data>
   <data name="ResourceID.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Top, Left, Right</value>
   </data>
@@ -1721,29 +2195,53 @@
   <data name="&gt;&gt;label13.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
-  <data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Top</value>
+  <data name="&gt;&gt;CancelBtn.Name" xml:space="preserve">
+    <value>CancelBtn</value>
   </data>
-  <data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 0</value>
+  <data name="&gt;&gt;CancelBtn.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
-    <value>354, 32</value>
+  <data name="&gt;&gt;CancelBtn.Parent" xml:space="preserve">
+    <value>panel1</value>
   </data>
-  <data name="panel2.TabIndex" type="System.Int32, mscorlib">
-    <value>5</value>
+  <data name="&gt;&gt;CancelBtn.ZOrder" xml:space="preserve">
+    <value>0</value>
   </data>
-  <data name="&gt;&gt;panel2.Name" xml:space="preserve">
-    <value>panel2</value>
+  <data name="&gt;&gt;OKBtn.Name" xml:space="preserve">
+    <value>OKBtn</value>
   </data>
-  <data name="&gt;&gt;panel2.Type" xml:space="preserve">
+  <data name="&gt;&gt;OKBtn.Type" xml:space="preserve">
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.Parent" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;OKBtn.ZOrder" xml:space="preserve">
+    <value>1</value>
+  </data>
+  <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+    <value>Bottom</value>
+  </data>
+  <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
+    <value>0, 419</value>
+  </data>
+  <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
+    <value>354, 40</value>
+  </data>
+  <data name="panel1.TabIndex" type="System.Int32, mscorlib">
+    <value>3</value>
+  </data>
+  <data name="&gt;&gt;panel1.Name" xml:space="preserve">
+    <value>panel1</value>
+  </data>
+  <data name="&gt;&gt;panel1.Type" xml:space="preserve">
     <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
-  <data name="&gt;&gt;panel2.Parent" xml:space="preserve">
+  <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
     <value>$this</value>
   </data>
-  <data name="&gt;&gt;panel2.ZOrder" xml:space="preserve">
-    <value>2</value>
+  <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
+    <value>3</value>
   </data>
   <data name="CancelBtn.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
     <value>Bottom, Right</value>
@@ -1805,30 +2303,6 @@
   <data name="&gt;&gt;OKBtn.ZOrder" xml:space="preserve">
     <value>1</value>
   </data>
-  <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
-    <value>Bottom</value>
-  </data>
-  <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
-    <value>0, 419</value>
-  </data>
-  <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
-    <value>354, 40</value>
-  </data>
-  <data name="panel1.TabIndex" type="System.Int32, mscorlib">
-    <value>3</value>
-  </data>
-  <data name="&gt;&gt;panel1.Name" xml:space="preserve">
-    <value>panel1</value>
-  </data>
-  <data name="&gt;&gt;panel1.Type" xml:space="preserve">
-    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
-  <data name="&gt;&gt;panel1.Parent" xml:space="preserve">
-    <value>$this</value>
-  </data>
-  <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
-    <value>3</value>
-  </data>
   <metadata name="ReferenceWorker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
@@ -1839,194 +2313,200 @@
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAB4
-        KgAAAk1TRnQBSQFMAgEBCAEAARwBAAEcAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
-        AwABMAMAAQEBAAEgBgABMP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AQgABVAIvAasBUAFT
-        AWIB+WAAAR4BbAEQAf4BYwGlAWIB/wFwAa8BbwH/AWwBrAFsAf8BZwGoAWcB/wFjAaUBYwH/AWEBowFg
-        Af8BZAGmAWQB/wFmAacBZQH/AWgBqQFoAf8BQgGBAUIB/wELAUABCwH/ATUCLwFXFAABRAI0AXkBNQGF
-        ATUB/wFPAZcBTgH/AUwBlQFLAf8BRwGRAUcB/wFBAY0BQQH/AUABjAFAAf8BRQGPAUQB/wFDAYsBQwH/
-        AQsBOQELAf8BHgGBAR4B/wEtAioBRhQAAwUBBwMGAQgDBAEFAV4CIgHVAU0BoAG+Af4BUAFTAWMB+QME
-        AQUDAAEBIAADBQEHAwYBCAMEAQUDAgEDAwIBAwEdAhwBKQErARkBTwH7ASsBGQF7AfsBKwEZAVsB+wE9
-        AjIBaQgAAT0CMgFpAYEB1QGBAf8BPAG9AToB/wE8Ab0BOgH/ATwBvQE6Af8BPAG9AToB/wFCAb4BQAH/
-        AV8ByAFeAf8BPAG9AToB/wE8Ab0BOgH/ATwBvQE6Af8BVwF+AS0B/wGTAQsBHAH/ARsBgQEbAf8UAAFT
-        AZoBUwH/ATwBvQE6Af8BPAG9AToB/wE8Ab0BOgH/ATwBvQE6Af8BUgHEAVAB/wFNAcIBSwH/ATwBvQE6
-        Af8BOgG3ATgB/wGUAQsBHQH/ATwBvQE6Af8BNQGGATUB/wwAAwsBDwF6AYgBZgH+AX8BoAF2Af4BfwGg
-        AXYB/gF/AaABdwH+AX8BngF3Af4BRgGJAacB/gGSAcwB6gH/AasBpQGmAf8BqQGqAaMB/wGxAbABqwH/
-        AasClgH+AwQBBgwAAwsBDwF6AYgBZgH+AX8BoAF2Af4BfwGgAXYB/gF/AaABdwH+AX8BngF3Af4BfwGU
-        AXQB/gIQAecB/wESARQBtAH/AUMBTAFBAf4BLQEgAWoB/gEmARMBrwH+AUACMwFwBAABUAIxAZ4BZwHK
-        AWYB/wE8Ab0BOgH/ATwBvQE6Af8BPAG9AToB/wE8Ab0BOgH/AVEBmAFQAf8BMQGBAS8B/wF7AdEBeQH/
-        ATwBvQE6Af8BPAG9AToB/wE7AbwBOQH/ATABkAEuAf8BTwGXAU4B/xQAAXQBswFzAf8BPAG9AToB/wE8
-        Ab0BOgH/ATwBvQE6Af8BQwG/AUEB/wEfAYEBHQH/AR4BgQEdAf8BQAG+AT4B/wE8Ab0BOgH/AScBeQEm
-        Af8BPAG9AToB/wFiAaUBYQH/DAABQgI0AXYBUwGVAUEB/gFLAZABQQH+AUsBkAFBAf4BSwGQAUEB/gF4
-        AYUBZAH+AX8BnAF4Af4BpQGiAaAB/wHFAdwBqwH/AcoB2wGZAf8B3AHbAZ0B/wFYAikBwQGzAqIB/gwA
-        AUICNAF2AVMBlQFBAf4BSwGQAUEB/gFLAZABQQH+AUsBkAFBAf4BeAGFAWQB/gE1ASgBYgH+ARABEgHg
-        Af8BEgEXAYAB/wE/AVgBLwH+AX8BngF3Af4BXAEcAR4B6gErARYBcgH8BAABUQIxAaIBZQHJAWQB/wE7
-        AbwBOgH/ATsBvAE6Af8BOwG8AToB/wF0Ac4BcwH/AWsBoAFnAv8C9wH/AVkBngFYAf8BOwG8AToB/wE7
-        AbwBOgH/AS8BjQEuAf8BjQELARwB/wErAU8BJQH/CAADFAEcAT8CMwFtAUACMwFvAXkBtgF4Af8BOwG7
-        AToB/wE7AbsBOgH/ATsBuwE6Af8BhgHQAYUB/wHnAeoB4AH/AdQB4QHOAf8BhAHTAYMB/wE7AbsBOgH/
-        AZQBCwEdAf8BMAE8ARoB/wFpAakBaAH/DAABSAI1AYMBUAGTAUEB/gFLAZABQQH+AUsBkAFBAf4BcQGc
-        AV0B/gGWAZwBfwH+AVABfwFBAf4BpwKiAf8ByQHbAZkB/wHJAdcBiwH/AdsB1gGGAf8BXQImAcoBdwE3
-        ATQB9gwAAUgCNQGDAVABkwFBAf4BSwGQAUEB/gFLAZABQQH+AXEBnAFdAf4BlgGcAX8B/gEQARIBkwH/
-        AREBFAGUAf8BSwGQAUEB/gERARQBowH/AXIBfwFeAf4BTAIzAZMBJgETAa8B/gQAAUwCMwGTAWwByQFr
-        Af8BOgG4ATkB/wE6AbgBOQH/AToBuAE5Af8BgQG5AYAB/wH8AfUB9AH/Af4C9gH/AUIBiwE+Af8BUwHB
-        AVIB/wE6AbgBOQH/AToBuAE5Af8BRQGjATUB/wGUAQsBHQH/ASwCKQFEAxIBGAHoAbgBggH/AeQBnwFS
-        Af8BzAGOAUoB/wFzAa8BcQH/ATkBtgE4Af8BOQG2ATgB/wE5AbYBOAH/AUsBkwFIAf8B/AH1AfQB/wH8
-        AfUB9AH/AVcBmwFVAf8BOQG2ATgB/wE7AbIBOAH/AZEBDwEdAf8BJAE4ARcB/wMMARABrgF/AWgB/gG6
-        AYABcwH+An8BQQH+AVIBkAFBAf4BSgGLAUAB/gFKAYsBQAH+AXoBhAFlAf4B0QG6AbkB/gHBAbQBrgH+
-        AbECrAH/AckB1gGLAf8ByQHQAYEB/wHhAdcBhAH/AWUCHwHlAYkBTAFLAfkDDAEQAa4BfwFoAf4BugGA
-        AXMB/gJ/AUEB/gFSAZABQQH+AUoBiwFAAf4BSgGLAUAB/gF6AYQBZQH+AdEBugG5Af4BSgE+AWkB/gIQ
-        AecB/wFKAYUBQAH+AUoBhwFAAf4BEgEUAccB/wFdARoBIgHyASsBFgFoAfwEAAEyAi0BUAGIAdMBhwH/
-        ATgBswE3Af8BOAGzATcB/wE8AbQBOwH/ATQBgQEwAf8B3wLYAf8B2QLSAf8BwAHNAbkB/wGOAdABjQH/
-        AXMBCwEXAf8BRwGYATMB/wE5AbMBOQH/AZQBCwEdAf8BNQIvAVUBOwIyAWQB5QGgAVQB/wHjAZgBRAH/
-        AdUBjwFAAf8BPgGKATkB/wE7AbEBOwH/ATcBsAE2Af8BTQG2AUwB/wFkAYoBXwH/AYEBmgHAAf8BgQGb
-        AcAB/wE8AQwBEQH/AW0BXgEpAf8BNwGwATYB/wGCASgBIQH/AVABIwETAfUBQQI0AXIBugF/AUEB/gG6
-        AX8BQQH+AYsBewE/Af4BfwGaAXAB/gFJAYQBPgH+AUoBhAE/Af4BUgF/AUEB/gGMAYIBkgH+AZ0BiwGT
-        Af4BpQGoAaEB/wG+Ac0BngH/AdEB0AGBAf8B7QHgAacB/wFgAiIB1gFwAi0B9QFBAjQBcgG6AX8BQQH+
-        AboBfwFBAf4BiwF7AT8B/gF/AZoBcAH+AUkBhAE+Af4BSgGEAT8B/gFSAX8BQQH+AYwBggGSAf4BmQGI
-        AY8B/gIQAdkB/wEQARIB3AH/AS0BKAFXAf4BFAEWAacB/wEmARMBrwH+ASsCKAFCCAABUAGVAUsB/wFP
-        AbYBTgH/ATYBrAE2Af8BcAG0AXAB/wElAXgBmAH/ARABdgHVAf8BKgGBAdkB/wESAXUB0gH/AUgBgQFZ
-        Af8BJgEqARUB/wGDAQsBGgH/AZQBCwEdAf8BWwIcAe8EAAE9AjIBZwHjAZ4BUgH/AeEBlgFDAf8B4AGV
-        AUMB/wGuAY0BawH/AVgBmgFTAf8BgQHJAYEB/wFJAYoBnwH/AYABrgHqAf8BqQHWAf4B/wGqAdcB/gH/
-        AVsBXQFkAf8BfgELARkB/wGUAQsBHQH/AWMBCwEVAf8DBQEHAUQCNAF5AboBfwFBAf4BugF/AUEB/gGx
-        AX8BQQH+AVUBdQE8Af4BfwGVAXoB/gFdAX8BcgH+AXEBfwGtAf4BkQGjAb4B/gGVAaQBvgH+AUQBfAGk
-        Af4BnAGLAYcB/gHRAc4BzQH/AacBkQGQAf4BawIgAewEAAFEAjQBeQG6AX8BQQH+AboBfwFBAf4BsQF/
-        AUEB/gFVAXUBPAH+AX8BlQF6Af4BXQF/AXIB/gFxAX8BrQH+AZEBowG+Af4BlQGkAb4B/gFFAXoBogH+
-        ATYBKQFbAf4BEQESAaYB/wFLARcBMQH4Ax0BKgwAAwcBCgFOATcBJgH2AXIBpwFvAf8BDQF0AdIB/wG4
-        Ad0B/QH/AY0BygL/AYwByQL/AZYBzgH+Af8BbwGlAecB/wFhAZUBjAH/AUwBkgFGAf8BSAI1AYQIAAEv
-        AisBSQHgAZ0BXAH/AdwBjQFBAf8B3AGNAUEB/wGvAWwBTAH/AdcC0QH/AY0BmAGeAf8BmwHIAfMB/wGK
-        AcgC/wGJAcgC/wGJAcgC/wGIAccC/wGKAbwB7wH/ASQCIwE2CAABNQIvAVYBtgF/AUEB/gG1AX8BQQH+
-        AboBfwFhAf4BuwGjAaEB/gGdAYUBhAH+AX0BfwGwAf4BfwGZAb8B/gF/AZkBvwH+AX8BmQG/Af4BfwGZ
-        Ab8B/gFHATcBVAH5EAABNQIvAVYBtgF/AUEB/gG1AX8BQQH+AboBfwFhAf4BuwGjAaEB/gGdAYUBhAH+
-        AX0BfwGwAf4BfwGZAb8B/gF/AZkBvwH+AX8BmQG/Af4BfwGZAb8B/gFHATcBVAH5IAABUwIvAagBtgHc
-        Af0B/wGIAccC/wGIAccC/wGIAccC/wGHAccC/wGJAccB/gH/ATYBgwHeAf8DBAEFEAAB1AGgAYEB/wHU
-        AYIBPwH/AdEBhwFNAf8BbQF2AYcB/wEeAXcBywH/ARMBeAHXAf8BhwHGAf4B/wGDAcQC/wGDAcMC/wGC
-        AcMC/wGBAcMC/wGHAcUB/gH/AVwCIQHZDAABrgF/AXMB/gGxAX8BQQH+AX8BfAF+Af4BUAF/AagB/gFG
-        AXMBlwH+AX8BmgG/Af4BfwGWAb8B/gF/AZYBvwH+AX8BlQG/Af4BfwGVAb8B/gGJAZ4BvAH+AwMBBBAA
-        Aa4BfwFzAf4BsQF/AUEB/gF/AXwBfgH+AVABfwGoAf4BRgFzAZcB/gF/AZoBvwH+AX8BlgG/Af4BfwGW
-        Ab8B/gF/AZUBvwH+AX8BlQG/Af4BiQGeAbwB/gMDAQQcAAEnAYEB4QH/AYMBxAL/AYMBwwL/AYIBwwL/
-        AYEBwwL/AYEBwgL/AYEBwgL/AbMB2gH9Af8BOgIyAWIQAAEbAhoBJgGxAXEBUAH/ASkBewHIAf8BpQHV
-        Af4B/wGDAb0B8AH/ATwBjAHqAf8BgQHAAv8BgQG/Av8BgQG/Av8BgQG/Av8BgQG+Av8BgQG+Av8BJwGB
-        AegB/wwAAwEBAgFZAikBvwGKAZ8BvAH+AX8BmQG+Af4BRwF/AaUB/gF/AZMBvwH+AX8BkQG/Af4BfwGR
-        Ab8B/gF/AZABvwH+AX8BkAG/Af4BgAGdAb4B/gEaAhkBJBAAAwEBAgFZAikBvwGKAZ8BvAH+AX8BmQG+
-        Af4BRwF/AaUB/gF/AZMBvwH+AX8BkQG/Af4BfwGRAb8B/gF/AZABvwH+AX8BkAG/Af4BgAGdAb4B/gEa
-        AhkBJBwAAXQBrAHxAf8BgQHAAv8BgQG/Av8BgQG/Av8BgQG/Av8BgQG+Av8BgQG+Av8BjgHJAf4B/wFW
-        AiwBtBQAAxgBIgGrAdYB/AH/AYYBxgL/AYEBuQHwAf8BLwGIAfEB/wGAAbsC/wF+AbsC/wF9AboC/wF9
-        AboC/wF8AboC/wF7AbkC/wEeAYEB8AH/EAABZAEdAR4B5wF/AZYBvwH+AX8BlgG/Af4BVgF/AaQB/gF/
-        AZYBvwH+AX8BjAG/Af4BfwGMAb8B/gF/AYsBvwH+AX8BiwG/Af4BfwGbAb0B/gMAAQEUAAFkAR0BHgHn
-        AX8BlgG/Af4BfwGWAb8B/gFWAX8BpAH+AX8BlgG/Af4BfwGMAb8B/gF/AYwBvwH+AX8BiwG/Af4BfwGL
-        Ab8B/gF/AZsBvQH+AwABARwAAWoBqQH0Af8BgQG8Av8BgAG7Av8BfgG7Av8BfgG7Av8BfQG6Av8BfAG6
-        Av8BjQHHAf4B/wFSAjEBoxQAAU4CMgGZAYEBwgH+Af8BgQHAAv8BgQG8AfkB/wEzAYYB5gH/AYEBwQH+
-        Af8BdgG3Av8BdgG2Av8BdQG2Av8BdAG2Av8BhgHEAf4B/wFOAjMBmBAAAVoBfwG1Af4BfwGRAb8B/gF/
-        AZEBvwH+AXoBfwGqAf4BcQGAAb4B/gF6AYgBvwH+AXkBiAG/Af4BeQGHAb8B/gF9AYoBvwH+AWQBIQEp
-        AfEYAAFaAX8BtQH+AX8BkQG/Af4BfwGRAb8B/gF6AX8BqgH+AXEBgAG+Af4BegGIAb8B/gF5AYgBvwH+
-        AXkBhwG/Af4BfQGKAb8B/gFkASEBKQHxIAABHgGDAfYB/wF9AboB/gH/AXgBtwL/AXcBtwL/AXcBtwL/
-        AXYBtgL/AXYBtgL/AaQB0QH8Af8BIAIfAS8UAAFOAjMBlQGBAb0B/gH/AYABuwL/AX4BugH+Af8BbAGe
-        AdkB/wFHAZsB/gH/AXgBtwH+Af8BbwGzAv8BbwGzAv8BegG4Af4B/wE7AZUB/gH/FAABXAImAckBfwGL
-        Ab8B/gF/AYsBvwH+AX0BiQG+Af4BYQF/AaEB/gFdAX8BvgH+AX8BmwG+Af4BfwGaAb4B/gFOAS4BQwH2
-        HAABXAImAckBfwGLAb8B/gF/AYsBvwH+AX0BiQG+Af4BYQF/AaEB/gFdAX8BvgH+AX8BmwG+Af4BfwGa
-        Ab4B/gFOAS4BQwH2JAABLwIrAUkBmgHMAf0B/wFyAbQC/wFxAbQC/wFxAbQC/wFwAbMC/wGBAb0B/gH/
-        ATIBfwHNAf4YAAEQAg8BFQGcAc4B/QH/AXYBtgL/AXUBtgL/AXMBtAH8Af8BYAGWAdQB/wEgAYYB/AH/
-        AXkBtQH+Af8BdwG0Af4B/wFcASQBLQHuGAADAgEDAX8BjgG+Af4BdwGGAb8B/gF2AYYBvwH+AX8BmAG+
-        Af4BNAIuAVQDBAEGAwABASAAAwIBAwF/AY4BvgH+AXcBhgG/Af4BdgGGAb8B/gF/AZgBvgH+ATQCLgFU
-        AwQBBgMAAQEsAAFSAjABpwGBAb0B/QH/AYIBwQH+Af8BgQG7Af4B/wGlAdIB/QH/ASgBjAH+Af8DAgED
-        HAABXAEmAScByQGPAccB/gH/AW4BsgL/AXIBtAH+Af8BgAG4Af0B/wMNAREoAAMBAQIBUwIvAagBWwIo
-        AcQDGQEjMAADAQECAVMCLwGoAVsCKAHEAxkBIzwAAwoBDgFRAjABpQFZAiUBxwE6AjIBYigAASsCKAFC
-        AVsCJwHIAVECMQGfAwABAUAAASECIAEwPAABVAIvAasBUAFTAWIB+XgAASECIAEwJAADFgEfAT4CMgFq
-        AUACMwFvATwCMgFmAToCMQFgATcCMAFaAT0CMgFpAXwBpQGuAf4BXAIjAdEBMwIuAVIDAQECFAADFgEf
-        AT4CMgFqAUACMwFvATwCMgFmAToCMQFgATcCMAFaAVIBOQFKAfgBTQGgAb4B/gFNAWABcAH6ATMCLgFS
-        AwEBAhQAAxYBHwE+AjIBagFAAjMBbwE8AjIBZgE6AjEBYAE3AjABWgE6AjEBYAE7AjIBYwE9AjIBZwEr
-        ARkBTwH7ASsBGQF7AfsBKwEZAVsB+wE9AjIBaRgAAwUBBwMGAQgDBAEFAwgBCwF8AaUBrgH+AVwCIwHR
-        AwQBBQMAAQEQAAE6AjEBYAF/AZ8BfwH+AW8BmwFaAf4BbQGaAVgB/gFxAZwBXAH+AXQBnAFgAf4BdwGd
-        AWMB/gF0AZwBYAH+AS8BsAHzAf8BKAGhAecB/wE9AaEB5AH/AW4BfwFaAf4DBAEFDAABOgIxAWABfwGf
-        AX8B/gFvAZsBWgH+AW0BmgFYAf4BcQGcAVwB/gF0AZwBYAH+AXcBnQFjAf4BdAGcAWAB/gFEAYgBpQH+
-        AZIBzAHqAf8BqwGlAaYB/wGsAaoBpgH/AXICJgHzAasClgH+AwQBBgQAAToCMQFgAX8BnwF/Af4BbwGb
-        AVoB/gFtAZoBWAH+AXEBnAFcAf4BdAGcAWAB/gF3AZ0BYwH+AXQBnAFgAf4BcAGRAVsB/gIQAecB/wER
-        ARQBswH/AUwBTQFBAf4BWwEcAR4B7wEmARMBrwH+AUACMwFwDAADCwEPAXoBiAFmAf4BfwGgAXYB/gF/
-        AaABdgH+AX8BoAF3Af4BfwGeAXcB/gEwAbAB8wH/ASgBoQHnAf8BSgF/Aa0B/gF/AZ0BdwH+AUQBfwE0
-        Af4MAAFdAiMB0gFPAZIBQQH+AUsBkAFBAf4BSwGQAUEB/gFLAZABQQH+AXcBnQFiAf4BUwF/AUEB/gFT
-        AZUBQQH+AUsBkAFBAf4BMwHAAe8B/wEoAaEB5wH/AUgBfwGrAf4BOwIyAWQMAAFdAiMB0gFPAZIBQQH+
-        AUsBkAFBAf4BSwGQAUEB/gFLAZABQQH+AXcBnQFiAf4BUwF/AUEB/gFTAZUBQQH+AUsBkAFBAf4BpQGi
-        AaAB/wHFAdwBqwH/AdUB3gGlAf8BXgIgAdgBWgIqAcABswKiAf4EAAFdAiMB0gFPAZIBQQH+AUsBkAFB
-        Af4BSwGQAUEB/gFLAZABQQH+AXcBnQFiAf4BUwF/AUEB/gFTAZUBQQH+ASwBJgFYAf4BEAESAeAB/wEo
-        ARoBbwH+AVIBZAFBAf4BOwIyAWQBXwIdAegBKwEWAXIB/AwAAUICNAF2AVMBlQFBAf4BSwGQAUEB/gFL
-        AZABQQH+AUsBkAFBAf4BeAGFAWQB/gF/AZwBeAH+ATMBwAHvAf8BKAGhAecB/wE/AX8BnwH+AX8BngF3
-        Af4DAQECCAABXgIeAeIBTQGRAUEB/gFLAZABQQH+AUsBkAFBAf4BSwGQAUEB/gFLAX8BQQH+AdABugG4
-        Af4BfgGHAWkB/gFLAZABQQH+AUsBkAFBAf4BMwHAAfAB/wEoAaEB5wH/AWECHwHcDAABXgIeAeIBTQGR
-        AUEB/gFLAZABQQH+AUsBkAFBAf4BSwGQAUEB/gFLAX8BQQH+AdABugG4Af4BfgGHAWkB/gFLAZABQQH+
-        AacCogH/AckB2wGZAf8B0wHaAZQB/wFhAh8B3AFcAiYByQF3ATcBNAH2BAABXgIeAeIBTQGRAUEB/gFL
-        AZABQQH+AUsBkAFBAf4BSwGQAUEB/gFLAX8BQQH+AdABugG4Af4BfgGHAWkB/gEQARMBkwH/AREBFAGU
-        Af8BSwGQAUEB/gERARQBowH/AUgCNAGGAUoCNAGLASYBEwGvAf4MAAFIAjUBgwFQAZMBQQH+AUsBkAFB
-        Af4BSwGQAUEB/gFxAZwBXQH+AZYBnAF/Af4BUAF/AUEB/gFNAZEBQQH+ATMBwAHwAf8BKAGhAecB/wF/
-        AYIBlgH+AwYBCAgAAVwCIAHZAU0BjgFBAf4BSwGNAUEB/gFLAY0BQQH+AWcBmAFUAf4BfwGFAXkB/gHR
-        AroB/gFKAX8BPQH+AU4BjwFBAf4BSwGNAUEB/gFLAY0BQQH+AZYByAHYAf8BmQKEAf4BYgEhASIB2ggA
-        AVwCIAHZAU0BjgFBAf4BSwGNAUEB/gFLAY0BQQH+AWcBmAFUAf4BfwGFAXkB/gHRAroB/gFKAX8BPQH+
-        AU4BjwFBAf4BsQKsAf8ByQHWAYsB/wLUAYEB/wFkAh4B4gFlAh8B5QGJAUwBSwH5BAABXAIgAdkBTQGO
-        AUEB/gFLAY0BQQH+AUsBjQFBAf4BZwGYAVQB/gF/AYUBeQH+AdECugH+AUoBfwE9Af4BNQE2AUwB/gIQ
-        AecB/wFKAYcBQAH+AWkBlQFVAf4BNgEXAZwB/QFdARoBIgHyASsBFgFoAfwDDAEQAa4BfwFoAf4BugGA
-        AXMB/gJ/AUEB/gFSAZABQQH+AUoBiwFAAf4BSgGLAUAB/gF6AYQBZQH+AdEBugG5Af4BwQG0Aa4B/gF/
-        AZ0BdwH+AUoBiwFAAf4BlgHIAdcB/wGyArAB/wFiASEBIgHaCAABUQIyAaABVgGPAUIB/gFKAYcBPwH+
-        AUoBhwE/Af4BfwGWAX0B/gG+AawBqwH+AbkCpQH+AaMBnAGKAf4BfwGeAXsB/gFKAYcBPwH+AUoBhwE/
-        Af4BfwGeAXkB/gJ/AZgB/gFRAUEBmAH+AVECMQGfBAABUQIyAaABVgGPAUIB/gFKAYcBPwH+AUoBhwE/
-        Af4BfwGWAX0B/gG+AawBqwH+AbkCpQH+AaMBnAGKAf4BfwGeAXsB/gGNAYMBfwH+Ab4BzgGfAf8B4QHW
-        AYMB/wFpAR8BHgHmAWACIgHWAXACLQH1BAABUQIyAaABVgGPAUIB/gFKAYcBPwH+AUoBhwE/Af4BfwGW
-        AX0B/gG+AawBqwH+AbkCpQH+AaMBnAGKAf4BfwGcAXsB/gEQAREB2QH/ARABEgHcAf8BNgEsAWAB/gFS
-        ARUBOAH3ASYBEwGvAf4BKwIoAUIBQQI0AXIBugF/AUEB/gG6AX8BQQH+AYsBewE/Af4BfwGaAXAB/gFJ
-        AYQBPgH+AUoBhAE/Af4BUgF/AUEB/gGMAYIBkgH+AZ0BiwGTAf4BaAF/AVIB/gFJAYQBPgH+AUkBhAE+
-        Af4BkQGOAccB/wFRAUEBmAH+AVECMQGfBAADBwEJAX8BigFyAf4BSwGCAUEB/gFIAX8BPQH+AUUBbgFZ
-        Af4BLQFsAaIB/gFOAX8BqAH+ASwBagGgAf4BYwF/AWEB/gFJAX8BPQH+AVIBhwFBAf4BXQF/AUUB/gQA
-        AV8CIAHbAwABAQQAAwcBCQF/AYoBcgH+AUsBggFBAf4BSAF/AT0B/gFFAW4BWQH+AS0BbAGiAf4BTgF/
-        AagB/gEsAWoBoAH+AWMBfwFhAf4BSQF/AT0B/gGWAY0BgAH+AdEBzgHNAf8BpwGRAZAB/gFrAiAB7AgA
-        AwcBCQF/AYoBcgH+AUsBggFBAf4BSAF/AT0B/gFFAW4BWQH+AS0BbAGiAf4BTgF/AagB/gEsAWoBoAH+
-        AWMBfwFhAf4BSAF/AT0B/gEwASoBVAH+ARABEgGlAf8BUgEVASwB9wMdASoEAAFEAjQBeQG6AX8BQQH+
-        AboBfwFBAf4BsQF/AUEB/gFVAXUBPAH+AX8BlQF6Af4BXQF/AXIB/gFxAX8BrQH+AZEBowG+Af4BlQGk
-        Ab4B/gFEAXwBpAH+AWsBggFZAf4BfwGKAXEB/gE7AjIBZAFfAiAB2wMAAQEIAAMSARgBXQEgAR4B8AFM
-        An8B/gGQAaABugH+AX8BmgG/Af4BfwGaAb8B/gF/AZsBvwH+AX8BhwGyAf4BWQF/AWcB/gFbAiIB0wMA
-        AQEUAAMSARgBXQEgAR4B8AFMAn8B/gGQAaABugH+AX8BmgG/Af4BfwGaAb8B/gF/AZsBvwH+AX8BhwGy
-        Af4BWQF/AWcB/gFbAiIB0wMAAQEUAAMSARgBXQEgAR4B8AFMAn8B/gGQAaABugH+AX8BmgG/Af4BfwGa
-        Ab8B/gF/AZsBvwH+AX8BhwGyAf4BWQF/AWcB/gFbAiIB0wMAAQEMAAE1Ai8BVgG2AX8BQQH+AbUBfwFB
-        Af4BugF/AWEB/gG7AaMBoQH+AZ0BhQGEAf4BfQF/AbAB/gF/AZkBvwH+AX8BmQG/Af4BfwGZAb8B/gF/
-        AZkBvwH+AUcBNwFUAfkcAAMDAQQBeQGpAeoB/wF/AZgBvwH+AYcBxgL/AX8BmAG/Af4BfwGYAb8B/gF/
-        AZgBvwH+AUIBfAGoAf4gAAMDAQQBeQGpAeoB/wF/AZgBvwH+AYcBxgL/AX8BmAG/Af4BfwGYAb8B/gF/
-        AZgBvwH+AUIBfAGoAf4gAAMDAQQBeQGpAeoB/wF/AZgBvwH+AYcBxgL/AX8BmAG/Af4BfwGYAb8B/gF/
-        AZgBvwH+AUIBfAGoAf4YAAGuAX8BcwH+AbEBfwFBAf4BfwF8AX4B/gFQAX8BqAH+AUYBcwGXAf4BfwGa
-        Ab8B/gF/AZYBvwH+AX8BlgG/Af4BfwGVAb8B/gF/AZUBvwH+AYkBngG8Af4DAwEEGAABNgIvAVkBiQGg
-        Ab8B/gF/AZYBvwH+AX8BlQG/Af4BfwGVAb8B/gF/AZQBvwH+AX8BlAG/Af4BhAGcAbsB/gMEAQUcAAE2
-        Ai8BWQGJAaABvwH+AX8BlgG/Af4BfwGVAb8B/gF/AZUBvwH+AX8BlAG/Af4BfwGUAb8B/gGEAZwBuwH+
-        AwQBBRwAATYCLwFZAYkBoAG/Af4BfwGWAb8B/gF/AZUBvwH+AX8BlQG/Af4BfwGUAb8B/gF/AZQBvwH+
-        AYQBnAG7Af4DBAEFFAADAQECAVkCKQG/AYoBnwG8Af4BfwGZAb4B/gFHAX8BpQH+AX8BkwG/Af4BfwGR
-        Ab8B/gF/AZEBvwH+AX8BkAG/Af4BfwGQAb8B/gGAAZ0BvgH+ARoCGQEkGAABRwI0AYEBjgHIAf4B/wF/
-        AZEBvwH+AYEBvQL/AX8BkQG/Af4BfwGQAb8B/gF/AZABvwH+AZIBogG+Af4DFAEcHAABRwI0AYEBjgHI
-        Af4B/wF/AZEBvwH+AYEBvQL/AX8BkQG/Af4BfwGQAb8B/gF/AZABvwH+AZIBogG+Af4DFAEcHAABRwI0
-        AYEBjgHIAf4B/wF/AZEBvwH+AYEBvQL/AX8BkQG/Af4BfwGQAb8B/gF/AZABvwH+AZIBogG+Af4DFAEc
-        GAABZAEdAR4B5wF/AZYBvwH+AX8BlgG/Af4BVgF/AaQB/gF/AZYBvwH+AX8BjAG/Af4BfwGMAb8B/gF/
-        AYsBvwH+AX8BiwG/Af4BfwGbAb0B/gMAAQEYAAEmAiQBOQGKAaABvgH+AX8BjQG/Af4BfwGMAb8B/gF/
-        AYwBvwH+AX8BjAG/Af4BfwGLAb8B/gF/AZUBvAH+IAABJgIkATkBigGgAb4B/gF/AY0BvwH+AX8BjAG/
-        Af4BfwGMAb8B/gF/AYwBvwH+AX8BiwG/Af4BfwGVAbwB/iAAASYCJAE5AYoBoAG+Af4BfwGNAb8B/gF/
-        AYwBvwH+AX8BjAG/Af4BfwGMAb8B/gF/AYsBvwH+AX8BlQG8Af4cAAFaAX8BtQH+AX8BkQG/Af4BfwGR
-        Ab8B/gF6AX8BqgH+AXEBgAG+Af4BegGIAb8B/gF5AYgBvwH+AXkBhwG/Af4BfQGKAb8B/gFkASEBKQHx
-        IAABSwGaAfsB/wF8AYkBvwH+AXgBtQL/AXoBiAG/Af4BegGIAb8B/gF/AY0BvwH+AU0BLAFBAfYkAAFL
-        AZoB+wH/AXwBiQG/Af4BeAG1Av8BegGIAb8B/gF6AYgBvwH+AX8BjQG/Af4BTQEsAUEB9iQAAUsBmgH7
-        Af8BfAGJAb8B/gF4AbUC/wF6AYgBvwH+AXoBiAG/Af4BfwGNAb8B/gFNASwBQQH2HAABXAImAckBfwGL
-        Ab8B/gF/AYsBvwH+AX0BiQG+Af4BYQF/AaEB/gFdAX8BvgH+AX8BmwG+Af4BfwGaAb4B/gFOAS4BQwH2
-        JAADGQEjAWwBfwG/Af4BfwGRAb8B/gF6AYgBvwH+AX8BlwG/Af4BSwF/Ab8B/gMAAQEkAAMZASMBbAF/
-        Ab8B/gF/AZEBvwH+AXoBiAG/Af4BfwGXAb8B/gFLAX8BvwH+AwABASQAAxkBIwFsAX8BvwH+AX8BkQG/
-        Af4BegGIAb8B/gF/AZcBvwH+AUsBfwG/Af4DAAEBHAADAgEDAX8BjgG+Af4BdwGGAb8B/gF2AYYBvwH+
-        AX8BmAG+Af4BNAIuAVQDBAEGAwABATAAAUwCMwGTAVwCJAHPAUICNAF2NAABTAIzAZMBXAIkAc8BQgI0
-        AXY0AAFMAjMBkwFcAiQBzwFCAjQBdigAAwEBAgFTAi8BqAFbAigBxAMZASMkAAFCAU0BPgcAAT4DAAEo
-        AwABQAMAATADAAEBAQABAQUAAYABARYAA/+BAAH/AT8C/wHAAQEB8AEAAfgBBwH4AQEBgAEBAfABAAHg
-        AQAB4AEAAYABAQHwAQAB4AEAAeABAAGAAQEBgAEAAeABAAHgAQABgAcAAYAHAAHAAQEDAAEBAQABAQHA
-        AQMBAAEDAQABDwEAAQ8B8AEHAYABAwGAAQcBgAEHAfABBwGAAQMBgAEHAYABBwHwAQcBwAEDAcABBwHA
-        AQcB8AEHAcABAwHAAQ8BwAEPAfABBwHAAQcBwAEfAcABHwHwAQ8BwAEPAcABPwHAAT8B+AEPAeABfwHh
-        Af8B4QH/AfwBPwHwAv8BfwH/AT8D/wF/AcABBwHAAQcBwAEBAfgBBwGAAQMBgAEAAYABAAHgAQMBgAED
-        AYABAAGAAQAB4AEBAYABAwGAAQABgAEAAeABAQGAAQEBgAEAAYACAAEBAYABAAGAAQABgAMAAYABBAGA
-        AQEBgAEBAgABwAEHAcABBwHAAQcBAAEPAeABHwHgAR8B4AEfAYABBwHgAQ8B4AEPAeABDwGAAQcB4AEP
-        AeABDwHgAQ8BwAEHAeABHwHgAR8B4AEfAcABDwHwAR8B8AEfAfABHwHAAR8B8AEfAfABHwHwAR8BwAE/
-        AfwBfwH8AX8B/AF/AeEB/ws=
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC+
+        KQAAAk1TRnQBSQFMAgEBCAEAATwBAAE8AQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABMAMAAQEBAAEgBgABMP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AQgABVAJSAasBTAFP
+        AWIB+WAAAR4BbAEQAf4BXwGlAV4B/wFsAa8BawH/AWgBrAFoAf8BYwGoAWMB/wFfAaUBXwH/AV0BowFc
+        Af8BYAGmAWAB/wFiAacBYQH/AWQBqQFkAf8BPgGBAT4B/wEHATwBBwH/AzUBVxQAA0QBeQExAYUBMQH/
+        AUsBlwFKAf8BSAGVAUcB/wFDAZEBQwH/AT0BjQE9Af8BPAGMATwB/wFBAY8BQAH/AT8BiwE/Af8BBwE1
+        AQcB/wEaAYEBGgH/Ay0BRhQAAwUBBwMGAQgDBAEFAV4CTwHVAU0BmAG2Af4BTAFPAWMB+QMEAQUDAAEB
+        IAADBQEHAwYBCAMEAQUDAgEDAwIBAwMdASkBKwEhAU8B+wErASEBbwH7ASsBIQFbAfsDPQFpCAADPQFp
+        AYEB1QGBAf8BOAG9ATYB/wE4Ab0BNgH/ATgBvQE2Af8BOAG9ATYB/wE+Ab4BPAH/AVsByAFaAf8BOAG9
+        ATYB/wE4Ab0BNgH/ATgBvQE2Af8BUwF6ASkB/wGTAQcBGAH/ARcBgQEXAf8UAAFPAZoBTwH/ATgBvQE2
+        Af8BOAG9ATYB/wE4Ab0BNgH/ATgBvQE2Af8BTgHEAUwB/wFJAcIBRwH/ATgBvQE2Af8BNgG3ATQB/wGU
+        AQcBGQH/ATgBvQE2Af8BMQGGATEB/wwAAwsBDwF6AYABZgH+AX8BmAF2Af4BfwGYAXYB/gF/AZgBdwH+
+        AX8BlgF3Af4BRgGBAZ8B/gGSAcwB6gH/AasBpQGmAf8BqQGqAaMB/wGxAbABqwH/AaMCjgH+AwQBBgwA
+        AwsBDwF6AYABZgH+AX8BmAF2Af4BfwGYAXYB/gF/AZgBdwH+AX8BlgF3Af4BfwGMAXQB/gIMAecB/wEO
+        ARABtAH/AUMBTAFBAf4BLQEgAWoB/gEmARMBpwH+A0ABcAQAAVACTwGeAWMBygFiAf8BOAG9ATYB/wE4
+        Ab0BNgH/ATgBvQE2Af8BOAG9ATYB/wFNAZgBTAH/AS0BgQErAf8BdwHRAXUB/wE4Ab0BNgH/ATgBvQE2
+        Af8BNwG8ATUB/wEsAZABKgH/AUsBlwFKAf8UAAFwAbMBbwH/ATgBvQE2Af8BOAG9ATYB/wE4Ab0BNgH/
+        AT8BvwE9Af8BGwGBARkB/wEaAYEBGQH/ATwBvgE6Af8BOAG9ATYB/wEjAXUBIgH/ATgBvQE2Af8BXgGl
+        AV0B/wwAA0IBdgFTAY0BQQH+AUsBiAFBAf4BSwGIAUEB/gFLAYgBQQH+AXgBfwFkAf4BfwGUAXgB/gGl
+        AaIBoAH/AcUB3AGrAf8BygHbAZkB/wHcAdsBnQH/AVgCUwHBAasCmgH+DAADQgF2AVMBjQFBAf4BSwGI
+        AUEB/gFLAYgBQQH+AUsBiAFBAf4BeAF/AWQB/gE1ASgBYgH+AQwBDgHgAf8BDgETAYAB/wE/AVgBLwH+
+        AX8BlgF3Af4BXAE9AT4B6gErARoBbgH8BAABUQJQAaIBYQHJAWAB/wE3AbwBNgH/ATcBvAE2Af8BNwG8
+        ATYB/wFwAc4BbwH/AWcBoAFjAv8C9wH/AVUBngFUAf8BNwG8ATYB/wE3AbwBNgH/ASsBjQEqAf8BjQEH
+        ARgB/wEnAUsBIQH/CAADFAEcAz8BbQFAAj8BbwF1AbYBdAH/ATcBuwE2Af8BNwG7ATYB/wE3AbsBNgH/
+        AYYB0AGFAf8B5wHqAeAB/wHUAeEBzgH/AYQB0wGDAf8BNwG7ATYB/wGUAQcBGQH/ASwBOAEWAf8BZQGp
+        AWQB/wwAAUgCRwGDAVABiwFBAf4BSwGIAUEB/gFLAYgBQQH+AXEBlAFdAf4BjgGUAX8B/gFQAX8BQQH+
+        AacCogH/AckB2wGZAf8ByQHXAYsB/wHbAdYBhgH/AV0CUwHKAW4BPQE4AfYMAAFIAkcBgwFQAYsBQQH+
+        AUsBiAFBAf4BSwGIAUEB/gFxAZQBXQH+AY4BlAF/Af4BDAEOAZMB/wENARABlAH/AUsBiAFBAf4BDQEQ
+        AaMB/wFyAX8BXgH+A0wBkwEmARMBpwH+BAADTAGTAWgByQFnAf8BNgG4ATUB/wE2AbgBNQH/ATYBuAE1
+        Af8BgQG5AYAB/wH8AfUB9AH/Af4C9gH/AT4BiwE6Af8BTwHBAU4B/wE2AbgBNQH/ATYBuAE1Af8BQQGj
+        ATEB/wGUAQcBGQH/AywBRAMSARgB6AG4AYIB/wHkAZ8BTgH/AcwBjgFGAf8BbwGvAW0B/wE1AbYBNAH/
+        ATUBtgE0Af8BNQG2ATQB/wFHAZMBRAH/AfwB9QH0Af8B/AH1AfQB/wFTAZsBUQH/ATUBtgE0Af8BNwGy
+        ATQB/wGRAQsBGQH/ASABNAETAf8DDAEQAaYBfwFoAf4BsgF/AXMB/gJ/AUEB/gFSAYgBQQH+AUoBgwFA
+        Af4BSgGDAUAB/gF6AX8BZQH+AckBsgGxAf4BuQGsAaYB/gGxAqwB/wHJAdYBiwH/AckB0AGBAf8B4QHX
+        AYQB/wFlAkUB5QGFAUgBRwH5AwwBEAGmAX8BaAH+AbIBfwFzAf4CfwFBAf4BUgGIAUEB/gFKAYMBQAH+
+        AUoBgwFAAf4BegF/AWUB/gHJAbIBsQH+AUoBPgFpAf4CDAHnAf8BSgF/AUAB/gFKAX8BQAH+AQ4BEAHH
+        Af8BWQEyATYB8gErARoBZAH8BAADMgFQAYgB0wGHAf8BNAGzATMB/wE0AbMBMwH/ATgBtAE3Af8BMAGB
+        ASwB/wHfAtgB/wHZAtIB/wHAAc0BuQH/AY4B0AGNAf8BbwEHARMB/wFDAZgBLwH/ATUBswE1Af8BlAEH
+        ARkB/wE1AjQBVQM7AWQB5QGgAVAB/wHjAZgBQAH/AdUBjwE8Af8BOgGKATUB/wE3AbEBNwH/ATMBsAEy
+        Af8BSQG2AUgB/wFgAYoBWwH/AYEBmgHAAf8BgQGbAcAB/wE4AQgBDQH/AWkBWgElAf8BMwGwATIB/wGC
+        ASQBHQH/AVQBLwElAfUDQQFyAbIBfwFBAf4BsgF/AUEB/gGDAXsBPwH+AX8BkgFwAf4BSQF/AT4B/gFK
+        AX8BPwH+AVIBfwFBAf4BhAF/AYoB/gGVAYMBiwH+AaUBqAGhAf8BvgHNAZ4B/wHRAdABgQH/Ae0B4AGn
+        Af8BYAJPAdYBbAI1AfUDQQFyAbIBfwFBAf4BsgF/AUEB/gGDAXsBPwH+AX8BkgFwAf4BSQF/AT4B/gFK
+        AX8BPwH+AVIBfwFBAf4BhAF/AYoB/gGRAYABhwH+AgwB2QH/AQwBDgHcAf8BLQEoAVcB/gEQARIBpwH/
+        ASYBEwGnAf4DKwFCCAABTAGVAUcB/wFLAbYBSgH/ATIBrAEyAf8BbAG0AWwB/wEhAXQBmAH/AQwBcgHV
+        Af8BJgGBAdkB/wEOAXEB0gH/AUQBgQFVAf8BIgEmAREB/wGDAQcBFgH/AZQBBwEZAf8BWAI0Ae8EAAE9
+        AjwBZwHjAZ4BTgH/AeEBlgE/Af8B4AGVAT8B/wGuAY0BZwH/AVQBmgFPAf8BgQHJAYEB/wFFAYoBnwH/
+        AYABrgHqAf8BqQHWAf4B/wGqAdcB/gH/AVcBWQFgAf8BegEHARUB/wGUAQcBGQH/AV8BBwERAf8DBQEH
+        A0QBeQGyAX8BQQH+AbIBfwFBAf4BqQF/AUEB/gFVAXUBPAH+AX8BjQF6Af4BXQF/AXIB/gFxAX8BpQH+
+        AYkBmwG2Af4BjQGcAbYB/gFEAXwBnAH+AZQBgwF/Af4B0QHOAc0B/wGfAYkBiAH+AWQCPgHsBAADRAF5
+        AbIBfwFBAf4BsgF/AUEB/gGpAX8BQQH+AVUBdQE8Af4BfwGNAXoB/gFdAX8BcgH+AXEBfwGlAf4BiQGb
+        AbYB/gGNAZwBtgH+AUUBegGaAf4BNgEpAVsB/gENAQ4BpgH/AU8BIQE6AfgDHQEqDAADBwEKAUoBPQEx
+        AfYBbgGnAWsB/wEJAXAB0gH/AbgB3QH9Af8BjQHKAv8BjAHJAv8BlgHOAf4B/wFrAaUB5wH/AV0BlQGM
+        Af8BSAGSAUIB/wNIAYQIAAMvAUkB4AGdAVgB/wHcAY0BPQH/AdwBjQE9Af8BrwFoAUgB/wHXAtEB/wGN
+        AZgBngH/AZsByAHzAf8BigHIAv8BiQHIAv8BiQHIAv8BiAHHAv8BigG8Ae8B/wMkATYIAAM1AVYBrgF/
+        AUEB/gGtAX8BQQH+AbIBfwFhAf4BswGbAZkB/gGVAn8B/gF9AX8BqAH+AX8BkQG3Af4BfwGRAbcB/gF/
+        AZEBtwH+AX8BkQG3Af4BRwE/AVAB+RAAAzUBVgGuAX8BQQH+Aa0BfwFBAf4BsgF/AWEB/gGzAZsBmQH+
+        AZUCfwH+AX0BfwGoAf4BfwGRAbcB/gF/AZEBtwH+AX8BkQG3Af4BfwGRAbcB/gFHAT8BUAH5IAABUwJQ
+        AagBtgHcAf0B/wGIAccC/wGIAccC/wGIAccC/wGHAccC/wGJAccB/gH/ATIBgwHeAf8DBAEFEAAB1AGg
+        AYEB/wHUAYIBOwH/AdEBhwFJAf8BaQFyAYcB/wEaAXMBywH/AQ8BdAHXAf8BhwHGAf4B/wGDAcQC/wGD
+        AcMC/wGCAcMC/wGBAcMC/wGHAcUB/gH/AVsCTQHZDAABpgF/AXMB/gGpAX8BQQH+AX8BfAF+Af4BUAF/
+        AaAB/gFGAXMBjwH+AX8BkgG3Af4BfwGOAbcB/gF/AY4BtwH+AX8BjQG3Af4BfwGNAbcB/gGBAZYBtAH+
+        AwMBBBAAAaYBfwFzAf4BqQF/AUEB/gF/AXwBfgH+AVABfwGgAf4BRgFzAY8B/gF/AZIBtwH+AX8BjgG3
+        Af4BfwGOAbcB/gF/AY0BtwH+AX8BjQG3Af4BgQGWAbQB/gMDAQQcAAEjAYEB4QH/AYMBxAL/AYMBwwL/
+        AYIBwwL/AYEBwwL/AYEBwgL/AYEBwgL/AbMB2gH9Af8DOgFiEAADGwEmAbEBbQFMAf8BJQF3AcgB/wGl
+        AdUB/gH/AYMBvQHwAf8BOAGMAeoB/wGBAcAC/wGBAb8C/wGBAb8C/wGBAb8C/wGBAb4C/wGBAb4C/wEj
+        AYEB6AH/DAADAQECAVkCVAG/AYIBlwG0Af4BfwGRAbYB/gFHAX8BnQH+AX8BiwG3Af4BfwGJAbcB/gF/
+        AYkBtwH+AX8BiAG3Af4BfwGIAbcB/gF/AZUBtgH+AxoBJBAAAwEBAgFZAlQBvwGCAZcBtAH+AX8BkQG2
+        Af4BRwF/AZ0B/gF/AYsBtwH+AX8BiQG3Af4BfwGJAbcB/gF/AYgBtwH+AX8BiAG3Af4BfwGVAbYB/gMa
+        ASQcAAFwAawB8QH/AYEBwAL/AYEBvwL/AYEBvwL/AYEBvwL/AYEBvgL/AYEBvgL/AY4ByQH+Af8BVgJS
+        AbQUAAMYASIBqwHWAfwB/wGGAcYC/wGBAbkB8AH/ASsBiAHxAf8BgAG7Av8BegG7Av8BeQG6Av8BeQG6
+        Av8BeAG6Av8BdwG5Av8BGgGBAfAB/xAAAWQCQAHnAX8BjgG3Af4BfwGOAbcB/gFWAX8BnAH+AX8BjgG3
+        Af4BfwGEAbcB/gF/AYQBtwH+AX8BgwG3Af4BfwGDAbcB/gF/AZMBtQH+AwABARQAAWQCQAHnAX8BjgG3
+        Af4BfwGOAbcB/gFWAX8BnAH+AX8BjgG3Af4BfwGEAbcB/gF/AYQBtwH+AX8BgwG3Af4BfwGDAbcB/gF/
+        AZMBtQH+AwABARwAAWYBqQH0Af8BgQG8Av8BgAG7Av8BegG7Av8BegG7Av8BeQG6Av8BeAG6Av8BjQHH
+        Af4B/wFSAlABoxQAA04BmQGBAcIB/gH/AYEBwAL/AYEBvAH5Af8BLwGGAeYB/wGBAcEB/gH/AXIBtwL/
+        AXIBtgL/AXEBtgL/AXABtgL/AYYBxAH+Af8DTgGYEAABWgF/Aa0B/gF/AYkBtwH+AX8BiQG3Af4BegF/
+        AaIB/gFxAX8BtgH+AXoBgAG3Af4BeQGAAbcB/gF5AX8BtwH+AX0BggG3Af4BZAE3AT0B8RgAAVoBfwGt
+        Af4BfwGJAbcB/gF/AYkBtwH+AXoBfwGiAf4BcQF/AbYB/gF6AYABtwH+AXkBgAG3Af4BeQF/AbcB/gF9
+        AYIBtwH+AWQBNwE9AfEgAAEaAYMB9gH/AXkBugH+Af8BdAG3Av8BcwG3Av8BcwG3Av8BcgG2Av8BcgG2
+        Av8BpAHRAfwB/wMgAS8UAAFOAk0BlQGBAb0B/gH/AYABuwL/AXoBugH+Af8BaAGeAdkB/wFDAZsB/gH/
+        AXQBtwH+Af8BawGzAv8BawGzAv8BdgG4Af4B/wE3AZUB/gH/FAABXAJTAckBfwGDAbcB/gF/AYMBtwH+
+        AX0BgQG2Af4BYQF/AZkB/gFdAX8BtgH+AX8BkwG2Af4BfwGSAbYB/gFKATMBSAH2HAABXAJTAckBfwGD
+        AbcB/gF/AYMBtwH+AX0BgQG2Af4BYQF/AZkB/gFdAX8BtgH+AX8BkwG2Af4BfwGSAbYB/gFKATMBSAH2
+        JAADLwFJAZoBzAH9Af8BbgG0Av8BbQG0Av8BbQG0Av8BbAGzAv8BgQG9Af4B/wEyAX8BxQH+GAADEAEV
+        AZwBzgH9Af8BcgG2Av8BcQG2Av8BbwG0AfwB/wFcAZYB1AH/ARwBhgH8Af8BdQG1Af4B/wFzAbQB/gH/
+        AVwBPAFCAe4YAAMCAQMBfwGGAbYB/gF3AX8BtwH+AXYBfwG3Af4BfwGQAbYB/gM0AVQDBAEGAwABASAA
+        AwIBAwF/AYYBtgH+AXcBfwG3Af4BdgF/AbcB/gF/AZABtgH+AzQBVAMEAQYDAAEBLAABUgJRAacBgQG9
+        Af0B/wGCAcEB/gH/AYEBuwH+Af8BpQHSAf0B/wEkAYwB/gH/AwIBAxwAAVwBUwFUAckBjwHHAf4B/wFq
+        AbIC/wFuAbQB/gH/AYABuAH9Af8DDQERKAADAQECAVMCUAGoAVsCVAHEAxkBIzAAAwEBAgFTAlABqAFb
+        AlQBxAMZASM8AAMKAQ4BUQJPAaUBWQJRAccDOgFiKAADKwFCAVsCVAHIAVECUAGfAwABAUAAAyEBMDwA
+        AVQCUgGrAUwBTwFiAfl4AAMhATAkAAMWAR8BPgI9AWoBQAI/AW8DPAFmAToCOQFgAzcBWgM9AWkBfAGd
+        AaYB/gFcAlAB0QMzAVIDAQECFAADFgEfAT4CPQFqAUACPwFvAzwBZgE6AjkBYAM3AVoBVgE9AU4B+AFN
+        AZgBtgH+AU0BWAFsAfoDMwFSAwEBAhQAAxYBHwE+Aj0BagFAAj8BbwM8AWYBOgI5AWADNwFaAToCOQFg
+        AzsBYwE9AjwBZwErASEBTwH7ASsBIQFvAfsBKwEhAVsB+wM9AWkYAAMFAQcDBgEIAwQBBQMIAQsBfAGd
+        AaYB/gFcAlAB0QMEAQUDAAEBEAABOgI5AWABfwGXAX8B/gFvAZMBWgH+AW0BkgFYAf4BcQGUAVwB/gF0
+        AZQBYAH+AXcBlQFjAf4BdAGUAWAB/gErAbAB8wH/ASQBoQHnAf8BOQGhAeQB/wFuAX8BWgH+AwQBBQwA
+        AToCOQFgAX8BlwF/Af4BbwGTAVoB/gFtAZIBWAH+AXEBlAFcAf4BdAGUAWAB/gF3AZUBYwH+AXQBlAFg
+        Af4BRAGAAZ0B/gGSAcwB6gH/AasBpQGmAf8BrAGqAaYB/wFtAjgB8wGjAo4B/gMEAQYEAAE6AjkBYAF/
+        AZcBfwH+AW8BkwFaAf4BbQGSAVgB/gFxAZQBXAH+AXQBlAFgAf4BdwGVAWMB/gF0AZQBYAH+AXABiQFb
+        Af4CDAHnAf8BDQEQAbMB/wFMAU0BQQH+AVgBNAE3Ae8BJgETAacB/gNAAXAMAAMLAQ8BegGAAWYB/gF/
+        AZgBdgH+AX8BmAF2Af4BfwGYAXcB/gF/AZYBdwH+ASwBsAHzAf8BJAGhAecB/wFKAX8BpQH+AX8BlQF3
+        Af4BRAF/ATQB/gwAAV0CUAHSAU8BigFBAf4BSwGIAUEB/gFLAYgBQQH+AUsBiAFBAf4BdwGVAWIB/gFT
+        AX8BQQH+AVMBjQFBAf4BSwGIAUEB/gEvAcAB7wH/ASQBoQHnAf8BSAF/AaMB/gM7AWQMAAFdAlAB0gFP
+        AYoBQQH+AUsBiAFBAf4BSwGIAUEB/gFLAYgBQQH+AXcBlQFiAf4BUwF/AUEB/gFTAY0BQQH+AUsBiAFB
+        Af4BpQGiAaAB/wHFAdwBqwH/AdUB3gGlAf8BXgJLAdgBWgJUAcABqwKaAf4EAAFdAlAB0gFPAYoBQQH+
+        AUsBiAFBAf4BSwGIAUEB/gFLAYgBQQH+AXcBlQFiAf4BUwF/AUEB/gFTAY0BQQH+ASwBJgFYAf4BDAEO
+        AeAB/wEoARoBbwH+AVIBZAFBAf4DOwFkAV8CQAHoASsBGgFuAfwMAANCAXYBUwGNAUEB/gFLAYgBQQH+
+        AUsBiAFBAf4BSwGIAUEB/gF4AX8BZAH+AX8BlAF4Af4BLwHAAe8B/wEkAaEB5wH/AT8BfwGXAf4BfwGW
+        AXcB/gMBAQIIAAFdAkgB4gFNAYkBQQH+AUsBiAFBAf4BSwGIAUEB/gFLAYgBQQH+AUsBfwFBAf4ByAGy
+        AbAB/gF+AX8BaQH+AUsBiAFBAf4BSwGIAUEB/gEvAcAB8AH/ASQBoQHnAf8BYQJMAdwMAAFdAkgB4gFN
+        AYkBQQH+AUsBiAFBAf4BSwGIAUEB/gFLAYgBQQH+AUsBfwFBAf4ByAGyAbAB/gF+AX8BaQH+AUsBiAFB
+        Af4BpwKiAf8ByQHbAZkB/wHTAdoBlAH/AWECTAHcAVwCUwHJAW4BPQE4AfYEAAFdAkgB4gFNAYkBQQH+
+        AUsBiAFBAf4BSwGIAUEB/gFLAYgBQQH+AUsBfwFBAf4ByAGyAbAB/gF+AX8BaQH+AQwBDwGTAf8BDQEQ
+        AZQB/wFLAYgBQQH+AQ0BEAGjAf8DSAGGA0oBiwEmARMBpwH+DAABSAJHAYMBUAGLAUEB/gFLAYgBQQH+
+        AUsBiAFBAf4BcQGUAV0B/gGOAZQBfwH+AVABfwFBAf4BTQGJAUEB/gEvAcAB8AH/ASQBoQHnAf8CfwGO
+        Af4DBgEICAABWwJNAdkBTQGGAUEB/gFLAYUBQQH+AUsBhQFBAf4BZwGQAVQB/gJ/AXkB/gHJArIB/gFK
+        AX8BPQH+AU4BhwFBAf4BSwGFAUEB/gFLAYUBQQH+AZYByAHYAf8BkQJ/Af4BYQFNAU8B2ggAAVsCTQHZ
+        AU0BhgFBAf4BSwGFAUEB/gFLAYUBQQH+AWcBkAFUAf4CfwF5Af4ByQKyAf4BSgF/AT0B/gFOAYcBQQH+
+        AbECrAH/AckB1gGLAf8C1AGBAf8BYQJIAeIBZQJFAeUBhQFIAUcB+QQAAVsCTQHZAU0BhgFBAf4BSwGF
+        AUEB/gFLAYUBQQH+AWcBkAFUAf4CfwF5Af4ByQKyAf4BSgF/AT0B/gE1ATYBTAH+AgwB5wH/AUoBfwFA
+        Af4BaQGNAVUB/gE6ARsBnAH9AVkBMgE2AfIBKwEaAWQB/AMMARABpgF/AWgB/gGyAX8BcwH+An8BQQH+
+        AVIBiAFBAf4BSgGDAUAB/gFKAYMBQAH+AXoBfwFlAf4ByQGyAbEB/gG5AawBpgH+AX8BlQF3Af4BSgGD
+        AUAB/gGWAcgB1wH/AbICsAH/AWEBTQFPAdoIAANRAaABVgGHAUIB/gFKAX8BPwH+AUoBfwE/Af4BfwGO
+        AX0B/gG2AaQBowH+AbECnQH+AZsBlAGCAf4BfwGWAXsB/gFKAX8BPwH+AUoBfwE/Af4BfwGWAXkB/gJ/
+        AZAB/gFRAUEBkAH+AVECUAGfBAADUQGgAVYBhwFCAf4BSgF/AT8B/gFKAX8BPwH+AX8BjgF9Af4BtgGk
+        AaMB/gGxAp0B/gGbAZQBggH+AX8BlgF7Af4BhQJ/Af4BvgHOAZ8B/wHhAdYBgwH/AWQBRQFDAeYBYAJP
+        AdYBbAI1AfUEAANRAaABVgGHAUIB/gFKAX8BPwH+AUoBfwE/Af4BfwGOAX0B/gG2AaQBowH+AbECnQH+
+        AZsBlAGCAf4BfwGUAXsB/gEMAQ0B2QH/AQwBDgHcAf8BNgEsAWAB/gFSASIBPAH3ASYBEwGnAf4DKwFC
+        A0EBcgGyAX8BQQH+AbIBfwFBAf4BgwF7AT8B/gF/AZIBcAH+AUkBfwE+Af4BSgF/AT8B/gFSAX8BQQH+
+        AYQBfwGKAf4BlQGDAYsB/gFoAX8BUgH+AUkBfwE+Af4BSQF/AT4B/gGRAY4BxwH/AVEBQQGQAf4BUQJQ
+        AZ8EAAMHAQkBfwGCAXIB/gFLAX8BQQH+AUgBfwE9Af4BRQFuAVkB/gEtAWwBmgH+AU4BfwGgAf4BLAFq
+        AZgB/gFjAX8BYQH+AUkBfwE9Af4BUgF/AUEB/gFdAX8BRQH+BAABXwJLAdsDAAEBBAADBwEJAX8BggFy
+        Af4BSwF/AUEB/gFIAX8BPQH+AUUBbgFZAf4BLQFsAZoB/gFOAX8BoAH+ASwBagGYAf4BYwF/AWEB/gFJ
+        AX8BPQH+AY4BhQF/Af4B0QHOAc0B/wGfAYkBiAH+AWQCPgHsCAADBwEJAX8BggFyAf4BSwF/AUEB/gFI
+        AX8BPQH+AUUBbgFZAf4BLQFsAZoB/gFOAX8BoAH+ASwBagGYAf4BYwF/AWEB/gFIAX8BPQH+ATABKgFU
+        Af4BDAEOAaUB/wFSASIBNgH3Ax0BKgQAA0QBeQGyAX8BQQH+AbIBfwFBAf4BqQF/AUEB/gFVAXUBPAH+
+        AX8BjQF6Af4BXQF/AXIB/gFxAX8BpQH+AYkBmwG2Af4BjQGcAbYB/gFEAXwBnAH+AWsBfwFZAf4BfwGC
+        AXEB/gM7AWQBXwJLAdsDAAEBCAADEgEYAV0BNQE0AfABTAJ/Af4BiAGYAbIB/gF/AZIBtwH+AX8BkgG3
+        Af4BfwGTAbcB/gJ/AaoB/gFZAX8BZwH+AVoCTgHTAwABARQAAxIBGAFdATUBNAHwAUwCfwH+AYgBmAGy
+        Af4BfwGSAbcB/gF/AZIBtwH+AX8BkwG3Af4CfwGqAf4BWQF/AWcB/gFaAk4B0wMAAQEUAAMSARgBXQE1
+        ATQB8AFMAn8B/gGIAZgBsgH+AX8BkgG3Af4BfwGSAbcB/gF/AZMBtwH+An8BqgH+AVkBfwFnAf4BWgJO
+        AdMDAAEBDAADNQFWAa4BfwFBAf4BrQF/AUEB/gGyAX8BYQH+AbMBmwGZAf4BlQJ/Af4BfQF/AagB/gF/
+        AZEBtwH+AX8BkQG3Af4BfwGRAbcB/gF/AZEBtwH+AUcBPwFQAfkcAAMDAQQBdQGpAeoB/wF/AZABtwH+
+        AYcBxgL/AX8BkAG3Af4BfwGQAbcB/gF/AZABtwH+AUIBfAGgAf4gAAMDAQQBdQGpAeoB/wF/AZABtwH+
+        AYcBxgL/AX8BkAG3Af4BfwGQAbcB/gF/AZABtwH+AUIBfAGgAf4gAAMDAQQBdQGpAeoB/wF/AZABtwH+
+        AYcBxgL/AX8BkAG3Af4BfwGQAbcB/gF/AZABtwH+AUIBfAGgAf4YAAGmAX8BcwH+AakBfwFBAf4BfwF8
+        AX4B/gFQAX8BoAH+AUYBcwGPAf4BfwGSAbcB/gF/AY4BtwH+AX8BjgG3Af4BfwGNAbcB/gF/AY0BtwH+
+        AYEBlgG0Af4DAwEEGAADNgFZAYEBmAG3Af4BfwGOAbcB/gF/AY0BtwH+AX8BjQG3Af4BfwGMAbcB/gF/
+        AYwBtwH+AX8BlAGzAf4DBAEFHAADNgFZAYEBmAG3Af4BfwGOAbcB/gF/AY0BtwH+AX8BjQG3Af4BfwGM
+        AbcB/gF/AYwBtwH+AX8BlAGzAf4DBAEFHAADNgFZAYEBmAG3Af4BfwGOAbcB/gF/AY0BtwH+AX8BjQG3
+        Af4BfwGMAbcB/gF/AYwBtwH+AX8BlAGzAf4DBAEFFAADAQECAVkCVAG/AYIBlwG0Af4BfwGRAbYB/gFH
+        AX8BnQH+AX8BiwG3Af4BfwGJAbcB/gF/AYkBtwH+AX8BiAG3Af4BfwGIAbcB/gF/AZUBtgH+AxoBJBgA
+        AUcCRgGBAY4ByAH+Af8BfwGJAbcB/gGBAb0C/wF/AYkBtwH+AX8BiAG3Af4BfwGIAbcB/gGKAZoBtgH+
+        AxQBHBwAAUcCRgGBAY4ByAH+Af8BfwGJAbcB/gGBAb0C/wF/AYkBtwH+AX8BiAG3Af4BfwGIAbcB/gGK
+        AZoBtgH+AxQBHBwAAUcCRgGBAY4ByAH+Af8BfwGJAbcB/gGBAb0C/wF/AYkBtwH+AX8BiAG3Af4BfwGI
+        AbcB/gGKAZoBtgH+AxQBHBgAAWQCQAHnAX8BjgG3Af4BfwGOAbcB/gFWAX8BnAH+AX8BjgG3Af4BfwGE
+        AbcB/gF/AYQBtwH+AX8BgwG3Af4BfwGDAbcB/gF/AZMBtQH+AwABARgAAyYBOQGCAZgBtgH+AX8BhQG3
+        Af4BfwGEAbcB/gF/AYQBtwH+AX8BhAG3Af4BfwGDAbcB/gF/AY0BtAH+IAADJgE5AYIBmAG2Af4BfwGF
+        AbcB/gF/AYQBtwH+AX8BhAG3Af4BfwGEAbcB/gF/AYMBtwH+AX8BjQG0Af4gAAMmATkBggGYAbYB/gF/
+        AYUBtwH+AX8BhAG3Af4BfwGEAbcB/gF/AYQBtwH+AX8BgwG3Af4BfwGNAbQB/hwAAVoBfwGtAf4BfwGJ
+        AbcB/gF/AYkBtwH+AXoBfwGiAf4BcQF/AbYB/gF6AYABtwH+AXkBgAG3Af4BeQF/AbcB/gF9AYIBtwH+
+        AWQBNwE9AfEgAAFHAZoB+wH/AXwBgQG3Af4BdAG1Av8BegGAAbcB/gF6AYABtwH+AX8BhQG3Af4BSQEy
+        AUgB9iQAAUcBmgH7Af8BfAGBAbcB/gF0AbUC/wF6AYABtwH+AXoBgAG3Af4BfwGFAbcB/gFJATIBSAH2
+        JAABRwGaAfsB/wF8AYEBtwH+AXQBtQL/AXoBgAG3Af4BegGAAbcB/gF/AYUBtwH+AUkBMgFIAfYcAAFc
+        AlMByQF/AYMBtwH+AX8BgwG3Af4BfQGBAbYB/gFhAX8BmQH+AV0BfwG2Af4BfwGTAbYB/gF/AZIBtgH+
+        AUoBMwFIAfYkAAMZASMBbAF/AbcB/gF/AYkBtwH+AXoBgAG3Af4BfwGPAbcB/gFLAX8BtwH+AwABASQA
+        AxkBIwFsAX8BtwH+AX8BiQG3Af4BegGAAbcB/gF/AY8BtwH+AUsBfwG3Af4DAAEBJAADGQEjAWwBfwG3
+        Af4BfwGJAbcB/gF6AYABtwH+AX8BjwG3Af4BSwF/AbcB/gMAAQEcAAMCAQMBfwGGAbYB/gF3AX8BtwH+
+        AXYBfwG3Af4BfwGQAbYB/gM0AVQDBAEGAwABATAAA0wBkwFcAlIBzwNCAXY0AANMAZMBXAJSAc8DQgF2
+        NAADTAGTAVwCUgHPA0IBdigAAwEBAgFTAlABqAFbAlQBxAMZASMkAAFCAU0BPgcAAT4DAAEoAwABQAMA
+        ATADAAEBAQABAQUAAYABARYAA/+BAAH/AT8C/wHAAQEB8AEAAfgBBwH4AQEBgAEBAfABAAHgAQAB4AEA
+        AYABAQHwAQAB4AEAAeABAAGAAQEBgAEAAeABAAHgAQABgAcAAYAHAAHAAQEDAAEBAQABAQHAAQMBAAED
+        AQABDwEAAQ8B8AEHAYABAwGAAQcBgAEHAfABBwGAAQMBgAEHAYABBwHwAQcBwAEDAcABBwHAAQcB8AEH
+        AcABAwHAAQ8BwAEPAfABBwHAAQcBwAEfAcABHwHwAQ8BwAEPAcABPwHAAT8B+AEPAeABfwHhAf8B4QH/
+        AfwBPwHwAv8BfwH/AT8D/wF/AcABBwHAAQcBwAEBAfgBBwGAAQMBgAEAAYABAAHgAQMBgAEDAYABAAGA
+        AQAB4AEBAYABAwGAAQABgAEAAeABAQGAAQEBgAEAAYACAAEBAYABAAGAAQABgAMAAYABBAGAAQEBgAEB
+        AgABwAEHAcABBwHAAQcBAAEPAeABHwHgAR8B4AEfAYABBwHgAQ8B4AEPAeABDwGAAQcB4AEPAeABDwHg
+        AQ8BwAEHAeABHwHgAR8B4AEfAcABDwHwAR8B8AEfAfABHwHAAR8B8AEfAfABHwHwAR8BwAE/AfwBfwH8
+        AX8B/AF/AeEB/ws=
 </value>
   </data>
   <metadata name="securityContextMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>314, 17</value>
   </metadata>
+  <data name="securityContextMenu.Size" type="System.Drawing.Size, System.Drawing">
+    <value>192, 92</value>
+  </data>
+  <data name="&gt;&gt;securityContextMenu.Name" xml:space="preserve">
+    <value>securityContextMenu</value>
+  </data>
+  <data name="&gt;&gt;securityContextMenu.Type" xml:space="preserve">
+    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
   <data name="readWriteAccessToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
     <value>191, 22</value>
   </data>
@@ -2051,15 +2531,6 @@
   <data name="inheritedAccessRightsToolStripMenuItem.Text" xml:space="preserve">
     <value>Inherited access rights</value>
   </data>
-  <data name="securityContextMenu.Size" type="System.Drawing.Size, System.Drawing">
-    <value>192, 92</value>
-  </data>
-  <data name="&gt;&gt;securityContextMenu.Name" xml:space="preserve">
-    <value>securityContextMenu</value>
-  </data>
-  <data name="&gt;&gt;securityContextMenu.Type" xml:space="preserve">
-    <value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </data>
   <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>470, 17</value>
   </metadata>

Modified: sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.designer.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.designer.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -103,9 +103,6 @@
             resources.ApplyResources(this, "$this");
             this.Controls.Add(this.listView1);
             this.Controls.Add(this.panel1);
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
-            this.MaximizeBox = false;
-            this.MinimizeBox = false;
             this.Name = "ValidationResultsDialog";
             this.ShowIcon = false;
             this.panel1.ResumeLayout(false);

Modified: sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.resx	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Base/UI/ValidationResultsDialog.resx	2010-12-22 04:40:33 UTC (rev 5481)
@@ -226,71 +226,71 @@
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADi
-        DgAAAk1TRnQBSQFMAgEBAwEAARQBAAEUAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADI
+        DgAAAk1TRnQBSQFMAgEBAwEAARwBAAEcAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
         AwABEAMAAQEBAAEgBgABEC4AAwwBEAMVAR0kAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEX
-        AxEBFwMRARcDEQEXAxUBHRwAAwkBDAMWAR8DFgEfAxYBHwMWAR8DFgEfZAADEgEYAX8BMAEdAfcBxAFG
-        AS0B/wHNAUoBMAH/Ac4BSgEwAf8BygFJAS8B/wGkAToBJQH/AUgCQgGGFAABUgFAAUMBzQEBAbsB6wH/
-        AQEBvQHsAf8BAQHBAe4B/wEBAcQB8AH/AQEBxQHwAf8BAQHFAfAB/wEBAcUB8AH/AQEBxQHwAf8BAQHF
-        AfAB/wEBAcMB7wH/AQEBvwHtAf8BAQG7AesB/wEFAZcBvgH/FAABUwFEAUUBqwEpATsBtgH/ASsBPgHA
-        Af8BLAFAAcYB/wEsAUABxwH/ASsBPwHDAf8BKgE9AbsB/wEiASkBgQH/XAABSgJDAYoBxgFHAS4B/wHX
-        AU0BMgH/AeMBUQE1Af8B6QFTATYB/wHqAVMBNgH/AeYBUgE1Af8B3QFPATMB/wHPAUoBMAH/AYIBKwEj
-        AfwQAAEHAYIBowH/AQEBvAHsAf8BAQHFAfAB/wEBAcsB8wH/AQEBzgH1Af8BAQHQAfYB/wEBAdAB9gH/
-        AQEB0AH2Af8BAQHQAfYB/wEBAc8B9gH/AQEBzQH0Af8BAQHIAfIB/wEBAcAB7gH/AQEBuwHrAf8DEgEY
-        DAABUwFEAUUBqwErAT8BwQH/AS4BQwHQAf8BMAFGAdkB/wExAUgB3gH/ATEBSAHfAf8BMQFHAdwB/wEv
-        AUUB1QH/ASwBQQHIAf8BIwErAYQB/1QAATsCOQFjAcoBSAEvAf8B3wFQATQB/wHvAVUBOAH/AfsB8QHv
-        Af8B/QL5Af8B4QFmAU8B/wH8AVoBOwH/AfUBVwE5Af8B5wFSATYB/wHTAUwBMQH/AYIBKwEjAfwMAAE+
-        AjwBawEBAb8B7QH/AQEByQHyAf8BAQHQAfYB/wEBAdQB+QH/AQEB1AH3Af8BhQHcAesB/wGBAdsB6gH/
-        AQEB0AHzAf8BAQHWAfoB/wEBAdIB+AH/AQEBzQH0Af8BAQHDAe8B/wEIAYABnQH/DAABUwFEAUUBqwEr
-        AT8BwwH/ATABRQHWAf8BMwFKAeQB/wE0AUwB7AH/ATUBTQHvAf8BNQFOAfAB/wE1AU0B7gH/ATMBSwHm
-        Af8BMQFIAd0B/wEtAUIBzAH/ASMBKwGEAf9QAAG3AUEBKgH/Ad0BTwEzAf8B8gFWATgB/wH+AV0BPwn/
-        AeMBiQF4Af8B6AGbAY0C/wFhAUMB/wH5AVkBOgH/AecBUgE2Af8BzwFKATAB/wFIAkIBhgwAAREBjgGu
-        Af8BPAHWAfUB/wFCAd0B+QH/ATgB4AH7Af8BHQHNAekJ/wErAcoB4wH/AQEB2QH7Af8BAQHUAfkB/wEB
-        Ac0B9QH/AQEBwwHvAf8BLwIuAUkIAAFQAkQBnwEqAT4BvQH/AS8BRQHVAf8BMwFLAeYB/wGqAbMB6wH/
-        AZwBpgHpAf8BOAFRAfoB/wE4AVEB+wH/AVgBagHgAf8B5QHoAfgB/wE0AUsB6AH/ATEBSAHdAf8BLAFB
-        AcgB/wEiASkBgQH/SAABRwJCAYEB0QFLATEB/wHrAVMBNwH/Af4BWwE9Av8BZwFKAf8B7AGxAaUF/wHz
-        AcwBxAH/AeEBcQFaAf8B/AFpAU0C/wFhAUMB/wH1AVcBOQH/Ad0BTwEzAf8BpAE6ASUB/wwAAT0COwFo
-        AUoB1gH1Af8BUQHeAfkB/wFXAeQB+wH/AV4B6AH9Af8BcwHZAekB/wGBAd4B6wH/AQoB2wH7Af8BAQHY
-        AfsB/wEBAdMB+AH/AQEBygHzAf8BCAGBAZ4B/wwAASMBKwGDAf8BLQFBAcoB/wEyAUkB4AH/AYgBlAHi
-        Cf8BnAGnAewB/wFZAWwB5An/Ad4B4QH3Af8BMwFLAegB/wEvAUUB1QH/ASoBPQG7Af8DFgEfRAABggEn
-        ASEB+wHaAU4BMwH/AfQBVgE4Av8BZQFJAv8BdAFZAf8B7AFvAVYJ/wH4AXUBWgL/AXYBWwL/AW4BUwH/
-        AfwBWgE7Af8B5gFSATUB/wHKAUkBLwH/EAABLwGWAbAB/wFfAd4B+AH/AWYB5QH7Af8BbQHpAf0J/wGB
-        AegB+QH/AVcB5AH7Af8BAQHPAfYB/wEBAcUB8AH/AS4CLQFHDAABJAEtAYkB/wE3AUwB1AH/AUUBWwHp
-        Af8BUQFmAfUB/wHXAdsB9xH/AfcB+AH9Af8BNQFOAfAB/wE1AU0B7gH/ATEBRwHcAf8BKwE/AcMB/wMW
-        AR9EAAGeATcBJAH/Ad8BUAE0Af8B9wFmAUoC/wF4AV8B/wH4AYABZgH/AewBewFkAf8B/AHzAfEF/wHm
-        AYsBegL/AYEBaQL/AXwBZAH/Af4BcQFXAf8B6gFTATYB/wHOAUoBMAH/AxUBHQwAATwCOgFmAW4B3gH3
-        Af8BdQHlAfoB/wF8AeoB/An/AY8B6gH5Af8BlgHtAfwB/wFcAd0B9wH/AQgBgQGeAf8QAAEwATgBjwH/
-        AUsBXQHbAf8BVAFoAe0B/wFdAXIB+AH/AWUBeAH8Af8B3wHiAfkJ/wH8Af0B/gH/AYUBlAH5Af8BcgGD
-        AfwB/wE1AU4B8AH/ATEBSAHfAf8BLAFAAccB/wMWAR9EAAGXATUBIgH/Ad4BUAE0Af8B+AGAAWYC/wGF
-        AXAB/wH+AY0BeAH/AfUB2AHSAf8B5wGbAY0F/wH5AecB5AL/AY4BeQL/AYkBdAH/Af4BgQFpAf8B7QF1
-        AV4B/wHNAUoBMAH/AwwBEBAAAT8BmgGxAf8BgwHmAfkB/wGKAesB/An/AZ4B7AH5Af8BpAHuAfsB/wGq
-        AewB+gH/Ay0BRhAAATUBPAGQAf8BVQFnAdwB/wFfAXIB7QH/AWgBewH4Af8BhgGTAeoR/wHJAc8B9AH/
-        AZkBpgH8Af8BoAGrAfcB/wFXAWoB5AH/ASwBQAHGAf8DFgEfRAABYwE4ATQB1QHcAWcBUAH/AfUBjQF7
-        Av8BkwGBAv8BmwGIAf8B/gGeAYoB/wHtAbEBpgH/AfwB9gH0Af8B7wG8AbIC/wGdAYoC/wGXAYQB/wH7
-        AY8BfAH/AewBigF4Af8BxAFGAS0B/xQAATsCOgFlAZIB5gH5Af8BmQHsAfsJ/wGsAe4B+QH/AbIB7wH7
-        Af8BQwGOAaIB/xQAAToBQAGPAf8BXwFvAdoB/wFqAXsB6wH/AYkBlQHmCf8B+gH7Af4B/wHkAecB+gn/
-        AdMB1wH1Af8BrAG1AfcB/wGxAbkB8QH/AWIBcAHPAf8DFgEfRAADHwEtAdQBagFVAf8B8QGeAY4B/wH8
-        AaIBkQL/AacBlwL/AasBmwL/Aa0BnQH/Ae8BtgGrAf8B/gH9AfwB/wHxAaUBlwH/Af4BpAGTAf8B9gGf
-        AY8B/wHpAZsBjAH/AX8BMAEdAfcYAAFPAZ0BsgH/AacB7QH7Cf8BuQHvAfkB/wG+AfAB+wH/AS0CLAFF
-        FAABMQE0AXkB/wFqAXgB1gH/AXUBgwHnAf8BfQGKAekB/wP+Af8C+wH+Af8BlQGiAfkB/wGdAakB/QH/
-        AekB6wH6Bf8BtgG9AfAB/wG3Ab8B9QH/AbwBwwHwAf8BwQHGAeoB/wMJAQxIAAGDAS8BGwH5AewBrgGi
-        Af8B9QGxAaQB/wH8AbQBpgL/AbYBqQL/AbgBqwH/AfcB3QHZBf8B9QHVAc8B/wH5AbIBpQH/AfABsAGj
-        Af8B3gGYAYoB/wMSARgYAAE7AjoBZAG0Ae0B+gn/AcUB8AH6Af8BSAGPAaIB/xgAAwgBCwFYAWABqgH/
-        AYEBiwHhAf8BiAGWAe0B/wGQAZwB7QH/AZkBpAH0Af8BoQGtAfsB/wGoAbMB+wH/Aa8BuQH6Af8BuQHA
-        AfEB/wG8AcMB9wH/AcEByAHzAf8BxwHMAe4B/wFUAUQBRQGrTwABAQG+AXgBagH/AfABwQG3Af8B9gHC
-        AbkB/wH6AcQBugH/AfwBxAG6Af8B+wHEAboB/wHyAcYBvQH/AfYBwgG5Af8B8wHCAbgB/wHsAb4BtQH/
-        AUoCQwGKIAABXAGfAbIB/wHGAfEB+wH/AcsB8gH8Af8B0AHzAfwB/wMsAUQcAAMIAQsBZwFuAbAB/wGT
-        AZ4B5gH/AZwBpwHuAf8BpQGvAfMB/wGsAbYB9gH/AbMBvAH3Af8BugHCAfcB/wHAAccB9QH/AcYBzAHz
-        Af8BywHQAfAB/wFUAUQBRQGrVwABAQGLAUABOAH5AfIB0AHJAf8B9AHRAcoB/wH2AdIBygH/AfYB0gHK
-        Af8B9QHRAcoB/wHzAdABygH/AdQBngGTAf8BOwI5AWMkAAE7AjoBZAHRAfIB+wH/AdUB9AH8Af8BTgGQ
-        AaMB/yQAAwgBCwF1AXoBswH/AacBrwHnAf8BrwG3Ae0B/wG2Ab4B8AH/Ab0BxAHyAf8BxAHKAfIB/wHK
-        Ac8B8QH/Ac8B0wHwAf8BVAFEAUUBq2AAAx8BLQFjATgBNQHVAakBbAFhAf8BtAF8AXEB/wGLAUYBNAH7
-        AUcCQgGBMAABTwFBAUcB3AFQAZEBpAH/AxYBHigAAwgBCwFJAUoBgQH/AWwBbgGfAf8BbwFyAaIB/wFz
-        AXUBpAH/AXYBdwGkAf8BdAF1AaAB/wFQAkQBn/8AUQABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEA
-        AQEFAAGAFwAD/wEAAf4BfwHAAQMB+AEfAgAB8AEPAYABAQHwAQ8CAAHgAQcBgAEAAeABBwIAAcABAwGA
-        AQEBwAEDAgABwAEBAcABAQGAAQECAAGAAQEBwAEDAYADAAGAAQEB4AEDAYADAAGAAQAB4AEHAYADAAGA
-        AQAB8AEHAYADAAGAAQEB8AEPAYADAAGAAQEB+AEPAYADAAHAAQEB+AEfAYABAQIAAcABAwH8AR8BwAED
-        AgAB4AEHAfwBPwHgAQcCAAH4AR8B/gE/AfABDwIABv8CAAs=
+        AxEBFwMRARcDEQEXAxUBHRwAAwkBDAMWAR8DFgEfAxYBHwMWAR8DFgEfZAADEgEYAX0BMwEgAfcBxAFF
+        ASwB/wHNAUkBLwH/Ac4BSQEvAf8BygFIAS4B/wGkATkBJAH/AUgCRwGGFAABVQFJAUwBzQEAAbsB6wH/
+        AQABvQHsAf8BAAHBAe4B/wEAAcQB8AH/AQABxQHwAf8BAAHFAfAB/wEAAcUB8AH/AQABxQHwAf8BAAHF
+        AfAB/wEAAcMB7wH/AQABvwHtAf8BAAG7AesB/wEEAZcBvgH/FAABVAJNAasBKAE6AbYB/wEqAT0BwAH/
+        ASsBPwHGAf8BKwE/AccB/wEqAT4BwwH/ASkBPAG7Af8BIQEoAYEB/1wAAUoCSAGKAcYBRgEtAf8B1wFM
+        ATEB/wHjAVABNAH/AekBUgE1Af8B6gFSATUB/wHmAVEBNAH/Ad0BTgEyAf8BzwFJAS8B/wF/ASsBJAH8
+        EAABBgGCAaMB/wEAAbwB7AH/AQABxQHwAf8BAAHLAfMB/wEAAc4B9QH/AQAB0AH2Af8BAAHQAfYB/wEA
+        AdAB9gH/AQAB0AH2Af8BAAHPAfYB/wEAAc0B9AH/AQAByAHyAf8BAAHAAe4B/wEAAbsB6wH/AxIBGAwA
+        AVQCTQGrASoBPgHBAf8BLQFCAdAB/wEvAUUB2QH/ATABRwHeAf8BMAFHAd8B/wEwAUYB3AH/AS4BRAHV
+        Af8BKwFAAcgB/wEiASoBhAH/VAABOwI6AWMBygFHAS4B/wHfAU8BMwH/Ae8BVAE3Af8B+wHxAe8B/wH9
+        AvkB/wHhAWUBTgH/AfwBWQE6Af8B9QFWATgB/wHnAVEBNQH/AdMBSwEwAf8BfwErASQB/AwAAT4CPQFr
+        AQABvwHtAf8BAAHJAfIB/wEAAdAB9gH/AQAB1AH5Af8BAAHUAfcB/wGFAdwB6wH/AYEB2wHqAf8BAAHQ
+        AfMB/wEAAdYB+gH/AQAB0gH4Af8BAAHNAfQB/wEAAcMB7wH/AQcBgAGdAf8MAAFUAk0BqwEqAT4BwwH/
+        AS8BRAHWAf8BMgFJAeQB/wEzAUsB7AH/ATQBTAHvAf8BNAFNAfAB/wE0AUwB7gH/ATIBSgHmAf8BMAFH
+        Ad0B/wEsAUEBzAH/ASIBKgGEAf9QAAG3AUABKQH/Ad0BTgEyAf8B8gFVATcB/wH+AVwBPgn/AeMBiQF3
+        Af8B6AGbAY0C/wFgAUIB/wH5AVgBOQH/AecBUQE1Af8BzwFJAS8B/wFIAkcBhgwAARABjgGuAf8BOwHW
+        AfUB/wFBAd0B+QH/ATcB4AH7Af8BHAHNAekJ/wEqAcoB4wH/AQAB2QH7Af8BAAHUAfkB/wEAAc0B9QH/
+        AQABwwHvAf8DLwFJCAABUAJLAZ8BKQE9Ab0B/wEuAUQB1QH/ATIBSgHmAf8BqgGzAesB/wGcAaYB6QH/
+        ATcBUAH6Af8BNwFQAfsB/wFXAWkB4AH/AeUB6AH4Af8BMwFKAegB/wEwAUcB3QH/ASsBQAHIAf8BIQEo
+        AYEB/0gAAUcCRQGBAdEBSgEwAf8B6wFSATYB/wH+AVoBPAL/AWYBSQH/AewBsQGlBf8B8wHMAcQB/wHh
+        AXABWQH/AfwBaAFMAv8BYAFCAf8B9QFWATgB/wHdAU4BMgH/AaQBOQEkAf8MAAE9AjwBaAFJAdYB9QH/
+        AVAB3gH5Af8BVgHkAfsB/wFdAegB/QH/AXIB2QHpAf8BgQHeAesB/wEJAdsB+wH/AQAB2AH7Af8BAAHT
+        AfgB/wEAAcoB8wH/AQcBgQGeAf8MAAEiASoBgwH/ASwBQAHKAf8BMQFIAeAB/wGIAZQB4gn/AZwBpwHs
+        Af8BWAFrAeQJ/wHeAeEB9wH/ATIBSgHoAf8BLgFEAdUB/wEpATwBuwH/AxYBH0QAAYEBJwEhAfsB2gFN
+        ATIB/wH0AVUBNwL/AWQBSAL/AXMBWAH/AewBbgFVCf8B+AF0AVkC/wF1AVoC/wFtAVIB/wH8AVkBOgH/
+        AeYBUQE0Af8BygFIAS4B/xAAAS4BlgGwAf8BXgHeAfgB/wFlAeUB+wH/AWwB6QH9Cf8BgQHoAfkB/wFW
+        AeQB+wH/AQABzwH2Af8BAAHFAfAB/wMuAUcMAAEjASwBiQH/ATYBSwHUAf8BRAFaAekB/wFQAWUB9QH/
+        AdcB2wH3Ef8B9wH4Af0B/wE0AU0B8AH/ATQBTAHuAf8BMAFGAdwB/wEqAT4BwwH/AxYBH0QAAZ4BNgEj
+        Af8B3wFPATMB/wH3AWUBSQL/AXcBXgH/AfgBgAFlAf8B7AF6AWMB/wH8AfMB8QX/AeYBiwF5Av8BgQFo
+        Av8BewFjAf8B/gFwAVYB/wHqAVIBNQH/Ac4BSQEvAf8DFQEdDAADPAFmAW0B3gH3Af8BdAHlAfoB/wF7
+        AeoB/An/AY8B6gH5Af8BlgHtAfwB/wFbAd0B9wH/AQcBgQGeAf8QAAEvATcBjwH/AUoBXAHbAf8BUwFn
+        Ae0B/wFcAXEB+AH/AWQBdwH8Af8B3wHiAfkJ/wH8Af0B/gH/AYUBlAH5Af8BcQGDAfwB/wE0AU0B8AH/
+        ATABRwHfAf8BKwE/AccB/wMWAR9EAAGXATQBIQH/Ad4BTwEzAf8B+AGAAWUC/wGFAW8B/wH+AY0BdwH/
+        AfUB2AHSAf8B5wGbAY0F/wH5AecB5AL/AY4BeAL/AYkBcwH/Af4BgQFoAf8B7QF0AV0B/wHNAUkBLwH/
+        AwwBEBAAAT4BmgGxAf8BgwHmAfkB/wGKAesB/An/AZ4B7AH5Af8BpAHuAfsB/wGqAewB+gH/Ay0BRhAA
+        ATQBOwGQAf8BVAFmAdwB/wFeAXEB7QH/AWcBegH4Af8BhgGTAeoR/wHJAc8B9AH/AZkBpgH8Af8BoAGr
+        AfcB/wFWAWkB5AH/ASsBPwHGAf8DFgEfRAABYgFEAUAB1QHcAWYBTwH/AfUBjQF6Av8BkwGBAv8BmwGI
+        Af8B/gGeAYoB/wHtAbEBpgH/AfwB9gH0Af8B7wG8AbIC/wGdAYoC/wGXAYQB/wH7AY8BewH/AewBigF3
+        Af8BxAFFASwB/xQAAzsBZQGSAeYB+QH/AZkB7AH7Cf8BrAHuAfkB/wGyAe8B+wH/AUIBjgGiAf8UAAE5
+        AT8BjwH/AV4BbgHaAf8BaQF6AesB/wGJAZUB5gn/AfoB+wH+Af8B5AHnAfoJ/wHTAdcB9QH/AawBtQH3
+        Af8BsQG5AfEB/wFhAW8BzwH/AxYBH0QAAx8BLQHUAWkBVAH/AfEBngGOAf8B/AGiAZEC/wGnAZcC/wGr
+        AZsC/wGtAZ0B/wHvAbYBqwH/Af4B/QH8Af8B8QGlAZcB/wH+AaQBkwH/AfYBnwGPAf8B6QGbAYwB/wF9
+        ATMBIAH3GAABTgGdAbIB/wGnAe0B+wn/AbkB7wH5Af8BvgHwAfsB/wMtAUUUAAEwATMBeAH/AWkBdwHW
+        Af8BdAGDAecB/wF8AYoB6QH/A/4B/wL7Af4B/wGVAaIB+QH/AZ0BqQH9Af8B6QHrAfoF/wG2Ab0B8AH/
+        AbcBvwH1Af8BvAHDAfAB/wHBAcYB6gH/AwkBDEgAAYIBMQEdAfkB7AGuAaIB/wH1AbEBpAH/AfwBtAGm
+        Av8BtgGpAv8BuAGrAf8B9wHdAdkF/wH1AdUBzwH/AfkBsgGlAf8B8AGwAaMB/wHeAZgBigH/AxIBGBgA
+        AzsBZAG0Ae0B+gn/AcUB8AH6Af8BRwGPAaIB/xgAAwgBCwFXAV8BqgH/AYEBiwHhAf8BiAGWAe0B/wGQ
+        AZwB7QH/AZkBpAH0Af8BoQGtAfsB/wGoAbMB+wH/Aa8BuQH6Af8BuQHAAfEB/wG8AcMB9wH/AcEByAHz
+        Af8BxwHMAe4B/wFUAk0Bq08AAQEBvgF3AWkB/wHwAcEBtwH/AfYBwgG5Af8B+gHEAboB/wH8AcQBugH/
+        AfsBxAG6Af8B8gHGAb0B/wH2AcIBuQH/AfMBwgG4Af8B7AG+AbUB/wFKAkgBiiAAAVsBnwGyAf8BxgHx
+        AfsB/wHLAfIB/AH/AdAB8wH8Af8DLAFEHAADCAELAWYBbQGwAf8BkwGeAeYB/wGcAacB7gH/AaUBrwHz
+        Af8BrAG2AfYB/wGzAbwB9wH/AboBwgH3Af8BwAHHAfUB/wHGAcwB8wH/AcsB0AHwAf8BVAJNAatXAAEB
+        AYoBQQE6AfkB8gHQAckB/wH0AdEBygH/AfYB0gHKAf8B9gHSAcoB/wH1AdEBygH/AfMB0AHKAf8B1AGe
+        AZMB/wE7AjoBYyQAAzsBZAHRAfIB+wH/AdUB9AH8Af8BTQGQAaMB/yQAAwgBCwF0AXkBswH/AacBrwHn
+        Af8BrwG3Ae0B/wG2Ab4B8AH/Ab0BxAHyAf8BxAHKAfIB/wHKAc8B8QH/Ac8B0wHwAf8BVAJNAatgAAMf
+        AS0BYgFEAUAB1QGpAWsBYAH/AbQBewFwAf8BigFGATMB+wFHAkUBgTAAAVIBSAFMAdwBTwGRAaQB/wMW
+        AR4oAAMIAQsBSAFJAYEB/wFrAW0BnwH/AW4BcQGiAf8BcgF0AaQB/wF1AXYBpAH/AXMBdAGgAf8BUAJL
+        AZ//AFEAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAH+AX8BwAEDAfgBHwIA
+        AfABDwGAAQEB8AEPAgAB4AEHAYABAAHgAQcCAAHAAQMBgAEBAcABAwIAAcABAQHAAQEBgAEBAgABgAEB
+        AcABAwGAAwABgAEBAeABAwGAAwABgAEAAeABBwGAAwABgAEAAfABBwGAAwABgAEBAfABDwGAAwABgAEB
+        AfgBDwGAAwABwAEBAfgBHwGAAQECAAHAAQMB/AEfAcABAwIAAeABBwH8AT8B4AEHAgAB+AEfAf4BPwHw
+        AQ8CAAb/AgAL
 </value>
   </data>
   <data name="listView1.TabIndex" type="System.Int32, mscorlib">

Modified: sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/ExpressionEditor.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -29,6 +29,7 @@
 using OSGeo.MapGuide.ObjectModels.Capabilities;
 using OSGeo.MapGuide.MaestroAPI.Exceptions;
 using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.Common
 {
@@ -115,8 +116,8 @@
                 m_featureSource = featuresSourceId;
 
                 //TODO: Perhaps add column type and indication of primary key
-                SortedList<string, FeatureSetColumn> sortedCols = new SortedList<string, FeatureSetColumn>();
-                foreach (FeatureSetColumn col in _cls.Columns)
+                SortedList<string, PropertyDefinition> sortedCols = new SortedList<string, PropertyDefinition>();
+                foreach (var col in _cls.Properties)
                 {
                     sortedCols.Add(col.Name, col);
                 }
@@ -124,7 +125,7 @@
                 ColumnName.Items.Clear();
                 ColumnName.Tag = sortedCols;
 
-                foreach (FeatureSetColumn col in sortedCols.Values)
+                foreach (var col in sortedCols.Values)
                 {
                     string name = col.Name;
                     ToolStripButton btn = new ToolStripButton();
@@ -142,7 +143,7 @@
                 if (ColumnName.Items.Count > 0)
                     ColumnName.SelectedIndex = 0;
 
-                LoadCompletableProperties(_cls.Columns);
+                LoadCompletableProperties(_cls.Properties);
 
                 //TODO: Figure out how to translate the enums into something usefull
 
@@ -301,9 +302,9 @@
         /// </summary>
         class PropertyItem : AutoCompleteItem
         {
-            private FeatureSetColumn _propDef;
+            private PropertyDefinition _propDef;
 
-            public PropertyItem(FeatureSetColumn pd)
+            public PropertyItem(PropertyDefinition pd)
             {
                 _propDef = pd;
             }
@@ -326,7 +327,7 @@
                 {
                     if (string.IsNullOrEmpty(_ttText))
                     {
-                        _ttText = string.Format(Properties.Resources.PropertyTooltip, _propDef.Name, _propDef.Type.Name);
+                        _ttText = string.Format(Properties.Resources.PropertyTooltip, _propDef.Name, _propDef.Type.ToString());
                     }
                     return _ttText;
                 }
@@ -487,9 +488,9 @@
             }
         }
 
-        private void LoadCompletableProperties(IEnumerable<FeatureSetColumn> cols)
+        private void LoadCompletableProperties(IEnumerable<PropertyDefinition> cols)
         {
-            foreach (FeatureSetColumn col in cols)
+            foreach (var col in cols)
             {
                 _autoCompleteItems[col.Name] = new PropertyItem(col);
             }
@@ -753,8 +754,8 @@
             {
                 try
                 {
-                    SortedList<string, FeatureSetColumn> cols = (SortedList<string, FeatureSetColumn>)ColumnName.Tag;
-                    FeatureSetColumn col = cols[ColumnName.Text];
+                    SortedList<string, PropertyDefinition> cols = (SortedList<string, PropertyDefinition>)ColumnName.Tag;
+                    PropertyDefinition col = cols[ColumnName.Text];
 
                     bool retry = true;
                     Exception rawEx = null;
@@ -768,14 +769,14 @@
                         try
                         {
                             retry = false;
-                            using (FeatureSetReader rd = _featSvc.QueryFeatureSource(m_featureSource, _cls.QualifiedNameDecoded, filter, new string[] { ColumnName.Text }))
+                            using (var rd = _featSvc.QueryFeatureSource(m_featureSource, _cls.QualifiedName, filter, new string[] { ColumnName.Text }))
                             {
-                                while (rd.Read())
+                                while (rd.ReadNext())
                                 {
-                                    if (rd.Row.IsValueNull(ColumnName.Text))
+                                    if (rd.IsNull(ColumnName.Text))
                                         hasNull = true;
                                     else
-                                        values[Convert.ToString(rd.Row[ColumnName.Text], System.Globalization.CultureInfo.InvariantCulture)] = null;
+                                        values[Convert.ToString(rd[ColumnName.Text], System.Globalization.CultureInfo.InvariantCulture)] = null;
                                 }
                             }
                         }

Modified: sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/GenericItemSelectionDialog.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -55,12 +55,13 @@
             if (!string.IsNullOrEmpty(prompt))
                 dlg.lblPrompt.Text = prompt;
 
-            dlg.lstItems.DataSource = items;
             if (!string.IsNullOrEmpty(displayMember))
                 dlg.lstItems.DisplayMember = displayMember;
             if (!string.IsNullOrEmpty(valueMember))
                 dlg.lstItems.ValueMember = valueMember;
 
+            dlg.lstItems.DataSource = items;
+
             if (dlg.ShowDialog() == DialogResult.OK)
             {
                 return (T)dlg.lstItems.SelectedItem;

Modified: sandbox/maestro-3.0/Maestro.Editors/Common/ResourcePicker.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Common/ResourcePicker.resx	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/Common/ResourcePicker.resx	2010-12-22 04:40:33 UTC (rev 5481)
@@ -129,7 +129,7 @@
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADQ
-        EQAAAk1TRnQBSQFMAgEBCQEAAcgBAAHIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        EQAAAk1TRnQBSQFMAgEBCQEAAdABAAHQAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
         AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -456,6 +456,9 @@
   <data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
     <value>0, 0</value>
   </data>
+  <data name="trvFolders.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
+    <value>Top, Bottom, Left, Right</value>
+  </data>
   <data name="trvFolders.ImageIndex" type="System.Int32, mscorlib">
     <value>0</value>
   </data>
@@ -466,51 +469,51 @@
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAs
-        CgAAAk1TRnQBSQFMAgEBAgEAARABAAEQAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAo
+        CgAAAk1TRnQBSQFMAgEBAgEAARgBAAEYAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
         AwABEAMAAQEBAAEgBgABEBYAAwcBCgMSARgDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMT
-        ARoDEwEaAxIBGAMIAQvIAAMOARMDOwFnA0MBpANDAaQDQwGkA0MBpANDAaQDQwGkA0MBpANDAaQDQwGk
-        A0MBpAM7AWgDEAEVBAADBAEGAxABFgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMT
-        ARoDEwEaAxMBGgMQARYDBAEGiAADGgElA0QBjgOGAf8DggH/A4IB/wOCAf8DggH/A4IB/wOCAf8DhgH/
-        A0QBjgMaASUIAAFDAUsBTwGRAT4BWgFpAb0BPgFaAWkBvQE+AVoBaQG9AT4BWgFpAb0BPgFaAWkBvQE+
-        AVoBaQG9AT4BWgFpAb0BPgFaAWkBvQE+AVoBaQG9AT4BWgFpAb0BPgFaAWkBvQE+AVoBaQG9AT4BWgFp
-        Ab0BPgFaAWkBvQFDAUsBTwGRjAADRAGTA2sB/wNnAf8DZwH/A2cB/wNnAf8DZwH/ATEBzAExAf8DawH/
-        A0QBkwwAAUEBWgFlAbABhgHPAfAB/wGCAcsB7QH/AYIBywHtAf8BggHLAe0B/wGCAcsB7QH/AYIBywHt
+        ARoDEwEaAxIBGAMIAQvIAAMOARMDPAFnA0oBpANKAaQDSgGkA0oBpANKAaQDSgGkA0oBpANKAaQDSgGk
+        A0oBpAM8AWgDEAEVBAADBAEGAxABFgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMT
+        ARoDEwEaAxMBGgMQARYDBAEGiAADGgElA0kBjgOGAf8DggH/A4IB/wOCAf8DggH/A4IB/wOCAf8DhgH/
+        A0kBjgMaASUIAAFJAUwBTQGRAUoBWgFiAb0BSgFaAWIBvQFKAVoBYgG9AUoBWgFiAb0BSgFaAWIBvQFK
+        AVoBYgG9AUoBWgFiAb0BSgFaAWIBvQFKAVoBYgG9AUoBWgFiAb0BSgFaAWIBvQFKAVoBYgG9AUoBWgFi
+        Ab0BSgFaAWIBvQFJAUwBTQGRjAADSgGTA2oB/wNmAf8DZgH/A2YB/wNmAf8DZgH/ATABzAEwAf8DagH/
+        A0oBkwwAAUsBVgFdAbABhgHPAfAB/wGCAcsB7QH/AYIBywHtAf8BggHLAe0B/wGCAcsB7QH/AYIBywHt
         Af8BggHLAe0B/wGCAcsB7QH/AYIBywHtAf8BggHLAe0B/wGCAcsB7QH/AYIBywHtAf8BggHLAe0B/wGG
-        Ac8B8AH/AUEBWgFlAbCMAANDAagDUwH/A1MB/wNTAf8DUwH/A1MB/wNTAf8DUwH/A1MB/wNDAagMAAFD
-        AVcBYAGiAYYBzwHuAf8BewHIAegB/wF7AcgB6AH/AXsByAHoAf8BewHIAegB/wF7AcgB6AH/AXsByAHo
-        Af8BewHIAegB/wF7AcgB6AH/AXsByAHoAf8BewHIAegB/wF7AcgB6AH/AXsByAHoAf8BhgHPAe4B/wFD
-        AVcBYAGijAADQwF+A8cB/wO9Af8DvQH/A70B/wO9Af8DvQH/A70B/wPHAf8DQwF+DAABRAFVAV0BnQGK
+        Ac8B8AH/AUsBVgFdAbCMAANLAagDUgH/A1IB/wNSAf8DUgH/A1IB/wNSAf8DUgH/A1IB/wNLAagMAAFL
+        AVQBVwGiAYYBzwHuAf8BegHIAegB/wF6AcgB6AH/AXoByAHoAf8BegHIAegB/wF6AcgB6AH/AXoByAHo
+        Af8BegHIAegB/wF6AcgB6AH/AXoByAHoAf8BegHIAegB/wF6AcgB6AH/AXoByAHoAf8BhgHPAe4B/wFL
+        AVQBVwGijAADRQF+A8cB/wO9Af8DvQH/A70B/wO9Af8DvQH/A70B/wPHAf8DRQF+DAABSwFSAVUBnQGK
         AdMB8AH/AYIBzAHrAf8BggHMAesB/wGCAcwB6wH/AYIBzAHrAf8BggHMAesB/wGCAcwB6wH/AYIBzAHr
-        Af8BggHMAesB/wGCAcwB6wH/AYIBzAHrAf8BggHMAesB/wGCAcwB6wH/AYoB0wHwAf8BRAFVAV0BnYwA
-        A0MBeAPKAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPSAf8DygH/A0MBeAwAAUMBVAFbAZkBjwHXAfIB/wGH
+        Af8BggHMAesB/wGCAcwB6wH/AYIBzAHrAf8BggHMAesB/wGCAcwB6wH/AYoB0wHwAf8BSwFSAVUBnYwA
+        A0MBeAPKAf8DwAH/A8AB/wPAAf8DwAH/A8AB/wPSAf8DygH/A0MBeAwAAUoBUAFTAZkBjwHXAfIB/wGH
         AdAB7QH/AYcB0AHtAf8BhwHQAe0B/wGHAdAB7QH/AYcB0AHtAf8BhwHQAe0B/wGHAdAB7QH/AYcB0AHt
-        Af8BhwHQAe0B/wGHAdAB7QH/AYcB0AHtAf8BhwHQAe0B/wGPAdcB8gH/AUMBVAFbAZmMAANBAXUDzQH/
-        A8MB/wPDAf8DwwH/A8MB/wPDAf8DmQH/A80B/wNBAXUMAAFEAVMBWQGVAZQB2wH0Af8BjQHVAfAB/wGN
+        Af8BhwHQAe0B/wGHAdAB7QH/AYcB0AHtAf8BhwHQAe0B/wGPAdcB8gH/AUoBUAFTAZmMAANCAXUDzQH/
+        A8MB/wPDAf8DwwH/A8MB/wPDAf8DmQH/A80B/wNCAXUMAAFLAU8BUQGVAZQB2wH0Af8BjQHVAfAB/wGN
         AdUB8AH/AY0B1QHwAf8BjQHVAfAB/wGNAdUB8AH/AY0B1QHwAf8BjQHVAfAB/wGNAdUB8AH/AY0B1QHw
-        Af8BjQHVAfAB/wGNAdUB8AH/AY0B1QHwAf8BlAHbAfQB/wFEAVMBWQGVjAADQQFzA9YB/wPRAf8D0QH/
-        A9EB/wPRAf8D0QH/A9EB/wPWAf8DQQFzDAABQwFSAVgBkgGZAeAB9gH/AZIB2gHzAf8BkgHaAfMB/wGS
+        Af8BjQHVAfAB/wGNAdUB8AH/AY0B1QHwAf8BlAHbAfQB/wFLAU8BUQGVjAADQQFzA9YB/wPRAf8D0QH/
+        A9EB/wPRAf8D0QH/A9EB/wPWAf8DQQFzDAABSQFOAVABkgGZAeAB9gH/AZIB2gHzAf8BkgHaAfMB/wGS
         AdoB8wH/AZIB2gHzAf8BkgHaAfMB/wGSAdoB8wH/AZIB2gHzAf8BkgHaAfMB/wGSAdoB8wH/AZIB2gHz
-        Af8BkgHaAfMB/wGSAdoB8wH/AZkB4AH2Af8BQwFSAVgBkowAA0ABcQO3Af8DuwH/A7sB/wO7Af8DuwH/
-        A7sB/wO7Af8DtwH/A0ABcQwAAUQBUAFWAY4BnwHlAfkB/wGYAd8B9gH/AZgB3wH2Af8BmAHfAfYB/wGY
+        Af8BkgHaAfMB/wGSAdoB8wH/AZkB4AH2Af8BSQFOAVABkowAA0ABcQO3Af8DuwH/A7sB/wO7Af8DuwH/
+        A7sB/wO7Af8DtwH/A0ABcQwAAUkBTQFPAY4BnwHlAfkB/wGYAd8B9gH/AZgB3wH2Af8BmAHfAfYB/wGY
         Ad8B9gH/AZgB3wH2Af8BmAHfAfYB/wGYAd8B9gH/AZgB3wH2Af8BmAHfAfYB/wGYAd8B9gH/AZgB3wH2
-        Af8BmAHfAfYB/wGfAeUB+QH/AUQBUAFWAY6MAANAAW8D2QH/A88B/wPPAf8DzwH/A88B/wPPAf8DzwH/
-        A9kB/wNAAW8MAAFDAU8BVAGLAaMB6QH7Af8BnQHjAfkB/wGdAeMB+QH/AZ0B4wH5Af8BnQHjAfkB/wGd
+        Af8BmAHfAfYB/wGfAeUB+QH/AUkBTQFPAY6MAANAAW8D2QH/A88B/wPPAf8DzwH/A88B/wPPAf8DzwH/
+        A9kB/wNAAW8MAAFIAUwBTQGLAaMB6QH7Af8BnQHjAfkB/wGdAeMB+QH/AZ0B4wH5Af8BnQHjAfkB/wGd
         AeMB+QH/AZ0B4wH5Af8BowHpAfoB/wGjAekB+gH/AaMB6QH6Af8BowHpAfoB/wGjAekB+gH/AaMB6QH6
-        Af8BpgHsAfsB/wFDAU8BVAGLjAADPwFtA+EB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPhAf8DPwFt
-        DAABQgFNAVMBiAGoAe0B/QH/AaIB5wH7Af8BogHnAfsB/wGiAecB+wH/AaIB5wH7Af8BogHnAfsB/wGr
-        AfAB/QH/AYUBygHmAf8BdgG8Ad4B/wF2AbwB3gH/AXYBvAHeAf8BdgG8Ad4B/wF2AbwB3gH/AXYBvAHe
-        Af8BQgFNAVMBiIwAAz4BawPBAf8DxgH/A8YB/wPGAf8DxgH/A8YB/wPGAf8DwQH/Az4BawwAAUMBTAFS
+        Af8BpgHsAfsB/wFIAUwBTQGLjAADPwFtA+EB/wPcAf8D3AH/A9wB/wPcAf8D3AH/A9wB/wPhAf8DPwFt
+        DAABRwFKAUsBiAGoAe0B/QH/AaIB5wH7Af8BogHnAfsB/wGiAecB+wH/AaIB5wH7Af8BogHnAfsB/wGr
+        AfAB/QH/AYUBygHmAf8BdQG8Ad4B/wF1AbwB3gH/AXUBvAHeAf8BdQG8Ad4B/wF1AbwB3gH/AXUBvAHe
+        Af8BRwFKAUsBiIwAAz4BawPBAf8DxgH/A8YB/wPGAf8DxgH/A8YB/wPGAf8DwQH/Az4BawwAAUcBSQFL
         AYUBrgHzAv8BqwHwAf4B/wGrAfAB/gH/AasB8AH+Af8BqwHwAf4B/wGuAfMC/wGJAc0B6QH/AYkBzQHp
-        Af8BqwHwAf4B/wGrAfAB/gH/AasB8AH+Af8BqwHwAf4B/wGrAfAB/gH/Aa4B8wL/AUMBTAFSAYWMAAM9
-        AWkD4wH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A+MB/wM9AWkMAAE5ATwBPgFjAUMBTAFQAYMBQwFM
-        AVABgwFDAUwBUAGDAUMBTAFQAYMBQwFMAVABgwFDAUwBUAGDAUMBTAFQAYMC/gH9Af8C+AHzAf8C8AHm
-        Af8C6QHbAf8B/gHJAT8B/wH0AbYBLAH/AUMBTAFQAYMBOQE8AT4BY4wAAz0BaAPqAf8D5QH/A+UB/wPl
-        Af8D5QH/A+UB/wPlAf8D6gH/Az0BaCgAAyABLgFCAUsBTwGBAUIBSwFPAYEBQgFLAU8BgQFCAUsBTwGB
-        AUIBSwFPAYEBQgFLAU8BgQMgAS6QAAMxAU0DPQFnAz0BZwM9AWcDPQFnAz0BZwM9AWcDPQFnAz0BZwMx
-        AU3MAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/AQABgAEBAv8EAAGAAQEGAAHA
-        AQMGAAHgAQcGAAHgAQcGAAHgAQcGAAHgAQcGAAHgAQcGAAHgAQcGAAHgAQcGAAHgAQcGAAHgAQcGAAHg
-        AQcGAAHgAQcGAAHgAQcB/gEBBAAB4AEHAv8EAAs=
+        Af8BqwHwAf4B/wGrAfAB/gH/AasB8AH+Af8BqwHwAf4B/wGrAfAB/gH/Aa4B8wL/AUcBSQFLAYWMAAM9
+        AWkD4wH/A9oB/wPaAf8D2gH/A9oB/wPaAf8D2gH/A+MB/wM9AWkMAAE6AjsBYwFGAUkBSgGDAUYBSQFK
+        AYMBRgFJAUoBgwFGAUkBSgGDAUYBSQFKAYMBRgFJAUoBgwFGAUkBSgGDAv4B/QH/AvgB8wH/AvAB5gH/
+        AukB2wH/Af4ByQE+Af8B9AG2ASsB/wFGAUkBSgGDAToCOwFjjAADPQFoA+oB/wPlAf8D5QH/A+UB/wPl
+        Af8D5QH/A+UB/wPqAf8DPQFoKAADIAEuAUUBSAFJAYEBRQFIAUkBgQFFAUgBSQGBAUUBSAFJAYEBRQFI
+        AUkBgQFFAUgBSQGBAyABLpAAAzEBTQM9AWcDPQFnAz0BZwM9AWcDPQFnAz0BZwM9AWcDPQFnAzEBTcwA
+        AUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAGAAQEC/wQAAYABAQYAAcABAwYA
+        AeABBwYAAeABBwYAAeABBwYAAeABBwYAAeABBwYAAeABBwYAAeABBwYAAeABBwYAAeABBwYAAeABBwYA
+        AeABBwYAAeABBwH+AQEEAAHgAQcC/wQACw==
 </value>
   </data>
   <data name="trvFolders.Location" type="System.Drawing.Point, System.Drawing">

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/CalculationSettings.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/CalculationSettings.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/CalculationSettings.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -27,6 +27,7 @@
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.FeatureSource.Extensions
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/ExtendedClassSettings.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/ExtendedClassSettings.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/ExtendedClassSettings.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -27,6 +27,7 @@
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Shared.UI;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.FeatureSource.Extensions
 {
@@ -37,17 +38,18 @@
             InitializeComponent();
         }
 
-        public ExtendedClassSettings(ClassDefinition[] classes, IFeatureSourceExtension ext)
+        public ExtendedClassSettings(IEnumerable<ClassDefinition> classes, IFeatureSourceExtension ext)
             : this()
         {
-            cmbBaseClass.DisplayMember = "QualifiedNameDecoded";
-            cmbBaseClass.ValueMember = "QualifiedNameDecoded";
-            cmbBaseClass.DataSource = classes;
+            var klasses = new List<ClassDefinition>(classes);
+            cmbBaseClass.DisplayMember = "QualifiedName";
+            cmbBaseClass.ValueMember = "QualifiedName";
+            cmbBaseClass.DataSource = klasses;
             ext.PropertyChanged += (sender, e) => { OnResourceChanged(); };
 
             //HACK
             if (string.IsNullOrEmpty(ext.FeatureClass))
-                ext.FeatureClass = classes[0].QualifiedNameDecoded;
+                ext.FeatureClass = klasses[0].QualifiedName;
             
             TextBoxBinder.BindText(txtExtendedName, ext, "Name");
             ComboBoxBinder.BindSelectedIndexChanged(cmbBaseClass, "SelectedValue", ext, "FeatureClass");

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/JoinSettings.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/JoinSettings.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/JoinSettings.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -29,6 +29,7 @@
 using OSGeo.MapGuide.MaestroAPI.Resource;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.FeatureSource.Extensions
 {
@@ -89,7 +90,7 @@
                 txtFeatureSource.Text = resId;
 
                 var schema = _edSvc.FeatureService.DescribeFeatureSource(txtFeatureSource.Text);
-                _secondaryClasses = schema.Classes;
+                _secondaryClasses = new List<ClassDefinition>(schema.AllClasses).ToArray();
                 //Invalidate existing secondary class
                 txtSecondaryClass.Text = string.Empty;
                 _secondaryClass = null;
@@ -107,11 +108,11 @@
                 return;
             }
 
-            var selClass = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectFeatureClass, Properties.Resources.SelectFeatureClass, _secondaryClasses, "QualifiedNameDecoded", "QualifiedNameDecoded");
+            var selClass = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectFeatureClass, Properties.Resources.SelectFeatureClass, _secondaryClasses, "QualifiedName", "QualifiedName");
             if (selClass != null)
             {
                 _secondaryClass = selClass;
-                txtSecondaryClass.Text = _secondaryClass.QualifiedNameDecoded;
+                txtSecondaryClass.Text = _secondaryClass.QualifiedName;
                 CheckAddStatus();
             }
         }
@@ -136,13 +137,13 @@
             if (!string.IsNullOrEmpty(_rel.ResourceId))
             {
                 var schema = _edSvc.FeatureService.DescribeFeatureSource(_rel.ResourceId);
-                _secondaryClasses = schema.Classes;
+                _secondaryClasses = new List<ClassDefinition>(schema.AllClasses).ToArray();
 
                 if (!string.IsNullOrEmpty(_rel.AttributeClass))
                 {
                     foreach (var cls in _secondaryClasses)
                     {
-                        if (cls.QualifiedNameDecoded.Equals(_rel.AttributeClass))
+                        if (cls.QualifiedName.Equals(_rel.AttributeClass))
                         {
                             _secondaryClass = cls;
                             break;

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/SelectJoinKeyDialog.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/SelectJoinKeyDialog.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Extensions/SelectJoinKeyDialog.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -25,6 +25,7 @@
 using System.Text;
 using System.Windows.Forms;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.FeatureSource.Extensions
 {
@@ -38,14 +39,14 @@
         public SelectJoinKeyDialog(ClassDefinition primary, ClassDefinition secondary)
             : this()
         {
-            lblPrimary.Text = primary.QualifiedNameDecoded;
-            lblSecondary.Text = secondary.QualifiedNameDecoded;
+            lblPrimary.Text = primary.QualifiedName;
+            lblSecondary.Text = secondary.QualifiedName;
 
             cmbPrimary.DisplayMember = "Name";
             cmbSecondary.DisplayMember = "Name";
 
-            cmbPrimary.DataSource = primary.Columns;
-            cmbSecondary.DataSource = secondary.Columns;
+            cmbPrimary.DataSource = primary.Properties;
+            cmbSecondary.DataSource = secondary.Properties;
 
             cmbPrimary.SelectedIndex = 0;
             cmbSecondary.SelectedIndex = 0;
@@ -55,7 +56,7 @@
         {
             get
             {
-                var col = cmbPrimary.SelectedItem as FeatureSetColumn;
+                var col = cmbPrimary.SelectedItem as PropertyDefinition;
                 if (col != null)
                     return col.Name;
                 return string.Empty;
@@ -66,7 +67,7 @@
         {
             get
             {
-                var col = cmbSecondary.SelectedItem as FeatureSetColumn;
+                var col = cmbSecondary.SelectedItem as PropertyDefinition;
                 if (col != null)
                     return col.Name;
                 return string.Empty;

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/ExtensionsCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/ExtensionsCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/ExtensionsCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -32,6 +32,7 @@
 using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.FeatureSource
 {
@@ -326,7 +327,7 @@
             var calc = e.Node.Tag as ICalculatedProperty;
             if (ext != null)
             {
-                var ctl = new ExtendedClassSettings(CachedSchema().Classes, ext);
+                var ctl = new ExtendedClassSettings(CachedSchema().AllClasses, ext);
                 ctl.Dock = DockStyle.Fill;
                 //If editing to something valid, update the toolbar
                 ctl.ResourceChanged += (s, evt) =>
@@ -345,16 +346,8 @@
                 ext = e.Node.Parent.Tag as IFeatureSourceExtension;
                 if (ext != null)
                 {
-                    ClassDefinition cls = null;
-                    foreach (var c in CachedSchema().Classes)
-                    {
-                        if (c.QualifiedName == ext.FeatureClass)
-                        {
-                            cls = c;
-                            break;
-                        }
-                    }
-
+                    ClassDefinition cls = CachedSchema().GetClass(ext.FeatureClass);
+                    
                     if (cls != null)
                     {
                         var ctl = new JoinSettings(cls, join);
@@ -371,16 +364,7 @@
                 ext = e.Node.Parent.Tag as IFeatureSourceExtension;
                 if (ext != null)
                 {
-                    ClassDefinition cls = null;
-                    foreach (var c in CachedSchema().Classes)
-                    {
-                        if (c.QualifiedName == ext.FeatureClass)
-                        {
-                            cls = c;
-                            break;
-                        }
-                    }
-
+                    ClassDefinition cls = CachedSchema().GetClass(ext.FeatureClass);
                     if (cls != null)
                     {
                         var ctl = new CalculationSettings(_edSvc, cls, _fs, calc);

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/IQueryControl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/IQueryControl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/IQueryControl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -22,12 +22,13 @@
 using System.Text;
 using System.Windows.Forms;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace Maestro.Editors.FeatureSource.Preview
 {
     internal interface IQueryControl
     {
-        FeatureSetReader ExecuteQuery();
+        IReader ExecuteQuery();
 
         Control Content { get; }
     }

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/LocalFeatureSourcePreviewCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/LocalFeatureSourcePreviewCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/LocalFeatureSourcePreviewCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -28,6 +28,7 @@
 using OSGeo.MapGuide.MaestroAPI;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.ObjectModels.Capabilities;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.FeatureSource.Preview
 {
@@ -90,9 +91,9 @@
             var schema = _fsvc.DescribeFeatureSource(currentFsId);
 
             Dictionary<string, List<ClassDefinition>> classes = new Dictionary<string, List<ClassDefinition>>();
-            foreach (var cls in schema.Classes)
+            foreach (var cls in schema.AllClasses)
             {
-                string[] tokens = cls.QualifiedNameDecoded.Split(':');
+                string[] tokens = cls.QualifiedName.Split(':');
                 if (!classes.ContainsKey(tokens[0]))
                     classes[tokens[0]] = new List<ClassDefinition>();
 
@@ -117,15 +118,15 @@
                         classNode.Tag = cls;
                         classNode.ImageIndex = classNode.SelectedImageIndex = IDX_CLASS;
 
-                        foreach (var prop in cls.Columns)
+                        foreach (var prop in cls.Properties)
                         {
                             var propNode = new TreeNode(prop.Name);
                             propNode.Text = prop.Name;
                             propNode.Tag = prop;
 
-                            if (prop.IsGeometry)
+                            if (prop.Type == PropertyDefinitionType.Geometry)
                                 propNode.ImageIndex = propNode.SelectedImageIndex = IDX_GEOMETRY;
-                            else if (prop.IsIdentity)
+                            else if (prop.Type == PropertyDefinitionType.Data && cls.IdentityProperties.Contains((DataPropertyDefinition)prop))
                                 propNode.ImageIndex = propNode.SelectedImageIndex = IDX_IDENTITY;
                             else
                                 propNode.ImageIndex = propNode.SelectedImageIndex = IDX_PROP;
@@ -190,7 +191,7 @@
             {
                 var pane = new PreviewPane(currentFsId, mode, cls, _fsvc, _caps);
                 var page = new TabPage();
-                page.Text = Properties.Resources.StandardQuery + " - " + cls.QualifiedNameDecoded;
+                page.Text = Properties.Resources.StandardQuery + " - " + cls.QualifiedName;
                 page.Tag = mode;
                 pane.Dock = DockStyle.Fill;
                 page.Controls.Add(pane);

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/PreviewPane.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/PreviewPane.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/PreviewPane.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -28,9 +28,13 @@
 using OSGeo.MapGuide.MaestroAPI.Services;
 using System.Diagnostics;
 using OSGeo.MapGuide.ObjectModels.Capabilities;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace Maestro.Editors.FeatureSource.Preview
 {
+    //TODO: IGeometry objects do not currently display (we should be showing the WKT form)
+
     internal partial class PreviewPane : UserControl, IQueryControl
     {
         private PreviewPane()
@@ -76,7 +80,7 @@
 
         private IQueryControl _inner;
 
-        public OSGeo.MapGuide.MaestroAPI.FeatureSetReader ExecuteQuery()
+        public IReader ExecuteQuery()
         {
             return _inner.ExecuteQuery();
         }
@@ -116,21 +120,20 @@
             {   
                 res.Result = new DataTable();
                 InitTable(reader, res.Result);
-                while (reader.Read())
+                while (reader.ReadNext())
                 {
                     if (e.Cancel)
                     {
                         break;
                     }
 
-                    var curRow = reader.Row;
                     var row = res.Result.NewRow();
-                    foreach (var col in reader.Columns)
+                    for (int i = 0; i < reader.FieldCount; i++)
                     {
-                        if (curRow.IsValueNull(col.Name))
-                            row[col.Name] = DBNull.Value;
+                        if (reader.IsNull(i))
+                            row[i] = DBNull.Value;
                         else
-                            row[col.Name] = curRow[col.Name];
+                            row[i] = reader[i];
                     }
                     res.Result.Rows.Add(row);
                 }
@@ -143,11 +146,14 @@
             e.Result = res;
         }
 
-        private void InitTable(FeatureSetReader reader, DataTable dataTable)
+        private void InitTable(IReader reader, DataTable dataTable)
         {
-            foreach (var col in reader.Columns)
+            //foreach (var col in reader.Columns)
+            for (int i = 0; i < reader.FieldCount; i++)
             {
-                var column = new DataColumn(col.Name, col.Type);
+                string name = reader.GetName(i);
+                Type type = reader.GetFieldType(i);
+                var column = new DataColumn(name, type);
                 dataTable.Columns.Add(column);
             }
         }

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/SqlQueryCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/SqlQueryCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/SqlQueryCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -25,6 +25,7 @@
 using System.Text;
 using System.Windows.Forms;
 using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace Maestro.Editors.FeatureSource.Preview
 {
@@ -45,7 +46,7 @@
             _featSvc = featSvc;
         }
 
-        public OSGeo.MapGuide.MaestroAPI.FeatureSetReader ExecuteQuery()
+        public IReader ExecuteQuery()
         {
             return _featSvc.ExecuteSqlQuery(_fsId, txtSql.Text);
         }

Modified: sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/StandardQueryCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/StandardQueryCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/FeatureSource/Preview/StandardQueryCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -29,6 +29,8 @@
 using System.Collections.Specialized;
 using Maestro.Editors.Common;
 using OSGeo.MapGuide.ObjectModels.Capabilities;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace Maestro.Editors.FeatureSource.Preview
 {
@@ -58,7 +60,7 @@
             _featSvc = featSvc;
             _cls = cls;
             _caps = caps;
-            foreach (var prop in cls.Columns)
+            foreach (var prop in cls.Properties)
             {
                 chkProperties.Items.Add(prop.Name, true);
             }
@@ -68,9 +70,9 @@
         /// Executes the query.
         /// </summary>
         /// <returns></returns>
-        public FeatureSetReader ExecuteQuery()
+        public IReader ExecuteQuery()
         {
-            return _featSvc.QueryFeatureSource(_fsId, _cls.QualifiedNameDecoded, txtFilter.Text, GetProperties(), GetComputedColumns());
+            return _featSvc.QueryFeatureSource(_fsId, _cls.QualifiedName, txtFilter.Text, GetProperties(), GetComputedColumns());
         }
 
         private NameValueCollection GetComputedColumns()

Modified: sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/IEditorService.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -28,6 +28,7 @@
 using System.ComponentModel;
 using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.MaestroAPI.Commands;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/LayerPropertiesSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/LayerPropertiesSectionCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/LayerPropertiesSectionCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -76,29 +76,26 @@
 
             //TODO: Should just fetch the class definition
             var desc = _edsvc.FeatureService.DescribeFeatureSource(_vl.ResourceId);
-            foreach (var sc in desc.Classes)
+            var cls = desc.GetClass(_vl.FeatureName);
+            if (cls != null)
             {
-                if (sc.QualifiedName == _vl.FeatureName)
+                grdProperties.Rows.Clear();
+                foreach (var col in cls.Properties)
                 {
-                    grdProperties.Rows.Clear();
-                    foreach (var col in sc.Columns)
+                    if (col.Type == OSGeo.MapGuide.MaestroAPI.Schema.PropertyDefinitionType.Data)
                     {
-                        if (!col.IsGeometry)
+                        bool visible = false;
+                        string disp = col.Name;
+                        foreach (var item in _vl.PropertyMapping)
                         {
-                            bool visible = false;
-                            string disp = col.Name;
-                            foreach (var item in _vl.PropertyMapping)
+                            if (item.Name == col.Name)
                             {
-                                if (item.Name == col.Name)
-                                {
-                                    visible = true;
-                                    disp = item.Value;
-                                }
+                                visible = true;
+                                disp = item.Value;
                             }
-                            grdProperties.Rows.Add(visible, col.Name, disp);
                         }
+                        grdProperties.Rows.Add(visible, col.Name, disp);
                     }
-                    break;
                 }
             }
         }

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/AreaFeatureStyleEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/AreaFeatureStyleEditor.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/AreaFeatureStyleEditor.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -26,6 +26,7 @@
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition.Vector.StyleEditors
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/FontStyleEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/FontStyleEditor.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/FontStyleEditor.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -27,6 +27,7 @@
 using OSGeo.MapGuide.MaestroAPI;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition.Vector.StyleEditors
 {
@@ -123,9 +124,11 @@
             m_featureSource = featureSource;
 
             propertyCombo.Items.Clear();
-            foreach (FeatureSetColumn col in m_schema.Columns)
-                if (col.Type != Utility.GeometryType && col.Type != Utility.RasterType)
-                propertyCombo.Items.Add(col.Name);
+            foreach (var col in m_schema.Properties)
+            {
+                if (col.Type == PropertyDefinitionType.Data)
+                    propertyCombo.Items.Add(col.Name);
+            }
             propertyCombo.Items.Add(Properties.Resources.ExpressionItem);
 
             fontCombo.Items.Clear();

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/LineFeatureStyleEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/LineFeatureStyleEditor.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/LineFeatureStyleEditor.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -28,6 +28,7 @@
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using Maestro.Editors.Common;
 using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition.Vector.StyleEditors
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/PointFeatureStyleEditor.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/PointFeatureStyleEditor.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/StyleEditors/PointFeatureStyleEditor.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -31,6 +31,7 @@
 using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.ObjectModels;
 using System.Threading;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition.Vector.StyleEditors
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/Thematics/ThemeCreator.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -33,6 +33,7 @@
 using OSGeo.MapGuide.ObjectModels;
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
 using Ldf = OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition.Vector.Thematics
 {
@@ -47,7 +48,7 @@
         private ILayerDefinition m_layer;
         private ClassDefinition m_schema;
         private Dictionary<object, long> m_values;
-        private Type m_dataType;
+        private DataPropertyType m_dataType;
         
         private object m_ruleCollection;
         private object m_defaultItem;
@@ -182,9 +183,11 @@
             ColumnCombo.Items.Add(Properties.Resources.SelectColumnPlaceholder);
             ColumnCombo.SelectedIndex = 0;
 
-            foreach (FeatureSetColumn col in m_schema.Columns)
-                if (col.Type == typeof(string) || Array.IndexOf<Type>(NUMERIC_TYPES, col.Type) >= 0) 
+            foreach (var col in m_schema.Properties)
+            {
+                if (col.Type == PropertyDefinitionType.Data)
                     ColumnCombo.Items.Add(col.Name);
+            }
         }
 
         private void ColumnCombo_SelectedIndexChanged(object sender, EventArgs e)
@@ -209,15 +212,8 @@
 
                 m_values = new Dictionary<object, long>();
 
-                FeatureSetColumn col = null;
-
-                foreach (FeatureSetColumn c in m_schema.Columns)
-                    if (c.Name == ColumnCombo.Text)
-                    {
-                        col = c;
-                        break;
-                    }
-
+                PropertyDefinition col = m_schema.FindProperty(ColumnCombo.Text);
+                
                 //Not really possible
                 if (col == null)
                     throw new Exception(Properties.Resources.InvalidColumnNameError);
@@ -232,13 +228,13 @@
                     try
                     {
                         IVectorLayerDefinition vl = (IVectorLayerDefinition)m_layer.SubLayer;
-                        using (FeatureSetReader rd = m_editor.FeatureService.QueryFeatureSource(vl.ResourceId, m_schema.QualifiedNameDecoded, filter, new string[] { col.Name }))
+                        using (var rd = m_editor.FeatureService.QueryFeatureSource(vl.ResourceId, m_schema.QualifiedName, filter, new string[] { col.Name }))
                         {
-                            while (rd.Read() && m_values.Count < 100000) //No more than 100.000 records in memory
+                            while (rd.ReadNext() && m_values.Count < 100000) //No more than 100.000 records in memory
                             {
-                                if (!rd.Row.IsValueNull(col.Name))
+                                if (!rd.IsNull(col.Name))
                                 {
-                                    object value = rd.Row[col.Name];
+                                    object value = rd[col.Name];
                                     if (!m_values.ContainsKey(value))
                                         m_values.Add(value, 0);
 
@@ -275,61 +271,65 @@
                     return;
                 }
 
-                m_dataType = col.Type;
-
-                if (Array.IndexOf<Type>(NUMERIC_TYPES, col.Type) >= 0)
+                if (col.Type == PropertyDefinitionType.Data)
                 {
-                    if (m_values.Count >= 100000)
-                        MessageBox.Show(this, string.Format(Properties.Resources.TooMuchDataWarning, 100000), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                    DataPropertyDefinition dp = ((DataPropertyDefinition)col);
+                    m_dataType = dp.DataType;
 
-                    GroupPanel.Enabled = true;
-                    RuleCountPanel.Enabled = true;
-                    RuleCount.Minimum = 3;
-
-                    if (m_values.Count <= 9)
+                    if (dp.IsNumericType())
                     {
-                        AggregateCombo.SelectedIndex = AggregateCombo.Items.Count - 1;
-                        AggregateCombo_SelectedIndexChanged(sender, e);
+                        if (m_values.Count >= 100000)
+                            MessageBox.Show(this, string.Format(Properties.Resources.TooMuchDataWarning, 100000), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
 
-                        RefreshColorBrewerSet();
-                    }
-                    else
-                    {
-                        RuleCount.Value = 6;
-                        if (!GradientColors.Checked)
-                            ColorBrewerColors.Checked = true;
+                        GroupPanel.Enabled = true;
+                        RuleCountPanel.Enabled = true;
+                        RuleCount.Minimum = 3;
 
-                        if (AggregateCombo.SelectedIndex < 0)
-                            AggregateCombo.SelectedIndex = 0;
-                        if (AggregateCombo.SelectedIndex == AggregateCombo.Items.Count - 1)
-                            AggregateCombo.SelectedIndex = 0;
+                        if (m_values.Count <= 9)
+                        {
+                            AggregateCombo.SelectedIndex = AggregateCombo.Items.Count - 1;
+                            AggregateCombo_SelectedIndexChanged(sender, e);
+
+                            RefreshColorBrewerSet();
+                        }
+                        else
+                        {
+                            RuleCount.Value = 6;
+                            if (!GradientColors.Checked)
+                                ColorBrewerColors.Checked = true;
+
+                            if (AggregateCombo.SelectedIndex < 0)
+                                AggregateCombo.SelectedIndex = 0;
+                            if (AggregateCombo.SelectedIndex == AggregateCombo.Items.Count - 1)
+                                AggregateCombo.SelectedIndex = 0;
+                        }
+
                     }
-
-                }
-                else //String type
-                {
-                    if (m_values.Count > 100)
+                    else //String type
                     {
-                        MessageBox.Show(this, string.Format(Properties.Resources.TooManyValuesError, 100), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
-                        ColumnCombo.SelectedIndex = 0;
-                        return;
-                    }
+                        if (m_values.Count > 100)
+                        {
+                            MessageBox.Show(this, string.Format(Properties.Resources.TooManyValuesError, 100), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
+                            ColumnCombo.SelectedIndex = 0;
+                            return;
+                        }
 
-                    RuleCountPanel.Enabled = 
-                    GroupPanel.Enabled = 
-                        false;
+                        RuleCountPanel.Enabled = 
+                        GroupPanel.Enabled = 
+                            false;
 
-                    RuleCount.Minimum = 0;
+                        RuleCount.Minimum = 0;
 
-                    //Select "Individual"
-                    AggregateCombo.SelectedIndex = AggregateCombo.Items.Count - 1;
-                    RuleCount.Value = m_values.Count;
-                    GradientColors.Checked = true;
+                        //Select "Individual"
+                        AggregateCombo.SelectedIndex = AggregateCombo.Items.Count - 1;
+                        RuleCount.Value = m_values.Count;
+                        GradientColors.Checked = true;
 
-                    DisplayGroup.Enabled =
-                    PreviewGroup.Enabled =
-                    OKBtn.Enabled =
-                        true;
+                        DisplayGroup.Enabled =
+                        PreviewGroup.Enabled =
+                        OKBtn.Enabled =
+                            true;
+                    }
                 }
 
                 RefreshColorBrewerSet();
@@ -513,7 +513,7 @@
 
         private string FormatValue(double value)
         {
-            if (m_dataType == typeof(double) || m_dataType == typeof(float))
+            if (m_dataType == DataPropertyType.Double || m_dataType == DataPropertyType.Single)
                 return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", value);
             else
                 return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", (long)Math.Round(value));

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/Vector/VectorLayerSettingsSectionCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -31,6 +31,7 @@
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using Maestro.Editors.Common;
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition.Vector
 {
@@ -77,14 +78,11 @@
                 if (_cachedDesc == null)
                     _cachedDesc = _edsvc.FeatureService.DescribeFeatureSource(txtFeatureSource.Text);
 
-                foreach (var cls in _cachedDesc.Classes)
+                var cls = _cachedDesc.GetClass(txtFeatureClass.Text);
+                if (cls != null)
                 {
-                    if (cls.QualifiedNameDecoded.Equals(txtFeatureClass.Text))
-                    {
-                        _selectedClass = cls;
-                        OnFeatureClassChanged();
-                        break;
-                    }
+                    _selectedClass = cls;
+                    OnFeatureClassChanged();
                 }
             }
         }
@@ -196,17 +194,18 @@
 
         private void btnBrowseSchema_Click(object sender, EventArgs e)
         {
-            var item = GenericItemSelectionDialog.SelectItem(null, null, _cachedDesc.Classes, "QualifiedNameDecoded", "QualifiedNameDecoded");
+            var list = new List<ClassDefinition>(_cachedDesc.AllClasses).ToArray();
+            var item = GenericItemSelectionDialog.SelectItem(null, null, list, "QualifiedName", "QualifiedName");
             if (item != null)
             {
-                txtFeatureClass.Text = item.QualifiedNameDecoded;
+                txtFeatureClass.Text = item.QualifiedName;
                 _selectedClass = item;
                 
                 //See if geometry needs invalidation
                 bool invalidate = true;
-                foreach (var col in item.Columns)
+                foreach (var col in item.Properties)
                 {
-                    if (col.IsGeometry && col.Name.Equals(txtGeometry.Text))
+                    if (col.Type == PropertyDefinitionType.Geometry && col.Name.Equals(txtGeometry.Text))
                     {
                         invalidate = false;
                         break;
@@ -218,10 +217,10 @@
                 }
 
                 //See if we can auto-assign geometry
-                List<FeatureSetColumn> geoms = new List<FeatureSetColumn>();
-                foreach (var col in _selectedClass.Columns)
+                List<PropertyDefinition> geoms = new List<PropertyDefinition>();
+                foreach (var col in _selectedClass.Properties)
                 {
-                    if (col.IsGeometry)
+                    if (col.Type == PropertyDefinitionType.Geometry)
                         geoms.Add(col);
                 }
 
@@ -236,10 +235,10 @@
         {
             if (_selectedClass != null)
             {
-                List<FeatureSetColumn> geoms = new List<FeatureSetColumn>();
-                foreach (var col in _selectedClass.Columns)
+                List<PropertyDefinition> geoms = new List<PropertyDefinition>();
+                foreach (var col in _selectedClass.Properties)
                 {
-                    if (col.IsGeometry)
+                    if (col.Type == PropertyDefinitionType.Geometry)
                         geoms.Add(col);
                 }
 

Modified: sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/LayerDefinition/VectorLayerEditorCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -8,6 +8,7 @@
 using OSGeo.MapGuide.ObjectModels.LayerDefinition;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.LayerDefinition
 {

Modified: sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/MapDefinition/MapSettingsSectionCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -48,6 +48,7 @@
         const string META_END = "</MapDescription>";
 
         private IEditorService _service;
+        private bool _updatingExtents = false;
 
         public override void Bind(IEditorService service)
         {
@@ -88,6 +89,10 @@
                 {
                     cmbBackgroundColor.CurrentColor = _map.BackgroundColor;
                 }
+                else if (e.PropertyName == "Extents")
+                {
+                    UpdateExtentsFromMap();
+                }
             };
 
             txtLowerX.Text = _map.Extents.MinX.ToString(CultureInfo.InvariantCulture);
@@ -97,6 +102,9 @@
 
             txtLowerX.TextChanged += (s, e) =>
             {
+                if (_updatingExtents)
+                    return;
+
                 if (txtLowerX.Text.EndsWith(".")) //Maybe typing in decimals atm
                     return;
 
@@ -107,6 +115,9 @@
 
             txtLowerY.TextChanged += (s, e) =>
             {
+                if (_updatingExtents)
+                    return;
+
                 if (txtLowerY.Text.EndsWith(".")) //Maybe typing in decimals atm
                     return;
 
@@ -117,6 +128,9 @@
 
             txtUpperX.TextChanged += (s, e) =>
             {
+                if (_updatingExtents)
+                    return;
+
                 if (txtUpperX.Text.EndsWith(".")) //Maybe typing in decimals atm
                     return;
 
@@ -127,6 +141,9 @@
 
             txtUpperY.TextChanged += (s, e) =>
             {
+                if (_updatingExtents)
+                    return;
+
                 if (txtUpperY.Text.EndsWith(".")) //Maybe typing in decimals atm
                     return;
 
@@ -138,6 +155,22 @@
             _map.Extents.PropertyChanged += (sender, e) => { OnResourceChanged(); };
         }
 
+        private void UpdateExtentsFromMap()
+        {
+            _updatingExtents = true;
+            try
+            {
+                txtLowerX.Text = _map.Extents.MinX.ToString(CultureInfo.InvariantCulture);
+                txtLowerY.Text = _map.Extents.MinY.ToString(CultureInfo.InvariantCulture);
+                txtUpperX.Text = _map.Extents.MaxX.ToString(CultureInfo.InvariantCulture);
+                txtUpperY.Text = _map.Extents.MaxY.ToString(CultureInfo.InvariantCulture);
+            }
+            finally
+            {
+                _updatingExtents = false;
+            }
+        }
+
         private void btnPickCs_Click(object sender, EventArgs e)
         {
             string cs = _service.GetCoordinateSystem();

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.Designer.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -231,22 +231,22 @@
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to &quot;ColorName&quot;,&quot;NumOfColors&quot;,&quot;Type&quot;,&quot;CritVal&quot;,&quot;ColorNum&quot;,&quot;ColorLetter&quot;,&quot;R&quot;,&quot;G&quot;,&quot;B&quot;,&quot;SchemeType&quot;
-        ///&quot;Accent&quot;,3,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,&quot;Qualitative&quot;
-        ///,,,,2,&quot;B&quot;,190,174,212,
-        ///,,,,3,&quot;C&quot;,253,192,134,
-        ///&quot;Accent&quot;,4,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,
-        ///,,,,2,&quot;B&quot;,190,174,212,
-        ///,,,,3,&quot;C&quot;,253,192,134,
-        ///,,,,4,&quot;D&quot;,255,255,153,
-        ///&quot;Accent&quot;,5,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,
-        ///,,,,2,&quot;B&quot;,190,174,212,
-        ///,,,,3,&quot;C&quot;,253,192,134,
-        ///,,,,4,&quot;D&quot;,255,255,153,
-        ///,,,,5,&quot;E&quot;,56,108,176,
-        ///&quot;Accent&quot;,6,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,
-        ///,,,,2,&quot;B&quot;,190,174,212,
-        ///,,,,3,&quot;C&quot;,253,192,134,
+        ///   Looks up a localized string similar to &quot;ColorName&quot;,&quot;NumOfColors&quot;,&quot;Type&quot;,&quot;CritVal&quot;,&quot;ColorNum&quot;,&quot;ColorLetter&quot;,&quot;R&quot;,&quot;G&quot;,&quot;B&quot;,&quot;SchemeType&quot;
+        ///&quot;Accent&quot;,3,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,&quot;Qualitative&quot;
+        ///,,,,2,&quot;B&quot;,190,174,212,
+        ///,,,,3,&quot;C&quot;,253,192,134,
+        ///&quot;Accent&quot;,4,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,
+        ///,,,,2,&quot;B&quot;,190,174,212,
+        ///,,,,3,&quot;C&quot;,253,192,134,
+        ///,,,,4,&quot;D&quot;,255,255,153,
+        ///&quot;Accent&quot;,5,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,
+        ///,,,,2,&quot;B&quot;,190,174,212,
+        ///,,,,3,&quot;C&quot;,253,192,134,
+        ///,,,,4,&quot;D&quot;,255,255,153,
+        ///,,,,5,&quot;E&quot;,56,108,176,
+        ///&quot;Accent&quot;,6,&quot;qual&quot;,,1,&quot;A&quot;,127,201,127,
+        ///,,,,2,&quot;B&quot;,190,174,212,
+        ///,,,,3,&quot;C&quot;,253,192,134,
         ///,, [rest of string was truncated]&quot;;.
         /// </summary>
         internal static string ColorBrewer {
@@ -2082,6 +2082,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Please select the layer first.
+        /// </summary>
+        internal static string SelectLayerFirst {
+            get {
+                return ResourceManager.GetString("SelectLayerFirst", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Select the package file to edit.
         /// </summary>
         internal static string SelectPackageFile {

Modified: sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/Properties/Resources.resx	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1067,4 +1067,7 @@
   <data name="InvokeUrlNoMapDefined" xml:space="preserve">
     <value>Cannot get layers. No map definition specified</value>
   </data>
+  <data name="SelectLayerFirst" xml:space="preserve">
+    <value>Please select the layer first</value>
+  </data>
 </root>
\ No newline at end of file

Modified: sandbox/maestro-3.0/Maestro.Editors/WebLayout/Commands/SearchCmdCtrl.cs
===================================================================
--- sandbox/maestro-3.0/Maestro.Editors/WebLayout/Commands/SearchCmdCtrl.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/Maestro.Editors/WebLayout/Commands/SearchCmdCtrl.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -31,6 +31,7 @@
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.MaestroAPI;
 using Maestro.Editors.Common;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace Maestro.Editors.WebLayout.Commands
 {
@@ -105,7 +106,10 @@
 
         void OnAddingNewColumn(object sender, AddingNewEventArgs e)
         {
-            e.NewObject = _cmd.ResultColumns.CreateColumn("MyProperty", _cls.Columns[0].Name);
+            if (_cls == null)
+                return;
+
+            e.NewObject = _cmd.ResultColumns.CreateColumn("MyProperty", _cls.Properties[0].Name);
         }
 
         void OnColumnsChanged(object sender, ListChangedEventArgs e)
@@ -168,13 +172,17 @@
                 var vl = (IVectorLayerDefinition)ldf.SubLayer;
 
                 var fs = (IFeatureSource)_edsvc.ResourceService.GetResource(vl.ResourceId);
-                
+
                 string expr = _edsvc.EditExpression(txtFilter.Text, _cls, fs.Provider, vl.ResourceId);
                 if (expr != null)
                 {
                     txtFilter.Text = expr;
                 }
             }
+            else
+            {
+                MessageBox.Show(Properties.Resources.SelectLayerFirst);
+            }
         }
 
         private void UpdateColumns()
@@ -189,7 +197,7 @@
                 _cls = _edsvc.FeatureService.GetClassDefinition(vl.ResourceId, vl.FeatureName);
 
                 COL_PROPERTY.DisplayMember = "Name";
-                COL_PROPERTY.DataSource = _cls.Columns;
+                COL_PROPERTY.DataSource = _cls.Properties;
             }
         }
 
@@ -203,6 +211,7 @@
 
         private void btnBrowseLayer_Click(object sender, EventArgs e)
         {
+            //FIXME: This doesn't properly show the specified display member. WTF?
             var layer = GenericItemSelectionDialog.SelectItem(Properties.Resources.SelectLayer, Properties.Resources.SelectLayer, _layers.ToArray(), "Name", "Name");
             if (layer != null)
             {

Added: sandbox/maestro-3.0/MaestroAPITests/ConfigurationTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ConfigurationTests.cs	                        (rev 0)
+++ sandbox/maestro-3.0/MaestroAPITests/ConfigurationTests.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,139 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.SchemaOverrides;
+using OSGeo.MapGuide.ObjectModels.Common;
+using System.IO;
+
+namespace MaestroAPITests
+{
+    [TestFixture]
+    public class ConfigurationTests
+    {
+        [Test]
+        public void TestOdbcSaveLoad()
+        {
+            var schema = new FeatureSchema("Default", "Test schema");
+            var cls = new ClassDefinition("Cities", "Cities class");
+
+            cls.AddProperty(new DataPropertyDefinition("ID", "Primary Key")
+            {
+                DataType = DataPropertyType.Int64,
+                IsNullable = false,
+                IsAutoGenerated = true
+            }, true);
+
+            cls.AddProperty(new DataPropertyDefinition("Name", "City Name")
+            {
+                DataType = DataPropertyType.String,
+                IsNullable = true,
+                IsAutoGenerated = false,
+                Length = 255
+            });
+
+            cls.AddProperty(new GeometricPropertyDefinition("Geometry", "Geometry property")
+            {
+                GeometricTypes = FeatureGeometricType.Point,
+                SpecificGeometryTypes = new SpecificGeometryType[] { SpecificGeometryType.Point },
+                HasElevation = false,
+                HasMeasure = false,
+                SpatialContextAssociation = "Default"
+            });
+
+            cls.AddProperty(new DataPropertyDefinition("Population", "Population")
+            {
+                DataType = DataPropertyType.Int32,
+                IsNullable = true,
+                IsAutoGenerated = false
+            });
+
+            cls.DefaultGeometryPropertyName = "Geometry";
+
+            schema.AddClass(cls);
+
+            var sc = new FdoSpatialContextListSpatialContext();
+            sc.CoordinateSystemName = "LL84";
+            sc.CoordinateSystemWkt = "";
+            sc.Description = "Default Spatial Context";
+            sc.Extent = new FdoSpatialContextListSpatialContextExtent()
+            {
+                LowerLeftCoordinate = new FdoSpatialContextListSpatialContextExtentLowerLeftCoordinate()
+                {
+                    X = "-180.0",
+                    Y = "-180.0"
+                },
+                UpperRightCoordinate = new FdoSpatialContextListSpatialContextExtentUpperRightCoordinate()
+                {
+                    X = "180.0",
+                    Y = "180.0"
+                }
+            };
+            sc.ExtentType = FdoSpatialContextListSpatialContextExtentType.Static;
+            sc.Name = "Default";
+            sc.XYTolerance = 0.0001;
+            sc.ZTolerance = 0.0001;
+
+            var conf = new OdbcConfigurationDocument();
+            conf.AddSchema(schema);
+            conf.AddSpatialContext(sc);
+
+            var ov = new OdbcTableItem();
+            ov.SchemaName = schema.Name;
+            ov.ClassName = cls.Name;
+            ov.SpatialContextName = sc.Name;
+            ov.XColumn = "Lon";
+            ov.YColumn = "Lat";
+            
+            conf.AddOverride(ov);
+
+            string path = "OdbcConfigTest.xml";
+            File.WriteAllText(path, conf.ToXml());
+
+            conf = null;
+            string xml = File.ReadAllText(path);
+            conf = ConfigurationDocument.LoadXml(xml) as OdbcConfigurationDocument;
+            Assert.NotNull(conf);
+
+            ov = conf.GetOverride("Default", "Cities");
+            Assert.NotNull(ov);
+            Assert.AreEqual("Default", ov.SchemaName);
+            Assert.AreEqual("Cities", ov.ClassName);
+            Assert.AreEqual(sc.Name, ov.SpatialContextName);
+            Assert.AreEqual("Lon", ov.XColumn);
+            Assert.AreEqual("Lat", ov.YColumn);
+        }
+
+        [Test]
+        public void TestGdalSaveLoad()
+        {
+
+        }
+
+        [Test]
+        public void TestWmsSaveLoad()
+        {
+
+        }
+    }
+}

Modified: sandbox/maestro-3.0/MaestroAPITests/ExpressionTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ExpressionTests.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/MaestroAPITests/ExpressionTests.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -27,6 +27,7 @@
 using System.Threading;
 using System.Diagnostics;
 using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using OSGeo.MapGuide.MaestroAPI.Http;
 
 namespace MaestroAPITests
 {
@@ -46,11 +47,17 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
             Assert.Catch<ExpressionException>(() => exprReader.Evaluate<bool>("CurrentDate()"));
             Assert.Catch<ExpressionException>(() => exprReader.Evaluate<bool>("'Foobar'"));
             Assert.Catch<ExpressionException>(() => exprReader.Evaluate<bool>("Power(2, 4)"));
@@ -73,11 +80,17 @@
 
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             Thread.Sleep(50);
 
@@ -97,7 +110,7 @@
             
             Thread.Sleep(50);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var dt2 = exprReader.Evaluate("CurrentDate()");
             Assert.NotNull(dt2);
@@ -115,7 +128,7 @@
 
             Thread.Sleep(50);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var dt3 = exprReader.Evaluate("CurrentDate()");
             Assert.NotNull(dt3);
@@ -133,7 +146,7 @@
 
             Thread.Sleep(50);
 
-            Assert.IsFalse(exprReader.Read()); //end of stream
+            Assert.IsFalse(exprReader.ReadNext()); //end of stream
 
             exprReader.Close();
         }
@@ -143,13 +156,19 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
-            Assert.IsTrue(!exprReader.IsDBNull(exprReader.GetOrdinal("URL")));
+            Assert.IsTrue(!exprReader.IsNull("URL"));
 
             var url = exprReader["URL"];
             var value = exprReader.Evaluate("NullValue(URL, 'http://www.snafu.com')");
@@ -157,19 +176,19 @@
             Assert.NotNull(value);
             Assert.AreEqual(url.ToString(), value.ToString());
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var value2 = exprReader.Evaluate("NullValue(URL, 'http://www.foo.com')");
             Assert.NotNull(value2);
             Assert.AreEqual("http://www.foo.com", value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var value3 = exprReader.Evaluate("NullValue(URL, 'http://www.bar.com')");
             Assert.NotNull(value3);
             Assert.AreEqual("http://www.bar.com", value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
             exprReader.Close();
         }
 
@@ -178,32 +197,38 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToInt32(exprReader.Evaluate("Abs(-ID)"));
 
             Assert.AreEqual(orig, value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToInt32(exprReader.Evaluate("Abs(-ID)"));
 
             Assert.AreEqual(orig2, value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToInt32(exprReader.Evaluate("Abs(-ID)"));
 
             Assert.AreEqual(orig3, value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -215,32 +240,38 @@
 
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToDouble(exprReader.Evaluate("Acos(ID * 0.1)"));
 
             Assert.AreEqual(Math.Acos(orig * 0.1), value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToDouble(exprReader.Evaluate("Acos(ID * 0.1)"));
 
             Assert.AreEqual(Math.Acos(orig2 * 0.1), value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToDouble(exprReader.Evaluate("Acos(ID * 0.1)"));
 
             Assert.AreEqual(Math.Acos(orig3 * 0.1), value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -252,32 +283,38 @@
 
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToDouble(exprReader.Evaluate("Asin(ID * 0.1)"));
 
             Assert.AreEqual(Math.Asin(orig * 0.1), value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToDouble(exprReader.Evaluate("Asin(ID * 0.1)"));
 
             Assert.AreEqual(Math.Asin(orig2 * 0.1), value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToDouble(exprReader.Evaluate("Asin(ID * 0.1)"));
 
             Assert.AreEqual(Math.Asin(orig3 * 0.1), value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -286,14 +323,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -303,32 +346,38 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToDouble(exprReader.Evaluate("Cos(ID)"));
 
             Assert.AreEqual(Math.Cos(orig), value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToDouble(exprReader.Evaluate("Cos(ID)"));
 
             Assert.AreEqual(Math.Cos(orig2), value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToDouble(exprReader.Evaluate("Cos(ID)"));
 
             Assert.AreEqual(Math.Cos(orig3), value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -338,32 +387,38 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToDouble(exprReader.Evaluate("Exp(ID)"));
 
             Assert.AreEqual(Math.Exp(orig), value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToDouble(exprReader.Evaluate("Exp(ID)"));
 
             Assert.AreEqual(Math.Exp(orig2), value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToDouble(exprReader.Evaluate("Exp(ID)"));
 
             Assert.AreEqual(Math.Exp(orig3), value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -373,32 +428,38 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToDouble(exprReader.Evaluate("Ln(ID)"));
 
             Assert.AreEqual(Math.Log(orig), value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToDouble(exprReader.Evaluate("Ln(ID)"));
 
             Assert.AreEqual(Math.Log(orig2), value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToDouble(exprReader.Evaluate("Ln(ID)"));
 
             Assert.AreEqual(Math.Log(orig3), value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -413,14 +474,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -430,32 +497,38 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = (int)exprReader["ID"];
             var value = Convert.ToDouble(exprReader.Evaluate("Power(ID, 2)"));
 
             Assert.AreEqual(Math.Pow(orig, 2), value);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = (int)exprReader["ID"];
             var value2 = Convert.ToDouble(exprReader.Evaluate("Power(ID, 4)"));
 
             Assert.AreEqual(Math.Pow(orig2, 4), value2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig3 = (int)exprReader["ID"];
             var value3 = Convert.ToDouble(exprReader.Evaluate("Power(ID, 8)"));
 
             Assert.AreEqual(Math.Pow(orig3, 8), value3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -464,14 +537,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -480,14 +559,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -496,14 +581,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -512,14 +603,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -528,14 +625,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -544,14 +647,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -560,14 +669,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -576,14 +691,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -592,14 +713,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -611,11 +738,17 @@
 
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig = exprReader["Name"].ToString();
             var value = exprReader.Evaluate("Concat(Concat(Name, 'Foo'), 'Bar')");
@@ -623,7 +756,7 @@
             Assert.AreEqual(orig + "FooBar", value);
             Assert.AreEqual(orig + "FooBarSnafu", valueV);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var orig2 = exprReader["Name"].ToString();
             var value2 = exprReader.Evaluate("Concat(Concat(Name, 'Foo'), 'Bar')");
@@ -631,14 +764,14 @@
             Assert.AreEqual(orig2 + "FooBar", value2);
             Assert.AreEqual(orig2 + "FooBarSnafu", valueV2);
 
-            Assert.IsTrue(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
 
             var value3 = exprReader.Evaluate("Concat(Concat(Name, 'Foo'), 'Bar')");
             var valueV3 = exprReader.Evaluate("Concat(Name, 'Foo', 'Bar', 'Snafu')");
             Assert.AreEqual("FooBar", value3);
             Assert.AreEqual("FooBarSnafu", valueV3);
 
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -647,14 +780,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -663,14 +802,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -679,14 +824,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -695,14 +846,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -711,14 +868,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -727,14 +890,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -743,14 +912,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -759,14 +934,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -775,14 +956,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -791,14 +978,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -807,14 +1000,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }
@@ -823,14 +1022,20 @@
         {
             //Simulate post-#708 SELECTFEATURES output and test our expression engine reader
             var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
-            var reader = new XmlFeatureSetReader(new MemoryStream(bytes));
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+            Assert.NotNull(reader.ClassDefinition);
+            Assert.AreEqual(3, reader.FieldCount);
+            Assert.AreEqual(3, reader.ClassDefinition.Properties.Count);
+            Assert.NotNull(reader.ClassDefinition.FindProperty("ID"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("Name"));
+            Assert.NotNull(reader.ClassDefinition.FindProperty("URL"));
 
             var exprReader = new ExpressionFeatureReader(reader);
 
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsTrue(exprReader.Read());
-            Assert.IsFalse(exprReader.Read());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsTrue(exprReader.ReadNext());
+            Assert.IsFalse(exprReader.ReadNext());
 
             exprReader.Close();
         }

Modified: sandbox/maestro-3.0/MaestroAPITests/FeatureReaderTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/FeatureReaderTests.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/MaestroAPITests/FeatureReaderTests.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -31,6 +31,63 @@
     [TestFixture]
     public class FeatureReaderTests
     {
+        public void TestXmlFeatureNullValues()
+        {
+            //Simulate post-#708 SELECTFEATURES and verify reader properly handles null values in response
+            var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectFeatureSample);
+            var reader = new XmlFeatureReader(new MemoryStream(bytes));
+
+            Assert.AreEqual(3, reader.FieldCount);
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsFalse(reader.IsNull(1));
+            Assert.IsFalse(reader.IsNull(2));
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsFalse(reader.IsNull(1));
+            Assert.IsTrue(reader.IsNull(2));
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsTrue(reader.IsNull(1));
+            Assert.IsTrue(reader.IsNull(2));
+
+            Assert.IsFalse(reader.ReadNext()); //end of stream
+
+            //Test the IEnumerable approach
+            reader = new XmlFeatureReader(new MemoryStream(bytes));
+
+            int i = 0;
+            foreach (var feat in reader)
+            {
+                switch (i)
+                {
+                    case 0:
+                        Assert.IsFalse(feat.IsNull(0));
+                        Assert.IsFalse(feat.IsNull(1));
+                        Assert.IsFalse(feat.IsNull(2));
+                        break;
+                    case 1:
+                        Assert.IsFalse(feat.IsNull(0));
+                        Assert.IsFalse(feat.IsNull(1));
+                        Assert.IsTrue(feat.IsNull(2));
+                        break;
+                    case 2:
+                        Assert.IsFalse(feat.IsNull(0));
+                        Assert.IsTrue(feat.IsNull(1));
+                        Assert.IsTrue(feat.IsNull(2));
+                        break;
+                }
+                i++;
+            }
+        }
+
+        /*
         [Test]
         public void TestXmlFeatureNullValues()
         {
@@ -84,8 +141,65 @@
                 }
                 i++;
             }
+        }*/
+
+        public void TestXmlAggregateNullValues()
+        {
+            //Simulate post-#708 SELECTAGGREGATES and verify reader properly handles null values in response
+            var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectAggregatesSample);
+            var reader = new XmlDataReader(new MemoryStream(bytes));
+
+            Assert.AreEqual(3, reader.FieldCount);
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsFalse(reader.IsNull(1));
+            Assert.IsFalse(reader.IsNull(2));
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsFalse(reader.IsNull(1));
+            Assert.IsTrue(reader.IsNull(2));
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsTrue(reader.IsNull(1));
+            Assert.IsTrue(reader.IsNull(2));
+
+            Assert.IsFalse(reader.ReadNext()); //end of stream
+
+            //Test the IEnumerable approach
+            reader = new XmlDataReader(new MemoryStream(bytes));
+
+            int i = 0;
+            while (reader.ReadNext())
+            {
+                switch (i)
+                {
+                    case 0:
+                        Assert.IsFalse(reader.IsNull(0));
+                        Assert.IsFalse(reader.IsNull(1));
+                        Assert.IsFalse(reader.IsNull(2));
+                        break;
+                    case 1:
+                        Assert.IsFalse(reader.IsNull(0));
+                        Assert.IsFalse(reader.IsNull(1));
+                        Assert.IsTrue(reader.IsNull(2));
+                        break;
+                    case 2:
+                        Assert.IsFalse(reader.IsNull(0));
+                        Assert.IsTrue(reader.IsNull(1));
+                        Assert.IsTrue(reader.IsNull(2));
+                        break;
+                }
+                i++;
+            }
         }
 
+        /*
         [Test]
         public void TestXmlAggregateNullValues()
         {
@@ -140,7 +254,65 @@
                 i++;
             }
         }
+         */
+
+        public void TestXmlSqlNullValues()
+        {
+            //Simulate post-#708 EXECUTESQL and verify reader properly handles null values in response
+            var bytes = Encoding.UTF8.GetBytes(Properties.Resources.SelectSqlSample);
+            var reader = new XmlSqlResultReader(new MemoryStream(bytes));
+
+            Assert.AreEqual(3, reader.FieldCount);
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsFalse(reader.IsNull(1));
+            Assert.IsFalse(reader.IsNull(2));
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsFalse(reader.IsNull(1));
+            Assert.IsTrue(reader.IsNull(2));
+
+            reader.ReadNext();
+
+            Assert.IsFalse(reader.IsNull(0));
+            Assert.IsTrue(reader.IsNull(1));
+            Assert.IsTrue(reader.IsNull(2));
+
+            Assert.IsFalse(reader.ReadNext()); //end of stream
+
+            //Test the IEnumerable approach
+            reader = new XmlSqlResultReader(new MemoryStream(bytes));
+
+            int i = 0;
+            while(reader.ReadNext())
+            {
+                switch (i)
+                {
+                    case 0:
+                        Assert.IsFalse(reader.IsNull(0));
+                        Assert.IsFalse(reader.IsNull(1));
+                        Assert.IsFalse(reader.IsNull(2));
+                        break;
+                    case 1:
+                        Assert.IsFalse(reader.IsNull(0));
+                        Assert.IsFalse(reader.IsNull(1));
+                        Assert.IsTrue(reader.IsNull(2));
+                        break;
+                    case 2:
+                        Assert.IsFalse(reader.IsNull(0));
+                        Assert.IsTrue(reader.IsNull(1));
+                        Assert.IsTrue(reader.IsNull(2));
+                        break;
+                }
+                i++;
+            }
+        }
         
+        /*
         [Test]
         public void TestXmlSqlNullValues()
         {
@@ -194,6 +366,6 @@
                 }
                 i++;
             }
-        }
+        }*/
     }
 }

Modified: sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/MaestroAPITests/MaestroAPITests.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -27,6 +27,9 @@
     <IsWebBootstrapper>false</IsWebBootstrapper>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -64,7 +67,11 @@
     </Reference>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="CapabilityTests.cs" />
+    <Compile Include="ConfigurationTests.cs" />
     <Compile Include="ExpressionTests.cs" />
     <Compile Include="FeatureReaderTests.cs" />
     <Compile Include="HttpConnectionTests.cs" />
@@ -77,6 +84,7 @@
     </Compile>
     <Compile Include="ResourceTests.cs" />
     <Compile Include="RuntimeMapTests.cs" />
+    <Compile Include="SchemaTests.cs" />
     <Compile Include="SerializationTests.cs" />
     <Compile Include="ValidationTests.cs" />
   </ItemGroup>
@@ -322,6 +330,30 @@
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
+    <Content Include="..\TestData\gen_default1_MySql_master.xml">
+      <Link>UserTestData\gen_default1_MySql_master.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\TestData\gen_default1_Oracle_master.xml">
+      <Link>UserTestData\gen_default1_Oracle_master.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\TestData\gen_default1_SqlServer2005_master.xml">
+      <Link>UserTestData\gen_default1_SqlServer2005_master.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\TestData\gen_default1_SqlServer2008_master.xml">
+      <Link>UserTestData\gen_default1_SqlServer2008_master.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\TestData\gen_default1_SQLServerSpatial_master.xml">
+      <Link>UserTestData\gen_default1_SQLServerSpatial_master.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\TestData\gen_default1_SqlServer_master.xml">
+      <Link>UserTestData\gen_default1_SqlServer_master.xml</Link>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <Content Include="TestData\CoordinateSystems\epsgcodes.txt">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>

Modified: sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/MaestroAPITests/RuntimeMapTests.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -615,7 +615,7 @@
         }
     }
 
-    [TestFixture]
+    [TestFixture(Ignore = true)]
     public class HttpRuntimeMapTests : RuntimeMapTests
     {
         protected override IServerConnection CreateTestConnection()

Added: sandbox/maestro-3.0/MaestroAPITests/SchemaTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/SchemaTests.cs	                        (rev 0)
+++ sandbox/maestro-3.0/MaestroAPITests/SchemaTests.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,311 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NUnit.Framework;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.IO;
+using System.Xml;
+
+namespace MaestroAPITests
+{
+    [TestFixture]
+    public class SchemaTests
+    {
+        //These tests are to verify that we can read FDO XML configuration and schema documents without problems
+
+        [Test]
+        public void TestMySqlSchema()
+        {
+            var fds = new FeatureSourceDescription(File.OpenRead("UserTestData\\gen_default1_MySql_master.xml"));
+            Assert.AreEqual(1, fds.Schemas.Length);
+
+            var fs = fds.GetSchema("AutoGen");
+            Assert.IsNotNull(fs);
+
+            Assert.AreEqual(12, fs.Classes.Count);
+
+            var c1 = fds.GetClass("AutoGen:rtable1");
+            var c2 = fds.GetClass("AutoGen:rtable2");
+            var c3 = fds.GetClass("AutoGen:rtable5");
+            var c4 = fds.GetClass("AutoGen:rtable6");
+            var c5 = fds.GetClass("AutoGen:rtable7");
+            var c6 = fds.GetClass("AutoGen:table1");
+            var c7 = fds.GetClass("AutoGen:table3");
+            var c8 = fds.GetClass("AutoGen:table4");
+            var c9 = fds.GetClass("AutoGen:table5");
+            var c10 = fds.GetClass("AutoGen:table6");
+            var c11 = fds.GetClass("AutoGen:table7");
+            var c12 = fds.GetClass("AutoGen:view1");
+
+            Assert.NotNull(c1);
+            Assert.NotNull(c2);
+            Assert.NotNull(c3);
+            Assert.NotNull(c4);
+            Assert.NotNull(c5);
+            Assert.NotNull(c6);
+            Assert.NotNull(c7);
+            Assert.NotNull(c8);
+            Assert.NotNull(c9);
+            Assert.NotNull(c10);
+            Assert.NotNull(c11);
+            Assert.NotNull(c12);
+
+            Assert.AreEqual(1, c1.IdentityProperties.Count);
+            Assert.AreEqual(1, c2.IdentityProperties.Count);
+            Assert.AreEqual(1, c3.IdentityProperties.Count);
+            Assert.AreEqual(1, c4.IdentityProperties.Count);
+            Assert.AreEqual(1, c5.IdentityProperties.Count);
+            Assert.AreEqual(1, c6.IdentityProperties.Count);
+            Assert.AreEqual(2, c7.IdentityProperties.Count);
+            Assert.AreEqual(1, c8.IdentityProperties.Count);
+            Assert.AreEqual(1, c9.IdentityProperties.Count);
+            Assert.AreEqual(2, c10.IdentityProperties.Count);
+            Assert.AreEqual(1, c11.IdentityProperties.Count);
+            Assert.AreEqual(0, c12.IdentityProperties.Count);
+
+            Assert.AreEqual(c1.Properties.Count, 3);
+            Assert.AreEqual(c2.Properties.Count, 5);
+            Assert.AreEqual(c3.Properties.Count, 3);
+            Assert.AreEqual(c4.Properties.Count, 4);
+            Assert.AreEqual(c5.Properties.Count, 3);
+            Assert.AreEqual(c6.Properties.Count, 47);
+            Assert.AreEqual(c7.Properties.Count, 3);
+            Assert.AreEqual(c8.Properties.Count, 4);
+            Assert.AreEqual(c9.Properties.Count, 2);
+            Assert.AreEqual(c10.Properties.Count, 3);
+            Assert.AreEqual(c11.Properties.Count, 2);
+            Assert.AreEqual(c12.Properties.Count, 3);
+
+            Assert.AreEqual(c1, fds.GetClass("AutoGen", "rtable1"));
+            Assert.AreEqual(c2, fds.GetClass("AutoGen", "rtable2"));
+            Assert.AreEqual(c3, fds.GetClass("AutoGen", "rtable5"));
+            Assert.AreEqual(c4, fds.GetClass("AutoGen", "rtable6"));
+            Assert.AreEqual(c5, fds.GetClass("AutoGen", "rtable7"));
+            Assert.AreEqual(c6, fds.GetClass("AutoGen", "table1"));
+            Assert.AreEqual(c7, fds.GetClass("AutoGen", "table3"));
+            Assert.AreEqual(c8, fds.GetClass("AutoGen", "table4"));
+            Assert.AreEqual(c9, fds.GetClass("AutoGen", "table5"));
+            Assert.AreEqual(c10, fds.GetClass("AutoGen", "table6"));
+            Assert.AreEqual(c11, fds.GetClass("AutoGen", "table7"));
+            Assert.AreEqual(c12, fds.GetClass("AutoGen", "view1"));
+
+            Assert.IsTrue(string.IsNullOrEmpty(c1.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c2.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c3.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c4.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c5.DefaultGeometryPropertyName));
+            //Though this feature class has geometries, the XML schema says none
+            //are designated
+            Assert.IsTrue(string.IsNullOrEmpty(c6.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c7.DefaultGeometryPropertyName));
+            Assert.IsFalse(string.IsNullOrEmpty(c8.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c9.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c10.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c11.DefaultGeometryPropertyName));
+            Assert.IsTrue(string.IsNullOrEmpty(c12.DefaultGeometryPropertyName));
+        }
+
+        [Test]
+        public void TestBidirectional()
+        {
+            FeatureSchema schema = new FeatureSchema("Default", "Default Schema");
+            ClassDefinition cls = new ClassDefinition("Class1", "Test Class");
+
+            cls.AddProperty(new DataPropertyDefinition("ID", "ID Property")
+            {
+                IsAutoGenerated = true,
+                DataType = DataPropertyType.Int64,
+                IsNullable = false,
+            }, true);
+
+            var prop = cls.FindProperty("ID") as DataPropertyDefinition;
+
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(1, cls.Properties.Count);
+            Assert.NotNull(prop);
+            Assert.AreEqual(DataPropertyType.Int64, prop.DataType);
+            Assert.IsTrue(prop.IsAutoGenerated);
+            Assert.IsFalse(prop.IsReadOnly);
+            Assert.IsFalse(prop.IsNullable);
+           
+            cls.AddProperty(new DataPropertyDefinition("Name", "The name")
+            {
+                DataType = DataPropertyType.String,
+                Length = 255
+            });
+
+            prop = cls.FindProperty("Name") as DataPropertyDefinition;
+
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(2, cls.Properties.Count);
+            Assert.NotNull(prop);
+            Assert.AreEqual(DataPropertyType.String, prop.DataType);
+            Assert.IsFalse(prop.IsAutoGenerated);
+            Assert.IsFalse(prop.IsReadOnly);
+            Assert.IsFalse(prop.IsNullable);
+
+            cls.AddProperty(new DataPropertyDefinition("Date", "The date")
+            {
+                DataType = DataPropertyType.DateTime,
+                IsNullable = true
+            });
+
+            prop = cls.FindProperty("Date") as DataPropertyDefinition;
+
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(3, cls.Properties.Count);
+            Assert.NotNull(prop);
+            Assert.AreEqual(DataPropertyType.DateTime, prop.DataType);
+            Assert.IsFalse(prop.IsAutoGenerated);
+            Assert.IsFalse(prop.IsReadOnly);
+            Assert.IsTrue(prop.IsNullable);
+
+            schema.AddClass(cls);
+            Assert.AreEqual(1, schema.Classes.Count);
+
+            XmlDocument doc = new XmlDocument();
+            schema.WriteXml(doc, doc);
+
+            string path = Path.GetTempFileName();
+            doc.Save(path);
+
+            FeatureSourceDescription fsd = new FeatureSourceDescription(File.OpenRead(path));
+            Assert.AreEqual(1, fsd.Schemas.Length);
+
+            schema = fsd.Schemas[0];
+            Assert.NotNull(schema);
+            
+            cls = schema.GetClass("Class1");
+            Assert.NotNull(cls);
+
+            prop = cls.FindProperty("ID") as DataPropertyDefinition;
+
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(3, cls.Properties.Count);
+            Assert.NotNull(prop);
+            Assert.AreEqual(DataPropertyType.Int64, prop.DataType);
+            Assert.IsTrue(prop.IsAutoGenerated);
+            Assert.IsFalse(prop.IsReadOnly);
+            Assert.IsFalse(prop.IsNullable);
+           
+
+            prop = cls.FindProperty("Name") as DataPropertyDefinition;
+
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(3, cls.Properties.Count);
+            Assert.NotNull(prop);
+            Assert.AreEqual(DataPropertyType.String, prop.DataType);
+            Assert.IsFalse(prop.IsAutoGenerated);
+            Assert.IsFalse(prop.IsReadOnly);
+            Assert.IsFalse(prop.IsNullable);
+
+            prop = cls.FindProperty("Date") as DataPropertyDefinition;
+
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(3, cls.Properties.Count);
+            Assert.NotNull(prop);
+            Assert.AreEqual(DataPropertyType.DateTime, prop.DataType);
+            Assert.IsFalse(prop.IsAutoGenerated);
+            Assert.IsFalse(prop.IsReadOnly);
+            Assert.IsTrue(prop.IsNullable);
+        }
+
+        [Test]
+        public void TestCreate()
+        {
+            var schema = new FeatureSchema("Default", "Default Schema");
+            Assert.AreEqual("Default", schema.Name);
+            Assert.AreEqual("Default Schema", schema.Description);
+
+            var cls = new ClassDefinition("Class1", "My Class");
+            Assert.AreEqual("Class1", cls.Name);
+            Assert.AreEqual("My Class", cls.Description);
+            Assert.IsTrue(string.IsNullOrEmpty(cls.DefaultGeometryPropertyName));
+            Assert.AreEqual(0, cls.Properties.Count);
+            Assert.AreEqual(0, cls.IdentityProperties.Count);
+
+            var prop = new DataPropertyDefinition("ID", "identity");
+            Assert.AreEqual("ID", prop.Name);
+            Assert.AreEqual("identity", prop.Description);
+            Assert.AreEqual(false, prop.IsAutoGenerated);
+            Assert.AreEqual(false, prop.IsReadOnly);
+            Assert.IsTrue(string.IsNullOrEmpty(prop.DefaultValue));
+
+            prop.DataType = DataPropertyType.Int32;
+            Assert.AreEqual(DataPropertyType.Int32, prop.DataType);
+
+            prop.IsAutoGenerated = true;
+            Assert.IsTrue(prop.IsAutoGenerated);
+
+            prop.IsReadOnly = true;
+            Assert.IsTrue(prop.IsReadOnly);
+
+            cls.AddProperty(prop, true);
+            Assert.AreEqual(1, cls.Properties.Count);
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(cls, prop.Parent);
+            Assert.NotNull(cls.FindProperty(prop.Name));
+
+            cls.RemoveProperty(prop);
+            Assert.AreEqual(0, cls.Properties.Count);
+            Assert.AreEqual(0, cls.Properties.Count);
+            Assert.IsNull(prop.Parent);
+            Assert.IsNull(cls.FindProperty(prop.Name));
+
+            cls.AddProperty(prop, true);
+            Assert.AreEqual(1, cls.Properties.Count);
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.AreEqual(cls, prop.Parent);
+            Assert.NotNull(cls.FindProperty(prop.Name));
+
+            cls.AddProperty(new DataPropertyDefinition("Name", "")
+            {
+                DataType = DataPropertyType.String,
+                Length = 255,
+                IsNullable = true
+            });
+
+            Assert.AreEqual(2, cls.Properties.Count);
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+
+            cls.AddProperty(new GeometricPropertyDefinition("Geom", "")
+            {
+                HasMeasure = false,
+                HasElevation = false,
+                GeometricTypes = FeatureGeometricType.All,
+                SpecificGeometryTypes = (SpecificGeometryType[])Enum.GetValues(typeof(SpecificGeometryType))
+            });
+            Assert.AreEqual(3, cls.Properties.Count);
+            Assert.AreEqual(1, cls.IdentityProperties.Count);
+            Assert.IsTrue(string.IsNullOrEmpty(cls.DefaultGeometryPropertyName));
+
+            var geom = cls.FindProperty("Geom");
+            Assert.NotNull(geom);
+
+            cls.DefaultGeometryPropertyName = geom.Name;
+            Assert.IsNotNullOrEmpty(cls.DefaultGeometryPropertyName);
+
+            schema.AddClass(cls);
+            Assert.AreEqual(schema, cls.Parent);
+        }
+    }
+}

Modified: sandbox/maestro-3.0/MaestroAPITests/ValidationTests.cs
===================================================================
--- sandbox/maestro-3.0/MaestroAPITests/ValidationTests.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/MaestroAPITests/ValidationTests.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -29,6 +29,8 @@
 using OSGeo.MapGuide.ObjectModels.LoadProcedure;
 using OSGeo.MapGuide.MaestroAPI.Resource.Validation;
 using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Services;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace MaestroAPITests
 {
@@ -92,6 +94,320 @@
             Assert.AreEqual(set.GetIssuesForResource("Library://Test.FeatureSource", ValidationStatus.Error).Count, 2);
         }
 
+        #region Mocks
+        class MockResourceService : IResourceService
+        {
+            public event ResourceEventHandler ResourceAdded;
+
+            public event ResourceEventHandler ResourceDeleted;
+
+            public event ResourceEventHandler ResourceUpdated;
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources()
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources(int depth)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources(string startingpoint, int depth)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources(string startingpoint)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources(string startingpoint, string type)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources(string startingpoint, string type, int depth)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceList GetRepositoryResources(string startingpoint, string type, int depth, bool computeChildren)
+            {
+                throw new NotImplementedException();
+            }
+
+            public T DeserializeObject<T>(System.IO.Stream data)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SerializeObject(object o, System.IO.Stream stream)
+            {
+                throw new NotImplementedException();
+            }
+
+            public System.IO.Stream GetResourceData(string resourceID, string dataname)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceDocumentHeaderType GetResourceHeader(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceFolderHeaderType GetFolderHeader(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public System.IO.Stream GetResourceXmlData(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public IResource GetResource(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void Touch(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SetResourceData(string resourceid, string dataname, OSGeo.MapGuide.ObjectModels.Common.ResourceDataType datatype, System.IO.Stream stream)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SetResourceData(string resourceid, string dataname, OSGeo.MapGuide.ObjectModels.Common.ResourceDataType datatype, System.IO.Stream stream, Utility.StreamCopyProgressDelegate callback)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SetResourceXmlData(string resourceid, System.IO.Stream stream)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SetFolderHeader(string resourceID, OSGeo.MapGuide.ObjectModels.Common.ResourceFolderHeaderType header)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SetResourceHeader(string resourceID, OSGeo.MapGuide.ObjectModels.Common.ResourceDocumentHeaderType header)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void UpdateRepository(string resourceId, OSGeo.MapGuide.ObjectModels.Common.ResourceFolderHeaderType header)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void DeleteResourceData(string resourceID, string dataname)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceDataList EnumerateResourceData(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void DeleteResource(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.ResourceReferenceList EnumerateResourceReferences(string resourceid)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void CopyResource(string oldpath, string newpath, bool overwrite)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void MoveResource(string oldpath, string newpath, bool overwrite)
+            {
+                throw new NotImplementedException();
+            }
+
+            public bool MoveResourceWithReferences(string oldpath, string newpath, LengthyOperationCallBack callback, LengthyOperationProgressCallBack progress)
+            {
+                throw new NotImplementedException();
+            }
+
+            public bool CopyFolderWithReferences(string oldpath, string newpath, LengthyOperationCallBack callback, LengthyOperationProgressCallBack progress)
+            {
+                throw new NotImplementedException();
+            }
+
+            public bool ResourceExists(string resourceid)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SaveResource(IResource resource)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void SaveResourceAs(IResource resource, string resourceid)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.UnmanagedDataList EnumerateUnmanagedData(string startpath, string filter, bool recursive, UnmanagedDataTypes type)
+            {
+                throw new NotImplementedException();
+            }
+
+            public void UploadPackage(string filename, Utility.StreamCopyProgressDelegate callback)
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        class MockFeatureService : IFeatureService
+        {
+            public OSGeo.MapGuide.ObjectModels.Capabilities.FdoProviderCapabilities GetProviderCapabilities(string provider)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.FeatureProviderRegistryFeatureProvider[] FeatureProviders
+            {
+                get { throw new NotImplementedException(); }
+            }
+
+            public string TestConnection(string providername, System.Collections.Specialized.NameValueCollection parameters)
+            {
+                throw new NotImplementedException();
+            }
+
+            public string TestConnection(string featureSourceId)
+            {
+                throw new NotImplementedException();
+            }
+
+            public string RemoveVersionFromProviderName(string providername)
+            {
+                throw new NotImplementedException();
+            }
+
+            public string[] GetConnectionPropertyValues(string providerName, string propertyName, string partialConnectionString)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.FeatureProviderRegistryFeatureProvider GetFeatureProvider(string providername)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IReader ExecuteSqlQuery(string featureSourceID, string sql)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader QueryFeatureSource(string resourceID, string schema, string query)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader QueryFeatureSource(string resourceID, string schema)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, System.Collections.Specialized.NameValueCollection computedProperties)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.MaestroAPI.Feature.IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, System.Collections.Specialized.NameValueCollection aggregateFunctions)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, string filter)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.IEnvelope GetSpatialExtent(string resourceID, string schema, string geometry, bool allowFallbackToContextInformation)
+            {
+                throw new NotImplementedException();
+            }
+
+            public FeatureSourceDescription DescribeFeatureSource(string resourceID)
+            {
+                throw new NotImplementedException();
+            }
+
+            public FeatureSchema DescribeFeatureSource(string resourceID, string schema)
+            {
+                throw new NotImplementedException();
+            }
+
+            public ClassDefinition GetClassDefinition(string resourceID, string schema)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.FdoSpatialContextList GetSpatialContextInfo(string resourceID, bool activeOnly)
+            {
+                throw new NotImplementedException();
+            }
+
+            public string[] GetIdentityProperties(string resourceID, string classname)
+            {
+                throw new NotImplementedException();
+            }
+
+            public OSGeo.MapGuide.ObjectModels.Common.DataStoreList EnumerateDataStores(string providerName, string partialConnString)
+            {
+                throw new NotImplementedException();
+            }
+
+            public string[] GetSchemas(string resourceId)
+            {
+                throw new NotImplementedException();
+            }
+
+            public string[] GetClassNames(string resourceId, string schemaName)
+            {
+                throw new NotImplementedException();
+            }
+        }
+        #endregion
+
         [Test]
         public void TestLoadProcedureValidation()
         {
@@ -102,6 +418,8 @@
             var id = "Library://Test.LoadProcedure";
             var mock = new Mockery();
             var conn = mock.NewMock<IServerConnection>();
+            var featSvc = new MockFeatureService();
+            var resSvc = new MockResourceService();
             var lp = ObjectFactory.CreateLoadProcedure(conn, LoadType.Sdf, new string[] 
             {
                 "C:\\foo.sdf",
@@ -109,8 +427,10 @@
             });
             lp.ResourceID = id;
 
+            var context = new ResourceValidationContext(resSvc, featSvc);
             var set = new ValidationResultSet();
-            set.AddIssues(ResourceValidatorSet.Validate(lp, false));
+            context.Reset();
+            set.AddIssues(ResourceValidatorSet.Validate(context, lp, false));
 
             //SDF2, generalization and 2 missing files
             Assert.AreEqual(4, set.GetAllIssues().Length);
@@ -123,7 +443,8 @@
             lp.ResourceID = id;
 
             set = new ValidationResultSet();
-            set.AddIssues(ResourceValidatorSet.Validate(lp, false));
+            context.Reset();
+            set.AddIssues(ResourceValidatorSet.Validate(context, lp, false));
 
             //SDF3 conversion, generalization and 2 missing files
             Assert.AreEqual(4, set.GetAllIssues().Length);
@@ -134,7 +455,8 @@
             };
             lp.ResourceID = id;
             set = new ValidationResultSet();
-            set.AddIssues(ResourceValidatorSet.Validate(lp, false));
+            context.Reset();
+            set.AddIssues(ResourceValidatorSet.Validate(context, lp, false));
 
             //Not supported
             Assert.AreEqual(1, set.GetAllIssues().Length);
@@ -145,7 +467,8 @@
             };
             lp.ResourceID = id;
             set = new ValidationResultSet();
-            set.AddIssues(ResourceValidatorSet.Validate(lp, false));
+            context.Reset();
+            set.AddIssues(ResourceValidatorSet.Validate(context, lp, false));
 
             //Not supported
             Assert.AreEqual(1, set.GetAllIssues().Length);

Modified: sandbox/maestro-3.0/MaestroBaseTests/MaestroBaseTests.csproj
===================================================================
--- sandbox/maestro-3.0/MaestroBaseTests/MaestroBaseTests.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/MaestroBaseTests/MaestroBaseTests.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -14,6 +14,8 @@
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkSubset>
     </TargetFrameworkSubset>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>maestroapi.key</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -72,6 +74,7 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />
+    <None Include="maestroapi.key" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/CommandType.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -31,6 +31,26 @@
         /// <summary>
         /// Gets a collection of resource content in a single batch
         /// </summary>
-        GetResourceContents
+        GetResourceContents,
+        /// <summary>
+        /// Applies a feature schema to a feature source
+        /// </summary>
+        ApplySchema,
+        /// <summary>
+        /// Inserts a feature into a feature source
+        /// </summary>
+        InsertFeature,
+        /// <summary>
+        /// Updates features in a feature source
+        /// </summary>
+        UpdateFeatures,
+        /// <summary>
+        /// Deletes features from a feature source
+        /// </summary>
+        DeleteFeatures,
+        /// <summary>
+        /// Creates a data store on a feature source
+        /// </summary>
+        CreateDataStore,
     }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Commands/ExecuteLoadProcedure.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -28,6 +28,7 @@
 using OSGeo.MapGuide.ObjectModels.LoadProcedure;
 using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.ObjectModels;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI.Commands
 {
@@ -368,74 +369,62 @@
                             //Step 1: Describe the schema
                             FeatureSourceDescription desc = this.Parent.FeatureService.DescribeFeatureSource(fsId);
 
-                            if (desc.Classes.Length > 0)
-                            {
-                                //Step 2: Find the first feature class with a geometry property
-                                ClassDefinition clsDef = null;
-                                FeatureSetColumn geom = null;
+                            //Step 2: Find the first feature class with a geometry property
+                            ClassDefinition clsDef = null;
+                            GeometricPropertyDefinition geom = null;
 
-                                bool done = false;
+                            bool done = false;
 
-                                foreach (ClassDefinition cls in desc.Classes)
+                            foreach (ClassDefinition cls in desc.AllClasses)
+                            {
+                                if (done) break;
+
+                                foreach (PropertyDefinition prop in cls.Properties)
                                 {
                                     if (done) break;
 
-                                    foreach (FeatureSetColumn prop in cls.Columns)
+                                    if (prop.Type == OSGeo.MapGuide.MaestroAPI.Schema.PropertyDefinitionType.Geometry)
                                     {
-                                        if (done) break;
-
-                                        if (typeof(Topology.Geometries.IGeometry).IsAssignableFrom(prop.Type))
-                                        {
-                                            clsDef = cls;
-                                            geom = prop;
-                                            done = true;
-                                        }
+                                        clsDef = cls;
+                                        geom = (GeometricPropertyDefinition)prop;
+                                        done = true;
                                     }
                                 }
+                            }
 
-                                if (clsDef != null && geom != null)
-                                {
-                                    var ld = ObjectFactory.CreateDefaultLayer(this.Parent, LayerType.Vector, new Version(1, 0, 0));
+                            if (clsDef != null && geom != null)
+                            {
+                                var ld = ObjectFactory.CreateDefaultLayer(this.Parent, LayerType.Vector, new Version(1, 0, 0));
 
-                                    //Step 3: Assign default properties
-                                    ld.ResourceID = lyrId;
-                                    var vld = ld.SubLayer as IVectorLayerDefinition;
-                                    vld.ResourceId = fsId;
-                                    vld.FeatureName = clsDef.QualifiedNameDecoded;
-                                    vld.Geometry = geom.Name;
+                                //Step 3: Assign default properties
+                                ld.ResourceID = lyrId;
+                                var vld = ld.SubLayer as IVectorLayerDefinition;
+                                vld.ResourceId = fsId;
+                                vld.FeatureName = clsDef.QualifiedName;
+                                vld.Geometry = geom.Name;
 
-                                    //Step 4: Infer geometry storage support and remove unsupported styles
-                                    object obj = geom.GetMetadata(GeometryMetadata.GEOM_TYPES);
-                                    if (obj != null)
-                                    {
-                                        List<string> geomTypes = new List<string>();
-                                        geomTypes.AddRange(obj.ToString().Trim().Split(' '));
+                                //Step 4: Infer geometry storage support and remove unsupported styles
+                                var scale = vld.GetScaleRangeAt(0);
+                                var geomTypes = geom.GetIndividualGeometricTypes();
+                                var remove = new List<string>();
+                                if (Array.IndexOf(geomTypes, FeatureGeometricType.Point) < 0)
+                                {
+                                    remove.Add(FeatureGeometricType.Point.ToString().ToLower());
+                                }
+                                if (Array.IndexOf(geomTypes, FeatureGeometricType.Curve) < 0)
+                                {
+                                    remove.Add(FeatureGeometricType.Curve.ToString().ToLower());
+                                }
+                                if (Array.IndexOf(geomTypes, FeatureGeometricType.Surface) < 0)
+                                {
+                                    remove.Add(FeatureGeometricType.Surface.ToString().ToLower());
+                                }
 
-                                        var scale = vld.GetScaleRangeAt(0);
+                                scale.RemoveStyles(remove);
 
-                                        var remove = new List<string>();
-                                        if (!geomTypes.Contains(GeometryMetadata.GEOM_TYPE_POINT))
-                                        {
-                                            remove.Add(GeometryMetadata.GEOM_TYPE_POINT);
-                                        }
-                                        if (!geomTypes.Contains(GeometryMetadata.GEOM_TYPE_CURVE))
-                                        {
-                                            remove.Add(GeometryMetadata.GEOM_TYPE_CURVE);
-                                        }
-                                        if (!geomTypes.Contains(GeometryMetadata.GEOM_TYPE_SURFACE))
-                                        {
-                                            remove.Add(GeometryMetadata.GEOM_TYPE_SURFACE);
-                                        }
-
-                                        scale.RemoveStyles(remove);
-                                    }
-
-                                    this.Parent.ResourceService.SaveResource(ld);
-                                    resCreatedOrUpdated.Add(lyrId);
-                                    cb(this, new LengthyOperationProgressArgs("Created: " + lyrId, current));
-
-                                    
-                                }
+                                this.Parent.ResourceService.SaveResource(ld);
+                                resCreatedOrUpdated.Add(lyrId);
+                                cb(this, new LengthyOperationProgressArgs("Created: " + lyrId, current));
                             }
                         }
                     }
@@ -670,26 +659,26 @@
                                 //Step 1: Describe the schema
                                 FeatureSourceDescription desc = this.Parent.FeatureService.DescribeFeatureSource(fsId);
 
-                                if (desc.Classes.Length > 0)
+                                if (desc.HasClasses())
                                 {
                                     //Step 2: Find the first feature class with a geometry property
                                     ClassDefinition clsDef = null;
-                                    FeatureSetColumn geom = null;
+                                    GeometricPropertyDefinition geom = null;
 
                                     bool done = false;
 
-                                    foreach (ClassDefinition cls in desc.Classes)
+                                    foreach (ClassDefinition cls in desc.AllClasses)
                                     {
                                         if (done) break;
 
-                                        foreach (FeatureSetColumn prop in cls.Columns)
+                                        foreach (PropertyDefinition prop in cls.Properties)
                                         {
                                             if (done) break;
 
-                                            if (typeof(Topology.Geometries.IGeometry).IsAssignableFrom(prop.Type))
+                                            if (prop.Type == OSGeo.MapGuide.MaestroAPI.Schema.PropertyDefinitionType.Geometry)
                                             {
                                                 clsDef = cls;
-                                                geom = prop;
+                                                geom = (GeometricPropertyDefinition)prop;
                                                 done = true;
                                             }
                                         }
@@ -707,31 +696,25 @@
                                         vld.Geometry = geom.Name;
 
                                         //Step 4: Infer geometry storage support and remove unsupported styles
-                                        object obj = geom.GetMetadata(GeometryMetadata.GEOM_TYPES);
-                                        if (obj != null)
-                                        {
-                                            List<string> geomTypes = new List<string>();
-                                            geomTypes.AddRange(obj.ToString().Trim().Split(' '));
+                                        var geomTypes = geom.GetIndividualGeometricTypes();
+                                        var scale = vld.GetScaleRangeAt(0);
 
-                                            var scale = vld.GetScaleRangeAt(0);
-
-                                            var remove = new List<string>();
-                                            if (!geomTypes.Contains(GeometryMetadata.GEOM_TYPE_POINT))
-                                            {
-                                                remove.Add(GeometryMetadata.GEOM_TYPE_POINT);
-                                            }
-                                            if (!geomTypes.Contains(GeometryMetadata.GEOM_TYPE_CURVE))
-                                            {
-                                                remove.Add(GeometryMetadata.GEOM_TYPE_CURVE);
-                                            }
-                                            if (!geomTypes.Contains(GeometryMetadata.GEOM_TYPE_SURFACE))
-                                            {
-                                                remove.Add(GeometryMetadata.GEOM_TYPE_SURFACE);
-                                            }
-
-                                            scale.RemoveStyles(remove);
+                                        var remove = new List<string>();
+                                        if (Array.IndexOf(geomTypes, FeatureGeometricType.Point) < 0)
+                                        {
+                                            remove.Add(FeatureGeometricType.Point.ToString().ToLower());
                                         }
+                                        if (Array.IndexOf(geomTypes, FeatureGeometricType.Curve) < 0)
+                                        {
+                                            remove.Add(FeatureGeometricType.Curve.ToString().ToLower());
+                                        }
+                                        if (Array.IndexOf(geomTypes, FeatureGeometricType.Surface) < 0)
+                                        {
+                                            remove.Add(FeatureGeometricType.Surface.ToString().ToLower());
+                                        }
 
+                                        scale.RemoveStyles(remove);
+
                                         this.Parent.ResourceService.SaveResource(ld);
                                         resCreatedOrUpdated.Add(lyrId);
                                         cb(this, new LengthyOperationProgressArgs("Created: " + lyrId, current));

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ConnectionProviderRegistry.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -77,6 +77,10 @@
     /// <example>
     /// This example shows how to create a http-based MapGuide Server connection to the server's mapagent interface.
     /// <code>
+    /// using OSGeo.MapGuide.MaestroAPI;
+    /// 
+    /// ...
+    /// 
     /// IServerConnection conn = ConnectionProviderRegistry.CreateConnection("Maestro.Http",
     ///     "Url", "http://localhost/mapguide/mapagent/mapagent.fcgi",
     ///     "Username", "Administrator",
@@ -87,6 +91,10 @@
     /// <example>
     /// This example shows how to create a TCP/IP connection that wraps the official MapGuide API
     /// <code>
+    /// using OSGeo.MapGuide.MaestroAPI;
+    /// 
+    /// ...
+    /// 
     /// IServerConnection conn = ConnectionProviderRegistry.CreateConnection("Maestro.LocalNative",
     ///     "ConfigFile", "webconfig.ini",
     ///     "Username", "Administrator",

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/CoordinateSystem/ActualCoordinateSystem.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/CoordinateSystem/ActualCoordinateSystem.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/CoordinateSystem/ActualCoordinateSystem.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,4 +1,23 @@
-using System;
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
 using System.Collections.Generic;
 using System.Text;
 using Topology.CoordinateSystems;

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionEngine.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionEngine.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionEngine.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -23,6 +23,7 @@
 using Ciloci.Flee;
 using System.Reflection;
 using System.Globalization;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI.Expression
 {
@@ -31,10 +32,10 @@
     /// </summary>
     internal class ExpressionEngine
     {
-        private FeatureSetReader _reader;
+        private ReaderBase _reader;
         private ExpressionContext _context;
 
-        public ExpressionEngine(FeatureSetReader reader, CultureInfo ci)
+        public ExpressionEngine(ReaderBase reader, CultureInfo ci)
         {
             _reader = reader;
             //_cls = cls;
@@ -69,17 +70,22 @@
         /// </summary>
         internal void UpdateVariables()
         {
-            if (_reader.Row == null)
-                throw new InvalidOperationException("Current row is empty"); //LOCALIZEME
+            if (_reader.Current == null)
+                throw new InvalidOperationException("Current record is empty"); //LOCALIZEME
 
             _context.Variables.Clear();
-            var row = _reader.Row;
-            for (int i = 0; i < row.FieldCount; i++)
+            for (int i = 0; i < _reader.FieldCount; i++)
             {
-                string name = row.GetName(i);
-                object value = row[i];
-
-                _context.Variables.Add(name, value ?? DBNull.Value);
+                string name = _reader.GetName(i);
+                if (_reader.IsNull(i))
+                {
+                    _context.Variables.Add(name, DBNull.Value);
+                }
+                else
+                {
+                    object value = _reader[i];
+                    _context.Variables.Add(name, value);
+                }
             }
         }
 
@@ -102,7 +108,7 @@
             var exprText = expression.Replace("\"", string.Empty)
                                      .Replace("'", "\"");
 
-            if (_reader.Row == null)
+            if (_reader.Current == null)
                 throw new InvalidOperationException("Unable to evaluate. Current row is empty"); //LOCALIZEME
 
             try
@@ -136,7 +142,7 @@
             var exprText = expression.Replace("\"", string.Empty)
                                      .Replace("'", "\"");
 
-            if (_reader.Row == null)
+            if (_reader.Current == null)
                 throw new InvalidOperationException("Unable to evaluate. Current row is empty"); //LOCALIZEME
 
             var expr = _context.CompileGeneric<T>(exprText);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Expression/ExpressionFeatureReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -22,23 +22,24 @@
 using System.Text;
 using System.Globalization;
 using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI.Expression
 {
     /// <summary>
     /// A <see cref="FeatureSetReader"/> that supports expression evaluation
     /// </summary>
-    internal class ExpressionFeatureReader : FeatureSetReader
+    internal class ExpressionFeatureReader : ReaderBase
     {
         private ExpressionEngine _exprEngine;
 
-        private FeatureSetReader _reader;
+        private ReaderBase _reader;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="ExpressionFeatureReader"/> class.
         /// </summary>
         /// <param name="reader">The reader.</param>
-        public ExpressionFeatureReader(FeatureSetReader reader)
+        public ExpressionFeatureReader(ReaderBase reader)
             : this(reader, System.Threading.Thread.CurrentThread.CurrentCulture)
         {
 
@@ -49,80 +50,14 @@
         /// </summary>
         /// <param name="reader">The reader.</param>
         /// <param name="ci"></param>
-        public ExpressionFeatureReader(FeatureSetReader reader, CultureInfo ci)
+        public ExpressionFeatureReader(ReaderBase reader, CultureInfo ci)
             : base()
         {
             _reader = reader;
-            InitColumns(reader.Columns);
             _exprEngine = new ExpressionEngine(_reader, ci);
         }
 
         /// <summary>
-        /// Advances the internal reader
-        /// </summary>
-        /// <returns></returns>
-        protected override bool ReadInternal()
-        {
-            return _reader.Read();
-        }
-
-        /// <summary>
-        /// Processes the feature row.
-        /// </summary>
-        /// <returns></returns>
-        protected override FeatureSetRow ProcessFeatureRow()
-        {
-            _exprEngine.UpdateVariables();
-            return _reader.Row;
-        }
-
-        /// <summary>
-        /// Closes the reader and its internal reader.
-        /// </summary>
-        protected override void CloseInternal()
-        {
-            _reader.Close();
-        }
-
-        /// <summary>
-        /// Gets a value indicating the depth of nesting for the current row.
-        /// </summary>
-        /// <value></value>
-        /// <returns>
-        /// The level of nesting.
-        /// </returns>
-        public override int Depth
-        {
-            get { return _reader.Depth; }
-        }
-
-        /// <summary>
-        /// Returns a <see cref="T:System.Data.DataTable"/> that describes the column metadata of the <see cref="T:System.Data.IDataReader"/>.
-        /// </summary>
-        /// <returns>
-        /// A <see cref="T:System.Data.DataTable"/> that describes the column metadata.
-        /// </returns>
-        /// <exception cref="T:System.InvalidOperationException">
-        /// The <see cref="T:System.Data.IDataReader"/> is closed.
-        /// </exception>
-        public override System.Data.DataTable GetSchemaTable()
-        {
-            return _reader.GetSchemaTable();
-        }
-
-        /// <summary>
-        /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
-        /// </summary>
-        /// <value></value>
-        /// <returns>
-        /// The number of rows changed, inserted, or deleted; 0 if no rows were affected or the statement failed; and -1 for SELECT statements.
-        /// </returns>
-        public override int RecordsAffected
-        {
-            get { return _reader.RecordsAffected; }
-        }
-
-        /// <summary>
         /// Evaluates the specified expression against the current row. If evaluation
         /// fails, null is returned.
         /// </summary>
@@ -152,5 +87,30 @@
                 throw new ExpressionException(expression);
             }
         }
+
+        public override Type GetFieldType(int i)
+        {
+            return _reader.GetFieldType(i);
+        }
+
+        public override string GetName(int index)
+        {
+            return _reader.GetName(index);
+        }
+
+        public override ReaderType ReaderType
+        {
+            get { return _reader.ReaderType; }
+        }
+
+        protected override IRecord ReadNextRecord()
+        {
+            if (_reader.ReadNext())
+            {
+                _exprEngine.UpdateVariables();
+                return _reader.Current;
+            }
+            return null; 
+        }
     }
 }

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClassDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClassDefinition.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClassDefinition.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,147 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2009, Kenneth Skovhede
-// http://www.hexad.dk, opensource at hexad.dk
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library 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
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
-
-namespace OSGeo.MapGuide.MaestroAPI
-{
-    /// <summary>
-    /// Represents a FDO class definition
-    /// </summary>
-    public class ClassDefinition
-    {
-        private string m_name;
-        private string m_schema;
-        private FeatureSetColumn[] m_columns;
-
-        internal ClassDefinition(XmlNode node, XmlNamespaceManager mgr)
-        {
-            XmlNode root = node.ParentNode;
-            if (root.NodeType == XmlNodeType.XmlDeclaration)
-                root = root.NextSibling;
-            m_schema = root.Attributes["targetNamespace"] == null ? null : root.Attributes["targetNamespace"].Value;
-            if (m_schema != null && m_schema.IndexOf("/") > 0)
-                m_schema = m_schema.Substring(m_schema.LastIndexOf("/") + 1);
-            m_name = node.Attributes["name"].Value;
-            if (m_name.EndsWith("Type"))
-                m_name = m_name.Substring(0, m_name.Length - "Type".Length);
-
-            XmlNodeList lst;
-            if (node.ChildNodes.Count == 0)
-            {
-                m_columns = new FeatureSetColumn[0];
-                return;
-            }
-            else if (node.FirstChild.Name == "xs:sequence")
-                lst = node.SelectNodes("xs:sequence/xs:element", mgr);
-            else
-                lst = node.SelectNodes("xs:complexContent/xs:extension/xs:sequence/xs:element", mgr);
-
-
-            m_columns = new FeatureSetColumn[lst.Count];
-            for (int i = 0; i < lst.Count; i++)
-                m_columns[i] = new ClassPropertyColumn(lst[i]);
-
-            XmlNode extension = node.SelectSingleNode("xs:complexContent/xs:extension", mgr);
-            if (extension != null && extension.Attributes["base"] != null)
-            {
-                string extTypeName = extension.Attributes["base"].Value;
-                extTypeName = extTypeName.Substring(extTypeName.IndexOf(":") + 1);
-
-                XmlNode baseEl = node.ParentNode.SelectSingleNode("xs:complexType[@name='" + extTypeName + "']", mgr);
-                if (baseEl != null)
-                {
-                    ClassDefinition tmpScm = new ClassDefinition(baseEl, mgr);
-                    FeatureSetColumn[] tmpCol = new FeatureSetColumn[m_columns.Length + tmpScm.m_columns.Length];
-                    Array.Copy(m_columns, tmpCol, m_columns.Length);
-                    Array.Copy(tmpScm.m_columns, 0, tmpCol, m_columns.Length, tmpScm.m_columns.Length);
-                    m_columns = tmpCol;
-                }
-            }
-        }
-
-        /// <summary>
-        /// Gets the name of this class definition
-        /// </summary>
-        public string Name { get { return m_name; } }
-
-        /// <summary>
-        /// Gets the name of the schema which this class definition belongs to
-        /// </summary>
-        public string SchemaName { get { return m_schema; } }
-
-        /// <summary>
-        /// Gets the fully qualified name of this class definition ([schema_name]:[name])
-        /// </summary>
-        public string QualifiedName { get { return m_schema == null ? m_name : m_schema + ":" + m_name; } }
-
-        /// <summary>
-        /// Gets the decoded fully qualified name of this class definition ([schema_name]:[name])
-        /// </summary>
-        public string QualifiedNameDecoded { get { return Utility.DecodeFDOName(this.QualifiedName); } }
-
-        /// <summary>
-        /// Gets an array of columns defining the properties in this class definition
-        /// </summary>
-        public FeatureSetColumn[] Columns { get { return m_columns; } }
-
-        /// <summary>
-        /// Returns a <see cref="System.String"/> that represents this instance.
-        /// </summary>
-        /// <returns>
-        /// A <see cref="System.String"/> that represents this instance.
-        /// </returns>
-        public override string ToString()
-        {
-            return this.QualifiedNameDecoded;
-        }
-
-        internal void MarkIdentityProperties(IEnumerable<string> keyFieldNames)
-        {
-            foreach (var name in keyFieldNames)
-            {
-                foreach (var col in m_columns)
-                {
-                    if (col.Name.Equals(name))
-                    {
-                        col.IsIdentity = true;
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// Gets an array of names of the identity properties
-        /// </summary>
-        /// <returns></returns>
-        public string[] GetIdentityProperties()
-        {
-            List<string> keys = new List<string>();
-            foreach (var col in m_columns)
-            {
-                if (col.IsIdentity)
-                    keys.Add(col.Name);
-            }
-            return keys.ToArray();
-        }
-    }
-}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ClrFdoTypeMap.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,116 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using Topology.Geometries;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    /// <summary>
+    /// Helper class to map MapGuide/FDO data/property types to CLR data types
+    /// </summary>
+    public static class ClrFdoTypeMap
+    {
+        public static Type GetClrType(DataPropertyType dataPropertyType)
+        {
+            switch (dataPropertyType)
+            {
+                case DataPropertyType.Blob:
+                    return typeof(byte[]);
+                case DataPropertyType.Boolean:
+                    return typeof(bool);
+                case DataPropertyType.Byte:
+                    return typeof(byte);
+                case DataPropertyType.Clob:
+                    return typeof(char[]);
+                case DataPropertyType.DateTime:
+                    return typeof(DateTime);
+                case DataPropertyType.Double:
+                    return typeof(double);
+                case DataPropertyType.Int16:
+                    return typeof(short);
+                case DataPropertyType.Int32:
+                    return typeof(int);
+                case DataPropertyType.Int64:
+                    return typeof(long);
+                case DataPropertyType.Single:
+                    return typeof(float);
+                case DataPropertyType.String:
+                    return typeof(string);
+            }
+            throw new ArgumentException();
+        }
+
+        public static Type GetClrType(PropertyValueType propertyValueType)
+        {
+            switch (propertyValueType)
+            {
+                case PropertyValueType.Blob:
+                    return typeof(byte[]);
+                case PropertyValueType.Boolean:
+                    return typeof(bool);
+                case PropertyValueType.Byte:
+                    return typeof(byte);
+                case PropertyValueType.Clob:
+                    return typeof(char[]);
+                case PropertyValueType.DateTime:
+                    return typeof(DateTime);
+                case PropertyValueType.Double:
+                    return typeof(double);
+                case PropertyValueType.Feature:
+                    return typeof(IFeature[]);
+                case PropertyValueType.Geometry:
+                    return typeof(IGeometry);
+                case PropertyValueType.Int16:
+                    return typeof(short);
+                case PropertyValueType.Int32:
+                    return typeof(int);
+                case PropertyValueType.Int64:
+                    return typeof(long);
+                //case PropertyValueType.Raster:
+                case PropertyValueType.Single:
+                    return typeof(float);
+                case PropertyValueType.String:
+                    return typeof(string);
+            }
+            throw new ArgumentException();
+        }
+
+        public static Type GetClrType(PropertyDefinition prop)
+        {
+            switch (prop.Type)
+            {
+                case PropertyDefinitionType.Data:
+                    {
+                        DataPropertyDefinition dp = (DataPropertyDefinition)prop;
+                        return GetClrType(dp.DataType);
+                    };
+                case PropertyDefinitionType.Geometry:
+                    return typeof(IGeometry);
+                case PropertyDefinitionType.Object:
+                    return typeof(IFeature[]);
+                //case PropertyDefinitionType.Raster:
+            }
+            throw new ArgumentException();
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureBase.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureBase.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,139 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    /// <summary>
+    /// Base implementation of the <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IFeature"/>
+    /// interface
+    /// </summary>
+    public class FeatureBase : RecordBase, IFeature
+    {
+        private ClassDefinition _clsDef;
+
+        public PropertyValue GetValue(string name)
+        {
+            return _values[name];
+        }
+
+        public FeatureBase(ClassDefinition clsDef) : base()
+        {
+            _clsDef = clsDef;
+            
+            for (int i = 0; i < clsDef.Properties.Count; i++)
+            {
+                var prop = clsDef[i];
+                _ordinalMap[i] = prop.Name;
+                switch (prop.Type)
+                {
+                    case PropertyDefinitionType.Data:
+                        {
+                            DataPropertyDefinition dp = (DataPropertyDefinition)prop;
+                            switch (dp.DataType)
+                            {
+                                case DataPropertyType.Blob:
+                                    _values[prop.Name] = new BlobValue();
+                                    break;
+                                case DataPropertyType.Boolean:
+                                    _values[prop.Name] = new BooleanValue();
+                                    break;
+                                case DataPropertyType.Byte:
+                                    _values[prop.Name] = new ByteValue();
+                                    break;
+                                case DataPropertyType.Clob:
+                                    _values[prop.Name] = new ClobValue();
+                                    break;
+                                case DataPropertyType.DateTime:
+                                    _values[prop.Name] = new DateTimeValue();
+                                    break;
+                                case DataPropertyType.Double:
+                                    _values[prop.Name] = new DoubleValue();
+                                    break;
+                                case DataPropertyType.Int16:
+                                    _values[prop.Name] = new Int16Value();
+                                    break;
+                                case DataPropertyType.Int32:
+                                    _values[prop.Name] = new Int32Value();
+                                    break;
+                                case DataPropertyType.Int64:
+                                    _values[prop.Name] = new Int64Value();
+                                    break;
+                                case DataPropertyType.Single:
+                                    _values[prop.Name] = new SingleValue();
+                                    break;
+                                case DataPropertyType.String:
+                                    _values[prop.Name] = new StringValue();
+                                    break;
+                            }
+                        }
+                        break;
+                    case PropertyDefinitionType.Geometry:
+                        _values[prop.Name] = new GeometryValue();
+                        break;
+                    case PropertyDefinitionType.Object:
+                        _values[prop.Name] = new FeatureValue();
+                        break;
+                    case PropertyDefinitionType.Raster:
+                        _values[prop.Name] = new RasterValue();
+                        break;
+                }
+            }
+        }
+
+        public ClassDefinition ClassDefinition
+        {
+            get { return _clsDef; }
+        }
+    }
+
+    public class FeatureArrayReader : FeatureReaderBase
+    {
+        private IFeature[] _features;
+
+        private int _pos;
+
+        public FeatureArrayReader(IFeature[] features)
+        {
+            _features = features;
+            //All class definitions are uniform, so get the first one
+            if (_features.Length > 0)
+                this.ClassDefinition = _features[0].ClassDefinition;
+            _pos = -1;
+        }
+
+        protected override IFeature ReadNextFeature()
+        {
+            _pos++;
+            if (_pos < _features.Length)
+                return _features[_pos];
+
+            return null;
+        }
+
+        public override void Close()
+        {
+            
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureReaderBase.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,114 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+using System.Data;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    /// <summary>
+    /// Base implementation of the <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IFeatureReader"/>
+    /// interface
+    /// </summary>
+    public abstract class FeatureReaderBase : ReaderBase, IFeatureReader
+    {
+        protected abstract IFeature ReadNextFeature();
+
+        private ClassDefinition _cls;
+
+        public OSGeo.MapGuide.MaestroAPI.Schema.ClassDefinition ClassDefinition
+        {
+            get { return _cls; }
+            protected set
+            {
+                _cls = value;
+                this.FieldCount = _cls.Properties.Count;
+            }
+        }
+
+        public override string GetName(int index)
+        {
+            return this.ClassDefinition.Properties[index].Name;
+        }
+
+        public override Type GetFieldType(int i)
+        {
+            return ClrFdoTypeMap.GetClrType(this.ClassDefinition[i]);
+        }
+
+        public override ReaderType ReaderType
+        {
+            get { return ReaderType.Feature; }
+        }
+
+        protected override IRecord ReadNextRecord()
+        {
+            return ReadNextFeature();
+        }
+
+        class Enumerator : IEnumerator<IFeature>
+        {
+            private FeatureReaderBase _reader;
+
+            public Enumerator(FeatureReaderBase reader)
+            {
+                _reader = reader;
+            }
+
+            public IFeature Current
+            {
+                get { return (IFeature)_reader.Current; }
+            }
+
+            public void Dispose()
+            {
+                
+            }
+
+            object IEnumerator.Current
+            {
+                get { return this.Current; }
+            }
+
+            public bool MoveNext()
+            {
+                return _reader.ReadNext();
+            }
+
+            public void Reset()
+            {
+                throw new NotImplementedException();
+            }
+        }
+
+        public IEnumerator<IFeature> GetEnumerator()
+        {
+            return new Enumerator(this);
+        }
+
+        IEnumerator IEnumerable.GetEnumerator()
+        {
+            return new Enumerator(this);
+        }
+    }
+}

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSetReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSetReader.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSetReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,1206 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2009, Kenneth Skovhede
-// http://www.hexad.dk, opensource at hexad.dk
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library 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
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.IO;
-using System.Xml;
-using Topology.Geometries;
-using System.Data;
-using System.Collections.Generic;
-
-namespace OSGeo.MapGuide.MaestroAPI
-{
-	/// <summary>
-	/// Represents a set of results from a query
-	/// </summary>
-	public abstract class FeatureSetReader : IDisposable, IDataReader, IEnumerable<IDataRecord>
-	{
-        /// <summary>
-        /// The columns
-        /// </summary>
-		protected FeatureSetColumn[] m_columns;
-        /// <summary>
-        /// The current row
-        /// </summary>
-		protected FeatureSetRow m_row;
-
-        /// <summary>
-        /// A name-ordinal map
-        /// </summary>
-        protected Dictionary<string, int> _nameOrdinalMap;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="FeatureSetReader"/> class.
-        /// </summary>
-        protected FeatureSetReader() { }
-
-        /// <summary>
-        /// Initializes the column array for this reader. Must be called before
-        /// any reading operations commence.
-        /// </summary>
-        /// <param name="cols"></param>
-        protected void InitColumns(FeatureSetColumn[] cols)
-        {
-            m_columns = cols;
-            _nameOrdinalMap = new Dictionary<string, int>();
-            for (int i = 0; i < m_columns.Length; i++)
-            {
-                _nameOrdinalMap.Add(m_columns[i].Name, i);
-            }
-        }
-
-        /// <summary>
-        /// Gets the columns.
-        /// </summary>
-        /// <value>The columns.</value>
-		public FeatureSetColumn[] Columns
-		{
-			get { return m_columns; }
-		}
-
-        /// <summary>
-        /// Advances the <see cref="T:System.Data.IDataReader"/> to the next record.
-        /// </summary>
-        /// <returns>
-        /// true if there are more rows; otherwise, false.
-        /// </returns>
-        public bool Read()
-        {
-            m_row = null;
-            bool next = ReadInternal();
-            if (next)
-            {
-                m_row = ProcessFeatureRow();
-            }
-            return next;
-        }
-
-        /// <summary>
-        /// Advances the internal reader
-        /// </summary>
-        /// <returns></returns>
-        protected abstract bool ReadInternal();
-
-        /// <summary>
-        /// Processes the feature row.
-        /// </summary>
-        /// <returns></returns>
-        protected abstract FeatureSetRow ProcessFeatureRow();
-
-        /// <summary>
-        /// Gets the row.
-        /// </summary>
-        /// <value>The row.</value>
-		public FeatureSetRow Row
-		{
-			get { return m_row; }
-		}
-
-        /// <summary>
-        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        /// </summary>
-        public virtual void Dispose() { }
-
-        /// <summary>
-        /// Closes the <see cref="T:System.Data.IDataReader"/> Object.
-        /// </summary>
-        public void Close()
-        {
-            CloseInternal();
-            this.IsClosed = true;
-        }
-
-        /// <summary>
-        /// Closes the internal.
-        /// </summary>
-        protected abstract void CloseInternal();
-
-        /// <summary>
-        /// Gets a value indicating the depth of nesting for the current row.
-        /// </summary>
-        /// <value></value>
-        /// <returns>
-        /// The level of nesting.
-        /// </returns>
-        public abstract int Depth { get; }
-
-        /// <summary>
-        /// Returns a <see cref="T:System.Data.DataTable"/> that describes the column metadata of the <see cref="T:System.Data.IDataReader"/>.
-        /// </summary>
-        /// <returns>
-        /// A <see cref="T:System.Data.DataTable"/> that describes the column metadata.
-        /// </returns>
-        /// <exception cref="T:System.InvalidOperationException">
-        /// The <see cref="T:System.Data.IDataReader"/> is closed.
-        /// </exception>
-        public abstract DataTable GetSchemaTable();
-
-        /// <summary>
-        /// Gets a value indicating whether the data reader is closed.
-        /// </summary>
-        /// <value></value>
-        /// <returns>true if the data reader is closed; otherwise, false.
-        /// </returns>
-        public bool IsClosed { get; private set; }
-
-        /// <summary>
-        /// Advances the data reader to the next result, when reading the results of batch SQL statements.
-        /// </summary>
-        /// <returns>
-        /// true if there are more rows; otherwise, false.
-        /// </returns>
-        public bool NextResult()
-        {
-            return Read();
-        }
-
-        /// <summary>
-        /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
-        /// </summary>
-        /// <value></value>
-        /// <returns>
-        /// The number of rows changed, inserted, or deleted; 0 if no rows were affected or the statement failed; and -1 for SELECT statements.
-        /// </returns>
-        public abstract int RecordsAffected { get; }
-
-        /// <summary>
-        /// Gets the number of columns in the current row.
-        /// </summary>
-        /// <value></value>
-        /// <returns>
-        /// When not positioned in a valid recordset, 0; otherwise, the number of columns in the current record. The default is -1.
-        /// </returns>
-        public int FieldCount
-        {
-            get { return m_columns.Length; }
-        }
-
-        /// <summary>
-        /// Gets the value of the specified column as a Boolean.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <returns>The value of the column.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual bool GetBoolean(int i)
-        {
-            return (bool)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the 8-bit unsigned integer value of the specified column.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <returns>
-        /// The 8-bit unsigned integer value of the specified column.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual byte GetByte(int i)
-        {
-            return (byte)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Reads a stream of bytes from the specified column offset into the buffer as an array, starting at the given buffer offset.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <param name="fieldOffset">The index within the field from which to start the read operation.</param>
-        /// <param name="buffer">The buffer into which to read the stream of bytes.</param>
-        /// <param name="bufferoffset">The index for <paramref name="buffer"/> to start the read operation.</param>
-        /// <param name="length">The number of bytes to read.</param>
-        /// <returns>The actual number of bytes read.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Gets the character value of the specified column.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <returns>
-        /// The character value of the specified column.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual char GetChar(int i)
-        {
-            return (char)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Reads a stream of characters from the specified column offset into the buffer as an array, starting at the given buffer offset.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <param name="fieldoffset">The index within the row from which to start the read operation.</param>
-        /// <param name="buffer">The buffer into which to read the stream of bytes.</param>
-        /// <param name="bufferoffset">The index for <paramref name="buffer"/> to start the read operation.</param>
-        /// <param name="length">The number of bytes to read.</param>
-        /// <returns>The actual number of characters read.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Returns an <see cref="T:System.Data.IDataReader"/> for the specified column ordinal.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// An <see cref="T:System.Data.IDataReader"/>.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual IDataReader GetData(int i)
-        {
-            return (IDataReader)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the data type information for the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The data type information for the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual string GetDataTypeName(int i)
-        {
-            return m_columns[i].Type.Name;
-        }
-
-        /// <summary>
-        /// Gets the date and time data value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The date and time data value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual DateTime GetDateTime(int i)
-        {
-            return (DateTime)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the fixed-position numeric value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The fixed-position numeric value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual decimal GetDecimal(int i)
-        {
-            return (decimal)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the double-precision floating point number of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The double-precision floating point number of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual double GetDouble(int i)
-        {
-            return (double)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the <see cref="T:System.Type"/> information corresponding to the type of <see cref="T:System.Object"/> that would be returned from <see cref="M:System.Data.IDataRecord.GetValue(System.Int32)"/>.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The <see cref="T:System.Type"/> information corresponding to the type of <see cref="T:System.Object"/> that would be returned from <see cref="M:System.Data.IDataRecord.GetValue(System.Int32)"/>.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual Type GetFieldType(int i)
-        {
-            return m_columns[i].Type;
-        }
-
-        /// <summary>
-        /// Gets the single-precision floating point number of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The single-precision floating point number of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public float GetFloat(int i)
-        {
-            return (float)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Returns the GUID value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>The GUID value of the specified field.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public virtual Guid GetGuid(int i)
-        {
-            return (Guid)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the 16-bit signed integer value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The 16-bit signed integer value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public short GetInt16(int i)
-        {
-            return (short)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the 32-bit signed integer value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The 32-bit signed integer value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public int GetInt32(int i)
-        {
-            return (int)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the 64-bit signed integer value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The 64-bit signed integer value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public long GetInt64(int i)
-        {
-            return (long)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets the name for the field to find.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The name of the field or the empty string (""), if there is no value to return.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public string GetName(int i)
-        {
-            return m_columns[i].Name;
-        }
-
-        /// <summary>
-        /// Return the index of the named field.
-        /// </summary>
-        /// <param name="name">The name of the field to find.</param>
-        /// <returns>The index of the named field.</returns>
-        public int GetOrdinal(string name)
-        {
-            return _nameOrdinalMap[name];
-        }
-
-        /// <summary>
-        /// Gets the string value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>The string value of the specified field.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public string GetString(int i)
-        {
-            return (string)m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Return the value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The <see cref="T:System.Object"/> which will contain the field value upon return.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public object GetValue(int i)
-        {
-            return m_row[GetName(i)];
-        }
-
-        /// <summary>
-        /// Gets all the attribute fields in the collection for the current record.
-        /// </summary>
-        /// <param name="values">An array of <see cref="T:System.Object"/> to copy the attribute fields into.</param>
-        /// <returns>
-        /// The number of instances of <see cref="T:System.Object"/> in the array.
-        /// </returns>
-        public int GetValues(object[] values)
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Return whether the specified field is set to null.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// true if the specified field is set to null; otherwise, false.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public bool IsDBNull(int i)
-        {
-            return m_row.IsDBNull(i);
-        }
-
-        /// <summary>
-        /// Gets the <see cref="System.Object"/> with the specified name.
-        /// </summary>
-        /// <value></value>
-        public virtual object this[string name]
-        {
-            get { return m_row[name]; }
-        }
-
-        /// <summary>
-        /// Gets the <see cref="System.Object"/> with the specified index.
-        /// </summary>
-        /// <value></value>
-        public object this[int i]
-        {
-            get { return m_row[GetName(i)]; }
-        }
-
-        internal class FeatureSetRowEnumerator : IEnumerator<IDataRecord>
-        {
-            private FeatureSetReader _parent;
-
-            /// <summary>
-            /// Initializes a new instance of the <see cref="FeatureSetRowEnumerator"/> class.
-            /// </summary>
-            /// <param name="parent">The parent.</param>
-            public FeatureSetRowEnumerator(FeatureSetReader parent)
-            {
-                _parent = parent;
-            }
-
-            /// <summary>
-            /// Gets the element in the collection at the current position of the enumerator.
-            /// </summary>
-            /// <value></value>
-            /// <returns>
-            /// The element in the collection at the current position of the enumerator.
-            /// </returns>
-            public IDataRecord Current
-            {
-                get { return _parent.Row; }
-            }
-
-            /// <summary>
-            /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-            /// </summary>
-            public void Dispose() { }
-
-            /// <summary>
-            /// Gets the element in the collection at the current position of the enumerator.
-            /// </summary>
-            /// <value></value>
-            /// <returns>
-            /// The element in the collection at the current position of the enumerator.
-            /// </returns>
-            object System.Collections.IEnumerator.Current
-            {
-                get { return _parent.Row; }
-            }
-
-            /// <summary>
-            /// Advances the enumerator to the next element of the collection.
-            /// </summary>
-            /// <returns>
-            /// true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
-            /// </returns>
-            /// <exception cref="T:System.InvalidOperationException">
-            /// The collection was modified after the enumerator was created.
-            /// </exception>
-            public bool MoveNext()
-            {
-                return _parent.Read();
-            }
-
-            /// <summary>
-            /// Sets the enumerator to its initial position, which is before the first element in the collection.
-            /// </summary>
-            /// <exception cref="T:System.InvalidOperationException">
-            /// The collection was modified after the enumerator was created.
-            /// </exception>
-            public void Reset()
-            {
-                throw new NotSupportedException();
-            }
-        }
-
-        /// <summary>
-        /// Returns an enumerator that iterates through the collection.
-        /// </summary>
-        /// <returns>
-        /// A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
-        /// </returns>
-        public IEnumerator<IDataRecord> GetEnumerator()
-        {
-            return new FeatureSetRowEnumerator(this);
-        }
-
-        /// <summary>
-        /// Returns an enumerator that iterates through a collection.
-        /// </summary>
-        /// <returns>
-        /// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
-        /// </returns>
-        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
-        {
-            return new FeatureSetRowEnumerator(this);
-        }
-    }
-
-    /// <summary>
-    /// Feature class property
-    /// </summary>
-	public abstract class FeatureSetColumn
-	{
-        /// <summary>
-        /// The metadata collection
-        /// </summary>
-        protected System.Collections.Hashtable m_metadata = new System.Collections.Hashtable();
-
-        /// <summary>
-        /// The name
-        /// </summary>
-		protected string m_name;
-        /// <summary>
-        /// The data type
-        /// </summary>
-        protected Type m_type;
-        /// <summary>
-        /// Indicates if it allows nulls
-        /// </summary>
-        protected bool m_allowNull;
-
-        /// <summary>
-        /// Gets the name.
-        /// </summary>
-        /// <value>The name.</value>
-		public string Name { get { return m_name; } }
-        /// <summary>
-        /// Gets the type.
-        /// </summary>
-        /// <value>The type.</value>
-		public Type Type { get { return m_type; } }
-        /// <summary>
-        /// Gets or sets a value indicating whether this instance is identity.
-        /// </summary>
-        /// <value>
-        /// 	<c>true</c> if this instance is identity; otherwise, <c>false</c>.
-        /// </value>
-        public bool IsIdentity { get; internal set; }
-
-        /// <summary>
-        /// Gets the metadata keys.
-        /// </summary>
-        /// <value>The metadata keys.</value>
-        public System.Collections.ICollection MetadataKeys { get { return m_metadata.Keys; } }
-
-        /// <summary>
-        /// Gets a value indicating whether this instance is geometry.
-        /// </summary>
-        /// <value>
-        /// 	<c>true</c> if this instance is geometry; otherwise, <c>false</c>.
-        /// </value>
-        public bool IsGeometry
-        {
-            get
-            {
-                return typeof(IGeometry).IsAssignableFrom(this.Type);
-            }
-        }
-
-        /// <summary>
-        /// Gets the metadata.
-        /// </summary>
-        /// <param name="key">The key.</param>
-        /// <returns></returns>
-        public object GetMetadata(string key)
-        {
-            return m_metadata[key];
-        }
-
-        /// <summary>
-        /// Sets the metadata.
-        /// </summary>
-        /// <param name="key">The key.</param>
-        /// <param name="value">The value.</param>
-        public void SetMetadata(string key, object value)
-        {
-            m_metadata[key] = value;
-        }
-	}
-
-    /// <summary>
-    /// Geometry metadata
-    /// </summary>
-    public class GeometryMetadata
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public const string SPATIAL_CONTEXT = "SPATIAL_CONTEXT";
-        /// <summary>
-        /// 
-        /// </summary>
-        public const string GEOM_TYPES = "GEOM_TYPES";
-        /// <summary>
-        /// 
-        /// </summary>
-        public const string GEOM_TYPE_POINT = "point";
-        /// <summary>
-        /// 
-        /// </summary>
-        public const string GEOM_TYPE_CURVE = "curve";
-        /// <summary>
-        /// 
-        /// </summary>
-        public const string GEOM_TYPE_SURFACE = "surface";
-        /// <summary>
-        /// 
-        /// </summary>
-        public const string GEOM_TYPE_SOLID = "solid";
-    }
-
-    /// <summary>
-    /// A feature record
-    /// </summary>
-	public abstract class FeatureSetRow : IDataRecord
-	{
-        private Topology.IO.WKTReader m_reader = null;
-
-        /// <summary>
-        /// Gets the reader.
-        /// </summary>
-        /// <value>The reader.</value>
-        protected Topology.IO.WKTReader Reader
-        {
-            get
-            {
-                if (m_reader == null)
-                    m_reader = new Topology.IO.WKTReader();
-                return m_reader;
-            }
-        }
-
-        /// <summary>
-        /// parent reader
-        /// </summary>
-        protected FeatureSetReader m_parent;
-        /// <summary>
-        /// array of items of current row
-        /// </summary>
-        protected object[] m_items;
-        /// <summary>
-        /// array indicating the ordinals with null values
-        /// </summary>
-        protected bool[] m_nulls;
-        /// <summary>
-        /// Indicates whether to lazy load geometry
-        /// </summary>
-        protected bool[] m_lazyloadGeometry;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="FeatureSetRow"/> class.
-        /// </summary>
-        /// <param name="parent">The parent.</param>
-		protected FeatureSetRow(FeatureSetReader parent)
-		{
-			m_parent = parent;
-			m_items = new object[parent.Columns.Length];
-			m_nulls = new bool[parent.Columns.Length];
-			m_lazyloadGeometry = new bool[parent.Columns.Length];
-			for(int i = 0;i < m_nulls.Length; i++)
-			{
-				m_nulls[i] = true;
-				m_lazyloadGeometry[i] = false;
-			}
-		}
-
-        /// <summary>
-        /// Determines whether the specified property name is null
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <returns>
-        /// 	<c>true</c> if the specified property name is null; otherwise, <c>false</c>.
-        /// </returns>
-        [Obsolete("This will be gone in a future release. Use IsDBNull(int i) instead. To get the index use GetOrdinal(string name)")]
-		public bool IsValueNull(string name)
-		{
-			return IsValueNull(GetOrdinal(name));
-		}
-
-        /// <summary>
-        /// Determines whether the specifeid index is null
-        /// </summary>
-        /// <param name="index">The index.</param>
-        /// <returns>
-        /// 	<c>true</c> if the specifeid index is null; otherwise, <c>false</c>.
-        /// </returns>
-        [Obsolete("This will be gone in a future release. Use IsDBNull(int i) instead")]
-		public bool IsValueNull(int index)
-		{
-			if (index >= m_nulls.Length)
-				throw new InvalidOperationException("Index " + index.ToString() + ", was out of bounds");
-			else
-				return m_nulls[index];
-		}
-
-        /// <summary>
-        /// Return the index of the named field.
-        /// </summary>
-        /// <param name="name">The name of the field to find.</param>
-        /// <returns>The index of the named field.</returns>
-		public int GetOrdinal(string name)
-		{
-            if (name == null)
-                throw new ArgumentNullException("name");
-
-            if (name == "")
-                throw new Exception("The name parameter must not be empty");
-
-			name = name.Trim();
-
-			for(int i = 0; i < m_parent.Columns.Length; i++)
-				if (m_parent.Columns[i].Name.Equals(name))
-					return i;
-
-			for(int i = 0; i < m_parent.Columns.Length; i++)
-				if (m_parent.Columns[i].Name.ToLower().Equals(name.ToLower()))
-					return i;
-
-			string[] t = new string[m_parent.Columns.Length];
-			for(int i = 0; i < m_parent.Columns.Length; i++)
-				t[i] = m_parent.Columns[i].Name;
-
-			throw new InvalidOperationException("Column name: " + name + ", was not found\nColumn names (" + m_parent.Columns.Length.ToString() + "): " + string.Join(", ", t));
-		}
-
-        /// <summary>
-        /// Gets the <see cref="System.Object"/> with the specified name.
-        /// </summary>
-        /// <value></value>
-		public object this[string name]
-		{
-			get 
-			{
-				return this[GetOrdinal(name)];
-			}
-		}
-
-        /// <summary>
-        /// Gets the number of columns in the current row.
-        /// </summary>
-        /// <value></value>
-        /// <returns>
-        /// When not positioned in a valid recordset, 0; otherwise, the number of columns in the current record. The default is -1.
-        /// </returns>
-        public int FieldCount
-        {
-            get { return m_parent.Columns.Length; }
-        }
-
-        /// <summary>
-        /// Gets the value of the specified column as a Boolean.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <returns>The value of the column.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public bool GetBoolean(int i)
-        {
-            return (bool)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the 8-bit unsigned integer value of the specified column.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <returns>
-        /// The 8-bit unsigned integer value of the specified column.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public byte GetByte(int i)
-        {
-            return (byte)m_items[i];
-        }
-
-        /// <summary>
-        /// Reads a stream of bytes from the specified column offset into the buffer as an array, starting at the given buffer offset.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <param name="fieldOffset">The index within the field from which to start the read operation.</param>
-        /// <param name="buffer">The buffer into which to read the stream of bytes.</param>
-        /// <param name="bufferoffset">The index for <paramref name="buffer"/> to start the read operation.</param>
-        /// <param name="length">The number of bytes to read.</param>
-        /// <returns>The actual number of bytes read.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Gets the character value of the specified column.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <returns>
-        /// The character value of the specified column.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public char GetChar(int i)
-        {
-            return (char)m_items[i];
-        }
-
-        /// <summary>
-        /// Reads a stream of characters from the specified column offset into the buffer as an array, starting at the given buffer offset.
-        /// </summary>
-        /// <param name="i">The zero-based column ordinal.</param>
-        /// <param name="fieldoffset">The index within the row from which to start the read operation.</param>
-        /// <param name="buffer">The buffer into which to read the stream of bytes.</param>
-        /// <param name="bufferoffset">The index for <paramref name="buffer"/> to start the read operation.</param>
-        /// <param name="length">The number of bytes to read.</param>
-        /// <returns>The actual number of characters read.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Returns an <see cref="T:System.Data.IDataReader"/> for the specified column ordinal.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// An <see cref="T:System.Data.IDataReader"/>.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public IDataReader GetData(int i)
-        {
-            return (IDataReader)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the data type information for the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The data type information for the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public string GetDataTypeName(int i)
-        {
-            return m_parent.Columns[i].Type.Name;
-        }
-
-        /// <summary>
-        /// Gets the date and time data value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The date and time data value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public DateTime GetDateTime(int i)
-        {
-            return (DateTime)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the fixed-position numeric value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The fixed-position numeric value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public decimal GetDecimal(int i)
-        {
-            return (decimal)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the double-precision floating point number of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The double-precision floating point number of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public double GetDouble(int i)
-        {
-            return (double)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the <see cref="T:System.Type"/> information corresponding to the type of <see cref="T:System.Object"/> that would be returned from <see cref="M:System.Data.IDataRecord.GetValue(System.Int32)"/>.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The <see cref="T:System.Type"/> information corresponding to the type of <see cref="T:System.Object"/> that would be returned from <see cref="M:System.Data.IDataRecord.GetValue(System.Int32)"/>.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public Type GetFieldType(int i)
-        {
-            return m_parent.Columns[i].Type;
-        }
-
-        /// <summary>
-        /// Gets the single-precision floating point number of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The single-precision floating point number of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public float GetFloat(int i)
-        {
-            return (float)m_items[i];
-        }
-
-        /// <summary>
-        /// Returns the GUID value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>The GUID value of the specified field.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public Guid GetGuid(int i)
-        {
-            return (Guid)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the 16-bit signed integer value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The 16-bit signed integer value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public short GetInt16(int i)
-        {
-            return (short)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the 32-bit signed integer value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The 32-bit signed integer value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public int GetInt32(int i)
-        {
-            return (int)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the 64-bit signed integer value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The 64-bit signed integer value of the specified field.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public long GetInt64(int i)
-        {
-            return (long)m_items[i];
-        }
-
-        /// <summary>
-        /// Gets the name for the field to find.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The name of the field or the empty string (""), if there is no value to return.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public string GetName(int i)
-        {
-            return m_parent.GetName(i);
-        }
-
-        /// <summary>
-        /// Gets the string value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>The string value of the specified field.</returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public string GetString(int i)
-        {
-            return (string)m_items[i];
-        }
-
-        /// <summary>
-        /// Return the value of the specified field.
-        /// </summary>
-        /// <param name="i">The index of the field to find.</param>
-        /// <returns>
-        /// The <see cref="T:System.Object"/> which will contain the field value upon return.
-        /// </returns>
-        /// <exception cref="T:System.IndexOutOfRangeException">
-        /// The index passed was outside the range of 0 through <see cref="P:System.Data.IDataRecord.FieldCount"/>.
-        /// </exception>
-        public object GetValue(int i)
-        {
-            return m_items[i];
-        }
-
-        /// <summary>
-        /// Gets all the attribute fields in the collection for the current record.
-        /// </summary>
-        /// <param name="values">An array of <see cref="T:System.Object"/> to copy the attribute fields into.</param>
-        /// <returns>
-        /// The number of instances of <see cref="T:System.Object"/> in the array.
-        /// </returns>
-        public int GetValues(object[] values)
-        {
-            throw new NotImplementedException();
-        }
-
-        /// <summary>
-        /// Determines whether the value at the specified index is null
-        /// </summary>
-        /// <param name="index"></param>
-        /// <returns></returns>
-        public bool IsDBNull(int index)
-        {
-            if (index >= m_nulls.Length)
-                throw new InvalidOperationException("Index " + index.ToString() + ", was out of bounds");
-            else
-                return m_nulls[index];
-        }
-
-        /// <summary>
-        /// Gets the <see cref="System.Object"/> at the specified index
-        /// </summary>
-        /// <value></value>
-        public object this[int i]
-        {
-            get 
-            {
-                if (i >= m_items.Length)
-                {
-                    throw new InvalidOperationException("Index " + i.ToString() + ", was out of bounds");
-                }
-                else
-                {
-                    if (m_lazyloadGeometry[i] && !m_nulls[i])
-                    {
-                        m_items[i] = this.Reader.Read((string)m_items[i]);
-                        m_lazyloadGeometry[i] = false;
-                    }
-                    return m_items[i];
-                }
-            }
-        }
-    }
-}

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSourceDescription.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSourceDescription.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/FeatureSourceDescription.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,255 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2009, Kenneth Skovhede
-// http://www.hexad.dk, opensource at hexad.dk
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library 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
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Xml;
-using System.Collections.Generic;
-
-namespace OSGeo.MapGuide.MaestroAPI
-{
-    /// <summary>
-    /// Dummy class that represents an unknown data type
-    /// </summary>
-    public class UnmappedDataType
-    {
-    }
-
-	/// <summary>
-	/// Class that represents a the layout of a datasource
-	/// </summary>
-	public class FeatureSourceDescription
-	{
-		private ClassDefinition[] m_classes;
-
-        private string[] m_schemaNames;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="FeatureSourceDescription"/> class.
-        /// </summary>
-        /// <param name="stream">The stream.</param>
-		public FeatureSourceDescription(System.IO.Stream stream)
-		{
-			XmlDocument doc = new XmlDocument();
-			doc.Load(stream);
-
-			if (doc.FirstChild.Name != "xml")
-				throw new Exception("Bad document");
-
-            XmlNode root;
-            if (doc.ChildNodes.Count == 2 && doc.ChildNodes[1].Name == "fdo:DataStore")
-                root = doc.ChildNodes[1];
-            else if (doc.ChildNodes.Count != 2 || doc.ChildNodes[1].Name != "xs:schema")
-                throw new Exception("Bad document");
-            else
-                root = doc;
-
-			XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
-			mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
-			mgr.AddNamespace("gml", "http://www.opengis.net/gml");
-			mgr.AddNamespace("fdo", "http://fdo.osgeo.org/schemas");
-
-            var keys = new Dictionary<string, string[]>();
-            var classMap = new Dictionary<string, ClassDefinition>();
-            XmlNodeList lst = root.SelectNodes("xs:schema/xs:complexType[@abstract='false']", mgr);
-            m_classes = new ClassDefinition[lst.Count];
-            for (int i = 0; i < m_classes.Length; i++)
-            {
-                m_classes[i] = new ClassDefinition(lst[i], mgr);
-                classMap.Add(m_classes[i].QualifiedNameDecoded, m_classes[i]);
-            }
-            XmlNodeList keyNodes = root.SelectNodes("xs:schema/xs:element[@abstract='false']", mgr);
-            foreach (XmlNode keyNode in keyNodes)
-            {
-                var typeAttr = keyNode.Attributes["type"];
-                if (typeAttr != null)
-                {
-                    string clsName = typeAttr.Value.Substring(0, typeAttr.Value.Length - 4); //class name is suffixed with type
-                    if (classMap.ContainsKey(clsName))
-                    {
-                        List<string> keyFieldNames = new List<string>();
-
-                        var cls = classMap[clsName];
-                        XmlNodeList keyFields = keyNode.SelectNodes("xs:key/xs:field", mgr);
-                        foreach (XmlNode keyField in keyFields)
-                        {
-                            var xpathAttr = keyField.Attributes["xpath"];
-                            if (xpathAttr != null)
-                            {
-                                keyFieldNames.Add(xpathAttr.Value);
-                            }
-                        }
-
-                        cls.MarkIdentityProperties(keyFieldNames);
-                    }
-                }
-            }
-
-            var snames = new List<string>();
-            foreach (string qn in classMap.Keys)
-            {
-                string[] tokens = qn.Split(':');
-                if (!snames.Contains(tokens[0]))
-                    snames.Add(tokens[0]);
-            }
-            m_schemaNames = snames.ToArray();
-		}
-
-        /// <summary>
-        /// Gets the schema names.
-        /// </summary>
-        /// <value>The schema names.</value>
-        public string[] SchemaNames { get { return m_schemaNames; } }
-
-        /// <summary>
-        /// Gets the classes.
-        /// </summary>
-        /// <value>The classes.</value>
-		public ClassDefinition[] Classes { get { return m_classes; } }
-
-        /// <summary>
-        /// Gets the <see cref="OSGeo.MapGuide.MaestroAPI.ClassDefinition"/> at the specified index.
-        /// </summary>
-        /// <value></value>
-		public ClassDefinition this[int index] { get { return m_classes[index]; } }
-        /// <summary>
-        /// Gets the <see cref="OSGeo.MapGuide.MaestroAPI.ClassDefinition"/> at the specified index.
-        /// </summary>
-        /// <value></value>
-		public ClassDefinition this[string index] 
-		{
-			get 
-			{
-				for(int i =0 ;i<m_classes.Length; i++)
-					if (m_classes[i].Name == index)
-						return m_classes[i];
-
-				throw new OverflowException("No such item found: " + index);
-			}
-		}
-	}
-
-    
-
-    internal class ClassPropertyColumn : FeatureSetColumn
-    {
-        internal ClassPropertyColumn(XmlNode node)
-            : base()
-		{
-            if (node.Name == "PropertyDefinition" || node.Name == "Column")
-            {
-                m_name = node["Name"].InnerText;
-                m_allowNull = true;
-                switch (node["Type"].InnerText.ToLower().Trim())
-                {
-                    case "string":
-                        m_type = typeof(string);
-                        break;
-                    case "byte":
-                        m_type = typeof(Byte);
-                        break;
-                    case "int32":
-                    case "int":
-                    case "integer":
-                        m_type = typeof(int);
-                        break;
-                    case "int16":
-                        m_type = typeof(short);
-                        break;
-                    case "int64":
-                    case "long":
-                        m_type = typeof(long);
-                        break;
-                    case "float":
-                    case "single":
-                        m_type = typeof(float);
-                        break;
-                    case "double":
-                    case "decimal":
-                        m_type = typeof(double);
-                        break;
-                    case "boolean":
-                    case "bool":
-                        m_type = typeof(bool);
-                        return;
-                    case "datetime":
-                    case "date":
-                        m_type = typeof(DateTime);
-                        break;
-                    case "raster":
-                        m_type = Utility.RasterType;
-                        break;
-                    case "geometry":
-                        m_type = Utility.GeometryType;
-                        break;
-                    default:
-                        //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
-                        m_type = Utility.UnmappedType;
-                        break;
-                }
-            }
-            else
-            {
-                m_name = node.Attributes["name"].Value;
-                m_allowNull = node.Attributes["minOccurs"] != null && node.Attributes["minOccurs"].Value == "0";
-                if (node.Attributes["type"] != null && node.Attributes["type"].Value == "gml:AbstractGeometryType")
-                    m_type = Utility.GeometryType;
-                else if (node["xs:simpleType"] == null)
-                    m_type = Utility.RasterType;
-                else
-                    switch (node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value.ToLower())
-                    {
-                        case "xs:string":
-                            m_type = typeof(string);
-                            break;
-                        case "fdo:byte":
-                            m_type = typeof(Byte);
-                            break;
-                        case "fdo:int32":
-                            m_type = typeof(int);
-                            break;
-                        case "fdo:int16":
-                            m_type = typeof(short);
-                            break;
-                        case "fdo:int64":
-                            m_type = typeof(long);
-                            break;
-                        case "xs:float":
-                        case "xs:single":
-                        case "fdo:single":
-                            m_type = typeof(float);
-                            break;
-                        case "xs:double":
-                        case "xs:decimal":
-                            m_type = typeof(double);
-                            break;
-                        case "xs:boolean":
-                            m_type = typeof(bool);
-                            return;
-                        case "xs:datetime":
-                            m_type = typeof(DateTime);
-                            break;
-                        default:
-                            //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
-                            m_type = Utility.UnmappedType;
-                            break;
-                    }
-            }
-		}
-    }
-}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IFeatureReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,37 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using Topology.Geometries;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    public interface IFeatureReader : IReader, IFeature, IEnumerable<IFeature>
+    {
+        
+    }
+
+    public interface IFeature : IRecord
+    {
+        ClassDefinition ClassDefinition { get; }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/IReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,96 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Topology.Geometries;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    public interface IReader : IDisposable, IRecord
+    {
+        bool ReadNext();
+
+        void Close();
+    }
+
+    public enum ReaderType : int
+    {
+        Data = 1,
+        Sql = 2,
+        Feature = 0
+    }
+
+    public interface IRecordReset
+    {
+        void Update(IRecord record);
+    }
+
+    public interface IRecordInitialize
+    {
+        PropertyValue GetValue(string name);
+        void PutValue(string name, PropertyValue value);
+    }
+
+    public interface IRecord
+    {
+        int FieldCount { get; }
+
+        string GetName(int index);
+        Type GetFieldType(int i);
+
+        bool IsNull(string name);
+        bool IsNull(int index);
+
+        bool GetBoolean(string name);
+        byte GetByte(string name);
+        byte[] GetBlob(string name);
+        char[] GetClob(string name);
+        double GetDouble(string name);
+        DateTime GetDateTime(string name);
+        IFeatureReader GetFeatureObject(string name);
+        short GetInt16(string name);
+        int GetInt32(string name);
+        long GetInt64(string name);
+        float GetSingle(string name);
+        string GetString(string name);
+        IGeometry GetGeometry(string name);
+
+        bool GetBoolean(int index);
+        byte GetByte(int index);
+        byte[] GetBlob(int index);
+        char[] GetClob(int index);
+        double GetDouble(int index);
+        DateTime GetDateTime(int index);
+        IFeatureReader GetFeatureObject(int index);
+        short GetInt16(int index);
+        int GetInt32(int index);
+        long GetInt64(int index);
+        float GetSingle(int index);
+        string GetString(int index);
+        IGeometry GetGeometry(int index);
+
+        //byte[] GetRaster(string name);
+        //byte[] GetRaster(int index);
+
+        object this[int index] { get; }
+        object this[string name] { get; }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/PropertyValue.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,234 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using Topology.Geometries;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    /// <summary>
+    /// Base class of all MapGuide property values. Functions as a nullable box type
+    /// around an underlying data type
+    /// </summary>
+    public abstract class PropertyValue
+    {
+        protected PropertyValue() { this.IsNull = true; }
+
+        public virtual bool IsNull { get; protected set; }
+
+        public virtual void SetNull() { this.IsNull = true; }
+
+        public abstract PropertyValueType Type { get; }
+    }
+
+    /// <summary>
+    /// Base class of all nullable value type property values.
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public abstract class ValueTypePropertyValue<T> : PropertyValue where T : struct
+    {
+        protected ValueTypePropertyValue() : base() { }
+
+        protected ValueTypePropertyValue(T value)
+            : base()
+        {
+            _value = value;
+        }
+
+        private Nullable<T> _value;
+
+        public override bool IsNull
+        {
+            get
+            {
+                return !_value.HasValue;
+            }
+        }
+
+        public T Value
+        {
+            get
+            {
+                if (IsNull)
+                    throw new Exception("Null Value"); //LOCALIZEME
+
+                return _value.Value;
+            }
+            set
+            {
+                _value = value;
+            }
+        }
+
+        public override void SetNull()
+        {
+            _value = null;
+        }
+    }
+
+    /// <summary>
+    /// Base class of all reference type property values
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public abstract class ReferenceTypePropertyValue<T> : PropertyValue where T : class
+    {
+        protected ReferenceTypePropertyValue() : base() { }
+
+        protected ReferenceTypePropertyValue(T value)
+            : base()
+        {
+            _value = value;
+            this.IsNull = false;
+        }
+
+        private T _value;
+
+        public T Value
+        {
+            get
+            {
+                if (IsNull)
+                    throw new Exception("Null Value"); //LOCALIZEME
+
+                return _value;
+            }
+            set
+            {
+                _value = value;
+                this.IsNull = (value == null);
+            }
+        }
+    }
+
+    public class ByteValue : ValueTypePropertyValue<byte>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Byte; }
+        }
+    }
+
+    public class BooleanValue : ValueTypePropertyValue<bool>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Boolean; }
+        }
+    }
+
+    public class BlobValue : ReferenceTypePropertyValue<byte[]>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Blob; }
+        }
+    }
+
+    public class ClobValue : ReferenceTypePropertyValue<char[]>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Clob; }
+        }
+    }
+
+    public class DateTimeValue : ValueTypePropertyValue<DateTime>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.DateTime; }
+        }
+    }
+
+    public class DoubleValue : ValueTypePropertyValue<double>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Double; }
+        }
+    }
+
+    public class FeatureValue : ReferenceTypePropertyValue<IFeature[]>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Feature; }
+        }
+    }
+
+    public class GeometryValue : ReferenceTypePropertyValue<IGeometry>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Geometry; }
+        }
+    }
+
+    public class Int16Value : ValueTypePropertyValue<short>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Int16; }
+        }
+    }
+
+    public class Int32Value : ValueTypePropertyValue<int>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Int32; }
+        }
+    }
+
+    public class Int64Value : ValueTypePropertyValue<long>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Int64; }
+        }
+    }
+
+    public class RasterValue : ReferenceTypePropertyValue<byte[]>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Raster; }
+        }
+    }
+
+    public class SingleValue : ValueTypePropertyValue<float>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.Single; }
+        }
+    }
+
+    public class StringValue : ReferenceTypePropertyValue<string>
+    {
+        public override PropertyValueType Type
+        {
+            get { return PropertyValueType.String; }
+        }
+    }
+
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/ReaderBase.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,208 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    /// <summary>
+    /// Base implementation of the <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IReader"/>
+    /// interface
+    /// </summary>
+    public abstract class ReaderBase : IReader
+    {
+        public IRecord Current { get; private set; }
+
+        public abstract ReaderType ReaderType { get; }
+
+        public int FieldCount
+        {
+            get;
+            protected set;
+        }
+
+        public abstract string GetName(int index);
+
+        public bool ReadNext()
+        {
+            this.Current = ReadNextRecord();
+            return this.Current != null;
+        }
+
+        protected abstract IRecord ReadNextRecord();
+
+        public virtual void Close() { }
+
+        public virtual void Dispose() { }
+
+        public abstract Type GetFieldType(int i);
+
+        public bool IsNull(string name)
+        {
+            return this.Current.IsNull(name);
+        }
+
+        public bool IsNull(int index)
+        {
+            return this.Current.IsNull(index);
+        }
+
+        public bool GetBoolean(string name)
+        {
+            return this.Current.GetBoolean(name);
+        }
+
+        public byte GetByte(string name)
+        {
+            return this.Current.GetByte(name);
+        }
+
+        public byte[] GetBlob(string name)
+        {
+            return this.Current.GetBlob(name);
+        }
+
+        public char[] GetClob(string name)
+        {
+            return this.Current.GetClob(name);
+        }
+
+        public double GetDouble(string name)
+        {
+            return this.Current.GetDouble(name);
+        }
+
+        public DateTime GetDateTime(string name)
+        {
+            return this.Current.GetDateTime(name);
+        }
+
+        public IFeatureReader GetFeatureObject(string name)
+        {
+            return this.Current.GetFeatureObject(name);
+        }
+
+        public short GetInt16(string name)
+        {
+            return this.Current.GetInt16(name);
+        }
+
+        public int GetInt32(string name)
+        {
+            return this.Current.GetInt32(name);
+        }
+
+        public long GetInt64(string name)
+        {
+            return this.Current.GetInt64(name);
+        }
+
+        public float GetSingle(string name)
+        {
+            return this.Current.GetSingle(name);
+        }
+
+        public string GetString(string name)
+        {
+            return this.Current.GetString(name);
+        }
+
+        public Topology.Geometries.IGeometry GetGeometry(string name)
+        {
+            return this.Current.GetGeometry(name);
+        }
+
+        public bool GetBoolean(int index)
+        {
+            return this.Current.GetBoolean(index);
+        }
+
+        public byte GetByte(int index)
+        {
+            return this.Current.GetByte(index);
+        }
+
+        public byte[] GetBlob(int index)
+        {
+            return this.Current.GetBlob(index);
+        }
+
+        public char[] GetClob(int index)
+        {
+            return this.Current.GetClob(index);
+        }
+
+        public double GetDouble(int index)
+        {
+            return this.Current.GetDouble(index);
+        }
+
+        public DateTime GetDateTime(int index)
+        {
+            return this.Current.GetDateTime(index);
+        }
+
+        public IFeatureReader GetFeatureObject(int index)
+        {
+            return this.Current.GetFeatureObject(index);
+        }
+
+        public short GetInt16(int index)
+        {
+            return this.Current.GetInt16(index);
+        }
+
+        public int GetInt32(int index)
+        {
+            return this.Current.GetInt32(index);
+        }
+
+        public long GetInt64(int index)
+        {
+            return this.Current.GetInt64(index);
+        }
+
+        public float GetSingle(int index)
+        {
+            return this.Current.GetSingle(index);
+        }
+
+        public string GetString(int index)
+        {
+            return this.Current.GetString(index);
+        }
+
+        public Topology.Geometries.IGeometry GetGeometry(int index)
+        {
+            return this.Current.GetGeometry(index);
+        }
+
+        public object this[int index]
+        {
+            get { return this.Current[index]; }
+        }
+
+        public object this[string name]
+        {
+            get { return this.Current[name]; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Feature/RecordBase.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,326 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Feature
+{
+    /// <summary>
+    /// Base implementation of the <see cref="T:OSGeo.MapGuide.MaestroAPI.Feature.IRecord"/>
+    /// interface
+    /// </summary>
+    public abstract class RecordBase : IRecord, IRecordReset, IRecordInitialize
+    {
+        protected Dictionary<string, PropertyValue> _values;
+        protected Dictionary<int, string> _ordinalMap;
+
+        public RecordBase()
+        {
+            _values = new Dictionary<string, PropertyValue>();
+            _ordinalMap = new Dictionary<int, string>();
+        }
+
+        public PropertyValue GetValue(string name)
+        {
+            return _values[name];
+        }
+
+        public void PutValue(string name, PropertyValue value)
+        {
+            if (_values.ContainsKey(name))
+                throw new ArgumentException("Key " + name + " already exists"); //LOCALIZEME
+
+            _values[name] = value;
+        }
+
+        public bool IsNull(string name)
+        {
+            return _values[name].IsNull;
+        }
+
+        public bool IsNull(int index)
+        {
+            return IsNull(_ordinalMap[index]);
+        }
+
+        public bool GetBoolean(string name)
+        {
+            return ((BooleanValue)_values[name]).Value;
+        }
+
+        public byte GetByte(string name)
+        {
+            return ((ByteValue)_values[name]).Value;
+        }
+
+        public byte[] GetBlob(string name)
+        {
+            return ((BlobValue)_values[name]).Value;
+        }
+
+        public char[] GetClob(string name)
+        {
+            return ((ClobValue)_values[name]).Value;
+        }
+
+        public double GetDouble(string name)
+        {
+            return ((DoubleValue)_values[name]).Value;
+        }
+
+        public DateTime GetDateTime(string name)
+        {
+            return ((DateTimeValue)_values[name]).Value;
+        }
+
+        public IFeatureReader GetFeatureObject(string name)
+        {
+            return new FeatureArrayReader(((FeatureValue)_values[name]).Value);
+        }
+
+        public short GetInt16(string name)
+        {
+            return ((Int16Value)_values[name]).Value;
+        }
+
+        public int GetInt32(string name)
+        {
+            return ((Int32Value)_values[name]).Value;
+        }
+
+        public long GetInt64(string name)
+        {
+            return ((Int64Value)_values[name]).Value;
+        }
+
+        public float GetSingle(string name)
+        {
+            return ((SingleValue)_values[name]).Value;
+        }
+
+        public string GetString(string name)
+        {
+            return ((StringValue)_values[name]).Value;
+        }
+
+        public Topology.Geometries.IGeometry GetGeometry(string name)
+        {
+            return ((GeometryValue)_values[name]).Value;
+        }
+
+        public bool GetBoolean(int index)
+        {
+            return GetBoolean(_ordinalMap[index]);
+        }
+
+        public byte GetByte(int index)
+        {
+            return GetByte(_ordinalMap[index]);
+        }
+
+        public byte[] GetBlob(int index)
+        {
+            return GetBlob(_ordinalMap[index]);
+        }
+
+        public char[] GetClob(int index)
+        {
+            return GetClob(_ordinalMap[index]);
+        }
+
+        public double GetDouble(int index)
+        {
+            return GetDouble(_ordinalMap[index]);
+        }
+
+        public DateTime GetDateTime(int index)
+        {
+            return GetDateTime(_ordinalMap[index]);
+        }
+
+        public IFeatureReader GetFeatureObject(int index)
+        {
+            return GetFeatureObject(_ordinalMap[index]);
+        }
+
+        public short GetInt16(int index)
+        {
+            return GetInt16(_ordinalMap[index]);
+        }
+
+        public int GetInt32(int index)
+        {
+            return GetInt32(_ordinalMap[index]);
+        }
+
+        public long GetInt64(int index)
+        {
+            return GetInt64(_ordinalMap[index]);
+        }
+
+        public float GetSingle(int index)
+        {
+            return GetSingle(_ordinalMap[index]);
+        }
+
+        public string GetString(int index)
+        {
+            return GetString(_ordinalMap[index]);
+        }
+
+        public Topology.Geometries.IGeometry GetGeometry(int index)
+        {
+            return GetGeometry(_ordinalMap[index]);
+        }
+
+        public object this[int index]
+        {
+            get { return this[_ordinalMap[index]]; }
+        }
+
+        public object this[string name]
+        {
+            get
+            {
+                switch (_values[name].Type)
+                {
+                    case PropertyValueType.Blob:
+                        return GetBlob(name);
+                    case PropertyValueType.Boolean:
+                        return GetBoolean(name);
+                    case PropertyValueType.Byte:
+                        return GetByte(name);
+                    case PropertyValueType.Clob:
+                        return GetClob(name);
+                    case PropertyValueType.DateTime:
+                        return GetDateTime(name);
+                    case PropertyValueType.Double:
+                        return GetDouble(name);
+                    case PropertyValueType.Feature:
+                        return GetFeatureObject(name);
+                    case PropertyValueType.Geometry:
+                        return GetGeometry(name);
+                    case PropertyValueType.Int16:
+                        return GetInt16(name);
+                    case PropertyValueType.Int32:
+                        return GetInt32(name);
+                    case PropertyValueType.Int64:
+                        return GetInt64(name);
+                    //case PropertyValueType.Raster:
+                    //    return GetRaster(name);
+                    case PropertyValueType.Single:
+                        return GetSingle(name);
+                    case PropertyValueType.String:
+                        return GetString(name);
+                }
+                throw new ArgumentException();
+            }
+        }
+
+        public int FieldCount
+        {
+            get { return _values.Count; }
+        }
+
+        public string GetName(int index)
+        {
+            return _ordinalMap[index];
+        }
+
+        public Type GetFieldType(int i)
+        {
+            return ClrFdoTypeMap.GetClrType(_values[GetName(i)].Type);
+        }
+
+        public void Update(IRecord record)
+        {
+            if (record.FieldCount != this.FieldCount)
+                throw new InvalidOperationException("Incoming record must be structurally identical"); //LOCALIZEME
+
+            foreach (var v in _values.Values)
+            {
+                v.SetNull();
+            }
+
+            for (int i = 0; i < record.FieldCount; i++)
+            {
+                if (record.IsNull(i))
+                    continue;
+
+                var val = _values[_ordinalMap[i]];
+                var type = val.Type;
+                switch (type)
+                {
+                    case PropertyValueType.Blob:
+                        ((BlobValue)val).Value = record.GetBlob(i);
+                        break;
+                    case PropertyValueType.Boolean:
+                        ((BooleanValue)val).Value = record.GetBoolean(i);
+                        break;
+                    case PropertyValueType.Byte:
+                        ((ByteValue)val).Value = record.GetByte(i);
+                        break;
+                    case PropertyValueType.Clob:
+                        ((ClobValue)val).Value = record.GetClob(i);
+                        break;
+                    case PropertyValueType.DateTime:
+                        ((DateTimeValue)val).Value = record.GetDateTime(i);
+                        break;
+                    case PropertyValueType.Double:
+                        ((DoubleValue)val).Value = record.GetDouble(i);
+                        break;
+                    case PropertyValueType.Feature:
+                        {
+                            List<IFeature> features = new List<IFeature>();
+                            foreach (var feat in record.GetFeatureObject(i))
+                            {
+                                features.Add(feat);
+                            }
+                            ((FeatureValue)val).Value = features.ToArray();
+                        }
+                        break;
+                    case PropertyValueType.Geometry:
+                        ((GeometryValue)val).Value = record.GetGeometry(i);
+                        break;
+                    case PropertyValueType.Int16:
+                        ((Int16Value)val).Value = record.GetInt16(i);
+                        break;
+                    case PropertyValueType.Int32:
+                        ((Int32Value)val).Value = record.GetInt32(i);
+                        break;
+                    case PropertyValueType.Int64:
+                        ((Int64Value)val).Value = record.GetInt64(i);
+                        break;
+                    //case PropertyValueType.Raster:
+                    //    ((RasterValue)val).Value = record.GetRaster(i);
+                    //    break;
+                    case PropertyValueType.Single:
+                        ((SingleValue)val).Value = record.GetSingle(i);
+                        break;
+                    case PropertyValueType.String:
+                        ((StringValue)val).Value = record.GetString(i);
+                        break;
+                }
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/IServerConnection.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -31,17 +31,17 @@
     /// <summary>
     /// MapGuide Platform connection interface. This is the root object of the Maestro API which typically 
     /// represents a session with a MapGuide Server. Connections are created through the 
-    /// <see cref="OSGeo.MapGuide.MaestroAPI.ConnectionProviderRegistry"/> class.
+    /// <see cref="T:OSGeo.MapGuide.MaestroAPI.ConnectionProviderRegistry"/> class.
     /// 
     /// All implementations supports the base services of the MapGuide Geospatial API:
-    ///  - Resource Service (<see cref="OSGeo.MapGuide.MaestroAPI.Services.IResourceService"/>) for manipulation of repositories and resources
-    ///  - Feature Service (<see cref="OSGeo.MapGuide.MaestroAPI.Services.IFeatureService"/>) an abstraction layer for querying feature data in 
+    ///  - Resource Service (<see cref="T:OSGeo.MapGuide.MaestroAPI.Services.IResourceService"/>) for manipulation of repositories and resources
+    ///  - Feature Service (<see cref="T:OSGeo.MapGuide.MaestroAPI.Services.IFeatureService"/>) an abstraction layer for querying feature data in 
     ///  technology-independent manner.
-    ///  - Coordinate System Catalog (<see cref="OSGeo.MapGuide.MaestroAPI.CoordinateSystem.ICoordinateSystemCatalog"/> for querying coordinate 
+    ///  - Coordinate System Catalog (<see cref="T:OSGeo.MapGuide.MaestroAPI.CoordinateSystem.ICoordinateSystemCatalog"/> for querying coordinate 
     ///  systems and for translating WKT, cs code and EPSG codes to other forms
     ///  
     /// Additional services are supported at various levels depending on the implementation. 
-    /// The <see cref="OSGeo.MapGuide.MaestroAPI.IServerConnection.Capabilities"/> property provides information about 
+    /// The <see cref="P:OSGeo.MapGuide.MaestroAPI.IServerConnection.Capabilities"/> property provides information about 
     /// what features, services and resource types are not supported.
     /// </summary>
     public interface IServerConnection

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/OSGeo.MapGuide.MaestroAPI.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.MaestroAPI</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -166,6 +169,9 @@
     <Compile Include="..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="ArgumentParser.cs" />
     <Compile Include="BindingListExtensions.cs" />
     <Compile Include="Commands\IGetResourceContents.cs" />
@@ -191,7 +197,26 @@
     <Compile Include="Expression\ExpressionFeatureReader.cs" />
     <Compile Include="Expression\FdoFunctionNamespace.cs" />
     <Compile Include="Expression\MgFunctionNamespace.cs" />
-    <Compile Include="Feature\ClassDefinition.cs" />
+    <Compile Include="Feature\ClrFdoTypeMap.cs" />
+    <Compile Include="Feature\FeatureBase.cs" />
+    <Compile Include="Feature\FeatureReaderBase.cs" />
+    <Compile Include="Feature\IFeatureReader.cs" />
+    <Compile Include="Feature\IReader.cs" />
+    <Compile Include="Feature\PropertyValue.cs" />
+    <Compile Include="Feature\ReaderBase.cs" />
+    <Compile Include="Feature\RecordBase.cs" />
+    <Compile Include="ObjectModels\IFdoSpatialContext.cs" />
+    <Compile Include="SchemaOverrides\GdalConfigurationDocument.cs" />
+    <Compile Include="SchemaOverrides\OdbcTableItem.cs" />
+    <Compile Include="SchemaOverrides\WmsConfigurationDocument.cs" />
+    <Compile Include="Schema\ClassDefinition.cs" />
+    <Compile Include="Schema\DataPropertyDefinition.cs" />
+    <Compile Include="Schema\FeatureSchema.cs" />
+    <Compile Include="Schema\GeometricPropertyDefinition.cs" />
+    <Compile Include="Schema\IFdoSerializable.cs" />
+    <Compile Include="Schema\PropertyDefinition.cs" />
+    <Compile Include="Schema\RasterPropertyDefinition.cs" />
+    <Compile Include="Schema\SchemaElement.cs" />
     <Compile Include="IConnectionCapabilities.cs" />
     <Compile Include="IO\ReadOnlyRewindableStream.cs" />
     <Compile Include="MaestroApiProviderAttribute.cs" />
@@ -200,8 +225,7 @@
     <Compile Include="CoordinateSystem\CoordinateSystemCatalog.cs" />
     <Compile Include="CoordinateSystem\CoordinateSystemCategory.cs" />
     <Compile Include="Enums.cs" />
-    <Compile Include="Feature\FeatureSetReader.cs" />
-    <Compile Include="Feature\FeatureSourceDescription.cs" />
+    <Compile Include="Schema\FeatureSourceDescription.cs" />
     <Compile Include="CoordinateSystem\ICoordinateSystemCatalog.cs" />
     <Compile Include="CrossConnection\ResourceMigrator.cs" />
     <Compile Include="Mapping\MapObservable.cs" />
@@ -285,7 +309,7 @@
     <Compile Include="SchemaOverrides\RasterFileItem.cs" />
     <Compile Include="SchemaOverrides\RasterItem.cs" />
     <Compile Include="SchemaOverrides\RasterWmsItem.cs" />
-    <Compile Include="SchemaOverrides\SpatialContextData.cs" />
+    <Compile Include="Schema\XmlNamespaces.cs" />
     <Compile Include="Serialization\Enums.cs" />
     <Compile Include="Serialization\IBinarySerializable.cs" />
     <Compile Include="Serialization\MgBinaryDeserializer.cs" />

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/FeatureSourceInterfaces.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -25,6 +25,7 @@
 using OSGeo.MapGuide.MaestroAPI;
 using System.ComponentModel;
 using System.IO;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.ObjectModels.FeatureSource
 {

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/IFdoSpatialContext.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,235 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Serialization;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Globalization;
+
+namespace OSGeo.MapGuide.ObjectModels.Common
+{
+    /// <summary>
+    /// Represents a Spatial Context of a Feature Source
+    /// </summary>
+    public interface IFdoSpatialContext : IFdoSerializable
+    {
+        string CoordinateSystemName { get; set; }
+
+        string CoordinateSystemWkt { get; set; }
+
+        string Description { get; set; }
+
+        IEnvelope Extent { get; set; }
+
+        FdoSpatialContextListSpatialContextExtentType ExtentType { get; set; }
+
+        string Name { get; set; }
+
+        double XYTolerance { get; set; }
+
+        double ZTolerance { get; set; }
+    }
+
+    partial class FdoSpatialContextListSpatialContext : IFdoSpatialContext
+    {
+        [XmlIgnore]
+        IEnvelope IFdoSpatialContext.Extent
+        {
+            get
+            {
+                double llx;
+                double lly;
+                double urx;
+                double ury;
+
+                if (double.TryParse(this.Extent.LowerLeftCoordinate.X, out llx) &&
+                    double.TryParse(this.Extent.LowerLeftCoordinate.Y, out lly) &&
+                    double.TryParse(this.Extent.UpperRightCoordinate.X, out urx) &&
+                    double.TryParse(this.Extent.UpperRightCoordinate.Y, out ury))
+                    return ObjectFactory.CreateEnvelope(llx, lly, urx, ury);
+
+                return null;
+            }
+            set
+            {
+                if (value == null)
+                {
+                    this.Extent = null;
+                    return;
+                }
+
+                this.Extent = new FdoSpatialContextListSpatialContextExtent()
+                {
+                    LowerLeftCoordinate = new FdoSpatialContextListSpatialContextExtentLowerLeftCoordinate()
+                    {
+                        X = value.MinX.ToString(CultureInfo.InvariantCulture),
+                        Y = value.MinY.ToString(CultureInfo.InvariantCulture)
+                    },
+                    UpperRightCoordinate = new FdoSpatialContextListSpatialContextExtentUpperRightCoordinate()
+                    {
+                        X = value.MaxX.ToString(CultureInfo.InvariantCulture),
+                        Y = value.MaxY.ToString(CultureInfo.InvariantCulture)
+                    }
+                };
+            }
+        }
+
+        public void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            //Can't write dynamic extents
+            if (this.ExtentType == FdoSpatialContextListSpatialContextExtentType.Dynamic)
+                return;
+
+            var crs = doc.CreateElement("gml", "DerivedCRS", XmlNamespaces.GML);
+            {
+                crs.SetAttribute("id", this.Name);
+                var meta = doc.CreateElement("gml", "metaDataProperty", XmlNamespaces.GML);
+                crs.AppendChild(meta);
+                {
+                    var genMeta = doc.CreateElement("gml", "GenericMetaData", XmlNamespaces.GML);
+                    meta.AppendChild(genMeta);
+                    {
+                        var fdoXY = doc.CreateElement("fdo", "XYTolerance", XmlNamespaces.FDO);
+                        var fdoZ = doc.CreateElement("fdo", "ZTolerance", XmlNamespaces.FDO);
+                        fdoXY.InnerText = this.XYTolerance.ToString(CultureInfo.InvariantCulture);
+                        fdoZ.InnerText = this.ZTolerance.ToString(CultureInfo.InvariantCulture);
+                        genMeta.AppendChild(fdoXY);
+                        genMeta.AppendChild(fdoZ);
+                    }
+                }
+                
+                var remarks = doc.CreateElement("gml", "remarks", XmlNamespaces.GML);
+                remarks.InnerText = this.Description;
+                crs.AppendChild(remarks);
+
+                var csName = doc.CreateElement("gml", "srsName", XmlNamespaces.GML);
+                csName.InnerText = this.CoordinateSystemName;
+                crs.AppendChild(csName);
+
+                var ext = doc.CreateElement("gml", "validArea", XmlNamespaces.GML);
+                {
+                    var bbox = doc.CreateElement("gml", "boundingBox", XmlNamespaces.GML);
+                    {
+                        var ll = doc.CreateElement("gml", "pos", XmlNamespaces.GML);
+                        var ur = doc.CreateElement("gml", "pos", XmlNamespaces.GML);
+                        ll.InnerText = this.Extent.LowerLeftCoordinate.X + " " + this.Extent.LowerLeftCoordinate.Y;
+                        ur.InnerText = this.Extent.UpperRightCoordinate.X + " " + this.Extent.UpperRightCoordinate.Y;
+                        bbox.AppendChild(ll);
+                        bbox.AppendChild(ur);
+                    }
+                    ext.AppendChild(bbox);
+                }
+                crs.AppendChild(ext);
+
+                var baseCrs = doc.CreateElement("gml", "baseCRS", XmlNamespaces.GML);
+                var definedBy = doc.CreateElement("gml", "definedByConversion", XmlNamespaces.GML);
+                var derivedCrs = doc.CreateElement("gml", "derivedCRSType", XmlNamespaces.GML);
+                var userCs = doc.CreateElement("gml", "usesCS", XmlNamespaces.GML);
+
+                if (string.IsNullOrEmpty(this.CoordinateSystemWkt))
+                {
+                    baseCrs.SetAttribute("href", XmlNamespaces.XLINK, "http://fdo.osgeo.org/schemas/feature/crs/#" + this.CoordinateSystemName);
+                }
+                else
+                {
+                    var wktCRS = doc.CreateElement("fdo", "WKTCRS", XmlNamespaces.FDO);
+                    wktCRS.SetAttribute("id", XmlNamespaces.GML, this.Name);
+                    {
+                        var srsName = doc.CreateElement("gml", "srsName", XmlNamespaces.GML);
+                        srsName.InnerText = this.nameField;
+                        var fdowkt = doc.CreateElement("fdo", "WKT", XmlNamespaces.FDO);
+                        fdowkt.InnerText = this.CoordinateSystemWkt;
+                        wktCRS.AppendChild(srsName);
+                        wktCRS.AppendChild(fdowkt);
+                    }
+                    baseCrs.AppendChild(wktCRS);
+                }
+
+                definedBy.SetAttribute("href", XmlNamespaces.XLINK, "http://fdo.osgeo.org/coord_conversions#identity");
+                derivedCrs.SetAttribute("codeSpace", "http://fdo.osgeo.org/crs_types");
+                derivedCrs.InnerText = "geographic";
+                userCs.SetAttribute("href", XmlNamespaces.XLINK, "http://fdo.osgeo.org/cs#default_cartesian");
+
+                crs.AppendChild(baseCrs);
+                crs.AppendChild(definedBy);
+                crs.AppendChild(derivedCrs);
+                crs.AppendChild(userCs);
+            }
+
+            currentNode.AppendChild(crs);
+        }
+
+        public void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            if (!node.Name.Equals("gml:DerivedCRS"))
+                throw new Exception("Bad document. Expected element gml:DerivedCRS"); //LOCALIZEME
+
+            var meta = node["gml:metaDataProperty"];
+            var remarks = node["gml:remarks"];
+            var srsName = node.Attributes["id"];
+            var ext = node["gml:validArea"];
+            var baseCrs = node["gml:baseCRS"];
+
+            //Anything we read in *must* be static!
+            this.ExtentType = FdoSpatialContextListSpatialContextExtentType.Static;
+            this.Name = srsName.Value;
+            this.Description = remarks.InnerText;
+
+            var bbox = ext["gml:boundingBox"];
+            var ll = bbox.FirstChild;
+            var ur = bbox.LastChild;
+
+            var llt = ll.InnerText.Split(' ');
+            var urt = ur.InnerText.Split(' ');
+
+            if (llt.Length != 2 || urt.Length != 2)
+                throw new Exception("Bad document. Invalid bounding box"); //LOCALIZEME
+
+            this.Extent = new FdoSpatialContextListSpatialContextExtent()
+            {
+                LowerLeftCoordinate = new FdoSpatialContextListSpatialContextExtentLowerLeftCoordinate()
+                {
+                    X = llt[0],
+                    Y = llt[1]
+                },
+                UpperRightCoordinate = new FdoSpatialContextListSpatialContextExtentUpperRightCoordinate()
+                {
+                    X = urt[0],
+                    Y = urt[1]
+                }
+            };
+
+            if (baseCrs.HasAttribute("xlink:href"))
+            {
+                var href = baseCrs.GetAttribute("xlink:href");
+                this.CoordinateSystemName = href.Substring(href.LastIndexOf("#") + 1);
+            }
+
+            if (baseCrs["fdo:WKTCRS"] != null)
+            {
+                if (baseCrs["fdo:WKTCRS"]["fdo:WKT"] != null)
+                {
+                    this.CoordinateSystemWkt = baseCrs["fdo:WKTCRS"]["fdo:WKT"].InnerText;
+                }
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ObjectModels/LayerInterfaceExtensions.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -26,6 +26,7 @@
 using OSGeo.MapGuide.ObjectModels.Common;
 using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.ObjectModels.DrawingSource;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.ObjectModels.LayerDefinition
 {
@@ -138,15 +139,15 @@
 
             foreach (var geomType in geomTypes)
             {
-                if (geomTypes.Equals(GeometryMetadata.GEOM_TYPE_CURVE))
+                if (geomType.ToLower().Equals(FeatureGeometricType.Curve.ToString().ToLower()))
                 {
                     range.LineStyle = null;
                 }
-                else if (geomTypes.Equals(GeometryMetadata.GEOM_TYPE_POINT))
+                else if (geomType.ToLower().Equals(FeatureGeometricType.Point.ToString().ToLower()))
                 {
                     range.PointStyle = null;
                 }
-                else if (geomTypes.Equals(GeometryMetadata.GEOM_TYPE_SURFACE))
+                else if (geomType.ToLower().Equals(FeatureGeometricType.Surface.ToString().ToLower()))
                 {
                     range.AreaStyle = null;
                 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Platform.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Platform.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Platform.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -24,7 +24,8 @@
 namespace OSGeo.MapGuide.MaestroAPI
 {
     /// <summary>
-    /// Platform check helper class
+    /// Platform check helper class. Use this class to determine if this assembly is executing
+    /// under the Mono Runtime environment.
     /// </summary>
     public static class Platform
     {

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/PlatformConnectionBase.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -34,6 +34,8 @@
 using OSGeo.MapGuide.ObjectModels.MapDefinition;
 using OSGeo.MapGuide.ObjectModels.Common;
 using System.Collections.Specialized;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -1405,7 +1407,7 @@
         /// <param name="resourceID">The resource ID.</param>
         /// <param name="schema">The schema.</param>
         /// <returns></returns>
-        abstract public FeatureSourceDescription DescribeFeatureSource(string resourceID, string schema);
+        abstract public FeatureSchema DescribeFeatureSource(string resourceID, string schema);
 
         /// <summary>
         /// feature source description cache
@@ -1428,8 +1430,8 @@
                 try
                 {
                     m_featureSchemaCache[resourceID] = this.DescribeFeatureSource(resourceID);
-                    foreach (ClassDefinition scm in m_featureSchemaCache[resourceID].Classes)
-                        m_featureSchemaNameCache[resourceID + "!" + scm.QualifiedNameDecoded] = scm;
+                    foreach (ClassDefinition scm in m_featureSchemaCache[resourceID].AllClasses)
+                        m_featureSchemaNameCache[resourceID + "!" + scm.QualifiedName] = scm;
                 }
                 catch
                 {
@@ -1479,7 +1481,7 @@
         /// <param name="schema">The schema name</param>
         /// <param name="filter">The filter to apply to the </param>
         /// <returns>A FeatureSetReader with the aggregated values</returns>
-        public virtual FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter)
+        public virtual IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter)
         {
             return AggregateQueryFeatureSource(resourceID, schema, filter, (string[])null);
         }
@@ -1491,8 +1493,8 @@
         /// <param name="schema">The schema name</param>
         /// <param name="filter">The filter to apply to the </param>
         /// <param name="columns">The columns to aggregate</param>
-        /// <returns>A FeatureSetReader with the aggregated values</returns>
-        public abstract FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns);
+        /// <returns>A IFeatureReader with the aggregated values</returns>
+        public abstract IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns);
 
         /// <summary>
         /// Performs an aggregate query on computed resources
@@ -1502,7 +1504,7 @@
         /// <param name="filter">The filter to apply to the </param>
         /// <param name="aggregateFunctions">A collection of column name and aggregate functions</param>
         /// <returns>A FeatureSetReader with the aggregated values</returns>
-        public abstract FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, System.Collections.Specialized.NameValueCollection aggregateFunctions);
+        public abstract IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, System.Collections.Specialized.NameValueCollection aggregateFunctions);
 
         /// <summary>
         /// Gets the spatial extent.
@@ -1559,11 +1561,11 @@
             {
                 System.Collections.Specialized.NameValueCollection fun = new System.Collections.Specialized.NameValueCollection();
                 fun.Add("extent", "SpatialExtents(\"" + geometry + "\")");
-                using (FeatureSetReader fsr = AggregateQueryFeatureSource(resourceID, schema, filter, fun))
+                using (IReader fsr = AggregateQueryFeatureSource(resourceID, schema, filter, fun))
                 {
-                    if (fsr.Read())
+                    if (fsr.ReadNext())
                     {
-                        Topology.Geometries.IGeometry geom = fsr.Row["extent"] as Topology.Geometries.IGeometry;
+                        Topology.Geometries.IGeometry geom = fsr["extent"] as Topology.Geometries.IGeometry;
                         if (geom == null)
                         {
                             throw new Exception("No data found in resource: " + resourceID);

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Properties/AssemblyInfo.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Properties/AssemblyInfo.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -19,4 +19,5 @@
 // The following GUID is for the ID of the typelib if this project is exposed to COM
 [assembly: Guid("ab443f91-168a-4c13-9477-1b264241b3cd")]
 
-[assembly: InternalsVisibleTo("MaestroAPITests")]
\ No newline at end of file
+// This long string is the public key of the maestroapi.key token
+[assembly: InternalsVisibleTo("MaestroAPITests, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f196e7ed5bff1e511efa3251b228582b26cbf78ea6d4282742d5c882db02b08ebc99922c0ddccf9ab79ee180250ac6716f986cf6fabdc1404b3dafee8873d4d6327be301f5ca52862065678cd5bc0c18ddc7ef6516723162c985a0c20eec07382a2090486f24393bf80976aa5ab57274620bafd62dfec34d5eed74bf41e72d2")]
\ No newline at end of file

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseLayerDefinitionValidator.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseLayerDefinitionValidator.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/BaseLayerDefinitionValidator.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -25,6 +25,7 @@
 using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.ObjectModels.Common;
 using OSGeo.MapGuide.ObjectModels.DrawingSource;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
 {
@@ -206,54 +207,57 @@
                         //Verify specified feature class and geometry check out
                         try
                         {
-                            string schema = vldef == null ? gldef.FeatureName : vldef.FeatureName;
+                            string qualClassName = vldef == null ? gldef.FeatureName : vldef.FeatureName;
                             string geometry = vldef == null ? gldef.Geometry : vldef.Geometry;
 
                             bool foundSchema = false;
                             bool foundGeometry = false;
 
                             FeatureSourceDescription desc = context.DescribeFeatureSource(ldef.SubLayer.ResourceId);
-                            foreach (ClassDefinition scm in desc.Classes)
+                            foreach (FeatureSchema fsc in desc.Schemas)
                             {
-                                if (scm.QualifiedNameDecoded == schema)
+                                foreach (ClassDefinition scm in fsc.Classes)
                                 {
-                                    foundSchema = true;
+                                    if (scm.QualifiedName == qualClassName)
+                                    {
+                                        foundSchema = true;
 
-                                    foreach (FeatureSetColumn col in scm.Columns)
-                                    {
-                                        if (col.Name == geometry)
+                                        foreach (PropertyDefinition col in scm.Properties)
                                         {
-                                            foundGeometry = true;
-                                            break;
+                                            if (col.Name == geometry)
+                                            {
+                                                foundGeometry = true;
+                                                break;
+                                            }
                                         }
-                                    }
 
-                                    if (vldef != null && vldef.PropertyMapping != null)
-                                    {
-                                        foreach (INameStringPair s in vldef.PropertyMapping)
+                                        if (vldef != null && vldef.PropertyMapping != null)
                                         {
-                                            bool found = false;
-                                            foreach (FeatureSetColumn col in scm.Columns)
+                                            foreach (INameStringPair s in vldef.PropertyMapping)
                                             {
-                                                if (col.Name == s.Name)
+                                                bool found = false;
+                                                foreach (PropertyDefinition col in scm.Properties)
                                                 {
-                                                    found = true;
-                                                    break;
+                                                    if (col.Name == s.Name)
+                                                    {
+                                                        found = true;
+                                                        break;
+                                                    }
                                                 }
+                                                if (!found)
+                                                    issues.Add(new ValidationIssue(resource, ValidationStatus.Error, string.Format(Properties.Resources.LDF_SchemaMissingError, qualClassName, fs.ResourceID)));
                                             }
-                                            if (!found)
-                                                issues.Add(new ValidationIssue(resource, ValidationStatus.Error, string.Format(Properties.Resources.LDF_SchemaMissingError, schema, fs.ResourceID)));
                                         }
+
+                                        break;
                                     }
-
-                                    break;
                                 }
                             }
 
                             if (!foundSchema)
-                                issues.Add(new ValidationIssue(resource, ValidationStatus.Error, string.Format(Properties.Resources.LDF_SchemaMissingError, schema, fs.ResourceID)));
+                                issues.Add(new ValidationIssue(resource, ValidationStatus.Error, string.Format(Properties.Resources.LDF_SchemaMissingError, qualClassName, fs.ResourceID)));
                             else if (!foundGeometry)
-                                issues.Add(new ValidationIssue(resource, ValidationStatus.Error, string.Format(Properties.Resources.LDF_GeometryMissingError, geometry, schema, fs.ResourceID)));
+                                issues.Add(new ValidationIssue(resource, ValidationStatus.Error, string.Format(Properties.Resources.LDF_GeometryMissingError, geometry, qualClassName, fs.ResourceID)));
                         }
                         catch (Exception)
                         {

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/FeatureSourceValidator.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -25,6 +25,7 @@
 using OSGeo.MapGuide.MaestroAPI;
 using OSGeo.MapGuide.ObjectModels.FeatureSource;
 using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
 {
@@ -83,7 +84,7 @@
             try
             {
                 fsd = context.DescribeFeatureSource(feature.ResourceID);
-                if (fsd == null || fsd.Classes == null || fsd.Classes.Length == 0)
+                if (fsd == null || fsd.Schemas.Length == 0)
                     issues.Add(new ValidationIssue(feature, ValidationStatus.Warning, Properties.Resources.FS_SchemasMissingWarning));
             }
             catch (Exception ex)
@@ -93,10 +94,10 @@
             }
 
 
-            foreach (var cl in fsd.Classes)
+            foreach (var cl in fsd.AllClasses)
             {
-                string[] ids = cl.GetIdentityProperties();
-                if (ids == null || ids.Length == 0)
+                var ids = cl.IdentityProperties;
+                if (ids.Count == 0)
                     issues.Add(new ValidationIssue(feature, ValidationStatus.Information, string.Format(Properties.Resources.FS_PrimaryKeyMissingInformation, cl)));
             }
 

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Resource/Validation/ResourceValidationContext.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -23,6 +23,7 @@
 using System.Diagnostics;
 using OSGeo.MapGuide.MaestroAPI.Services;
 using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI.Resource.Validation
 {
@@ -50,6 +51,17 @@
             _spatialContexts = new Dictionary<string, FdoSpatialContextList>();
         }
 
+        /// <summary>
+        /// Clears all cached items and validated resources
+        /// </summary>
+        public void Reset()
+        {
+            _validated.Clear();
+            _resources.Clear();
+            _schemas.Clear();
+            _spatialContexts.Clear();
+        }
+
         public FdoSpatialContextList GetSpatialContexts(string resourceId)
         {
             if (_spatialContexts.ContainsKey(resourceId))

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/ResourceTypeRegistry.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -68,6 +68,8 @@
         public ResourceDeserializationCallback Deserialize { get; set; }
     }
 
+    //TODO: Expand on documentation as this is an important class
+
     /// <summary>
     /// A registry of serializers allowing automatic serialization/deserialization of any XML
     /// content based on its version and resource type.

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/ClassDefinition.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,433 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.Collections.ObjectModel;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    //TODO: Expand on documentation as this is an important class
+
+    /// <summary>
+    /// Represents a FDO class definition
+    /// </summary>
+    public class ClassDefinition : SchemaElement, IFdoSerializable
+    {
+        private List<DataPropertyDefinition> _identity;
+
+        private List<PropertyDefinition> _properties;
+
+        private Dictionary<string, int> _ordinalMap;
+
+        private ClassDefinition()
+        {
+            _ordinalMap = new Dictionary<string, int>();
+            _identity = new List<DataPropertyDefinition>();
+            _properties = new List<PropertyDefinition>();
+        }
+
+        public ClassDefinition(string name, string description)
+            : this()
+        {
+            this.Name = name;
+            this.Description = description;
+        }
+
+        public ClassDefinition BaseClass { get; set; }
+
+        /// <summary>
+        /// Gets the property definition at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        public PropertyDefinition this[int index]
+        {
+            get { return _properties[index]; }
+        }
+
+        public int GetOrdinal(string name)
+        {
+            if (_ordinalMap.ContainsKey(name))
+                return _ordinalMap[name];
+
+            for (int i = 0; i < this.Properties.Count; i++)
+            {
+                if (this[i].Name.Equals(name))
+                {
+                    _ordinalMap[name] = i;
+                    return i;
+                }
+            }
+
+            throw new ArgumentException("Property not found: " + name); //LOCALIZEME
+        }
+
+        /// <summary>
+        /// Gets or sets whether this is abstract
+        /// </summary>
+        public bool IsAbstract { get; set; }
+
+        /// <summary>
+        /// Gets or sets whether this is computed. Computed classes should have its properties
+        /// checked out (and possibly modified) before serving as a basis for a new class definition
+        /// </summary>
+        public bool IsComputed { get; set; }
+
+        /// <summary>
+        /// Gets or sets the name of the default geometry property.
+        /// </summary>
+        public string DefaultGeometryPropertyName { get; set; }
+
+        /// <summary>
+        /// Gets the identity properties
+        /// </summary>
+        public ReadOnlyCollection<DataPropertyDefinition> IdentityProperties
+        {
+            get { return _identity.AsReadOnly(); }
+        }
+
+        /// <summary>
+        /// Gets the properties
+        /// </summary>
+        public ReadOnlyCollection<PropertyDefinition> Properties
+        {
+            get { return _properties.AsReadOnly(); }
+        }
+
+        /// <summary>
+        /// Adds the specified data property, with an option to include it as an identity property
+        /// </summary>
+        /// <param name="prop"></param>
+        /// <param name="identity"></param>
+        public void AddProperty(DataPropertyDefinition prop, bool identity)
+        {
+            if (!_properties.Contains(prop))
+                _properties.Add(prop);
+
+            if (identity && !_identity.Contains(prop))
+                _identity.Add(prop);
+
+            prop.Parent = this;
+        }
+
+        /// <summary>
+        /// Adds the specified property definition
+        /// </summary>
+        /// <param name="prop"></param>
+        public void AddProperty(PropertyDefinition prop)
+        {
+            if (!_properties.Contains(prop)) 
+                _properties.Add(prop);
+            prop.Parent = this;
+        }
+
+        /// <summary>
+        /// Gets the index of the specified property
+        /// </summary>
+        /// <param name="prop"></param>
+        /// <returns></returns>
+        public int IndexOfProperty(PropertyDefinition prop)
+        {
+            return _properties.IndexOf(prop);
+        }
+        
+        /// <summary>
+        /// Removes the property definition at the specified index. If it is a data property
+        /// is is also removed from the identity properties (if it is specified as one)
+        /// </summary>
+        /// <param name="index"></param>
+        public void RemovePropertyAt(int index)
+        {
+            if (index < _properties.Count)
+            {
+                var prop = _properties[index];
+                _properties.RemoveAt(index);
+                if (prop.Type == PropertyDefinitionType.Data)
+                {
+                    _identity.Remove((DataPropertyDefinition)prop);
+                    prop.Parent = null;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Removes the specified property from the properties collection. If it is a data property definition, it is also
+        /// removed from the identity properties collection
+        /// </summary>
+        /// <param name="prop"></param>
+        /// <returns></returns>
+        public bool RemoveProperty(PropertyDefinition prop)
+        {
+            bool removed = _properties.Remove(prop);
+
+            if (removed && prop.Type == PropertyDefinitionType.Data)
+            {
+                _identity.Remove((DataPropertyDefinition)prop);
+                prop.Parent = null;
+            }
+
+            return removed;
+        }
+
+        #region old impl
+        /*
+        private string m_name;
+        private string m_schema;
+        private FeatureSetColumn[] m_columns;
+
+        internal ClassDefinition(XmlNode node, XmlNamespaceManager mgr)
+        {
+            XmlNode root = node.ParentNode;
+            if (root.NodeType == XmlNodeType.XmlDeclaration)
+                root = root.NextSibling;
+            m_schema = root.Attributes["targetNamespace"] == null ? null : root.Attributes["targetNamespace"].Value;
+            if (m_schema != null && m_schema.IndexOf("/") > 0)
+                m_schema = m_schema.Substring(m_schema.LastIndexOf("/") + 1);
+            m_name = node.Attributes["name"].Value;
+            if (m_name.EndsWith("Type"))
+                m_name = m_name.Substring(0, m_name.Length - "Type".Length);
+
+            XmlNodeList lst;
+            if (node.ChildNodes.Count == 0)
+            {
+                m_columns = new FeatureSetColumn[0];
+                return;
+            }
+            else if (node.FirstChild.Name == "xs:sequence")
+                lst = node.SelectNodes("xs:sequence/xs:element", mgr);
+            else
+                lst = node.SelectNodes("xs:complexContent/xs:extension/xs:sequence/xs:element", mgr);
+
+
+            m_columns = new FeatureSetColumn[lst.Count];
+            for (int i = 0; i < lst.Count; i++)
+                m_columns[i] = new ClassPropertyColumn(lst[i]);
+
+            XmlNode extension = node.SelectSingleNode("xs:complexContent/xs:extension", mgr);
+            if (extension != null && extension.Attributes["base"] != null)
+            {
+                string extTypeName = extension.Attributes["base"].Value;
+                extTypeName = extTypeName.Substring(extTypeName.IndexOf(":") + 1);
+
+                XmlNode baseEl = node.ParentNode.SelectSingleNode("xs:complexType[@name='" + extTypeName + "']", mgr);
+                if (baseEl != null)
+                {
+                    ClassDefinition tmpScm = new ClassDefinition(baseEl, mgr);
+                    FeatureSetColumn[] tmpCol = new FeatureSetColumn[m_columns.Length + tmpScm.m_columns.Length];
+                    Array.Copy(m_columns, tmpCol, m_columns.Length);
+                    Array.Copy(tmpScm.m_columns, 0, tmpCol, m_columns.Length, tmpScm.m_columns.Length);
+                    m_columns = tmpCol;
+                }
+            }
+        }
+
+        /// <summary>
+        /// Gets the name of this class definition
+        /// </summary>
+        public string Name { get { return m_name; } }
+
+        /// <summary>
+        /// Gets the name of the schema which this class definition belongs to
+        /// </summary>
+        public string SchemaName { get { return m_schema; } }
+
+        /// <summary>
+        /// Gets the fully qualified name of this class definition ([schema_name]:[name])
+        /// </summary>
+        public string QualifiedName { get { return m_schema == null ? m_name : m_schema + ":" + m_name; } }
+
+        /// <summary>
+        /// Gets the decoded fully qualified name of this class definition ([schema_name]:[name])
+        /// </summary>
+        public string QualifiedNameDecoded { get { return Utility.DecodeFDOName(this.QualifiedName); } }
+
+        /// <summary>
+        /// Gets an array of columns defining the properties in this class definition
+        /// </summary>
+        public FeatureSetColumn[] Columns { get { return m_columns; } }
+
+        /// <summary>
+        /// Returns a <see cref="System.String"/> that represents this instance.
+        /// </summary>
+        /// <returns>
+        /// A <see cref="System.String"/> that represents this instance.
+        /// </returns>
+        public override string ToString()
+        {
+            return this.QualifiedName;
+        }
+
+        internal void MarkIdentityProperties(IEnumerable<string> keyFieldNames)
+        {
+            foreach (var name in keyFieldNames)
+            {
+                foreach (var col in m_columns)
+                {
+                    if (col.Name.Equals(name))
+                    {
+                        col.IsIdentity = true;
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// Gets an array of names of the identity properties
+        /// </summary>
+        /// <returns></returns>
+        public string[] GetIdentityProperties()
+        {
+            List<string> keys = new List<string>();
+            foreach (var col in m_columns)
+            {
+                if (col.IsIdentity)
+                    keys.Add(col.Name);
+            }
+            return keys.ToArray();
+        }
+         */
+        #endregion
+
+        public FeatureSchema Parent { get; internal set; }
+
+        public PropertyDefinition FindProperty(string name)
+        {
+            foreach (var prop in _properties)
+            {
+                if (prop.Name.Equals(name))
+                    return prop;
+            }
+            return null;
+        }
+
+        public string QualifiedName { get { return this.Parent != null ? this.Parent.Name + ":" + this.Name : this.Name; } }
+
+        public void WriteXml(XmlDocument doc, XmlNode currentNode)
+        {
+            XmlElement id = null;
+
+            if (_identity.Count > 0)
+            {
+                id = doc.CreateElement("xs", "element", XmlNamespaces.XS);
+                id.SetAttribute("name", this.Name);
+                id.SetAttribute("type", this.Parent.Name + ":" + this.Name + "Type");
+                id.SetAttribute("abstract", this.IsAbstract.ToString().ToLower());
+                id.SetAttribute("substitutionGroup", "gml:_Feature");
+
+                var key = doc.CreateElement("xs", "key", XmlNamespaces.XS);
+                key.SetAttribute("name", this.Name + "Key");
+
+                var selector = doc.CreateElement("xs", "selector", XmlNamespaces.XS);
+                selector.SetAttribute("xpath", ".//" + this.Name);
+
+                key.AppendChild(selector);
+
+                foreach (var prop in _identity)
+                {
+                    var field = doc.CreateElement("xs", "field", XmlNamespaces.XS);
+                    field.SetAttribute("xpath", prop.Name);
+
+                    key.AppendChild(field);
+                }
+                id.AppendChild(key);
+            }
+
+            //Now write class body
+            var ctype = doc.CreateElement("xs", "complexType", XmlNamespaces.XS);
+            ctype.SetAttribute("name", this.Name + "Type");
+            ctype.SetAttribute("abstract", this.IsAbstract.ToString().ToLower());
+            if (!string.IsNullOrEmpty(this.DefaultGeometryPropertyName))
+            {
+                var geom = FindProperty(this.DefaultGeometryPropertyName) as GeometricPropertyDefinition;
+                if (geom != null)
+                {
+                    ctype.SetAttribute("geometryName", XmlNamespaces.FDO, geom.Name);
+                }
+            }
+
+            var cnt = doc.CreateElement("xs", "complexContent", XmlNamespaces.XS);
+            ctype.AppendChild(cnt);
+
+            var ext = doc.CreateElement("xs", "extension", XmlNamespaces.XS);
+            if (this.BaseClass != null)
+                ext.SetAttribute("base", this.BaseClass.QualifiedName);
+            else
+                ext.SetAttribute("base", "gml:AbstractFeatureType");
+            cnt.AppendChild(ext);
+
+            var seq = doc.CreateElement("xs", "sequence", XmlNamespaces.XS);
+            ext.AppendChild(seq);
+
+            foreach (var prop in _properties)
+            {
+                prop.WriteXml(doc, seq);
+            }
+
+            if (id != null)
+                currentNode.AppendChild(id);
+
+            currentNode.AppendChild(ctype);
+        }
+
+        public void ReadXml(XmlNode node, XmlNamespaceManager mgr)
+        {
+ 	        var abn = node.Attributes["abstract"];
+            if (abn != null)
+                this.IsAbstract = Convert.ToBoolean(abn.Value);
+
+            //Process properties
+            XmlNodeList propNodes = node.SelectNodes("xs:complexContent/xs:extension/xs:sequence/xs:element", mgr);
+            if (propNodes.Count == 0)
+                propNodes = node.SelectNodes("xs:sequence/xs:element", mgr);
+            foreach (XmlNode propNode in propNodes)
+            {
+                var prop = PropertyDefinition.Parse(propNode, mgr);
+                this.AddProperty(prop);
+            }
+
+            //Set designated geometry property
+            var geom = node.Attributes["fdo:geometryName"];
+            if (geom != null)
+                this.DefaultGeometryPropertyName = geom.Value;
+
+            //TODO: Base class
+
+            //Process identity properties
+            var parent = node.ParentNode;
+            var key = parent.SelectSingleNode("xs:element[@name='" + this.Name + "']/xs:key", mgr);
+            if (key != null)
+            {
+                var fields = key.SelectNodes("xs:field", mgr);
+                foreach (XmlNode f in fields)
+                {
+                    var idpropa = f.Attributes["xpath"];
+                    if (idpropa == null)
+                        throw new Exception("Bad document. Expected attribute: xpath"); //LOCALIZEME
+
+                    var prop = FindProperty(idpropa.Value);
+                    if (prop != null && prop.Type == PropertyDefinitionType.Data)
+                        _identity.Add((DataPropertyDefinition)prop);
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/DataPropertyDefinition.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,179 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Globalization;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    public class DataPropertyDefinition : PropertyDefinition
+    {
+        private DataPropertyDefinition() { this.DataType = DataPropertyType.String; }
+
+        public DataPropertyDefinition(string name, string description) 
+            : this()
+        {
+            this.Name = name;
+            this.Description = description;
+        }
+
+        public DataPropertyType DataType { get; set; }
+
+        public string DefaultValue { get; set; }
+
+        public int Length { get; set; }
+
+        public bool IsNullable { get; set; }
+
+        public int Precision { get; set; }
+
+        public bool IsReadOnly { get; set; }
+
+        public int Scale { get; set; }
+
+        public bool IsAutoGenerated { get; set; }
+
+        public override PropertyDefinitionType Type
+        {
+            get { return PropertyDefinitionType.Data; }
+        }
+
+        private static string GetXmlType(DataPropertyType dataPropertyType)
+        {
+            switch (dataPropertyType)
+            {
+                case DataPropertyType.Blob:
+                    return "xs:base64Binary";
+                case DataPropertyType.Boolean:
+                    return "xs:boolean";
+                case DataPropertyType.Byte:
+                    return "fdo:byte";
+                case DataPropertyType.DateTime:
+                    return "xs:datetime";
+                case DataPropertyType.Double:
+                    return "fdo:double";
+                case DataPropertyType.Int16:
+                    return "fdo:int16";
+                case DataPropertyType.Int32:
+                    return "fdo:int32";
+                case DataPropertyType.Int64:
+                    return "fdo:int64";
+                case DataPropertyType.Single:
+                    return "fdo:single";
+                case DataPropertyType.String:
+                    return "xs:string";
+                case DataPropertyType.Clob:
+                    return "xs:string";
+                default:
+                    throw new ArgumentException();
+            }
+        }
+
+        public static DataPropertyType GetDataType(string xmlType)
+        {
+            switch (xmlType)
+            {
+                case "xs:hexbinary":
+                case "xs:base64Binary":
+                    return DataPropertyType.Blob;
+                case "xs:boolean":
+                    return DataPropertyType.Boolean;
+                case "fdo:byte":
+                    return DataPropertyType.Byte;
+                case "xs:datetime":
+                    return DataPropertyType.DateTime;
+                case "fdo:double":
+                case "fdo:decimal":
+                case "xs:decimal":
+                case "xs:double":
+                    return DataPropertyType.Double;
+                case "fdo:int16":
+                case "xs:int16":
+                    return DataPropertyType.Int16;
+                case "fdo:int32":
+                case "xs:int32":
+                    return DataPropertyType.Int32;
+                case "fdo:int64":
+                case "xs:int64":
+                    return DataPropertyType.Int64;
+                case "xs:float":
+                case "xs:single":
+                case "fdo:single":
+                    return DataPropertyType.Single;
+                case "xs:string":
+                    return DataPropertyType.String;
+                //case "xs:string":
+                //    return DataPropertyType.Clob;
+                default:
+                    throw new ArgumentException();
+            }
+        }
+
+        public override void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            var prop = doc.CreateElement("xs", "element", XmlNamespaces.XS);
+            prop.SetAttribute("name", this.Name);
+            prop.SetAttribute("minOccurs", this.IsNullable ? "0" : "1");
+            if (this.IsReadOnly)
+                prop.SetAttribute("readOnly", XmlNamespaces.FDO, this.IsReadOnly.ToString().ToLower());
+            if (this.IsAutoGenerated)
+                prop.SetAttribute("autogenerated", XmlNamespaces.FDO, this.IsAutoGenerated.ToString().ToLower());
+
+            var simp = doc.CreateElement("xs", "simpleType", XmlNamespaces.XS);
+            prop.AppendChild(simp);
+
+            var rest = doc.CreateElement("xs", "restriction", XmlNamespaces.XS);
+            simp.AppendChild(rest);
+
+            rest.SetAttribute("base", GetXmlType(this.DataType));
+            if (this.DataType == DataPropertyType.String)
+            {
+                var max = doc.CreateElement("xs", "maxLength", XmlNamespaces.XS);
+                max.SetAttribute("value", this.Length.ToString(CultureInfo.InvariantCulture));
+            }
+            
+            currentNode.AppendChild(prop);
+        }
+
+        public override void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            this.DataType = GetDataType(node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value.ToLower());
+            this.IsNullable = (node.Attributes["minOccurs"] != null && node.Attributes["minOccurs"].Value == "0");
+            this.IsReadOnly = (node.Attributes["fdo:readOnly"] != null && node.Attributes["fdo:readOnly"].Value == "true");
+            this.IsAutoGenerated = (node.Attributes["fdo:autogenerated"] != null && node.Attributes["fdo:autogenerated"].Value == "true");
+            this.DefaultValue = (node.Attributes["default"] != null ? node.Attributes["default"].Value : string.Empty);
+        }
+
+        /// <summary>
+        /// Convenience method to get whether this data property is numeric
+        /// </summary>
+        /// <returns></returns>
+        public bool IsNumericType()
+        {
+            return this.DataType == DataPropertyType.Byte ||
+                   this.DataType == DataPropertyType.Double ||
+                   this.DataType == DataPropertyType.Int16 ||
+                   this.DataType == DataPropertyType.Int32 ||
+                   this.DataType == DataPropertyType.Int64 ||
+                   this.DataType == DataPropertyType.Single;
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSchema.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSchema.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSchema.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,160 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections.ObjectModel;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    //TODO: Expand on documentation as this is an important class
+
+    public class FeatureSchema : SchemaElement, IFdoSerializable
+    {
+        private List<ClassDefinition> _classes;
+
+        internal FeatureSchema() { _classes = new List<ClassDefinition>(); }
+
+        public FeatureSchema(string name, string description)
+            : this()
+        {
+            this.Name = name;
+            this.Description = description;
+        }
+
+        /// <summary>
+        /// Gets the class definitions
+        /// </summary>
+        public ReadOnlyCollection<ClassDefinition> Classes
+        {
+            get { return _classes.AsReadOnly(); }
+        }
+
+        /// <summary>
+        /// Adds the specified class definition
+        /// </summary>
+        /// <param name="cls"></param>
+        public void AddClass(ClassDefinition cls) 
+        { 
+            _classes.Add(cls);
+            cls.Parent = this;
+        }
+
+        /// <summary>
+        /// Removes the specified class definition
+        /// </summary>
+        /// <param name="cls"></param>
+        /// <returns></returns>
+        public bool RemoveClass(ClassDefinition cls) 
+        {
+            if (_classes.Remove(cls))
+            {
+                cls.Parent = null;
+                return true;
+            }
+            return false;
+        }
+
+        public ClassDefinition GetClass(string name)
+        {
+            foreach (var cls in _classes)
+            {
+                if (cls.Name.Equals(name))
+                    return cls;
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// Gets the index of the specified class definition
+        /// </summary>
+        /// <param name="cls"></param>
+        /// <returns></returns>
+        public int IndexOf(ClassDefinition cls) { return _classes.IndexOf(cls); }
+
+        /// <summary>
+        /// Gets the class definition at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        public ClassDefinition this[int index]
+        {
+            get { return GetItem(index); }
+        }
+
+        /// <summary>
+        /// Gets the class definition at the specified index
+        /// </summary>
+        /// <param name="index"></param>
+        /// <returns></returns>
+        public ClassDefinition GetItem(int index) { return _classes[index]; }
+
+        public void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            var schema = doc.CreateElement("xs", "schema", XmlNamespaces.XS);
+            schema.SetAttribute("xmlns:xs", XmlNamespaces.XS);
+            schema.SetAttribute("targetNamespace", XmlNamespaces.FDO  + "/feature/" + this.Name);
+            schema.SetAttribute("xmlns:fdo", XmlNamespaces.FDO);
+            schema.SetAttribute("xmlns:" + this.Name, XmlNamespaces.FDO + "/feature/" + this.Name);
+            schema.SetAttribute("elementFormDefault", "qualified");
+            schema.SetAttribute("attributeFormDefault", "unqualified");
+
+            foreach (var cls in this.Classes)
+            {
+                cls.WriteXml(doc, schema);
+            }
+
+            currentNode.AppendChild(schema);
+        }
+
+        public void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            if (!node.Name.Equals("xs:schema"))
+                throw new Exception("Bad document. Expected element: xs:schema"); //LOCALIZEME
+
+            var tns = node.Attributes["targetNamespace"];
+            if (tns == null)
+                throw new Exception("Bad document. Expected attribute: targetNamespace"); //LOCALIZEME
+
+            int lidx = tns.Value.LastIndexOf("/") + 1;
+            this.Name = tns.Value.Substring(lidx);
+
+            //TODO: Description
+
+            //Now handle classes
+            if (node.ChildNodes.Count > 0)
+            {
+                XmlNodeList clsNodes = node.SelectNodes("xs:complexType", mgr);
+                foreach (XmlNode clsNode in clsNodes)
+                {
+                    var nn = clsNode.Attributes["name"];
+                    if (nn == null)
+                        throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                    string name = nn.Value.Substring(0, nn.Value.Length - "Type".Length);
+                    ClassDefinition cls = new ClassDefinition(name, string.Empty); //TODO: Description
+                    cls.ReadXml(clsNode, mgr);
+                    this.AddClass(cls);
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSourceDescription.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSourceDescription.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/FeatureSourceDescription.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,366 @@
+#region Disclaimer / License
+// Copyright (C) 2009, Kenneth Skovhede
+// http://www.hexad.dk, opensource at hexad.dk
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Xml;
+using System.Collections.Generic;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    /// <summary>
+    /// Dummy class that represents an unknown data type
+    /// </summary>
+    public class UnmappedDataType
+    {
+    }
+
+	/// <summary>
+	/// Class that represents a the layout of a datasource
+	/// </summary>
+	public class FeatureSourceDescription
+    {
+        public FeatureSourceDescription(System.IO.Stream stream)
+        {
+            List<FeatureSchema> schemas = new List<FeatureSchema>();
+
+            XmlDocument doc = new XmlDocument();
+            doc.Load(stream);
+
+            XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
+            mgr.AddNamespace("xs", XmlNamespaces.XS);
+            mgr.AddNamespace("gml", XmlNamespaces.GML);
+            mgr.AddNamespace("fdo", XmlNamespaces.FDO);
+
+            //Assume XML configuration document
+            XmlNodeList schemaNodes = doc.SelectNodes("fdo:DataStore/xs:schema", mgr);
+            if (schemaNodes.Count == 0) //Then assume FDO schema
+                schemaNodes = doc.SelectNodes("xs:schema", mgr);
+
+            foreach (XmlNode sn in schemaNodes)
+            {
+                FeatureSchema fs = new FeatureSchema();
+                fs.ReadXml(sn, mgr);
+                schemas.Add(fs);
+            }
+            this.Schemas = schemas.ToArray();
+        }
+
+        public bool IsPartial { get; internal set; }
+
+        public FeatureSchema[] Schemas { get; private set; }
+
+        public FeatureSchema GetSchema(string schemaName)
+        {
+            foreach (var fsc in this.Schemas)
+            {
+                if (fsc.Name.Equals(schemaName))
+                {
+                    return fsc;
+                }
+            }
+            return null;
+        }
+
+        public string[] SchemaNames
+        {
+            get
+            {
+                List<string> names = new List<string>();
+                foreach (var fsc in this.Schemas)
+                {
+                    names.Add(fsc.Name);
+                }
+                return names.ToArray();
+            }
+        }
+
+        public IEnumerable<ClassDefinition> AllClasses
+        {
+            get
+            {
+                foreach (var fsc in this.Schemas)
+                {
+                    foreach (var cls in fsc.Classes)
+                    {
+                        yield return cls;
+                    }
+                }
+            }
+        }
+
+        public ClassDefinition GetClass(string schemaName, string className)
+        {
+            var fsc = GetSchema(schemaName);
+            if (fsc != null)
+            {
+                foreach (var cls in fsc.Classes)
+                {
+                    if (cls.Name.Equals(className))
+                        return cls;
+                }
+            }
+            return null;
+        }
+
+        #region old impl
+        /*
+        private ClassDefinition[] m_classes;
+
+        private string[] m_schemaNames;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="FeatureSourceDescription"/> class.
+        /// </summary>
+        /// <param name="stream">The stream.</param>
+		public FeatureSourceDescription(System.IO.Stream stream)
+		{
+			XmlDocument doc = new XmlDocument();
+			doc.Load(stream);
+
+			if (doc.FirstChild.Name != "xml")
+				throw new Exception("Bad document");
+
+            XmlNode root;
+            if (doc.ChildNodes.Count == 2 && doc.ChildNodes[1].Name == "fdo:DataStore")
+                root = doc.ChildNodes[1];
+            else if (doc.ChildNodes.Count != 2 || doc.ChildNodes[1].Name != "xs:schema")
+                throw new Exception("Bad document");
+            else
+                root = doc;
+
+			XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
+			mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
+			mgr.AddNamespace("gml", "http://www.opengis.net/gml");
+			mgr.AddNamespace("fdo", "http://fdo.osgeo.org/schemas");
+
+            var keys = new Dictionary<string, string[]>();
+            var classMap = new Dictionary<string, ClassDefinition>();
+            XmlNodeList lst = root.SelectNodes("xs:schema/xs:complexType[@abstract='false']", mgr);
+            m_classes = new ClassDefinition[lst.Count];
+            for (int i = 0; i < m_classes.Length; i++)
+            {
+                m_classes[i] = new ClassDefinition(lst[i], mgr);
+                classMap.Add(m_classes[i].QualifiedName, m_classes[i]);
+            }
+            XmlNodeList keyNodes = root.SelectNodes("xs:schema/xs:element[@abstract='false']", mgr);
+            foreach (XmlNode keyNode in keyNodes)
+            {
+                var typeAttr = keyNode.Attributes["type"];
+                if (typeAttr != null)
+                {
+                    string clsName = typeAttr.Value.Substring(0, typeAttr.Value.Length - 4); //class name is suffixed with type
+                    if (classMap.ContainsKey(clsName))
+                    {
+                        List<string> keyFieldNames = new List<string>();
+
+                        var cls = classMap[clsName];
+                        XmlNodeList keyFields = keyNode.SelectNodes("xs:key/xs:field", mgr);
+                        foreach (XmlNode keyField in keyFields)
+                        {
+                            var xpathAttr = keyField.Attributes["xpath"];
+                            if (xpathAttr != null)
+                            {
+                                keyFieldNames.Add(xpathAttr.Value);
+                            }
+                        }
+
+                        cls.MarkIdentityProperties(keyFieldNames);
+                    }
+                }
+            }
+
+            var snames = new List<string>();
+            foreach (string qn in classMap.Keys)
+            {
+                string[] tokens = qn.Split(':');
+                if (!snames.Contains(tokens[0]))
+                    snames.Add(tokens[0]);
+            }
+            m_schemaNames = snames.ToArray();
+		}
+
+        /// <summary>
+        /// Gets the schema names.
+        /// </summary>
+        /// <value>The schema names.</value>
+        public string[] SchemaNames { get { return m_schemaNames; } }
+
+        /// <summary>
+        /// Gets the classes.
+        /// </summary>
+        /// <value>The classes.</value>
+		public ClassDefinition[] Classes { get { return m_classes; } }
+
+        /// <summary>
+        /// Gets the <see cref="OSGeo.MapGuide.MaestroAPI.ClassDefinition"/> at the specified index.
+        /// </summary>
+        /// <value></value>
+		public ClassDefinition this[int index] { get { return m_classes[index]; } }
+        /// <summary>
+        /// Gets the <see cref="OSGeo.MapGuide.MaestroAPI.ClassDefinition"/> at the specified index.
+        /// </summary>
+        /// <value></value>
+		public ClassDefinition this[string index] 
+		{
+			get 
+			{
+				for(int i =0 ;i<m_classes.Length; i++)
+					if (m_classes[i].Name == index)
+						return m_classes[i];
+
+				throw new OverflowException("No such item found: " + index);
+			}
+        }
+        */
+        #endregion
+
+        public bool HasClasses()
+        {
+            if (this.Schemas.Length == 0)
+                return false;
+
+            foreach (var fsc in this.Schemas)
+            {
+                if (fsc.Classes.Count > 0)
+                    return true;
+            }
+            return false;
+        }
+
+        public ClassDefinition GetClass(string qualifiedName)
+        {
+            Check.NotEmpty(qualifiedName, "qualifiedName");
+            var tokens = qualifiedName.Split(':');
+            if (tokens.Length != 2)
+                throw new ArgumentException("Not a qualified class name: " + qualifiedName); //LOCALIZEME
+
+            return GetClass(tokens[0], tokens[1]);
+        }
+    }
+
+    
+    /*
+    internal class ClassPropertyColumn : FeatureSetColumn
+    {
+        internal ClassPropertyColumn(XmlNode node)
+            : base()
+		{
+            if (node.Name == "PropertyDefinition" || node.Name == "Column")
+            {
+                m_name = node["Name"].InnerText;
+                m_allowNull = true;
+                switch (node["Type"].InnerText.ToLower().Trim())
+                {
+                    case "string":
+                        m_type = typeof(string);
+                        break;
+                    case "byte":
+                        m_type = typeof(Byte);
+                        break;
+                    case "int32":
+                    case "int":
+                    case "integer":
+                        m_type = typeof(int);
+                        break;
+                    case "int16":
+                        m_type = typeof(short);
+                        break;
+                    case "int64":
+                    case "long":
+                        m_type = typeof(long);
+                        break;
+                    case "float":
+                    case "single":
+                        m_type = typeof(float);
+                        break;
+                    case "double":
+                    case "decimal":
+                        m_type = typeof(double);
+                        break;
+                    case "boolean":
+                    case "bool":
+                        m_type = typeof(bool);
+                        return;
+                    case "datetime":
+                    case "date":
+                        m_type = typeof(DateTime);
+                        break;
+                    case "raster":
+                        m_type = Utility.RasterType;
+                        break;
+                    case "geometry":
+                        m_type = Utility.GeometryType;
+                        break;
+                    default:
+                        //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
+                        m_type = Utility.UnmappedType;
+                        break;
+                }
+            }
+            else
+            {
+                m_name = node.Attributes["name"].Value;
+                m_allowNull = node.Attributes["minOccurs"] != null && node.Attributes["minOccurs"].Value == "0";
+                if (node.Attributes["type"] != null && node.Attributes["type"].Value == "gml:AbstractGeometryType")
+                    m_type = Utility.GeometryType;
+                else if (node["xs:simpleType"] == null)
+                    m_type = Utility.RasterType;
+                else
+                    switch (node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value.ToLower())
+                    {
+                        case "xs:string":
+                            m_type = typeof(string);
+                            break;
+                        case "fdo:byte":
+                            m_type = typeof(Byte);
+                            break;
+                        case "fdo:int32":
+                            m_type = typeof(int);
+                            break;
+                        case "fdo:int16":
+                            m_type = typeof(short);
+                            break;
+                        case "fdo:int64":
+                            m_type = typeof(long);
+                            break;
+                        case "xs:float":
+                        case "xs:single":
+                        case "fdo:single":
+                            m_type = typeof(float);
+                            break;
+                        case "xs:double":
+                        case "xs:decimal":
+                            m_type = typeof(double);
+                            break;
+                        case "xs:boolean":
+                            m_type = typeof(bool);
+                            return;
+                        case "xs:datetime":
+                            m_type = typeof(DateTime);
+                            break;
+                        default:
+                            //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
+                            m_type = Utility.UnmappedType;
+                            break;
+                    }
+            }
+		}
+    }
+     */
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/GeometricPropertyDefinition.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,247 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    public enum FeatureGeometricType
+    {
+        Point = 1,
+        Curve = 2,
+        Surface = 4,
+        Solid = 8,
+        All = Curve | Point | Solid | Surface
+    }
+
+    public enum SpecificGeometryType
+    {
+        Point = 1,
+        LineString = 2,
+        Polygon = 3,
+        MultiPoint = 4,
+        MultiLineString = 5,
+        MultiPolygon = 6,
+        MultiGeometry = 7,
+        CurveString = 10,
+        CurvePolygon = 11,
+        MultiCurveString = 12,
+        MultiCurvePolygon = 13
+    }
+
+    public class GeometricPropertyDefinition : PropertyDefinition
+    {
+        private GeometricPropertyDefinition() { this.SpecificGeometryTypes = new SpecificGeometryType[0]; }
+
+        public GeometricPropertyDefinition(string name, string description)
+            : this()
+        {
+            this.Name = name;
+            this.Description = description;
+        }
+
+        public bool IsReadOnly { get; set; }
+
+        public bool HasMeasure { get; set; }
+
+        public bool HasElevation { get; set; }
+
+        public string SpatialContextAssociation { get; set; }
+
+        public FeatureGeometricType GeometricTypes { get; set; }
+
+        public SpecificGeometryType[] SpecificGeometryTypes { get; set; }
+
+        public override PropertyDefinitionType Type
+        {
+            get { return PropertyDefinitionType.Geometry; }
+        }
+
+        public override void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            var geom = doc.CreateElement("xs", "element", XmlNamespaces.XS);
+            geom.SetAttribute("name", this.Name);
+            geom.SetAttribute("type", "gml:AbstractGeometryType");
+            geom.SetAttribute("hasMeasure", XmlNamespaces.FDO, this.HasMeasure.ToString().ToLower());
+            geom.SetAttribute("hasElevation", XmlNamespaces.FDO, this.HasElevation.ToString().ToLower());
+            geom.SetAttribute("srsName", XmlNamespaces.FDO, this.SpatialContextAssociation);
+            geom.SetAttribute("geometricTypes", XmlNamespaces.FDO, GeometricTypesToString());
+            geom.SetAttribute("geometryTypes", XmlNamespaces.FDO, GeometryTypesToString());
+            geom.SetAttribute("geometryReadOnly", XmlNamespaces.FDO, this.IsReadOnly.ToString().ToLower());
+
+            currentNode.AppendChild(geom);
+        }
+
+        public override void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            var gt = node.Attributes["fdo:geometricTypes"];
+            var gt2 = node.Attributes["fdo:geometryTypes"];
+            var gtro = node.Attributes["fdo:geometryReadOnly"];
+            var hms = node.Attributes["fdo:hasMeasure"];
+            var hev = node.Attributes["fdo:hasElevation"];
+            var srs = node.Attributes["fdo:srsName"];
+
+            this.GeometricTypes = ProcessGeometricTypes(gt.Value);
+            if (gt2 != null)
+                this.SpecificGeometryTypes = ProcessSpecificGeometryTypes(gt2.Value);
+
+            this.IsReadOnly = (gtro != null ? Convert.ToBoolean(gtro.Value) : false);
+            this.HasElevation = (hev != null ? Convert.ToBoolean(hev.Value) : false);
+            this.HasMeasure = (hms != null ? Convert.ToBoolean(hms.Value) : false);
+            this.SpatialContextAssociation = (srs != null ? srs.Value : string.Empty);
+        }
+
+        private string GeometryTypesToString()
+        {
+            List<string> values = new List<string>();
+            var gts = GetIndividualGeometricTypes();
+            foreach (var gt in gts)
+            {
+                values.Add(gt.ToString().ToLower());
+            }
+            return string.Join(" ", values.ToArray());
+        }
+
+        public FeatureGeometricType[] GetIndividualGeometricTypes()
+        {
+            List<FeatureGeometricType> gts = new List<FeatureGeometricType>();
+            if (this.GeometricTypes == FeatureGeometricType.All)
+            {
+                gts.AddRange((FeatureGeometricType[])Enum.GetValues(typeof(FeatureGeometricType)));
+            }
+            else
+            {
+                foreach (FeatureGeometricType gt in Enum.GetValues(typeof(FeatureGeometricType)))
+                {
+                    if (((int)this.GeometricTypes & (int)gt) == (int)gt)
+                    {
+                        gts.Add(gt);
+                    }
+                }
+            }
+            return gts.ToArray();
+        }
+
+        private string GeometricTypesToString()
+        {
+            List<string> values = new List<string>();
+            foreach (SpecificGeometryType geom in this.SpecificGeometryTypes)
+            {
+                values.Add(geom.ToString().ToLower());
+            }
+            return string.Join(" ", values.ToArray());
+        }
+
+        private static SpecificGeometryType[] ProcessSpecificGeometryTypes(string str)
+        {
+            List<SpecificGeometryType> values = new List<SpecificGeometryType>();
+            string[] tokens = str.ToLower().Split(' ');
+            foreach (string t in tokens)
+            {
+                switch (t)
+                {
+                    case "curvepolygon":
+                        values.Add(SpecificGeometryType.CurvePolygon);
+                        break;
+                    case "curvestring":
+                        values.Add(SpecificGeometryType.CurveString);
+                        break;
+                    case "linestring":
+                        values.Add(SpecificGeometryType.LineString);
+                        break;
+                    case "multicurvepolygon":
+                        values.Add(SpecificGeometryType.MultiCurvePolygon);
+                        break;
+                    case "multicurvestring":
+                        values.Add(SpecificGeometryType.MultiCurveString);
+                        break;
+                    case "multigeometry":
+                        values.Add(SpecificGeometryType.MultiGeometry);
+                        break;
+                    case "multilinestring":
+                        values.Add(SpecificGeometryType.MultiLineString);
+                        break;
+                    case "multipoint":
+                        values.Add(SpecificGeometryType.MultiPoint);
+                        break;
+                    case "multipolygon":
+                        values.Add(SpecificGeometryType.MultiPolygon);
+                        break;
+                    case "point":
+                        values.Add(SpecificGeometryType.Point);
+                        break;
+                    case "polygon":
+                        values.Add(SpecificGeometryType.Polygon);
+                        break;
+                }
+            }
+            return values.ToArray();
+        }
+
+        private static FeatureGeometricType ProcessGeometricTypes(string p)
+        {
+            FeatureGeometricType? gt = null;
+            string[] tokens = p.ToLower().Split(' ');
+            foreach (string str in tokens)
+            {
+                switch (str)
+                {
+                    case "point":
+                        {
+                            if (gt.HasValue)
+                                gt = gt.Value | FeatureGeometricType.Point;
+                            else
+                                gt = FeatureGeometricType.Point;
+                        }
+                        break;
+                    case "curve":
+                        {
+                            if (gt.HasValue)
+                                gt = gt.Value | FeatureGeometricType.Curve;
+                            else
+                                gt = FeatureGeometricType.Curve;
+                        }
+                        break;
+                    case "surface":
+                        {
+                            if (gt.HasValue)
+                                gt = gt.Value | FeatureGeometricType.Surface;
+                            else
+                                gt = FeatureGeometricType.Surface;
+                        }
+                        break;
+                    case "solid":
+                        {
+                            if (gt.HasValue)
+                                gt = gt.Value | FeatureGeometricType.Solid;
+                            else
+                                gt = FeatureGeometricType.Solid;
+                        }
+                        break;
+                }
+            }
+            if (gt.HasValue)
+                return gt.Value;
+            else
+                throw new ArgumentException();
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/IFdoSerializable.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/IFdoSerializable.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/IFdoSerializable.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,46 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    /// <summary>
+    /// Defines an interface for reading and writing content to and from FDO XML documents
+    /// </summary>
+    public interface IFdoSerializable
+    {
+        /// <summary>
+        /// Writes the current element's content
+        /// </summary>
+        /// <param name="doc"></param>
+        /// <param name="currentNode"></param>
+        void WriteXml(XmlDocument doc, XmlNode currentNode);
+        /// <summary>
+        /// Set the current element's content from the current XML node
+        /// </summary>
+        /// <param name="node"></param>
+        /// <param name="mgr"></param>
+        void ReadXml(XmlNode node, XmlNamespaceManager mgr);
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/PropertyDefinition.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,110 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    public enum PropertyDefinitionType
+    {
+        Data = 100,
+        Geometry = 102,
+        Raster = 104,
+        Association = 103,
+        Object = 101
+    }
+
+    public enum PropertyValueType
+    {
+        Blob = 10,
+        Boolean = 1,
+        Byte = 2,
+        Clob = 11,
+        DateTime = 3,
+        Double = 5,
+        Feature = 12,
+        Geometry = 13,
+        Int16 = 6,
+        Int32 = 7,
+        Int64 = 8,
+        Null = 0,
+        Raster = 14,
+        Single = 4,
+        String = 9
+    }
+
+    public enum DataPropertyType
+    {
+        Blob = PropertyValueType.Blob,
+        Boolean = PropertyValueType.Boolean,
+        Byte = PropertyValueType.Byte,
+        Clob = PropertyValueType.Clob,
+        DateTime = PropertyValueType.DateTime,
+        Double = PropertyValueType.Double,
+        Int16 = PropertyValueType.Int16,
+        Int32 = PropertyValueType.Int32,
+        Int64 = PropertyValueType.Int64,
+        Single = PropertyValueType.Single,
+        String = PropertyValueType.String
+    }
+
+    public abstract class PropertyDefinition : SchemaElement, IFdoSerializable
+    {
+        public ClassDefinition Parent { get; internal set; }
+
+        public abstract PropertyDefinitionType Type { get; }
+
+        public abstract void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode);
+
+        public abstract void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr);
+
+        public static PropertyDefinition Parse(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            PropertyDefinition prop = null;
+            var nn = node.Attributes["name"];
+            var nulln = node.Attributes["minOccurs"];
+
+            string name = nn.Value;
+            string desc = string.Empty;
+
+            if (node.Attributes["type"] != null && node.Attributes["type"].Value == "gml:AbstractGeometryType")
+            {
+                prop = new GeometricPropertyDefinition(name, desc);
+            }
+            else if (node["xs:simpleType"] == null)
+            {
+                prop = new RasterPropertyDefinition(name, desc);
+            }
+            else
+            {
+                if (node["xs:simpleType"] != null)
+                    prop = new DataPropertyDefinition(name, desc);
+            }
+
+            if (prop != null)
+                prop.ReadXml(node, mgr);
+            else
+                throw new NotSupportedException("Unrecognized element. Only a subset of the FDO logical schema is supported here"); //LOCALIZEME
+
+            return prop;
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/RasterPropertyDefinition.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/RasterPropertyDefinition.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/RasterPropertyDefinition.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,49 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    public class RasterPropertyDefinition : PropertyDefinition
+    {
+        public RasterPropertyDefinition(string name, string description)
+        {
+            this.Name = name;
+            this.Description = description;
+        }
+
+        public override PropertyDefinitionType Type
+        {
+            get { return PropertyDefinitionType.Raster; }
+        }
+
+        public override void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            throw new NotImplementedException();
+        }
+
+        public override void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/SchemaElement.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,32 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    public abstract class SchemaElement
+    {
+        public string Name { get; set; }
+
+        public string Description { get; set; }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/XmlNamespaces.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/XmlNamespaces.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Schema/XmlNamespaces.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,56 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace OSGeo.MapGuide.MaestroAPI.Schema
+{
+    /// <summary>
+    /// A set of XML namespaces commonly used in FDO XML documents
+    /// </summary>
+    public class XmlNamespaces
+    {
+        /// <summary>
+        /// XML Schema namespace
+        /// </summary>
+        public const string XS = "http://www.w3.org/2001/XMLSchema";
+        /// <summary>
+        /// XML Schema Instance namespace
+        /// </summary>
+        public const string XSI = "http://www.w3.org/2001/XMLSchema-instance";
+        /// <summary>
+        /// XLink namespace
+        /// </summary>
+        public const string XLINK = "http://www.w3.org/1999/xlink";
+        /// <summary>
+        /// GML (Geography Markup Language) namespace
+        /// </summary>
+        public const string GML = "http://www.opengis.net/gml";
+        /// <summary>
+        /// FDO (Feature Data Objects) namespace
+        /// </summary>
+        public const string FDO = "http://fdo.osgeo.org/schemas";
+        /// <summary>
+        /// FDS namespace
+        /// </summary>
+        public const string FDS = "http://fdo.osgeo.org/schemas/fds";
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/ConfigurationDocument.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,184 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.ObjectModels.Common;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public abstract class ConfigurationDocument : IFdoSerializable
+    {
+        protected List<IFdoSpatialContext> _spatialContexts;
+
+        protected List<FeatureSchema> _schemas;
+
+        public ConfigurationDocument() 
+        { 
+            _spatialContexts = new List<IFdoSpatialContext>();
+            _schemas = new List<FeatureSchema>();
+        }
+
+        public void AddSpatialContext(IFdoSpatialContext context) { _spatialContexts.Add(context); }
+
+        public void RemoveSpatialContext(IFdoSpatialContext context) { _spatialContexts.Remove(context); }
+
+        public IFdoSpatialContext GetSpatialContext(string name)
+        {
+            foreach (var ctx in _spatialContexts)
+            {
+                if (ctx.Name.Equals(name))
+                    return ctx;
+            }
+            return null;
+        }
+
+        public void AddSchema(FeatureSchema schema) { _schemas.Add(schema); }
+
+        public void RemoveSchema(FeatureSchema schema) { _schemas.Remove(schema); }
+
+        public FeatureSchema GetSchema(string name)
+        {
+            foreach (var fsc in _schemas)
+            {
+                if (fsc.Name.Equals(name))
+                    return fsc;
+            }
+            return null;
+        }
+
+        public ClassDefinition GetClass(string schemaName, string className)
+        {
+            var fs = GetSchema(schemaName);
+            return fs.GetClass(className);
+        }
+
+        public void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            var dstore = doc.CreateElement("fdo", "DataStore", XmlNamespaces.FDO);
+            dstore.SetAttribute("xmlns:xs", XmlNamespaces.XS);
+            dstore.SetAttribute("xmlns:xsi", XmlNamespaces.XSI);
+            dstore.SetAttribute("xmlns:xlink", XmlNamespaces.XLINK);
+            dstore.SetAttribute("xmlns:gml", XmlNamespaces.GML);
+            dstore.SetAttribute("xmlns:fdo", XmlNamespaces.FDO);
+            dstore.SetAttribute("xmlns:fds", XmlNamespaces.FDS);
+            foreach (var sc in _spatialContexts)
+            {
+                sc.WriteXml(doc, dstore);
+            }
+            foreach (var sc in _schemas)
+            {
+                sc.WriteXml(doc, dstore);
+            }
+            
+            WriteSchemaMappings(doc, dstore);
+            currentNode.AppendChild(dstore);
+        }
+
+        protected abstract void WriteSchemaMappings(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode);
+
+        protected abstract void ReadSchemaMappings(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr);
+
+        public void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            if (!node.Name.Equals("fdo:DataStore"))
+                throw new Exception("Bad document. Expected element fdo:DataStore"); //LOCALIZEME
+
+            _spatialContexts.Clear();
+            _schemas.Clear();
+
+            XmlNodeList csNodes = node.SelectNodes("gml:DerivedCRS", mgr);
+            foreach (XmlNode cs in csNodes)
+            {
+                var context = new FdoSpatialContextListSpatialContext();
+                context.ReadXml(cs, mgr);
+
+                AddSpatialContext(context);
+            }
+
+            XmlNodeList schemaNodes = node.SelectNodes("xs:schema", mgr);
+            foreach (XmlNode sn in schemaNodes)
+            {
+                FeatureSchema fs = new FeatureSchema();
+                fs.ReadXml(sn, mgr);
+                AddSchema(fs);
+            }
+
+            ReadSchemaMappings(node, mgr);
+        }
+
+        public string ToXml()
+        {
+            XmlDocument doc = new XmlDocument();
+            this.WriteXml(doc, doc);
+            return doc.OuterXml;
+        }
+
+        public static ConfigurationDocument LoadXml(string xml)
+        {
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml(xml);
+            var mgr = new XmlNamespaceManager(doc.NameTable);
+            mgr.AddNamespace("xs", XmlNamespaces.XS);
+            mgr.AddNamespace("xsi", XmlNamespaces.XSI);
+            mgr.AddNamespace("fdo", XmlNamespaces.FDO);
+            mgr.AddNamespace("gml", XmlNamespaces.GML);
+            mgr.AddNamespace("xlink", XmlNamespaces.XLINK);
+            mgr.AddNamespace("fds", XmlNamespaces.FDS);
+
+            ConfigurationDocument conf = null;
+            var root = doc.DocumentElement;
+            if (root == null || root.Name != "fdo:DataStore")
+                return null;
+
+            //Sample the first schema mapping node. Even if there are multiples
+            //they will all be the same provider
+
+            //NOTE: Why does the XPath query (commented out) fail? 
+
+            var map = root.LastChild; //root.SelectSingleNode("SchemaMapping"); 
+            if (map != null && map.Name == "SchemaMapping")
+            {
+                var prov = map.Attributes["provider"];
+                if (prov != null)
+                {
+                    if (prov.Value.StartsWith("OSGeo.ODBC"))
+                        conf = new OdbcConfigurationDocument();
+                    else if (prov.Value.StartsWith("OSGeo.Gdal"))
+                        conf = new GdalConfigurationDocument();
+                    else if (prov.Value.StartsWith("OSGeo.WMS"))
+                        conf = new WmsConfigurationDocument();
+                    else
+                        conf = new GenericConfigurationDocument();
+                }
+            }
+
+            if (conf != null)
+            {
+                conf.ReadXml(doc.SelectSingleNode("fdo:DataStore", mgr), mgr);
+                return conf;
+            }
+
+            return null;
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GdalConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GdalConfigurationDocument.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GdalConfigurationDocument.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,101 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class GdalConfigurationDocument : RasterConfigurationDocumentBase<RasterFileItem>
+    {
+        protected override void WriteSchemaMappings(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            foreach (var schema in base._schemas)
+            {
+                var map = doc.CreateElement("SchemaMapping");
+                map.SetAttribute("provider", "OSGeo.Gdal.3.2");
+                map.SetAttribute("xmlns", "http://fdogrfp.osgeo.org/schemas");
+                map.SetAttribute("name", schema.Name);
+
+                foreach (var item in _rasterItems)
+                {
+                    if (!string.IsNullOrEmpty(item.FeatureClassName))
+                    {
+                        if (item.FeatureClassName.StartsWith(schema.Name))
+                        {
+                            item.WriteXml(doc, map);
+                        }
+                    }
+                }
+
+                currentNode.AppendChild(map);
+            }
+        }
+
+        protected override void ReadSchemaMappings(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            //XmlNodeList mappings = node.SelectNodes("SchemaMapping");
+            foreach (XmlNode map in node.ChildNodes)
+            {
+                if (map.Name != "SchemaMapping")
+                    continue;
+
+                var prv = map.Attributes["provider"];
+                if (prv == null)
+                    throw new Exception("Bad document. Expected attribute: provider"); //LOCALIZEME
+
+                var sn = map.Attributes["name"];
+                if (sn == null)
+                    throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                if (!prv.Value.StartsWith("OSGeo.Gdal"))
+                    continue;
+
+                //XmlNodeList list = map.SelectNodes("complexType");
+                foreach (XmlNode clsMap in map.ChildNodes)
+                {
+                    if (clsMap.Name != "complexType")
+                        continue;
+
+                    var cn = clsMap.Attributes["name"];
+                    if (cn == null)
+                        throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                    string className = sn.Value + ":" + cn.Value.Substring(0, cn.Value.Length - "Type".Length);
+
+                    var img = clsMap.SelectSingleNode("RasterDefinition/Location/Feature/Image");
+                    if (img == null)
+                        throw new Exception("Bad document. Expected element: Image"); //LOCALIZEME
+
+                    var imgName = img.Attributes["name"];
+                    if (imgName == null)
+                        throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                    RasterItem item = new RasterFileItem(imgName.Value);
+
+                    item.Parent = this;
+
+                    item.ReadXml(clsMap, mgr);
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GenericConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GenericConfigurationDocument.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/GenericConfigurationDocument.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,54 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class GenericConfigurationDocument : ConfigurationDocument
+    {
+        private XmlNode[] _mappings;
+
+        public GenericConfigurationDocument() { _mappings = new XmlNode[0]; }
+
+        protected override void WriteSchemaMappings(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            foreach (var el in _mappings)
+            {
+                currentNode.AppendChild(el);
+            }
+        }
+
+        protected override void ReadSchemaMappings(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            var children = node.ChildNodes;
+            _mappings = new XmlElement[children.Count];
+            int i = 0;
+            foreach (XmlNode child in children)
+            {
+                var clone = child.Clone();
+                _mappings[i] = clone;
+                i++;
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcConfigurationDocument.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,114 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class OdbcConfigurationDocument : ConfigurationDocument
+    {
+        private List<OdbcTableItem> _tables;
+
+        public OdbcConfigurationDocument() { _tables = new List<OdbcTableItem>(); }
+
+        public void AddOverride(OdbcTableItem item) 
+        { 
+            _tables.Add(item);
+            item.Parent = this;
+        }
+
+        private List<OdbcTableItem> GetMappingsForSchema(string schemaName)
+        {
+            List<OdbcTableItem> items = new List<OdbcTableItem>();
+            foreach (var item in _tables)
+            {
+                if (item.SchemaName.Equals(schemaName))
+                    items.Add(item);
+            }
+            return items;
+        }
+
+        protected override void WriteSchemaMappings(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            foreach (var fs in _schemas)
+            {
+                var items = GetMappingsForSchema(fs.Name);
+                if (items.Count > 0)
+                {
+                    var map = doc.CreateElement("SchemaMapping");
+                    //The version is required for data compatiblity with FDO. I don't think
+                    //the actual value matters. So use a safe version of FDO
+                    map.SetAttribute("provider", "OSGeo.ODBC.3.2"); 
+                    map.SetAttribute("xmlns:rdb", "http://fdordbms.osgeo.org/schemas");
+                    map.SetAttribute("xmlns", "http://fdoodbc.osgeo.org/schemas");
+                    map.SetAttribute("name", fs.Name);
+
+                    foreach (var item in items)
+                    {
+                        item.WriteXml(doc, map);
+                    }
+
+                    currentNode.AppendChild(map);
+                }
+            }
+        }
+
+        protected override void ReadSchemaMappings(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            //var mappings = node.SelectNodes("SchemaMapping", mgr);
+            foreach (XmlNode map in node.ChildNodes)
+            {
+                if (map.Name != "SchemaMapping")
+                    continue;
+
+                var sn = map.Attributes["name"];
+                if (sn == null)
+                    throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                //XmlNodeList clsMaps = map.SelectNodes("complexType");
+                foreach (XmlNode clsMap in map.ChildNodes)
+                {
+                    if (clsMap.Name != "complexType")
+                        continue;
+
+                    var item = new OdbcTableItem();
+                    item.Parent = this;
+                    item.SchemaName = sn.Value;
+                    item.ReadXml(clsMap, mgr);
+
+                    AddOverride(item);
+                }
+            }
+        }
+
+        public OdbcTableItem GetOverride(string schemaName, string className)
+        {
+            foreach (var item in _tables)
+            {
+                if (item.SchemaName.Equals(schemaName) && item.ClassName.Equals(className))
+                    return item;
+            }
+            return null;
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/OdbcTableItem.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,112 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class OdbcTableItem : IFdoSerializable
+    {
+        internal OdbcConfigurationDocument Parent { get; set; }
+
+        public string SchemaName { get; set; }
+
+        public string ClassName { get; set; }
+
+        public string SpatialContextName { get; set; }
+
+        public string XColumn { get; set; }
+
+        public string YColumn { get; set; }
+
+        public string ZColumn { get; set; }
+
+        public void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            var cls = this.Parent.GetClass(this.SchemaName, this.ClassName);
+            if (cls != null)
+            {
+                var ctype = doc.CreateElement("complexType");
+                ctype.SetAttribute("name", this.ClassName + "Type");
+                {
+                    var table = doc.CreateElement("Table");
+                    table.SetAttribute("name", this.ClassName);
+                    {
+                        foreach (var prop in cls.Properties)
+                        {
+                            var el = doc.CreateElement("element");
+                            el.SetAttribute("name", prop.Name);
+
+                            if (!string.IsNullOrEmpty(this.XColumn))
+                                el.SetAttribute("xColumnName", this.XColumn);
+                            if (!string.IsNullOrEmpty(this.YColumn))
+                                el.SetAttribute("yColumnName", this.YColumn);
+                            if (!string.IsNullOrEmpty(this.ZColumn))
+                                el.SetAttribute("zColumnName", this.ZColumn);
+
+                            var col = doc.CreateElement("Column");
+                            col.SetAttribute("name", prop.Name);
+
+                            el.AppendChild(col);
+                            table.AppendChild(el);
+                        }
+                    }
+                    ctype.AppendChild(table);
+                }
+                currentNode.AppendChild(ctype);
+            }
+        }
+
+        public void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            if (!node.Name.Equals("complexType"))
+                throw new Exception("Bad document. Expected element: complexType"); //LOCALIZEME
+
+            var sn = node.ParentNode.Attributes["name"];
+            this.SchemaName = sn.Value;
+
+            var cn = node.Attributes["name"];
+            this.ClassName = cn.Value.Substring(0, cn.Value.Length - "Type".Length);
+
+            var cls = this.Parent.GetClass(this.SchemaName, this.ClassName);
+            if (!string.IsNullOrEmpty(cls.DefaultGeometryPropertyName))
+            {
+                GeometricPropertyDefinition geom = (GeometricPropertyDefinition)cls.FindProperty(cls.DefaultGeometryPropertyName);
+                this.SpatialContextName = geom.SpatialContextAssociation;
+            }
+
+            var table = node["Table"];
+            var el = table["element"];
+
+            var x = el.Attributes["xColumnName"];
+            var y = el.Attributes["yColumnName"];
+            var z = el.Attributes["zColumnName"];
+
+            if (x != null)
+                this.XColumn = x.Value;
+            if (y != null)
+                this.YColumn = y.Value;
+            if (z != null)
+                this.ZColumn = z.Value;
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterConfigurationDocument.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterConfigurationDocument.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,63 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public abstract class RasterConfigurationDocumentBase<T> : ConfigurationDocument where T : RasterItem
+    {
+        protected List<T> _rasterItems;
+
+        protected RasterConfigurationDocumentBase()
+        {
+            _rasterItems = new List<T>();
+        }
+
+        public void AddRasterItem(T item) 
+        { 
+            _rasterItems.Add(item); 
+            item.Parent = this; 
+        }
+
+        public void AddRasterItems(IEnumerable<T> items) 
+        { 
+            _rasterItems.AddRange(items);
+            foreach (var item in items)
+            {
+                item.Parent = this;
+            }
+        }
+        /*
+        protected override void WriteSchemaMappings(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            
+        }
+
+        protected override void ReadSchemaMappings(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            
+        }
+         */
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterFileItem.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterFileItem.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterFileItem.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,218 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.ObjectModels;
+using System.IO;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class RasterFileItem : RasterItem
+    {
+        public RasterFileItem(string name)
+        {
+            this.Name = name;
+        }
+
+        public string Name { get; private set; }
+
+        public IPoint2D InsertionPoint { get; set; }
+
+        public IPoint2D Resolution { get; set; }
+
+        public IPoint2D Rotation { get; set; }
+
+        public void SetPosition(double insertionX, double insertionY,
+                                double resolutionX, double resolutionY,
+                                double rotationX, double rotationY)
+        {
+            this.InsertionPoint = ObjectFactory.CreatePoint2D(insertionX, insertionY);
+            this.Resolution = ObjectFactory.CreatePoint2D(resolutionX, resolutionY);
+            this.Rotation = ObjectFactory.CreatePoint2D(rotationX, rotationY);
+        }
+
+        public bool HasPosition
+        {
+            get
+            {
+                return this.InsertionPoint != null &&
+                       this.Resolution != null &&
+                       this.Rotation != null;
+            }
+        }
+
+        public override void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            var ctype = doc.CreateElement("complexType");
+            ctype.SetAttribute("name", this.ClassName + "Type");
+            {
+                var rdf = doc.CreateElement("RasterDefinition");
+                rdf.SetAttribute("name", this.ClassName);
+                {
+                    var loc = doc.CreateElement("Location");
+                    loc.SetAttribute("name", Path.GetDirectoryName(this.Name));
+                    {
+                        var feat = doc.CreateElement("Feature");
+                        feat.SetAttribute("name", Path.GetFileNameWithoutExtension(this.Name));
+                        {
+                            var band = doc.CreateElement("Band");
+                            band.SetAttribute("name", "RGB");
+                            band.SetAttribute("number", "1");
+                            {
+                                var img = doc.CreateElement("Image");
+                                img.SetAttribute("name", Path.GetFileName(this.Name));
+                                band.AppendChild(img);
+                                
+                                //Set bounds if spatial context is defined
+                                if (this.Parent != null)
+                                {
+                                    var sc = this.Parent.GetSpatialContext(this.SpatialContextName);
+                                    if (sc != null)
+                                    {
+                                        var bounds = doc.CreateElement("Bounds");
+                                        bounds.InnerXml = string.Format("<MinX>{0}</MinX><MinY>{1}</MinY><MaxX>{2}</MaxX><MaxY>{3}</MaxY>",
+                                            sc.Extent.MinX,
+                                            sc.Extent.MinY,
+                                            sc.Extent.MaxX,
+                                            sc.Extent.MaxY);
+
+                                        band.AppendChild(bounds);
+                                    }
+                                }
+
+                                //Set georeference if position is defined
+                                if (this.HasPosition)
+                                {
+                                    var georef = doc.CreateElement("Georeference");
+                                    georef.InnerXml = string.Format("<InsertionPointX>{0}</InsertionPointX><InsertionPointY>{1}</InsertionPointY><ResolutionX>{2}</ResolutionX><ResolutionY>{3}</ResolutionY><RotationX>{4}</RotationX><RotationY>{5}</RotationY>",
+                                        this.InsertionPoint.X, this.InsertionPoint.Y,
+                                        this.Resolution.X, this.Resolution.Y,
+                                        this.Rotation.X, this.Rotation.Y);
+
+                                    band.AppendChild(georef);
+                                }
+                            }
+                            feat.AppendChild(band);
+                        }
+                        loc.AppendChild(feat);
+                    }
+                    rdf.AppendChild(loc);
+                }
+                ctype.AppendChild(rdf);
+            }
+            currentNode.AppendChild(ctype);
+        }
+
+        public override void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            var ctype = node.SelectSingleNode("ctype");
+            var sn = node.Attributes["name"];
+            var cn = ctype.Attributes["name"];
+
+            if (sn == null || cn == null)
+                throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+            this.FeatureClassName = sn.Value + ":" + cn.Value.Substring(0, cn.Value.Length - "Type".Length);
+
+            var loc = node.SelectSingleNode("complexType/RasterDefinition/Location");
+            var img = node.SelectSingleNode("complexType/RasterDefinition/Location/Feature/Band/Image");
+            var georef = node.SelectSingleNode("complexType/RasterDefinition/Location/Feature/Band/Georeference");
+
+            if (loc == null)
+                throw new Exception("Bad document. Expected element: Location"); //LOCALIZEME
+
+            if (img == null)
+                throw new Exception("Bad document. Expected element: Image"); //LOCALIZEME
+
+            //Set spatial context
+            var cls = this.Parent.GetClass(this.SchemaName, this.ClassName);
+            if (cls != null)
+            {
+                if (!string.IsNullOrEmpty(cls.DefaultGeometryPropertyName))
+                {
+                    var geom = cls.FindProperty(cls.DefaultGeometryPropertyName) as GeometricPropertyDefinition;
+                    if (geom != null && !string.IsNullOrEmpty(geom.SpatialContextAssociation))
+                        this.SpatialContextName = geom.SpatialContextAssociation;
+                }
+            }
+
+            //Construct image path
+            var locName = loc.Attributes["name"];
+            var imgName = loc.Attributes["name"];
+
+            if (locName == null || imgName == null)
+                throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+            this.Name = Path.Combine(locName.Value, imgName.Value);
+
+            //Set georeferencing information
+            if (georef != null)
+            {
+                double insX = 0.0;
+                double insY = 0.0;
+                double rotX = 0.0;
+                double rotY = 0.0;
+                double resX = 0.0;
+                double resY = 0.0;
+
+                if (georef["InsertionPointX"] != null)
+                {
+                    if (!double.TryParse(georef["InsertionPointX"].InnerText, out insX))
+                        throw new Exception("Invalid value for InsertionPointX"); //LOCALIZEME
+                }
+
+                if (georef["InsertionPointY"] != null)
+                {
+                    if (!double.TryParse(georef["InsertionPointY"].InnerText, out insY))
+                        throw new Exception("Invalid value for InsertionPointY"); //LOCALIZEME
+                }
+
+                if (georef["ResolutionX"] != null)
+                {
+                    if (!double.TryParse(georef["ResolutionX"].InnerText, out resX))
+                        throw new Exception("Invalid value for ResolutionX"); //LOCALIZEME
+                }
+
+                if (georef["ResolutionY"] != null)
+                {
+                    if (!double.TryParse(georef["ResolutionY"].InnerText, out resY))
+                        throw new Exception("Invalid value for ResolutionY"); //LOCALIZEME
+                }
+
+                if (georef["RotationX"] != null)
+                {
+                    if (!double.TryParse(georef["RotationX"].InnerText, out rotX))
+                        throw new Exception("Invalid value for RotationX"); //LOCALIZEME
+                }
+
+                if (georef["RotationY"] != null)
+                {
+                    if (!double.TryParse(georef["RotationY"].InnerText, out rotY))
+                        throw new Exception("Invalid value for RotationY"); //LOCALIZEME
+                }
+
+                this.SetPosition(insX, insY, resX, resY, rotX, rotY);
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterItem.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterItem.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterItem.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,86 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public abstract class RasterItem : IFdoSerializable
+    {
+        public ConfigurationDocument Parent { get; internal set; }
+
+        public string Name { get; set; }
+
+        private string _featureClassName;
+
+        public string FeatureClassName
+        {
+            get { return _featureClassName; }
+            set
+            {
+                if (!string.IsNullOrEmpty(value))
+                {
+                    var tokens = value.Split(':');
+                    if (tokens.Length != 2)
+                        throw new ArgumentException("Not a qualified class name: " + value); //LOCALIZEME
+                }
+                _featureClassName = value;
+            }
+        }
+
+        public string SchemaName
+        {
+            get
+            {
+                if (!string.IsNullOrEmpty(this.FeatureClassName))
+                {
+                    var tokens = this.FeatureClassName.Split(':');
+                    if (tokens.Length == 2)
+                        return tokens[0];
+                }
+                return string.Empty;
+            }
+        }
+
+        public string ClassName
+        {
+            get
+            {
+                if (!string.IsNullOrEmpty(this.FeatureClassName))
+                {
+                    var tokens = this.FeatureClassName.Split(':');
+                    if (tokens.Length == 2)
+                        return tokens[1];
+                }
+                return string.Empty;
+            }
+        }
+
+        public string Description { get; set; }
+
+        public string SpatialContextName { get; set; }
+        
+        public abstract void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode);
+        
+        public abstract void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr);
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterWmsItem.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterWmsItem.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/RasterWmsItem.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,51 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.ObjectModels;
+using System.Drawing;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class RasterWmsItem : RasterItem
+    {
+        public RasterWmsItem(string name) { this.Name = name; }
+
+        public int ImageFormat { get; set; }
+
+        public string WmsStyle { get; set; }
+
+        public bool IsTransparent { get; set; }
+
+        public Color BackgroundColor { get; set; }
+
+        public override void WriteXml(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            throw new NotImplementedException();
+        }
+
+        public override void ReadXml(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/WmsConfigurationDocument.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/WmsConfigurationDocument.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/SchemaOverrides/WmsConfigurationDocument.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,82 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.SchemaOverrides
+{
+    public class WmsConfigurationDocument : RasterConfigurationDocumentBase<RasterWmsItem>
+    {
+        protected override void WriteSchemaMappings(System.Xml.XmlDocument doc, System.Xml.XmlNode currentNode)
+        {
+            throw new NotImplementedException();
+        }
+
+        protected override void ReadSchemaMappings(System.Xml.XmlNode node, System.Xml.XmlNamespaceManager mgr)
+        {
+            //XmlNodeList mappings = node.SelectNodes("SchemaMapping");
+            foreach (XmlNode map in node.ChildNodes)
+            {
+                if (map.Name != "SchemaMapping")
+                    continue;
+
+                var prv = map.Attributes["provider"];
+                if (prv == null)
+                    throw new Exception("Bad document. Expected attribute: provider"); //LOCALIZEME
+
+                var sn = map.Attributes["name"];
+                if (sn == null)
+                    throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                //XmlNodeList list = map.SelectNodes("complexType");
+                foreach (XmlNode clsMap in map.ChildNodes)
+                {
+                    if (clsMap.Name != "complexType")
+                        continue;
+
+                    var cn = clsMap.Attributes["name"];
+                    if (cn == null)
+                        throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                    string className = sn.Value + ":" + cn.Value.Substring(0, cn.Value.Length - "Type".Length);
+
+                    var rdf = clsMap.SelectSingleNode("RasterDefinition");
+                    if (rdf == null)
+                        throw new Exception("Bad document. Expected element: RasterDefinition"); //LOCALIZEME
+
+                    var rdfName = rdf.Attributes["name"];
+                    if (rdfName == null)
+                        throw new Exception("Bad document. Expected attribute: name"); //LOCALIZEME
+
+                    RasterItem item = new RasterWmsItem(rdfName.Value);
+
+                    if (item == null)
+                        throw new Exception("Bad document. Provider " + prv.Value + " is not supported for this configuration document"); //LOCALIZEME
+
+                    item.Parent = this;
+
+                    item.ReadXml(clsMap, mgr);
+                }
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Services/IFeatureService.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -22,6 +22,8 @@
 using System.Text;
 using System.Collections.Specialized;
 using ObjCommon = OSGeo.MapGuide.ObjectModels.Common;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI.Services
 {
@@ -86,7 +88,7 @@
         /// <param name="featureSourceID"></param>
         /// <param name="sql"></param>
         /// <returns></returns>
-        FeatureSetReader ExecuteSqlQuery(string featureSourceID, string sql);
+        IReader ExecuteSqlQuery(string featureSourceID, string sql);
 
         /// <summary>
         /// Executes a feature query on the specified feature source
@@ -95,7 +97,7 @@
         /// <param name="schema"></param>
         /// <param name="query"></param>
         /// <returns></returns>
-        FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query);
+        IFeatureReader QueryFeatureSource(string resourceID, string schema, string query);
 
         /// <summary>
         /// Executes a feature query on the specified feature source
@@ -103,7 +105,7 @@
         /// <param name="resourceID"></param>
         /// <param name="schema"></param>
         /// <returns></returns>
-        FeatureSetReader QueryFeatureSource(string resourceID, string schema);
+        IFeatureReader QueryFeatureSource(string resourceID, string schema);
 
         /// <summary>
         /// Executes a feature query on the specified feature source
@@ -113,7 +115,7 @@
         /// <param name="query"></param>
         /// <param name="columns"></param>
         /// <returns></returns>
-        FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns);
+        IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns);
 
         /// <summary>
         /// Executes a feature query on the specified feature source
@@ -124,7 +126,7 @@
         /// <param name="columns"></param>
         /// <param name="computedProperties"></param>
         /// <returns></returns>
-        FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, NameValueCollection computedProperties);
+        IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, NameValueCollection computedProperties);
 
         /// <summary>
         /// Executes an aggregate query on the specified feature source
@@ -133,7 +135,7 @@
         /// <param name="schema"></param>
         /// <param name="filter"></param>
         /// <returns></returns>
-        FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter);
+        IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter);
 
         /// <summary>
         /// Executes an aggregate query on the specified feature source
@@ -143,7 +145,7 @@
         /// <param name="filter"></param>
         /// <param name="columns"></param>
         /// <returns></returns>
-        FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns);
+        IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns);
 
         /// <summary>
         /// Executes an aggregate query on the specified feature source
@@ -153,7 +155,7 @@
         /// <param name="filter"></param>
         /// <param name="aggregateFunctions"></param>
         /// <returns></returns>
-        FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, NameValueCollection aggregateFunctions);
+        IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, NameValueCollection aggregateFunctions);
 
         /// <summary>
         /// Gets the geometric extent of the specified feature source
@@ -197,7 +199,7 @@
         /// <param name="resourceID"></param>
         /// <param name="schema"></param>
         /// <returns></returns>
-        FeatureSourceDescription DescribeFeatureSource(string resourceID, string schema);
+        FeatureSchema DescribeFeatureSource(string resourceID, string schema);
 
         /// <summary>
         /// Gets the specified class definition

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI/Utility.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -22,6 +22,7 @@
 using Topology.Geometries;
 using System.Collections.Generic;
 using OSGeo.MapGuide.MaestroAPI.IO;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCoordinateSystemCatalog.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCoordinateSystemCatalog.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpCoordinateSystemCatalog.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -83,25 +83,25 @@
         public override string ConvertWktToCoordinateSystemCode(string wkt)
 		{
 			string req = m_req.ConvertWktToCoordinateSystemCode(wkt);
-			return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req));
+            return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req)).Trim('\0');
 		}
 
         public override string ConvertCoordinateSystemCodeToWkt(string coordcode)
 		{
 			string req = m_req.ConvertCoordinateSystemCodeToWkt(coordcode);
-			return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req));
+            return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req)).Trim('\0');
 		}
 
         public override string ConvertWktToEpsgCode(string wkt)
 		{
 			string req = m_req.ConvertWktToEpsgCode(wkt);
-			return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req));
+            return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req)).Trim('\0');
 		}
 
         public override string ConvertEpsgCodeToWkt(string epsg)
 		{
 			string req = m_req.ConvertEpsgCodeToWkt(epsg);
-			return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req));
+            return System.Text.Encoding.UTF8.GetString(m_con.DownloadData(req)).Trim('\0');
 		}
 
         public override bool IsLoaded { get { return m_categories != null; } }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/HttpServerConnection.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -40,6 +40,8 @@
 using System.Collections.Generic;
 using OSGeo.MapGuide.ObjectModels.ApplicationDefinition_1_0_0;
 using OSGeo.MapGuide.MaestroAPI.Http.Commands;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI
 {
@@ -544,7 +546,7 @@
             }
         }
 
-        public FeatureSetReader ExecuteSqlQuery(string featureSourceID, string sql)
+        public IReader ExecuteSqlQuery(string featureSourceID, string sql)
         {
             ResourceIdentifier.Validate(featureSourceID, ResourceTypes.FeatureSource);
             string req = m_reqBuilder.ExecuteSqlQuery(featureSourceID, sql);
@@ -552,27 +554,27 @@
             return new XmlSqlResultReader(this.OpenRead(req));
         }
 
-		public FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query)
+		public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query)
 		{
 			return QueryFeatureSource(resourceID, schema, query, null);
 		}
 
-		public FeatureSetReader QueryFeatureSource(string resourceID, string schema)
+		public IFeatureReader QueryFeatureSource(string resourceID, string schema)
 		{
 			return QueryFeatureSource(resourceID, schema, null, null);
 		}
 
-		public FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns)
+		public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns)
 		{
             return QueryFeatureSource(resourceID, schema, query, columns, null);
 		}
 
-        public FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, NameValueCollection computedProperties)
+        public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, NameValueCollection computedProperties)
         {
-            return QueryFeatureSourceCore(false, resourceID, schema, query, columns, computedProperties);
+            return (IFeatureReader)QueryFeatureSourceCore(false, resourceID, schema, query, columns, computedProperties);
         }
 
-        private FeatureSetReader QueryFeatureSourceCore(bool aggregate, string resourceID, string schema, string query, string[] columns, NameValueCollection computedProperties)
+        private IReader QueryFeatureSourceCore(bool aggregate, string resourceID, string schema, string query, string[] columns, NameValueCollection computedProperties)
         {
             //The request may execeed the url limit of the server, especially when using GeomFromText('...')
             ResourceIdentifier.Validate(resourceID, ResourceTypes.FeatureSource);
@@ -595,9 +597,9 @@
                 LogResponse(resp);
 
                 if (aggregate)
-                    return new XmlAggregateSetReader(resp.GetResponseStream());
+                    return new XmlDataReader(resp.GetResponseStream());
                 else
-                    return new XmlFeatureSetReader(resp.GetResponseStream());
+                    return new XmlFeatureReader(resp.GetResponseStream());
             }
             catch (Exception ex)
             {
@@ -623,31 +625,57 @@
         }
 
 
-        public override FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns)
+        public override IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns)
         {
             return QueryFeatureSourceCore(true, resourceID, schema, filter, columns, null);
         }
 
-        public override FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, NameValueCollection aggregateFunctions)
+        public override IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, NameValueCollection aggregateFunctions)
         {
             return QueryFeatureSourceCore(true, resourceID, schema, filter, null, aggregateFunctions);
         }
 
 		public override FeatureSourceDescription DescribeFeatureSource(string resourceID)
 		{
-			return DescribeFeatureSource(resourceID, "");
+            ResourceIdentifier.Validate(resourceID, ResourceTypes.FeatureSource);
+            string req = m_reqBuilder.DescribeSchema(resourceID);
+
+            try
+            {
+                return new FeatureSourceDescription(this.OpenRead(req));
+            }
+            catch (Exception ex)
+            {
+                if (typeof(WebException).IsAssignableFrom(ex.GetType()))
+                    LogFailedRequest((WebException)ex);
+                try
+                {
+                    if (this.IsSessionExpiredException(ex) && this.AutoRestartSession && this.RestartSession(false))
+                        return this.DescribeFeatureSource(resourceID);
+                }
+                catch
+                {
+                    //Throw the original exception, not the secondary one
+                }
+
+                Exception ex2 = Utility.ThrowAsWebException(ex);
+                if (ex2 != ex)
+                    throw ex2;
+                else
+                    throw;
+
+            }
 		}
 
-		public override FeatureSourceDescription DescribeFeatureSource(string resourceID, string schema)
+		public override FeatureSchema DescribeFeatureSource(string resourceID, string schema)
 		{
-			if (schema != null && schema.IndexOf(":") > 0)
-				schema = schema.Substring(0, schema.IndexOf(":"));
-			ResourceIdentifier.Validate(resourceID, ResourceTypes.FeatureSource);
-			string req = m_reqBuilder.DescribeSchema(resourceID, schema);
+            ResourceIdentifier.Validate(resourceID, ResourceTypes.FeatureSource);
+            string req = m_reqBuilder.DescribeSchema(resourceID, schema);
 
             try
             {
-                return new FeatureSourceDescription(this.OpenRead(req));
+                var fsd = new FeatureSourceDescription(this.OpenRead(req));
+                return fsd.Schemas[0];
             }
             catch (Exception ex)
             {
@@ -668,7 +696,6 @@
                     throw ex2;
                 else
                     throw;
-
             }
 		}
 

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/OSGeo.MapGuide.MaestroAPI.Http.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.MaestroAPI.Http</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -36,11 +39,18 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Web" />
     <Reference Include="System.Xml" />
+    <Reference Include="Topology, Version=1.0.8.24721, Culture=neutral, PublicKeyToken=f526c48929fda856, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Thirdparty\TF.NET\Topology.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="HttpCapabilities.cs" />
     <Compile Include="HttpCoordinateSystem.cs" />
     <Compile Include="HttpCoordinateSystemCatalog.cs" />
@@ -49,8 +59,10 @@
     <Compile Include="Commands\HttpGetResourceContents.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="RequestBuilder.cs" />
-    <Compile Include="XmlAggregateSetReader.cs" />
-    <Compile Include="XmlFeatureSetReader.cs" />
+    <Compile Include="XmlDataReader.cs" />
+    <Compile Include="XmlFeatureReader.cs" />
+    <Compile Include="XmlReaderBase.cs" />
+    <Compile Include="XmlRecord.cs" />
     <Compile Include="XmlSqlResultReader.cs" />
   </ItemGroup>
   <ItemGroup>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/Properties/AssemblyInfo.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/Properties/AssemblyInfo.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -20,7 +20,8 @@
 // The following GUID is for the ID of the typelib if this project is exposed to COM
 [assembly: Guid("a62015dd-d084-44e3-9a73-02c1e6d0189a")]
 
-[assembly: InternalsVisibleTo("MaestroAPITests")]
-[assembly: InternalsVisibleTo("MaestroBaseTests")]
+// This long string is the public key of the maestroapi.key token
+[assembly: InternalsVisibleTo("MaestroAPITests, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f196e7ed5bff1e511efa3251b228582b26cbf78ea6d4282742d5c882db02b08ebc99922c0ddccf9ab79ee180250ac6716f986cf6fabdc1404b3dafee8873d4d6327be301f5ca52862065678cd5bc0c18ddc7ef6516723162c985a0c20eec07382a2090486f24393bf80976aa5ab57274620bafd62dfec34d5eed74bf41e72d2")]
+[assembly: InternalsVisibleTo("MaestroBaseTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f196e7ed5bff1e511efa3251b228582b26cbf78ea6d4282742d5c882db02b08ebc99922c0ddccf9ab79ee180250ac6716f986cf6fabdc1404b3dafee8873d4d6327be301f5ca52862065678cd5bc0c18ddc7ef6516723162c985a0c20eec07382a2090486f24393bf80976aa5ab57274620bafd62dfec34d5eed74bf41e72d2")]
 
 [assembly: MaestroApiProvider("Maestro.Http", "Maestro HTTP API", typeof(HttpServerConnection), true)]
\ No newline at end of file

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/RequestBuilder.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -575,6 +575,22 @@
 			return m_hosturi + "?" + EncodeParameters(param);
 		}
 
+        public string DescribeSchema(string resourceID)
+        {
+            NameValueCollection param = new NameValueCollection();
+            param.Add("OPERATION", "DESCRIBEFEATURESCHEMA");
+            param.Add("VERSION", "1.0.0");
+            param.Add("SESSION", m_sessionID);
+            param.Add("FORMAT", "text/xml");
+            param.Add("CLIENTAGENT", m_userAgent);
+            if (m_locale != null)
+                param.Add("LOCALE", m_locale);
+
+            param.Add("RESOURCEID", resourceID);
+
+            return m_hosturi + "?" + EncodeParameters(param);
+        }
+
 		public string GetProviderCapabilities(string provider)
 		{
 			NameValueCollection param = new NameValueCollection();

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlAggregateSetReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlAggregateSetReader.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlAggregateSetReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,283 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library 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
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
-using System.IO;
-
-namespace OSGeo.MapGuide.MaestroAPI.Http
-{
-    public class XmlAggregateSetReader : FeatureSetReader
-    {
-        private XmlTextReader m_reader;
-
-		//TODO: Make internal
-        public XmlAggregateSetReader(Stream m_source)
-            : base()
-		{
-			m_reader = new XmlTextReader(m_source);
-			m_reader.WhitespaceHandling = WhitespaceHandling.Significant;
-
-			//First we extract the response layout
-			m_reader.Read();
-			if (m_reader.Name != "xml")
-				throw new Exception("Bad document");
-			m_reader.Read();
-			if (m_reader.Name != "PropertySet")
-				throw new Exception("Bad document");
-
-            m_reader.Read();
-            if (m_reader.Name != "PropertyDefinitions")
-                throw new Exception("Bad document");
-
-			XmlDocument doc = new XmlDocument();
-			doc.LoadXml(m_reader.ReadOuterXml());
-			XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
-			mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
-			mgr.AddNamespace("gml", "http://www.opengis.net/gml");
-			mgr.AddNamespace("fdo", "http://fdo.osgeo.org/schemas");
-
-			//TODO: Assumes there is only one type returned... perhaps more can be returned....
-			XmlNodeList lst = doc.SelectNodes("PropertyDefinitions/PropertyDefinition");
-			FeatureSetColumn[] cols = new FeatureSetColumn[lst.Count];
-			for(int i = 0;i<lst.Count;i++)
-                cols[i] = new XmlAggregateSetColumn(lst[i]);
-
-            InitColumns(cols);
-
-			m_row = null;
-
-			if (m_reader.Name != "Properties")
-				throw new Exception("Bad document");
-
-			m_reader.Read();
-
-            if (m_reader.NodeType != XmlNodeType.EndElement)
-            {
-                if (m_reader.Name == "PropertyCollection")
-                {
-                    //OK
-                }
-                else
-                    throw new Exception("Bad document");
-            }
-		}
-
-        protected override bool ReadInternal()
-        {
-            if (m_reader == null || (m_reader.Name != "PropertyCollection"))
-            {
-                m_row = null;
-                return false;
-            }
-            return true;
-        }
-
-        protected override FeatureSetRow ProcessFeatureRow()
-        {
-            string xmlfragment = m_reader.ReadOuterXml();
-            XmlDocument doc = new XmlDocument();
-            doc.LoadXml(xmlfragment);
-
-            FeatureSetRow row = null;
-
-            if (doc["PropertyCollection"] != null)
-                row = new XmlAggregateSetRow(this, doc["PropertyCollection"]);
-
-            if (m_reader.Name != "PropertyCollection")
-            {
-                m_reader.Close();
-                m_reader = null;
-            }
-
-            return row;
-        }
-
-        protected override void CloseInternal()
-        {
-            
-        }
-
-        public override int Depth
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public override System.Data.DataTable GetSchemaTable()
-        {
-            throw new NotImplementedException();
-        }
-
-        public override int RecordsAffected
-        {
-            get { throw new NotImplementedException(); }
-        }
-    }
-
-    public class XmlAggregateSetRow : FeatureSetRow
-    {
-        internal XmlAggregateSetRow(FeatureSetReader parent, XmlNode node)
-			: base(parent)
-		{
-            string nodeName = "Property";
-
-            foreach (XmlNode p in node.SelectNodes(nodeName))
-            {
-                int ordinal = GetOrdinal(p["Name"].InnerText);
-                if (!m_nulls[ordinal])
-                    throw new Exception("Bad document, multiple: " + p["Name"].InnerText + " values in a single feature");
-                m_nulls[ordinal] = false;
-
-                XmlNode valueNode = p["Value"];
-                if (valueNode == null || string.IsNullOrEmpty(valueNode.InnerText))
-                {
-                    m_nulls[ordinal] = true;
-                }
-                else
-                {
-                    if (parent.Columns[ordinal].Type == typeof(string) || parent.Columns[ordinal].Type == Utility.UnmappedType)
-                        m_items[ordinal] = valueNode.InnerText;
-                    else if (parent.Columns[ordinal].Type == typeof(int))
-                        m_items[ordinal] = XmlConvert.ToInt32(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(long))
-                        m_items[ordinal] = XmlConvert.ToInt64(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(short))
-                        m_items[ordinal] = XmlConvert.ToInt16(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(float))
-                        m_items[ordinal] = XmlConvert.ToSingle(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(double))
-                        m_items[ordinal] = XmlConvert.ToDouble(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(bool))
-                        m_items[ordinal] = XmlConvert.ToBoolean(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(DateTime))
-                    {
-                        try
-                        {
-                            //Fix for broken ODBC provider
-                            string v = valueNode.InnerText;
-
-                            if (v.Trim().ToUpper().StartsWith("TIMESTAMP"))
-                                v = v.Trim().Substring("TIMESTAMP".Length).Trim();
-                            else if (v.Trim().ToUpper().StartsWith("DATE"))
-                                v = v.Trim().Substring("DATE".Length).Trim();
-                            else if (v.Trim().ToUpper().StartsWith("TIME"))
-                                v = v.Trim().Substring("TIME".Length).Trim();
-
-                            if (v != valueNode.InnerText)
-                            {
-                                if (v.StartsWith("'"))
-                                    v = v.Substring(1);
-                                if (v.EndsWith("'"))
-                                    v = v.Substring(0, v.Length - 1);
-
-                                m_items[ordinal] = DateTime.Parse(v, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
-                            }
-                            else
-                                m_items[ordinal] = XmlConvert.ToDateTime(v, XmlDateTimeSerializationMode.Unspecified);
-                        }
-                        catch (Exception ex)
-                        {
-                            //Unfortunately FDO supports invalid dates, such as the 30th feb
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = ex;
-                        }
-                    }
-                    else if (parent.Columns[ordinal].Type == Utility.GeometryType)
-                    {
-                        m_items[ordinal] = valueNode.InnerText;
-                        if (string.IsNullOrEmpty(valueNode.InnerText))
-                        {
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = null;
-                        }
-                        else
-                            m_lazyloadGeometry[ordinal] = true;
-                    }
-                    else
-                        throw new Exception("Unknown type: " + parent.Columns[ordinal].Type.FullName);
-                }
-            }
-		}
-    }
-
-    public class XmlAggregateSetColumn : FeatureSetColumn
-    {
-        internal XmlAggregateSetColumn(XmlNode node) : base()
-		{
-            if (node.Name == "PropertyDefinition")
-            {
-                m_name = node["Name"].InnerText;
-                m_allowNull = true;
-                switch (node["Type"].InnerText.ToLower().Trim())
-                {
-                    case "string":
-                        m_type = typeof(string);
-                        break;
-                    case "byte":
-                        m_type = typeof(Byte);
-                        break;
-                    case "int32":
-                    case "int":
-                    case "integer":
-                        m_type = typeof(int);
-                        break;
-                    case "int16":
-                        m_type = typeof(short);
-                        break;
-                    case "int64":
-                    case "long":
-                        m_type = typeof(long);
-                        break;
-                    case "float":
-                    case "single":
-                        m_type = typeof(float);
-                        break;
-                    case "double":
-                    case "decimal":
-                        m_type = typeof(double);
-                        break;
-                    case "boolean":
-                    case "bool":
-                        m_type = typeof(bool);
-                        return;
-                    case "datetime":
-                    case "date":
-                        m_type = typeof(DateTime);
-                        break;
-                    case "raster":
-                        m_type = Utility.RasterType;
-                        break;
-                    case "geometry":
-                        m_type = Utility.GeometryType;
-                        break;
-                    default:
-                        //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
-                        m_type = Utility.UnmappedType;
-                        break;
-                }
-            }
-            else
-            {
-                throw new Exception("Bad document. Expected element: PropertyDefinition"); //LOCALIZE
-            }
-		}
-    }
-}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlDataReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,89 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.IO;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Http
+{
+    public class XmlDataReader : XmlReaderBase
+    {
+        public XmlDataReader(Stream source) : base(source) { }
+
+        public override ReaderType ReaderType
+        {
+            get { return ReaderType.Data; }
+        }
+
+        protected override string DefinitionRootElement
+        {
+            get { return "PropertyDefinitions"; }
+        }
+
+        protected override string DefinitionChildElement
+        {
+            get { return "PropertyDefinition"; }
+        }
+
+        protected override string DefinitionChildNameElement
+        {
+            get { return "Name"; }
+        }
+
+        protected override string DefinitionChildTypeElement
+        {
+            get { return "Type"; }
+        }
+
+        protected override string ValuesRootElement
+        {
+            get { return "Properties"; }
+        }
+
+        protected override string ValuesRowElement
+        {
+            get { return "PropertyCollection"; }
+        }
+
+        protected override string ValuesRowPropertyElement
+        {
+            get { return "Property"; }
+        }
+
+        protected override string ValuesRowPropertyNameElement
+        {
+            get { return "Name"; }
+        }
+
+        protected override string ValuesRowPropertyValueElement
+        {
+            get { return "Value"; }
+        }
+
+        protected override string ResponseRootElement
+        {
+            get { return "PropertySet"; }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,276 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+using System.IO;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Http;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Diagnostics;
+
+namespace OSGeo.MapGuide.MaestroAPI.Http
+{
+    public class XmlFeatureReader : XmlReaderBase, IFeatureReader
+    {
+        public XmlFeatureReader(Stream source)
+            : base(source)
+        { }
+
+        public override ReaderType ReaderType
+        {
+            get { return ReaderType.Feature; }
+        }
+
+        protected override void InitProperties()
+        {
+            //SelectAggregate responses start with PropertySet
+            _reader.Read();
+            if (_reader.Name != "xml")
+                throw new Exception("Bad document. Expected xml prolog"); //LOCALIZEME
+            _reader.Read();
+            if (_reader.Name != this.ResponseRootElement)
+                throw new Exception("Bad document. Expected element: " + this.ResponseRootElement); //LOCALIZEME
+            _reader.Read();
+            if (_reader.Name != this.DefinitionRootElement)
+                throw new Exception("Bad document. Expected element: " + this.DefinitionRootElement); //LOCALIZEME
+
+            var schemaXml = _reader.ReadOuterXml();
+            XmlDocument doc = new XmlDocument();
+            doc.LoadXml(schemaXml);
+            FeatureSchema schema = new FeatureSchema("", "");
+            XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
+            mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
+            mgr.AddNamespace("gml", "http://www.opengis.net/gml");
+            mgr.AddNamespace("fdo", "http://fdo.osgeo.org/schemas");
+
+            XmlNode root = doc.SelectSingleNode("xs:schema", mgr);
+            schema.ReadXml(root, mgr);
+
+            //This is a query of a single feature class after all!
+            Debug.Assert(schema.Classes.Count == 1);
+
+            this.ClassDefinition = schema.Classes[0];
+            List<XmlProperty> properties = new List<XmlProperty>();
+            foreach (var prop in this.ClassDefinition.Properties)
+            {
+                string name = prop.Name;
+                switch (prop.Type)
+                {
+                    case PropertyDefinitionType.Association:
+                        break;
+                    case PropertyDefinitionType.Data:
+                        {
+                            DataPropertyDefinition dp = (DataPropertyDefinition)prop;
+                            switch (dp.DataType)
+                            {
+                                case DataPropertyType.Blob:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Blob));
+                                    break;
+                                case DataPropertyType.Boolean:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Boolean));
+                                    break;
+                                case DataPropertyType.Byte:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Byte));
+                                    break;
+                                case DataPropertyType.Clob:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Clob));
+                                    break;
+                                case DataPropertyType.DateTime:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.DateTime));
+                                    break;
+                                case DataPropertyType.Double:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Double));
+                                    break;
+                                case DataPropertyType.Int16:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Int16));
+                                    break;
+                                case DataPropertyType.Int32:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Int32));
+                                    break;
+                                case DataPropertyType.Int64:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Int64));
+                                    break;
+                                case DataPropertyType.Single:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.Single));
+                                    break;
+                                case DataPropertyType.String:
+                                    properties.Add(new XmlProperty(name, PropertyValueType.String));
+                                    break;
+                            }
+                        }
+                        break;
+                    case PropertyDefinitionType.Geometry:
+                        {
+                            properties.Add(new XmlProperty(name, PropertyValueType.Geometry));
+                        }
+                        break;
+                    case PropertyDefinitionType.Object:
+                        {
+                            properties.Add(new XmlProperty(name, PropertyValueType.Feature));
+                        }
+                        break;
+                    case PropertyDefinitionType.Raster:
+                        {
+                            properties.Add(new XmlProperty(name, PropertyValueType.Raster));
+                        }
+                        break;
+                }
+            }
+            _properties = properties.ToArray();
+            foreach (var prop in _properties)
+            {
+                _propertyMap[prop.Name] = prop;
+            }
+            this.FieldCount = _properties.Length;
+
+            if (_reader.Name != this.ValuesRootElement)
+                throw new Exception("Bad document");
+
+            _reader.Read();
+
+            if (_reader.NodeType != XmlNodeType.EndElement)
+            {
+                if (_reader.Name == this.ValuesRootElement)
+                    _reader = null; //No features :(
+            }
+        }
+
+        protected override string ResponseRootElement
+        {
+            get { return "FeatureSet"; }
+        }
+
+        protected override string DefinitionRootElement
+        {
+            get { return "xs:schema"; }
+        }
+
+        protected override string DefinitionChildElement
+        {
+            get { throw new NotImplementedException(); }
+        }
+
+        protected override string DefinitionChildNameElement
+        {
+            get { throw new NotImplementedException(); }
+        }
+
+        protected override string DefinitionChildTypeElement
+        {
+            get { throw new NotImplementedException(); }
+        }
+
+        protected override string ValuesRootElement
+        {
+            get { return "Features"; }
+        }
+
+        protected override string ValuesRowElement
+        {
+            get { return "Feature"; }
+        }
+
+        protected override string ValuesRowPropertyElement
+        {
+            get { return "Property"; }
+        }
+
+        protected override string ValuesRowPropertyNameElement
+        {
+            get { return "Name"; }
+        }
+
+        protected override string ValuesRowPropertyValueElement
+        {
+            get { return "Value"; }
+        }
+
+        public OSGeo.MapGuide.MaestroAPI.Schema.ClassDefinition ClassDefinition
+        {
+            get;
+            private set;
+        }
+
+        protected override IRecord ReadNextRecord()
+        {
+            if (_reader == null || (_reader.Name != this.ValuesRowElement))
+            {
+                return null;
+            }
+            else
+            {
+                if (_recDoc == null)
+                    _recDoc = new XmlDocument();
+
+                //TODO: We can probably make this more efficient.
+                _recDoc.LoadXml(_reader.ReadOuterXml());
+                var propertyNodeList = _recDoc[this.ValuesRowElement].SelectNodes(this.ValuesRowPropertyElement);
+                var rec = new XmlRecord(_properties, _wktReader, propertyNodeList, this.ValuesRowPropertyNameElement, this.ValuesRowPropertyValueElement);
+                var feat = new FeatureBase(this.ClassDefinition);
+                feat.Update(rec);
+                return feat;
+            }
+        }
+
+        class Enumerator : IEnumerator<IFeature>
+        {
+            private XmlFeatureReader _reader;
+
+            public Enumerator(XmlFeatureReader reader) { _reader = reader; }
+
+            public IFeature Current
+            {
+                get { return (IFeature)_reader.Current; }
+            }
+
+            public void Dispose()
+            {
+                
+            }
+
+            object System.Collections.IEnumerator.Current
+            {
+                get { return this.Current; }
+            }
+
+            public bool MoveNext()
+            {
+                return _reader.ReadNext();
+            }
+
+            public void Reset()
+            {
+                throw new NotSupportedException();
+            }
+        }
+
+        public IEnumerator<IFeature> GetEnumerator()
+        {
+            return new Enumerator(this);
+        }
+
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            return new Enumerator(this);
+        }
+    }
+}

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureSetReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureSetReader.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlFeatureSetReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,284 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library 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
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
-using System.IO;
-
-namespace OSGeo.MapGuide.MaestroAPI
-{
-    public class XmlFeatureSetReader : FeatureSetReader
-    {
-        private XmlTextReader m_reader;
-
-		//TODO: Make internal
-        public XmlFeatureSetReader(Stream m_source) : base()
-		{
-			m_reader = new XmlTextReader(m_source);
-			m_reader.WhitespaceHandling = WhitespaceHandling.Significant;
-
-			//First we extract the response layout
-			m_reader.Read();
-			if (m_reader.Name != "xml")
-				throw new Exception("Bad document");
-			m_reader.Read();
-			if (m_reader.Name != "FeatureSet")
-				throw new Exception("Bad document");
-
-            m_reader.Read();
-            if (m_reader.Name != "xs:schema")
-                throw new Exception("Bad document");
-
-			XmlDocument doc = new XmlDocument();
-			doc.LoadXml(m_reader.ReadOuterXml());
-			XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
-			mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
-			mgr.AddNamespace("gml", "http://www.opengis.net/gml");
-			mgr.AddNamespace("fdo", "http://fdo.osgeo.org/schemas");
-
-			//TODO: Assumes there is only one type returned... perhaps more can be returned....
-            XmlNodeList lst = doc.SelectNodes("xs:schema/xs:complexType/xs:complexContent/xs:extension/xs:sequence/xs:element", mgr);
-            if (lst.Count == 0)
-                lst = doc.SelectNodes("xs:schema/xs:complexType/xs:sequence/xs:element", mgr);
-
-			FeatureSetColumn[] cols = new FeatureSetColumn[lst.Count];
-			for(int i = 0;i<lst.Count;i++)
-                cols[i] = new XmlFeatureSetColumn(lst[i]);
-
-            InitColumns(cols);
-
-			m_row = null;
-
-			if (m_reader.Name != "Features")
-				throw new Exception("Bad document");
-
-			m_reader.Read();
-
-            if (m_reader.NodeType != XmlNodeType.EndElement)
-            {
-                if (m_reader.Name == "Features")
-                    m_reader = null; //No features :(
-                
-                if (m_reader.Name != "Feature")
-                    throw new Exception("Bad document");
-            }
-		}
-
-        protected override bool ReadInternal()
-        {
-            if (m_reader == null || (m_reader.Name != "Feature"))
-            {
-                m_row = null;
-                return false;
-            }
-            return true;
-        }
-
-        protected override FeatureSetRow ProcessFeatureRow()
-        {
-            string xmlfragment = m_reader.ReadOuterXml();
-            XmlDocument doc = new XmlDocument();
-            doc.LoadXml(xmlfragment);
-
-            FeatureSetRow row = null;
-
-            if (doc["Feature"] != null)
-                row = new XmlFeatureSetRow(this, doc["Feature"]);
-
-            if (m_reader.Name != "Feature")
-            {
-                m_reader.Close();
-                m_reader = null;
-            }
-
-            return row;
-        }
-
-        protected override void CloseInternal()
-        {
-            
-        }
-
-        public override int Depth
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public override System.Data.DataTable GetSchemaTable()
-        {
-            throw new NotImplementedException();
-        }
-
-        public override int RecordsAffected
-        {
-            get { throw new NotImplementedException(); }
-        }
-    }
-
-    public class XmlFeatureSetRow : FeatureSetRow
-    {
-        internal XmlFeatureSetRow(FeatureSetReader parent, XmlNode node)
-			: base(parent)
-		{
-            string nodeName = "Property";
-
-            foreach (XmlNode p in node.SelectNodes(nodeName))
-            {
-                int ordinal = GetOrdinal(p["Name"].InnerText);
-                if (!m_nulls[ordinal])
-                    throw new Exception("Bad document, multiple: " + p["Name"].InnerText + " values in a single feature");
-                m_nulls[ordinal] = false;
-
-                XmlNode valueNode = p["Value"];
-                if (valueNode == null)
-                {
-                    m_nulls[ordinal] = true;
-                }
-                else
-                {
-                    if (parent.Columns[ordinal].Type == typeof(string) || parent.Columns[ordinal].Type == Utility.UnmappedType)
-                        m_items[ordinal] = valueNode.InnerText;
-                    else if (parent.Columns[ordinal].Type == typeof(int))
-                        m_items[ordinal] = XmlConvert.ToInt32(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(long))
-                        m_items[ordinal] = XmlConvert.ToInt64(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(short))
-                        m_items[ordinal] = XmlConvert.ToInt16(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(float))
-                        m_items[ordinal] = XmlConvert.ToSingle(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(double))
-                        m_items[ordinal] = XmlConvert.ToDouble(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(bool))
-                        m_items[ordinal] = XmlConvert.ToBoolean(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(DateTime))
-                    {
-                        try
-                        {
-                            //Fix for broken ODBC provider
-                            string v = valueNode.InnerText;
-
-                            if (v.Trim().ToUpper().StartsWith("TIMESTAMP"))
-                                v = v.Trim().Substring("TIMESTAMP".Length).Trim();
-                            else if (v.Trim().ToUpper().StartsWith("DATE"))
-                                v = v.Trim().Substring("DATE".Length).Trim();
-                            else if (v.Trim().ToUpper().StartsWith("TIME"))
-                                v = v.Trim().Substring("TIME".Length).Trim();
-
-                            if (v != valueNode.InnerText)
-                            {
-                                if (v.StartsWith("'"))
-                                    v = v.Substring(1);
-                                if (v.EndsWith("'"))
-                                    v = v.Substring(0, v.Length - 1);
-
-                                m_items[ordinal] = DateTime.Parse(v, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
-                            }
-                            else
-                                m_items[ordinal] = XmlConvert.ToDateTime(v, XmlDateTimeSerializationMode.Unspecified);
-                        }
-                        catch (Exception ex)
-                        {
-                            //Unfortunately FDO supports invalid dates, such as the 30th feb
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = ex;
-                        }
-                    }
-                    else if (parent.Columns[ordinal].Type == Utility.GeometryType)
-                    {
-                        m_items[ordinal] = valueNode.InnerText;
-                        if (string.IsNullOrEmpty(valueNode.InnerText))
-                        {
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = null;
-                        }
-                        else
-                            m_lazyloadGeometry[ordinal] = true;
-                    }
-                    else
-                        throw new Exception("Unknown type: " + parent.Columns[ordinal].Type.FullName);
-                }
-            }
-		}
-    }
-
-    public class XmlFeatureSetColumn : FeatureSetColumn
-    {
-        internal XmlFeatureSetColumn(XmlNode node) : base()
-		{
-            m_name = node.Attributes["name"].Value;
-            m_allowNull = node.Attributes["minOccurs"] != null && node.Attributes["minOccurs"].Value == "0";
-            if (node.Attributes["type"] != null && node.Attributes["type"].Value == "gml:AbstractGeometryType")
-            {
-                m_type = Utility.GeometryType;
-                this.SetMetadata(GeometryMetadata.GEOM_TYPES, node.Attributes["fdo:geometricTypes"].Value);
-                try
-                {
-                    this.SetMetadata(GeometryMetadata.SPATIAL_CONTEXT, node.Attributes["fdo:srsName"].Value);
-                }
-                catch { }
-            }
-            else if (node["xs:simpleType"] == null)
-            {
-                m_type = Utility.RasterType;
-            }
-            else
-            {
-                switch (node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value.ToLower())
-                {
-                    case "xs:string":
-                        m_type = typeof(string);
-                        break;
-                    case "fdo:byte":
-                        m_type = typeof(Byte);
-                        break;
-                    case "fdo:int32":
-                        m_type = typeof(int);
-                        break;
-                    case "fdo:int16":
-                        m_type = typeof(short);
-                        break;
-                    case "fdo:int64":
-                        m_type = typeof(long);
-                        break;
-                    case "xs:float":
-                    case "xs:single":
-                    case "fdo:single":
-                        m_type = typeof(float);
-                        break;
-                    case "xs:double":
-                    case "xs:decimal":
-                        m_type = typeof(double);
-                        break;
-                    case "xs:boolean":
-                        m_type = typeof(bool);
-                        return;
-                    case "xs:datetime":
-                        m_type = typeof(DateTime);
-                        break;
-                    default:
-                        //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
-                        m_type = Utility.UnmappedType;
-                        break;
-                }
-            }
-		}
-    }
-}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlReaderBase.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,213 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using System.IO;
+using System.Xml;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Http
+{
+    public delegate IRecord RecordFactoryMethod();
+
+    public abstract class XmlReaderBase : ReaderBase
+    {
+        protected Topology.IO.WKTReader _wktReader;
+        protected XmlTextReader _reader;
+
+        protected XmlProperty[] _properties;
+        protected Dictionary<string, XmlProperty> _propertyMap;
+
+        //The xml response format is mostly the same (structurally).
+
+        protected abstract string ResponseRootElement { get; }
+
+        protected abstract string DefinitionRootElement { get; }
+
+        protected abstract string DefinitionChildElement { get; }
+
+        protected abstract string DefinitionChildNameElement { get; }
+
+        protected abstract string DefinitionChildTypeElement { get; }
+
+        protected abstract string ValuesRootElement { get; }
+
+        protected abstract string ValuesRowElement { get; }
+
+        protected abstract string ValuesRowPropertyElement { get; }
+
+        protected abstract string ValuesRowPropertyNameElement { get; }
+
+        protected abstract string ValuesRowPropertyValueElement { get; }
+
+        public XmlReaderBase(Stream source) 
+        {
+            _reader = new XmlTextReader(source);
+            _wktReader = new Topology.IO.WKTReader();
+            _reader.WhitespaceHandling = WhitespaceHandling.Significant;
+            _propertyMap = new Dictionary<string, XmlProperty>();
+
+            InitProperties();
+        }
+
+        protected virtual void InitProperties()
+        {
+            //SelectAggregate responses start with PropertySet
+            _reader.Read();
+            if (_reader.Name != "xml")
+                throw new Exception("Bad document. Expected xml prolog"); //LOCALIZEME
+            _reader.Read();
+            if (_reader.Name != this.ResponseRootElement)
+                throw new Exception("Bad document. Expected element: " + this.ResponseRootElement); //LOCALIZEME
+            _reader.Read();
+            if (_reader.Name != this.DefinitionRootElement)
+                throw new Exception("Bad document. Expected element: " + this.DefinitionRootElement); //LOCALIZEME
+
+            List<XmlProperty> properties = new List<XmlProperty>();
+
+            XmlDocument headerDoc = new XmlDocument();
+            string xml = _reader.ReadOuterXml();
+            headerDoc.LoadXml(xml);
+
+            foreach (XmlNode def in headerDoc.FirstChild.ChildNodes)
+            {
+                if (def.Name != this.DefinitionChildElement)
+                    throw new Exception("Bad document. Expected element: " + this.DefinitionChildElement); //LOCALIZEME
+
+                var n = def[this.DefinitionChildNameElement];
+                var t = def[this.DefinitionChildTypeElement];
+
+                if (n == null)
+                    throw new Exception("Bad document. Expected element: " + this.DefinitionChildNameElement); //LOCALIZEME
+                if (t == null)
+                    throw new Exception("Bad document. Expected element: " + this.DefinitionChildTypeElement); //LOCALIZEME
+
+                properties.Add(new XmlProperty(n.InnerText, GetPropertyValueType(t.InnerText)));
+            }
+
+            /*
+            while (_reader.Read() && _reader.Name == this.DefinitionChildElement)
+            {
+                _reader.Read();
+                if (_reader.Name != this.DefinitionChildNameElement)
+                    throw new Exception("Bad document. Expected element: " + this.DefinitionChildNameElement); //LOCALIZEME
+                string name = _reader.ReadInnerXml();
+                _reader.Read();
+                if (_reader.Name != this.DefinitionChildTypeElement)
+                    throw new Exception("Bad document. Expected element: " + this.DefinitionChildTypeElement);
+                string type = _reader.ReadInnerXml();
+
+               
+            }*/
+
+            _properties = properties.ToArray();
+            foreach (var p in _properties)
+            {
+                _propertyMap[p.Name] = p;
+            }
+
+            this.FieldCount = _properties.Length;
+
+            if (_reader.Name != this.ValuesRootElement)
+                throw new Exception("Bad document");
+
+            _reader.Read();
+
+            if (_reader.NodeType != XmlNodeType.EndElement)
+            {
+                if (_reader.Name == this.ValuesRootElement)
+                    _reader = null; //No features :(
+            }
+        }
+
+        public override Type GetFieldType(int i)
+        {
+            return ClrFdoTypeMap.GetClrType(_properties[i].Type);
+        }
+
+        public override string GetName(int index)
+        {
+            return _properties[index].Name;
+        }
+
+        private OSGeo.MapGuide.MaestroAPI.Schema.PropertyValueType GetPropertyValueType(string type)
+        {
+            switch (type)
+            {
+                case "bool":
+                case "boolean":
+                    return PropertyValueType.Boolean;
+                case "blob":
+                    return PropertyValueType.Blob;
+                case "byte":
+                    return PropertyValueType.Byte;
+                case "clob":
+                    return PropertyValueType.Clob;
+                case "double":
+                case "decimal":
+                    return PropertyValueType.Double;
+                case "date":
+                case "datetime":
+                    return PropertyValueType.DateTime;
+                case "geometry":
+                    return PropertyValueType.Geometry;
+                case "int":
+                case "int32":
+                case "integer":
+                    return PropertyValueType.Int32;
+                case "int16":
+                    return PropertyValueType.Int16;
+                case "int64":
+                case "long":
+                    return PropertyValueType.Int64;
+                case "raster":
+                    return PropertyValueType.Raster;
+                case "float":
+                case "single":
+                    return PropertyValueType.Single;
+                case "string":
+                    return PropertyValueType.String;
+            }
+            throw new ArgumentException();
+        }
+
+        protected XmlDocument _recDoc;
+
+        protected override IRecord ReadNextRecord()
+        {
+            if (_reader == null || (_reader.Name != this.ValuesRowElement))
+            {
+                return null;
+            }
+            else
+            {
+                if (_recDoc == null)
+                    _recDoc = new XmlDocument();
+
+                _recDoc.LoadXml(_reader.ReadOuterXml());
+                var rec = new XmlRecord(_properties, _wktReader, _recDoc[this.ValuesRowElement].SelectNodes(this.ValuesRowPropertyElement), this.ValuesRowPropertyNameElement, this.ValuesRowPropertyValueElement);
+                
+                return rec;
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlRecord.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlRecord.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlRecord.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,199 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using System.Xml;
+
+namespace OSGeo.MapGuide.MaestroAPI.Http
+{
+    public class XmlProperty
+    {
+        public XmlProperty(string name, PropertyValueType pvtype) 
+        { 
+            this.Name =name;
+            this.Type = pvtype;
+        }
+
+        public string Name { get; private set; }
+
+        public PropertyValueType Type { get; private set; } 
+    }
+
+    public class XmlRecord : RecordBase
+    {
+        public XmlRecord(XmlProperty[] properties, Topology.IO.WKTReader wktReader, XmlNodeList propertyNodes, string nameElement, string valueElement)
+        {
+            for (int i = 0; i < properties.Length; i++)
+            {
+                string name = properties[i].Name;
+                _ordinalMap[i] = name;
+
+                switch (properties[i].Type)
+                {
+                    case PropertyValueType.Blob:
+                        _values[name] = new BlobValue();
+                        break;
+                    case PropertyValueType.Boolean:
+                        _values[name] = new BooleanValue();
+                        break;
+                    case PropertyValueType.Byte:
+                        _values[name] = new ByteValue();
+                        break;
+                    case PropertyValueType.Clob:
+                        _values[name] = new ClobValue();
+                        break;
+                    case PropertyValueType.DateTime:
+                        _values[name] = new DateTimeValue();
+                        break;
+                    case PropertyValueType.Double:
+                        _values[name] = new DoubleValue();
+                        break;
+                    case PropertyValueType.Feature:
+                        _values[name] = new FeatureValue();
+                        break;
+                    case PropertyValueType.Geometry:
+                        _values[name] = new GeometryValue();
+                        break;
+                    case PropertyValueType.Int16:
+                        _values[name] = new Int16Value();
+                        break;
+                    case PropertyValueType.Int32:
+                        _values[name] = new Int32Value();
+                        break;
+                    case PropertyValueType.Int64:
+                        _values[name] = new Int64Value();
+                        break;
+                    case PropertyValueType.Raster:
+                        _values[name] = new RasterValue();
+                        break;
+                    case PropertyValueType.Single:
+                        _values[name] = new SingleValue();
+                        break;
+                    case PropertyValueType.String:
+                        _values[name] = new StringValue();
+                        break;
+                }
+            }
+
+            foreach (XmlNode propNode in propertyNodes)
+            {
+                var name = propNode[nameElement].InnerText;
+                var valueNode = propNode[valueElement];
+                if (valueNode != null)
+                {
+                    var value = valueNode.InnerText;
+                    switch (_values[name].Type)
+                    {
+                        case PropertyValueType.Blob:
+                            ((BlobValue)_values[name]).Value = Encoding.UTF8.GetBytes(value);
+                            break;
+                        case PropertyValueType.Boolean:
+                            ((BooleanValue)_values[name]).Value = XmlConvert.ToBoolean(value);
+                            break;
+                        case PropertyValueType.Byte:
+                            ((ByteValue)_values[name]).Value = XmlConvert.ToByte(value);
+                            break;
+                        case PropertyValueType.Clob:
+                            ((ClobValue)_values[name]).Value = value.ToCharArray();
+                            break;
+                        case PropertyValueType.DateTime:
+                            var dt = ConvertToDateTime(value);
+                            if (dt.HasValue)
+                                ((DateTimeValue)_values[name]).Value = dt.Value;
+                            break;
+                        case PropertyValueType.Double:
+                            ((DoubleValue)_values[name]).Value = XmlConvert.ToDouble(value);
+                            break;
+                        case PropertyValueType.Feature:
+                            ((FeatureValue)_values[name]).Value = ConvertToFeatures(value);
+                            break;
+                        case PropertyValueType.Geometry:
+                            ((GeometryValue)_values[name]).Value = wktReader.Read(value);
+                            break;
+                        case PropertyValueType.Int16:
+                            ((Int16Value)_values[name]).Value = XmlConvert.ToInt16(value);
+                            break;
+                        case PropertyValueType.Int32:
+                            ((Int32Value)_values[name]).Value = XmlConvert.ToInt32(value);
+                            break;
+                        case PropertyValueType.Int64:
+                            ((Int64Value)_values[name]).Value = XmlConvert.ToInt64(value);
+                            break;
+                        case PropertyValueType.Raster:
+                            ((RasterValue)_values[name]).Value = ConvertToRaster(value);
+                            break;
+                        case PropertyValueType.Single:
+                            ((SingleValue)_values[name]).Value = XmlConvert.ToSingle(value);
+                            break;
+                        case PropertyValueType.String:
+                            ((StringValue)_values[name]).Value = value;
+                            break;
+                    }
+                }
+            }
+        }
+
+        protected byte[] ConvertToRaster(string name)
+        {
+            throw new NotImplementedException();
+        }
+
+        protected IFeature[] ConvertToFeatures(string value)
+        {
+            throw new NotImplementedException();
+        }
+
+        protected DateTime? ConvertToDateTime(string value)
+        {
+            try
+            {
+                //Fix for broken ODBC provider
+                string v = value;
+
+                if (v.Trim().ToUpper().StartsWith("TIMESTAMP"))
+                    v = v.Trim().Substring("TIMESTAMP".Length).Trim();
+                else if (v.Trim().ToUpper().StartsWith("DATE"))
+                    v = v.Trim().Substring("DATE".Length).Trim();
+                else if (v.Trim().ToUpper().StartsWith("TIME"))
+                    v = v.Trim().Substring("TIME".Length).Trim();
+
+                if (v != value)
+                {
+                    if (v.StartsWith("'"))
+                        v = v.Substring(1);
+                    if (v.EndsWith("'"))
+                        v = v.Substring(0, v.Length - 1);
+
+                    return DateTime.Parse(v, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
+                }
+                else
+                    return XmlConvert.ToDateTime(v, XmlDateTimeSerializationMode.Unspecified);
+            }
+            catch
+            {
+                //Unfortunately FDO supports invalid dates, such as the 30th feb
+                return null;
+            }
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Http/XmlSqlResultReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -22,262 +22,67 @@
 using System.Text;
 using System.Xml;
 using System.IO;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI.Http
 {
-    public class XmlSqlResultReader : FeatureSetReader
+    public class XmlSqlResultReader : XmlReaderBase
     {
-        private XmlTextReader m_reader;
+        public XmlSqlResultReader(Stream source) : base(source) { }
 
-		//TODO: Make internal
-        public XmlSqlResultReader(Stream m_source)
-            : base()
-		{
-			m_reader = new XmlTextReader(m_source);
-			m_reader.WhitespaceHandling = WhitespaceHandling.Significant;
+        public override ReaderType ReaderType
+        {
+            get { return ReaderType.Sql; }
+        }
 
-			//First we extract the response layout
-			m_reader.Read();
-			if (m_reader.Name != "xml")
-				throw new Exception("Bad document");
-			m_reader.Read();
-			if (m_reader.Name != "RowSet")
-				throw new Exception("Bad document");
+        protected override string ResponseRootElement
+        {
+            get { return "RowSet"; }
+        }
 
-            m_reader.Read();
-            if (m_reader.Name != "ColumnDefinitions")
-                throw new Exception("Bad document");
+        protected override string DefinitionRootElement
+        {
+            get { return "ColumnDefinitions"; }
+        }
 
-			XmlDocument doc = new XmlDocument();
-			doc.LoadXml(m_reader.ReadOuterXml());
-			XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
-			mgr.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
-			mgr.AddNamespace("gml", "http://www.opengis.net/gml");
-			mgr.AddNamespace("fdo", "http://fdo.osgeo.org/schemas");
+        protected override string DefinitionChildElement
+        {
+            get { return "Column"; }
+        }
 
-			//TODO: Assumes there is only one type returned... perhaps more can be returned....
-            XmlNodeList lst = doc.SelectNodes("ColumnDefinitions/Column");
-			FeatureSetColumn[] cols = new FeatureSetColumn[lst.Count];
-			for(int i = 0;i<lst.Count;i++)
-                cols[i] = new XmlSqlResultColumn(lst[i]);
-
-            InitColumns(cols);
-
-			m_row = null;
-
-			if (m_reader.Name != "Rows")
-				throw new Exception("Bad document");
-
-			m_reader.Read();
-
-            if (m_reader.NodeType != XmlNodeType.EndElement)
-            {
-                if (m_reader.Name == "Row")
-                {
-                    //OK
-                }
-                else
-                    throw new Exception("Bad document");
-            }
-		}
-
-        protected override bool ReadInternal()
+        protected override string DefinitionChildNameElement
         {
-            if (m_reader == null || (m_reader.Name != "Row"))
-            {
-                m_row = null;
-                return false;
-            }
-            return true;
+            get { return "Name"; }
         }
 
-        protected override FeatureSetRow ProcessFeatureRow()
+        protected override string DefinitionChildTypeElement
         {
-            string xmlfragment = m_reader.ReadOuterXml();
-            XmlDocument doc = new XmlDocument();
-            doc.LoadXml(xmlfragment);
+            get { return "Type"; }
+        }
 
-            FeatureSetRow row = null;
-
-            if (doc["Row"] != null)
-                row = new XmlSqlResultRow(this, doc["Row"]);
-
-            if (m_reader.Name != "Row")
-            {
-                m_reader.Close();
-                m_reader = null;
-            }
-
-            return row;
+        protected override string ValuesRootElement
+        {
+            get { return "Rows"; }
         }
 
-        protected override void CloseInternal()
+        protected override string ValuesRowElement
         {
-            
+            get { return "Row"; }
         }
 
-        public override int Depth
+        protected override string ValuesRowPropertyElement
         {
-            get { throw new NotImplementedException(); }
+            get { return "Column"; }
         }
 
-        public override System.Data.DataTable GetSchemaTable()
+        protected override string ValuesRowPropertyNameElement
         {
-            throw new NotImplementedException();
+            get { return "Name"; }
         }
 
-        public override int RecordsAffected
+        protected override string ValuesRowPropertyValueElement
         {
-            get { throw new NotImplementedException(); }
+            get { return "Value"; }
         }
     }
-
-    public class XmlSqlResultRow : FeatureSetRow
-    {
-        internal XmlSqlResultRow(FeatureSetReader parent, XmlNode node)
-			: base(parent)
-		{
-            string nodeName = "Column";
-
-            foreach (XmlNode p in node.SelectNodes(nodeName))
-            {
-                int ordinal = GetOrdinal(p["Name"].InnerText);
-                if (!m_nulls[ordinal])
-                    throw new Exception("Bad document, multiple: " + p["Name"].InnerText + " values in a single feature");
-                m_nulls[ordinal] = false;
-
-                XmlNode valueNode = p["Value"];
-                if (valueNode == null || string.IsNullOrEmpty(valueNode.InnerText))
-                {
-                    m_nulls[ordinal] = true;
-                }
-                else
-                {
-                    if (parent.Columns[ordinal].Type == typeof(string) || parent.Columns[ordinal].Type == Utility.UnmappedType)
-                        m_items[ordinal] = valueNode.InnerText;
-                    else if (parent.Columns[ordinal].Type == typeof(int))
-                        m_items[ordinal] = XmlConvert.ToInt32(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(long))
-                        m_items[ordinal] = XmlConvert.ToInt64(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(short))
-                        m_items[ordinal] = XmlConvert.ToInt16(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(float))
-                        m_items[ordinal] = XmlConvert.ToSingle(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(double))
-                        m_items[ordinal] = XmlConvert.ToDouble(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(bool))
-                        m_items[ordinal] = XmlConvert.ToBoolean(valueNode.InnerText);
-                    else if (parent.Columns[ordinal].Type == typeof(DateTime))
-                    {
-                        try
-                        {
-                            //Fix for broken ODBC provider
-                            string v = valueNode.InnerText;
-
-                            if (v.Trim().ToUpper().StartsWith("TIMESTAMP"))
-                                v = v.Trim().Substring("TIMESTAMP".Length).Trim();
-                            else if (v.Trim().ToUpper().StartsWith("DATE"))
-                                v = v.Trim().Substring("DATE".Length).Trim();
-                            else if (v.Trim().ToUpper().StartsWith("TIME"))
-                                v = v.Trim().Substring("TIME".Length).Trim();
-
-                            if (v != valueNode.InnerText)
-                            {
-                                if (v.StartsWith("'"))
-                                    v = v.Substring(1);
-                                if (v.EndsWith("'"))
-                                    v = v.Substring(0, v.Length - 1);
-
-                                m_items[ordinal] = DateTime.Parse(v, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
-                            }
-                            else
-                                m_items[ordinal] = XmlConvert.ToDateTime(v, XmlDateTimeSerializationMode.Unspecified);
-                        }
-                        catch (Exception ex)
-                        {
-                            //Unfortunately FDO supports invalid dates, such as the 30th feb
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = ex;
-                        }
-                    }
-                    else if (parent.Columns[ordinal].Type == Utility.GeometryType)
-                    {
-                        m_items[ordinal] = valueNode.InnerText;
-                        if (string.IsNullOrEmpty(valueNode.InnerText))
-                        {
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = null;
-                        }
-                        else
-                            m_lazyloadGeometry[ordinal] = true;
-                    }
-                    else
-                        throw new Exception("Unknown type: " + parent.Columns[ordinal].Type.FullName);
-                }
-            }
-		}
-    }
-
-    public class XmlSqlResultColumn : FeatureSetColumn
-    {
-        internal XmlSqlResultColumn(XmlNode node) : base()
-		{
-            if (node.Name == "Column")
-            {
-                m_name = node["Name"].InnerText;
-                m_allowNull = true;
-                switch (node["Type"].InnerText.ToLower().Trim())
-                {
-                    case "string":
-                        m_type = typeof(string);
-                        break;
-                    case "byte":
-                        m_type = typeof(Byte);
-                        break;
-                    case "int32":
-                    case "int":
-                    case "integer":
-                        m_type = typeof(int);
-                        break;
-                    case "int16":
-                        m_type = typeof(short);
-                        break;
-                    case "int64":
-                    case "long":
-                        m_type = typeof(long);
-                        break;
-                    case "float":
-                    case "single":
-                        m_type = typeof(float);
-                        break;
-                    case "double":
-                    case "decimal":
-                        m_type = typeof(double);
-                        break;
-                    case "boolean":
-                    case "bool":
-                        m_type = typeof(bool);
-                        return;
-                    case "datetime":
-                    case "date":
-                        m_type = typeof(DateTime);
-                        break;
-                    case "raster":
-                        m_type = Utility.RasterType;
-                        break;
-                    case "geometry":
-                        m_type = Utility.GeometryType;
-                        break;
-                    default:
-                        //throw new Exception("Failed to find appropriate type for: " + node["xs:simpleType"]["xs:restriction"].Attributes["base"].Value);
-                        m_type = Utility.UnmappedType;
-                        break;
-                }
-            }
-            else
-            {
-                throw new Exception("Bad document. Expected element: PropertyDefinition"); //LOCALIZE
-            }
-		}
-    }
 }

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeConnection.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -35,6 +35,8 @@
 using System.Diagnostics;
 using OSGeo.MapGuide.MaestroAPI.Commands;
 using OSGeo.MapGuide.MaestroAPI.Native.Commands;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+using OSGeo.MapGuide.MaestroAPI.Feature;
 
 namespace OSGeo.MapGuide.MaestroAPI.Native
 {
@@ -177,13 +179,20 @@
             }
         }
 
+        private void LogMethodCall(string method, bool success, params string[] values)
+        {
+            OnRequestDispatched(method + "(" + string.Join(", ", values) + ") " + ((success) ? "Success" : "Failure"));
+        }
+
 		public override ResourceList GetRepositoryResources(string startingpoint, string type, int depth, bool computeChildren)
 		{
 			if (type == null)
 				type = "";
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			System.Reflection.MethodInfo mi = res.GetType().GetMethod("EnumerateResources", new Type[] { typeof(MgResourceIdentifier), typeof(int), typeof(string), typeof(bool) });
-			return (ResourceList) base.DeserializeObject(typeof(ResourceList), Utility.MgStreamToNetStream(res, mi, new object[] {new MgResourceIdentifier(startingpoint), depth, type, computeChildren }));
+			var result = (ResourceList) base.DeserializeObject(typeof(ResourceList), Utility.MgStreamToNetStream(res, mi, new object[] {new MgResourceIdentifier(startingpoint), depth, type, computeChildren }));
+            LogMethodCall("MgResourceService::EnumerateResources", true, startingpoint, depth.ToString(), type, computeChildren.ToString());
+            return result;
 		}
 
 		public override FeatureProviderRegistryFeatureProvider[] FeatureProviders
@@ -192,6 +201,7 @@
 			{
 				MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
                 var reg = (FeatureProviderRegistry)base.DeserializeObject(typeof(FeatureProviderRegistry), Utility.MgStreamToNetStream(fes, fes.GetType().GetMethod("GetFeatureProviders"), new object[] { }));
+                LogMethodCall("MgFeatureService::GetFeatureProviders", true);
                 return reg.FeatureProvider.ToArray();
 			}
 		}
@@ -207,31 +217,41 @@
 				if (sb.Length > 0)
 					sb.Length--;
 			}
-			return fes.TestConnection(providername, sb.ToString()) ? "True" : "Unspecified errors";
+			var res = fes.TestConnection(providername, sb.ToString()) ? "True" : "Unspecified errors";
+            LogMethodCall("MgFeatureService::TestConnection", true, providername, sb.ToString());
+            return res;
 		}
 
 		public override string TestConnection(string featuresource)
 		{
 			MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
-			return fes.TestConnection(new MgResourceIdentifier(featuresource)) ? "True" : "Unspecified errors";
+			var res = fes.TestConnection(new MgResourceIdentifier(featuresource)) ? "True" : "Unspecified errors";
+            LogMethodCall("MgFeatureService::TestConnection", true, featuresource);
+            return res;
 		}
 
 		public FdoProviderCapabilities GetProviderCapabilities(string provider)
 		{
 			MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
-			return (FdoProviderCapabilities) base.DeserializeObject(typeof(FdoProviderCapabilities), Utility.MgStreamToNetStream(fes, fes.GetType().GetMethod("GetCapabilities"), new object[] { provider }));
+			var res = (FdoProviderCapabilities) base.DeserializeObject(typeof(FdoProviderCapabilities), Utility.MgStreamToNetStream(fes, fes.GetType().GetMethod("GetCapabilities"), new object[] { provider }));
+            LogMethodCall("MgFeatureService::GetProviderCapabilities", true, provider);
+            return res;
 		}
 
 		public override System.IO.Stream GetResourceData(string resourceID, string dataname)
 		{
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
-			return Utility.MgStreamToNetStream(res, res.GetType().GetMethod("GetResourceData"), new object[] { new MgResourceIdentifier(resourceID), dataname });
+			var result = Utility.MgStreamToNetStream(res, res.GetType().GetMethod("GetResourceData"), new object[] { new MgResourceIdentifier(resourceID), dataname });
+            LogMethodCall("MgResourceService::GetResourceData", true, resourceID, dataname);
+            return result;
 		}
 
 		public override Stream GetResourceXmlData(string resourceID)
 		{
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
-            return Utility.MgStreamToNetStream(res, res.GetType().GetMethod("GetResourceContent"), new object[] { new MgResourceIdentifier(resourceID) });
+            var result = Utility.MgStreamToNetStream(res, res.GetType().GetMethod("GetResourceContent"), new object[] { new MgResourceIdentifier(resourceID) });
+            LogMethodCall("MgResourceService::GetResourceContent", true, resourceID);
+            return result;
 		}
 
 		public override void SetResourceXmlData(string resourceid, System.IO.Stream content, System.IO.Stream header)
@@ -245,36 +265,37 @@
             MgByteReader rH = bufHeader.Length == 0 ? null : new MgByteReader(bufHeader, bufHeader.Length, "text/xml");
             MgByteReader rC = bufContent.Length == 0 ? null : new MgByteReader(bufContent, bufContent.Length, "text/xml");
             res.SetResource(new MgResourceIdentifier(resourceid), rC, rH);
-
+            LogMethodCall("MgResourceService::SetResource", true, resourceid, "MgByteReader", "MgByteReader");
             if (exists)
                 OnResourceUpdated(resourceid);
             else
                 OnResourceAdded(resourceid);
 		}
 
-        public FeatureSetReader ExecuteSqlQuery(string featureSourceID, string sql)
+        public IReader ExecuteSqlQuery(string featureSourceID, string sql)
         {
             MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
             MgSqlDataReader reader = fes.ExecuteSqlQuery(new MgResourceIdentifier(featureSourceID), sql);
-            return new LocalNativeFeatureSetReader(reader);
+            LogMethodCall("MgFeatureService::ExecuteSqlQuery", true, featureSourceID, sql);
+            return new LocalNativeSqlReader(reader);
         }
 
-		public FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query)
+		public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query)
 		{
 			return QueryFeatureSource(resourceID, schema, query, null);
 		}
 
-		public FeatureSetReader QueryFeatureSource(string resourceID, string schema)
+		public IFeatureReader QueryFeatureSource(string resourceID, string schema)
 		{
 			return QueryFeatureSource(resourceID, schema, null, null);
 		}
 
-        public FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns)
+        public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns)
         {
             return QueryFeatureSource(resourceID, schema, query, columns, null);
         }
 
-		public FeatureSetReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, System.Collections.Specialized.NameValueCollection computedProperties)
+		public IFeatureReader QueryFeatureSource(string resourceID, string schema, string query, string[] columns, System.Collections.Specialized.NameValueCollection computedProperties)
 		{
 			MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
 			MgFeatureQueryOptions mgf = new MgFeatureQueryOptions();
@@ -289,14 +310,14 @@
                 foreach (string s in computedProperties.Keys)
                     mgf.AddComputedProperty(s, computedProperties[s]);
 
-            MgReader mr = fes.SelectFeatures(new MgResourceIdentifier(resourceID), schema, mgf);
+            MgFeatureReader mr = fes.SelectFeatures(new MgResourceIdentifier(resourceID), schema, mgf);
 
-            
+            LogMethodCall("MgFeatureService::SelectFeatures", true, resourceID, schema, "MgFeatureQueryOptions");
 
-   			return new LocalNativeFeatureSetReader(mr);
+   			return new LocalNativeFeatureReader(mr);
 		}
 
-        private FeatureSetReader AggregateQueryFeatureSourceCore(string resourceID, string schema, string query, string[] columns, System.Collections.Specialized.NameValueCollection computedProperties)
+        private IReader AggregateQueryFeatureSourceCore(string resourceID, string schema, string query, string[] columns, System.Collections.Specialized.NameValueCollection computedProperties)
         {
             MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
             MgFeatureAggregateOptions mgf = new MgFeatureAggregateOptions();
@@ -311,15 +332,19 @@
                 foreach (string s in computedProperties.Keys)
                     mgf.AddComputedProperty(s, computedProperties[s]);
 
-            return new LocalNativeFeatureSetReader(fes.SelectAggregate(new MgResourceIdentifier(resourceID), schema, mgf));
+            var reader = fes.SelectAggregate(new MgResourceIdentifier(resourceID), schema, mgf);
+
+            LogMethodCall("MgFeatureService::SelectAggregate", true, resourceID, schema, "MgFeatureAggregateOptions");
+
+            return new LocalNativeDataReader(reader);
         }
 
-        public override FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns)
+        public override IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, string[] columns)
         {
             return AggregateQueryFeatureSourceCore(resourceID, schema, filter, columns, null);
         }
 
-        public override FeatureSetReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, System.Collections.Specialized.NameValueCollection aggregateFunctions)
+        public override IReader AggregateQueryFeatureSource(string resourceID, string schema, string filter, System.Collections.Specialized.NameValueCollection aggregateFunctions)
         {
             return AggregateQueryFeatureSourceCore(resourceID, schema, filter, null, aggregateFunctions);
         }
@@ -329,106 +354,40 @@
 		{
 			MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
 			System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(fes.DescribeSchemaAsXml(new MgResourceIdentifier(resourceID), "")));
+
+            LogMethodCall("MgFeatureService::DescribeSchemaAsXml", true, resourceID, "");
+
 			return new FeatureSourceDescription(ms);
 		}
 
-		public override FeatureSourceDescription DescribeFeatureSource(string resourceID, string schema)
+        public override FeatureSchema DescribeFeatureSource(string resourceID, string schema)
 		{
 			MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
             if (schema != null && schema.IndexOf(":") > 0)
                 schema = schema.Split(':')[0];
 			System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(fes.DescribeSchemaAsXml(new MgResourceIdentifier(resourceID), schema)));
-			return new FeatureSourceDescription(ms);
-		}
-        /*
-		public override void CreateRuntimeMap(string resourceID, string mapdefinition)
-		{
-            string mapname = new ResourceIdentifier(resourceID).Path;
-			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
-			MgMap map = new MgMap();
-			map.Create(res, new MgResourceIdentifier(mapdefinition), mapname);
-			map.Save(res, new MgResourceIdentifier(resourceID));
-        
-            //Grrr... This does not happen automatically, even though it is required!
-            MgSelection sel = new MgSelection(map);
-            sel.Save(res, mapname);
-        }
 
-		public void CreateRuntimeMap(string resourceID, IMapDefinition map)
-		{
-			ResourceIdentifier guid = new ResourceIdentifier(Guid.NewGuid().ToString(), ResourceTypes.MapDefinition, this.SessionID);
-			try
-			{
-				SaveResourceAs(map, guid);
-				CreateRuntimeMap(resourceID, guid);
-			}
-			finally
-			{
-				try { DeleteResource(guid); }
-				catch { }
-			}
-		}
+            LogMethodCall("MgFeatureService::DescribeSchemaAsXml", true, resourceID, schema);
 
-		public void SaveRuntimeMap(string resourceID, RuntimeMapBase map)
-		{
-			System.IO.MemoryStream ms = new System.IO.MemoryStream();
-			System.IO.MemoryStream ms2 = null;
-
-			//Apparently the name is used to reconstruct the resourceId rather than pass it around
-			//inside the map server
-			string r = map.Name;
-			string t = map.ResourceID;
-
-			string mapname = resourceID.Substring(resourceID.IndexOf("//") + 2);
-			mapname = mapname.Substring(0, mapname.LastIndexOf("."));
-			map.Name = mapname;
-			map.ResourceID = resourceID;
-
-			try
-			{
-				map.Serialize(new MgBinarySerializer(ms, this.SiteVersion));
-				if (this.SiteVersion >= SiteVersions.GetVersion(KnownSiteVersions.MapGuideOS1_2))
-				{
-					ms2 = new System.IO.MemoryStream();
-					map.SerializeLayerData(new MgBinarySerializer(ms2, this.SiteVersion));
-				}
-
-				SetResourceData(resourceID, "RuntimeData", ResourceDataType.Stream, ms);
-				if (ms2 != null)
-					SetResourceData(resourceID, "LayerGroupData", ResourceDataType.Stream, ms2);
-
-                if (map.HasLoadedSelectionXml)
-                    SetSelectionXml(resourceID, map.Selection.ToXml());
-			}
-			finally
-			{
-				map.Name = r;
-				map.ResourceID = t;
-			}
+            return new FeatureSourceDescription(ms).Schemas[0];
 		}
-
-        public RuntimeMapBase GetRuntimeMap(string resourceID)
-        {
-            RuntimeMapBase m = RuntimeMapBase.Deserialize(new MgBinaryDeserializer(this.GetResourceData(resourceID, "RuntimeData"), this.SiteVersion));
-            if (this.SiteVersion >= SiteVersions.GetVersion(KnownSiteVersions.MapGuideOS1_2))
-                m.DeserializeLayerData(new MgBinaryDeserializer(this.GetResourceData(resourceID, "LayerGroupData"), this.SiteVersion));
-
-            m.CurrentConnection = this;
-            return m;
-        }
-         */
-
+        
 		public void DeleteResourceData(string resourceID, string dataname)
 		{
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			res.DeleteResourceData(new MgResourceIdentifier(resourceID), dataname);
+
+            LogMethodCall("MgResourceService::DeleteResourceData", true, resourceID, dataname);
 		}
 
 		public ResourceDataList EnumerateResourceData(string resourceID)
 		{
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
-			System.IO.Stream ms = Utility.MgStreamToNetStream(res, res.GetType().GetMethod("EnumerateResourceData"), new object[] { new MgResourceIdentifier(resourceID) });			
-			return (ResourceDataList)DeserializeObject(typeof(ResourceDataList), ms);
+			System.IO.Stream ms = Utility.MgStreamToNetStream(res, res.GetType().GetMethod("EnumerateResourceData"), new object[] { new MgResourceIdentifier(resourceID) });
+
+            LogMethodCall("MgResourceService::EnumerateResourceData", true, resourceID);
+            
+            return (ResourceDataList)DeserializeObject(typeof(ResourceDataList), ms);
 		}
 
 		public override void DeleteResource(string resourceID)
@@ -436,6 +395,8 @@
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			res.DeleteResource(new MgResourceIdentifier(resourceID));
 
+            LogMethodCall("MgResourceService::DeleteResource", true, resourceID);
+
             OnResourceDeleted(resourceID);
 		}
 
@@ -455,6 +416,8 @@
 
                     MgPropertyCollection col = amd.GetInformationProperties();
 
+                    LogMethodCall("MgServerAdmin::GetInformationProperties", true);
+
                     for (int i = 0; i < col.Count; i++)
                     {
                         if (col[i].Name == "ServerVersion")
@@ -508,7 +471,9 @@
 		{
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
             System.IO.Stream ms = Utility.MgStreamToNetStream(res, res.GetType().GetMethod("EnumerateReferences"), new object[] { new MgResourceIdentifier(resourceid) });
-			return (ResourceReferenceList)DeserializeObject(typeof(ResourceReferenceList), ms);
+
+            LogMethodCall("MgResourceService::EnumerateReferences", true, resourceid);
+            return (ResourceReferenceList)DeserializeObject(typeof(ResourceReferenceList), ms);
 		}
 
 		public override void CopyResource(string oldpath, string newpath, bool overwrite)
@@ -518,6 +483,8 @@
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			res.CopyResource(new MgResourceIdentifier(oldpath), new MgResourceIdentifier(newpath), overwrite);
 
+            LogMethodCall("MgResourceService::CopyResource", true, oldpath, newpath, overwrite.ToString());
+
             if (exists)
                 OnResourceUpdated(newpath);
             else
@@ -535,6 +502,8 @@
 
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			res.CopyResource(new MgResourceIdentifier(oldpath), new MgResourceIdentifier(newpath), overwrite);
+            
+            LogMethodCall("MgResourceService::CopyResource", true, oldpath, newpath, overwrite.ToString());
 
             if (exists)
                 OnResourceUpdated(newpath);
@@ -549,6 +518,8 @@
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			res.MoveResource(new MgResourceIdentifier(oldpath), new MgResourceIdentifier(newpath), overwrite);
 
+            LogMethodCall("MgResourceService::MoveResource", true, oldpath, newpath, overwrite.ToString());
+
             OnResourceDeleted(oldpath);
             if (exists)
                 OnResourceUpdated(newpath);
@@ -568,6 +539,8 @@
 			MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 			res.MoveResource(new MgResourceIdentifier(oldpath), new MgResourceIdentifier(newpath), overwrite);
 
+            LogMethodCall("MgResourceService::MoveResource", true, oldpath, newpath, overwrite.ToString());
+
             OnResourceDeleted(oldpath);
             if (exists)
                 OnResourceUpdated(newpath);
@@ -592,7 +565,11 @@
             //TODO: The render method is missing the overload for the Clip parameter
             object[] args = new object[] { map, sel, gf.CreateCoordinateXY(x, y), scale, width, height, color, format, true };
             Type[] types = new Type[] { args[0].GetType(), args[1].GetType(), args[2].GetType(), args[3].GetType(), args[4].GetType(), args[5].GetType(), args[6].GetType(), args[7].GetType(), args[8].GetType() };
-			return Utility.MgStreamToNetStream(rnd, rnd.GetType().GetMethod("RenderMap", types), args);
+			var result = Utility.MgStreamToNetStream(rnd, rnd.GetType().GetMethod("RenderMap", types), args);
+
+            LogMethodCall("MgRenderingService::RenderMap", true, "MgMap", "MgSelection", "MgPoint("+ x + "," + y + ")", scale.ToString(), width.ToString(), height.ToString(), "MgColor", format, true.ToString());
+
+            return result;
 		}
 
         public override System.IO.Stream RenderRuntimeMap(string resourceId, double x1, double y1, double x2, double y2, int width, int height, int dpi, string format, bool clip)
@@ -614,7 +591,11 @@
 
             object[] args = new object[] { map, sel, env, width, height, color, format };
             Type[] types = new Type[] { args[0].GetType(), args[1].GetType(), args[2].GetType(), args[3].GetType(), args[4].GetType(), args[5].GetType(), args[6].GetType() };
-            return Utility.MgStreamToNetStream(rnd, rnd.GetType().GetMethod("RenderMap", types), args);
+            var result = Utility.MgStreamToNetStream(rnd, rnd.GetType().GetMethod("RenderMap", types), args);
+
+            LogMethodCall("MgRenderingService::RenderMap", true, "MgMap", "MgSelection", "MgEnvelope", width.ToString(), height.ToString(), "MgColor", format);
+
+            return result;
         }
 
         public override Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selection, string format, bool keepSelection)
@@ -630,7 +611,11 @@
 
             object[] args = new object[] { mmap, sel, format, keepSelection };
             Type[] types = new Type[] { args[0].GetType(), args[1].GetType(), args[2].GetType(), args[3].GetType() };
-            return Utility.MgStreamToNetStream(rnd, rnd.GetType().GetMethod("RenderDynamicOverlay", types), args);
+            var result = Utility.MgStreamToNetStream(rnd, rnd.GetType().GetMethod("RenderDynamicOverlay", types), args);
+
+            LogMethodCall("MgRenderingService::RenderDynamicOverlay", true, "MgMap", "MgSelection", format, keepSelection.ToString());
+
+            return result;
         }
 
 		public override bool IsSessionExpiredException(Exception ex)
@@ -648,6 +633,9 @@
 		{
 			MgFeatureService fes = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
 			MgSpatialContextReader rd = fes.GetSpatialContexts(new MgResourceIdentifier(resourceID), activeOnly);
+
+            LogMethodCall("MgFeatureService::GetSpatialContexts", true, resourceID, activeOnly.ToString());
+
             return this.DeserializeObject(typeof(FdoSpatialContextList), Utility.MgStreamToNetStream(rd, rd.GetType().GetMethod("ToXml"), null)) as FdoSpatialContextList;
 		}
 
@@ -668,7 +656,11 @@
 			else if (parts.Length != 2)
 				throw new Exception("Unable to parse classname into class and schema: " + classname);
 
-            foreach (MgClassDefinition cdef in fes.DescribeSchema(resId, parts[0])[0].GetClasses())
+            var classes = fes.DescribeSchema(resId, parts[0])[0].GetClasses();
+
+            LogMethodCall("MgFeatureService::DescribeSchema", true, resourceID, parts[0]);
+
+            foreach (MgClassDefinition cdef in classes)
             {
                 if (parts.Length == 1 || cdef.Name.ToLower().Trim().Equals(parts[1].ToLower().Trim()))
                 {
@@ -742,12 +734,17 @@
             MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
 
             if (header == null)
+            {
                 res.UpdateRepository(new MgResourceIdentifier(resourceId), null, null);
+                LogMethodCall("MgResourceService::UpdateRepository", true, resourceId, "null", "null");
+            }
             else
             {
                 byte[] data = this.SerializeObject(header).ToArray();
                 MgByteReader rd = new MgByteReader(data, data.Length, "text/xml");
                 res.UpdateRepository(new MgResourceIdentifier(resourceId), null, rd);
+
+                LogMethodCall("MgResourceService::UpdateRepository", true, resourceId, "null", "MgByteReader");
             }
         }
 
@@ -769,7 +766,10 @@
         public override UserList EnumerateUsers(string group)
         {
             if (m_cachedUserList == null)
+            {
                 m_cachedUserList = this.DeserializeObject<UserList>(Utility.MgStreamToNetStream(this.Connection.GetSite(), this.Connection.GetSite().GetType().GetMethod("EnumerateUsers"), new object[] { group }));
+                LogMethodCall("MgSite::EnumerateUsers", true, group);
+            }
             return m_cachedUserList;
         }
 
@@ -780,7 +780,10 @@
         public override GroupList EnumerateGroups()
         {
             if (m_cachedGroupList == null)
+            {
                 m_cachedGroupList = this.DeserializeObject<GroupList>(Utility.MgStreamToNetStream(this.Connection.GetSite(), this.Connection.GetSite().GetType().GetMethod("EnumerateGroups"), null));
+                LogMethodCall("MgSite::EnumerateGroups", true);
+            }
             return m_cachedGroupList;
         }
 
@@ -790,7 +793,9 @@
 
             Type[] types = new Type[] { typeof(MgResourceIdentifier), typeof(string), typeof(int), typeof(int), typeof(int) };
 
-            return Utility.MgStreamToNetStream(ts, ts.GetType().GetMethod("GetTile", types), new object[] { new MgResourceIdentifier(mapdefinition), baselayergroup, col, row, scaleindex });
+            var result = Utility.MgStreamToNetStream(ts, ts.GetType().GetMethod("GetTile", types), new object[] { new MgResourceIdentifier(mapdefinition), baselayergroup, col, row, scaleindex });
+            LogMethodCall("MgTileService::GetTile", true, mapdefinition, baselayergroup, col.ToString(), row.ToString(), scaleindex.ToString());
+            return result;
             //ts.GetTile(new MgResourceIdentifier(mapdefinition), baselayergroup, col, row, scaleindex)
         }
 
@@ -800,7 +805,9 @@
             if (this.SiteVersion >= new Version(2, 1))
             {
                 MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
-                return res.ResourceExists(new MgResourceIdentifier(resourceid));
+                var result = res.ResourceExists(new MgResourceIdentifier(resourceid));
+                LogMethodCall("MgResourceService::ResourceExists", true, resourceid);
+                return result;
             }
             else
             {
@@ -812,6 +819,7 @@
         {
             MgFeatureService featSvc = this.Connection.CreateService(MgServiceType.FeatureService) as MgFeatureService;
             MgStringCollection result = featSvc.GetConnectionPropertyValues(providerName, propertyName, partialConnectionString);
+            LogMethodCall("MgFeatureService::GetConnectionPropertyValues", true, providerName, propertyName, partialConnectionString);
             string[] values = new string[result.GetCount()];
             for (int i = 0; i < result.GetCount(); i++)
             {
@@ -847,7 +855,9 @@
             MgMappingService ms = this.Connection.CreateService(MgServiceType.MappingService) as MgMappingService;
             MgResourceIdentifier ldef = new MgResourceIdentifier(layerdefinition);
 
-            return new System.Drawing.Bitmap(Utility.MgStreamToNetStream(ms, ms.GetType().GetMethod("GenerateLegendImage"), new object[] { ldef, scale, 16, 16, "PNG", type, themeIndex }));
+            var bmp = new System.Drawing.Bitmap(Utility.MgStreamToNetStream(ms, ms.GetType().GetMethod("GenerateLegendImage"), new object[] { ldef, scale, 16, 16, "PNG", type, themeIndex }));
+            LogMethodCall("MgMappingService::GetLegendImage", true, scale.ToString(), layerdefinition, themeIndex.ToString(), type.ToString());
+            return bmp;
         }
 
         public OSGeo.MapGuide.MaestroAPI.Services.IFeatureService FeatureService
@@ -915,7 +925,7 @@
             MgResourceService res = this.Connection.CreateService(MgServiceType.ResourceService) as MgResourceService;
             MgByteReader reader = new MgByteReader(data, data.Length, "binary/octet-stream");
             res.SetResourceData(new MgResourceIdentifier(resourceid), dataname, datatype.ToString(), reader);
-
+            LogMethodCall("MgResourceService::SetResourceData", true, resourceid, dataname, datatype.ToString(), "MgByteReader");
             if (callback != null)
                 callback(data.Length, 0, data.Length);
         }
@@ -932,8 +942,8 @@
             MgByteReader rd = pkgSource.GetReader();
             res.ApplyResourcePackage(rd);
             rd.Dispose();
+            LogMethodCall("MgResourceService::ApplyResourcePackage", true, "MgByteReader");
 
-
             if (callback != null)
                 callback(fi.Length, 0, fi.Length);
         }
@@ -961,7 +971,9 @@
         public override DataStoreList EnumerateDataStores(string providerName, string partialConnString)
         {
             var fes = (MgFeatureService)this.Connection.CreateService(MgServiceType.FeatureService);
-            return (DataStoreList)base.DeserializeObject(typeof(DataStoreList), Utility.MgStreamToNetStream(fes, fes.GetType().GetMethod("EnumerateDataStores"), new object[] { providerName, partialConnString }));
+            var list = (DataStoreList)base.DeserializeObject(typeof(DataStoreList), Utility.MgStreamToNetStream(fes, fes.GetType().GetMethod("EnumerateDataStores"), new object[] { providerName, partialConnString }));
+            LogMethodCall("MgFeatureService::EnumerateDataStores", true, providerName, partialConnString);
+            return list;
         }
 
         public override string[] GetSchemas(string resourceId)
@@ -969,6 +981,7 @@
             List<string> names = new List<string>();
             var fsvc = (MgFeatureService)this.Connection.CreateService(MgServiceType.FeatureService);
             var schemaNames = fsvc.GetSchemas(new MgResourceIdentifier(resourceId));
+            LogMethodCall("MgFeatureService::GetSchemas", true, resourceId);
             for (int i = 0; i < schemaNames.GetCount(); i++)
             {
                 names.Add(schemaNames.GetItem(i));
@@ -981,6 +994,7 @@
             List<string> names = new List<string>();
             var fsvc = (MgFeatureService)this.Connection.CreateService(MgServiceType.FeatureService);
             var classNames = fsvc.GetClasses(new MgResourceIdentifier(resourceId), schemaName);
+            LogMethodCall("MgFeatureService::GetClasses", true, resourceId, schemaName);
             for (int i = 0; i < classNames.GetCount(); i++)
             {
                 names.Add(classNames.GetItem(i));
@@ -1019,6 +1033,7 @@
             info.Statistics = new SiteInformationStatistics();
 
             var props = this.ServerAdmin.GetInformationProperties();
+            LogMethodCall("MgServerAdmin::GetInformationProperties", true);
 
             var prop = props.GetItem(MgServerInformationProperties.DisplayName);
             info.SiteServer.DisplayName = ((MgStringProperty)prop).GetValue();
@@ -1083,13 +1098,16 @@
         public Stream DescribeDrawing(string resourceID)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("DescribeDrawing"), new object[] { new MgResourceIdentifier(resourceID) });
+            var result = Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("DescribeDrawing"), new object[] { new MgResourceIdentifier(resourceID) });
+            LogMethodCall("MgDrawingService::DescribeDrawing", true, resourceID);
+            return result;
         }
 
         public string[] EnumerateDrawingLayers(string resourceID, string sectionName)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
             var layers = dwSvc.EnumerateLayers(new MgResourceIdentifier(resourceID), sectionName);
+            LogMethodCall("MgDrawingService::EnumerateLayers", true, resourceID, sectionName);
             var layerNames = new List<string>();
             for (int i = 0; i < layers.GetCount(); i++)
             {
@@ -1101,43 +1119,57 @@
         public DrawingSectionResourceList EnumerateDrawingSectionResources(string resourceID, string sectionName)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return base.DeserializeObject<DrawingSectionResourceList>(Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("EnumerateDrawingSectionResources"), new object[] { new MgResourceIdentifier(resourceID), sectionName }));
+            var list = base.DeserializeObject<DrawingSectionResourceList>(Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("EnumerateDrawingSectionResources"), new object[] { new MgResourceIdentifier(resourceID), sectionName }));
+            LogMethodCall("MgDrawingService::EnumerateDrawingSectionResources", true, resourceID, sectionName);
+            return list;
         }
 
         public DrawingSectionList EnumerateDrawingSections(string resourceID)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return base.DeserializeObject<DrawingSectionList>(Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("EnumerateDrawingSections"), new object[] { new MgResourceIdentifier(resourceID) }));
+            var list = base.DeserializeObject<DrawingSectionList>(Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("EnumerateDrawingSections"), new object[] { new MgResourceIdentifier(resourceID) }));
+            LogMethodCall("MgDrawingService::EnumerateDrawingSections", true, resourceID);
+            return list;
         }
 
         public string GetDrawingCoordinateSpace(string resourceID)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return dwSvc.GetCoordinateSpace(new MgResourceIdentifier(resourceID));
+            var res = dwSvc.GetCoordinateSpace(new MgResourceIdentifier(resourceID));
+            LogMethodCall("MgDrawingService::GetCoordinateSpace", true, resourceID);
+            return res;
         }
 
         public Stream GetDrawing(string resourceID)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetDrawing"), new object[] { new MgResourceIdentifier(resourceID) });
+            var res = Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetDrawing"), new object[] { new MgResourceIdentifier(resourceID) });
+            LogMethodCall("MgDrawingService::GetDrawing", true, resourceID);
+            return res;
         }
 
         public Stream GetLayer(string resourceID, string sectionName, string layerName)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetLayer"), new object[] { new MgResourceIdentifier(resourceID), sectionName, layerName });
+            var res = Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetLayer"), new object[] { new MgResourceIdentifier(resourceID), sectionName, layerName });
+            LogMethodCall("MgDrawingService::GetLayer", true, resourceID, sectionName, layerName);
+            return res;
         }
 
         public Stream GetSection(string resourceID, string sectionName)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSection"), new object[] { new MgResourceIdentifier(resourceID), sectionName });
+            var res = Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSection"), new object[] { new MgResourceIdentifier(resourceID), sectionName });
+            LogMethodCall("MgDrawingService::GetSection", true, resourceID, sectionName);
+            return res;
         }
 
         public Stream GetSectionResource(string resourceID, string resourceName)
         {
             var dwSvc = (MgDrawingService)this.Connection.CreateService(MgServiceType.DrawingService);
-            return Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSectionResource"), new object[] { new MgResourceIdentifier(resourceID), resourceName });
+            var res = Utility.MgStreamToNetStream(dwSvc, dwSvc.GetType().GetMethod("GetSectionResource"), new object[] { new MgResourceIdentifier(resourceID), resourceName });
+            LogMethodCall("MgDrawingService::GetSectionResource", true, resourceID, resourceName);
+            return res;
         }
     }
 }

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeDataReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,68 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Native
+{
+    public class LocalNativeDataReader : ReaderBase
+    {
+        private MgDataReader _reader;
+
+        public LocalNativeDataReader(MgDataReader reader) 
+        {
+            _reader = reader;
+        }
+
+        protected override IRecord ReadNextRecord()
+        {
+            if (_reader.ReadNext())
+                return new LocalNativeRecord(_reader);
+
+            return null;
+        }
+
+        public override void Close()
+        {
+            _reader.Close();
+        }
+
+        public override ReaderType ReaderType
+        {
+            get { return ReaderType.Data; }
+        }
+
+        public override string GetName(int index)
+        {
+            return _reader.GetPropertyName(index);
+        }
+
+        public override Type GetFieldType(int i)
+        {
+            string name = GetName(i);
+            //The enum uses the same values as MgPropertyType
+            var type = (PropertyValueType)_reader.GetPropertyType(name);
+            return ClrFdoTypeMap.GetClrType(type);
+        }
+    }
+}
\ No newline at end of file

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeature.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,34 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+
+namespace OSGeo.MapGuide.MaestroAPI.Native
+{
+    public class LocalNativeFeature : FeatureBase
+    {
+        public LocalNativeFeature(MgFeatureReader reader)
+            : base(Utility.ConvertClassDefinition(reader.GetClassDefinition()))
+        {
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,50 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+
+namespace OSGeo.MapGuide.MaestroAPI.Native
+{
+    public class LocalNativeFeatureReader : FeatureReaderBase
+    {
+        private MgFeatureReader _reader;
+
+        public LocalNativeFeatureReader(MgFeatureReader reader) 
+        {
+            _reader = reader;
+        }
+
+        protected override IFeature ReadNextFeature()
+        {
+            if (_reader.ReadNext())
+                return new LocalNativeFeature(_reader);
+
+            return null;
+        }
+
+        public override void Close()
+        {
+            _reader.Close();
+        }
+    }
+}

Deleted: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureSetReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureSetReader.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeFeatureSetReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -1,199 +0,0 @@
-#region Disclaimer / License
-// Copyright (C) 2010, Jackie Ng
-// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
-// 
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-// 
-// This library 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
-// Lesser General Public License for more details.
-// 
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-// 
-#endregion
-using System;
-using System.Collections.Generic;
-using System.Text;
-using OSGeo.MapGuide.MaestroAPI.Exceptions;
-
-namespace OSGeo.MapGuide.MaestroAPI.Native
-{
-    public class LocalNativeFeatureSetReader : FeatureSetReader
-    {
-        private OSGeo.MapGuide.MgReader m_rd;
-
-        public LocalNativeFeatureSetReader(OSGeo.MapGuide.MgReader mr)
-            : base()
-        {
-            m_rd = mr;
-
-            FeatureSetColumn[] cols = new FeatureSetColumn[mr.GetPropertyCount()];
-            for (int i = 0; i < cols.Length; i++)
-                cols[i] = new LocalNativeFeatureSetColumn(mr.GetPropertyName(i), mr.GetPropertyType(mr.GetPropertyName(i)));
-
-            InitColumns(cols);
-        }
-
-        protected override bool ReadInternal()
-        {
-            return m_rd.ReadNext();
-        }
-
-        protected override FeatureSetRow ProcessFeatureRow()
-        {
-            return new LocalNativeFeatureSetRow(this, m_rd);
-        }
-
-        protected override void CloseInternal()
-        {
-            m_rd.Close();
-        }
-
-        public override int Depth
-        {
-            get
-            {
-                return -1;
-            }
-        }
-
-        public override System.Data.DataTable GetSchemaTable()
-        {
-            throw new NotImplementedException();
-        }
-
-        public override int RecordsAffected
-        {
-            get { throw new NotImplementedException(); }
-        }
-    }
-
-    public class LocalNativeFeatureSetRow : FeatureSetRow
-    {
-        private Topology.IO.MapGuide.MgReader m_mgReader = null;
-
-        private Topology.IO.MapGuide.MgReader MgReader
-        {
-            get
-            {
-                if (m_mgReader == null)
-                {
-                    m_mgReader = new Topology.IO.MapGuide.MgReader();
-                }
-
-                return m_mgReader;
-            }
-        }
-
-        internal LocalNativeFeatureSetRow(FeatureSetReader parent, OSGeo.MapGuide.MgReader rd)
-            : base(parent)
-        {
-            for (int i = 0; i < m_parent.Columns.Length; i++)
-            {
-                string p = m_parent.Columns[i].Name;
-                int ordinal = GetOrdinal(p);
-                m_nulls[ordinal] = rd.IsNull(p);
-
-                if (!m_nulls[ordinal])
-                {
-                    if (parent.Columns[ordinal].Type == typeof(string))
-                        m_items[ordinal] = rd.GetString(p);
-                    else if (parent.Columns[ordinal].Type == typeof(int))
-                        m_items[ordinal] = rd.GetInt32(p);
-                    else if (parent.Columns[ordinal].Type == typeof(long))
-                        m_items[ordinal] = rd.GetInt64(p);
-                    else if (parent.Columns[ordinal].Type == typeof(short))
-                        m_items[ordinal] = rd.GetInt16(p);
-                    else if (parent.Columns[ordinal].Type == typeof(double))
-                        m_items[ordinal] = rd.GetDouble(p);
-                    else if (parent.Columns[ordinal].Type == typeof(float))
-                        m_items[ordinal] = rd.GetSingle(p);
-                    else if (parent.Columns[ordinal].Type == typeof(bool))
-                        m_items[ordinal] = rd.GetBoolean(p);
-                    else if (parent.Columns[ordinal].Type == typeof(DateTime))
-                    {
-                        MgDateTime t = rd.GetDateTime(p);
-                        try
-                        {
-                            m_items[ordinal] = new DateTime(t.Year, t.Month, t.Day, t.Hour, t.Minute, t.Second);
-                        }
-                        catch (Exception ex)
-                        {
-                            //Unfortunately FDO supports invalid dates, such as the 30th feb
-                            m_nulls[ordinal] = true;
-                            m_items[ordinal] = ex;
-                        }
-                    }
-                    else if (parent.Columns[ordinal].Type == Utility.GeometryType)
-                    {
-                        //TODO: Uncomment this once the Topology.Net API gets updated to 2.0.0
-                        //It is optional to include the Topology.IO.MapGuide dll
-                        /*if (this.MgReader != null)
-                            m_items[ordinal] = this.MgReader.ReadGeometry(ref rd, p);
-                        else*/
-                        {
-                            try
-                            {
-                                //No MapGuide dll, convert to WKT and then to internal representation
-                                OSGeo.MapGuide.MgAgfReaderWriter rdw = new OSGeo.MapGuide.MgAgfReaderWriter();
-                                OSGeo.MapGuide.MgGeometry g = rdw.Read(rd.GetGeometry(p));
-                                OSGeo.MapGuide.MgWktReaderWriter rdww = new OSGeo.MapGuide.MgWktReaderWriter();
-                                m_items[ordinal] = this.Reader.Read(rdww.Write(g));
-                            }
-                            catch (MgException ex)
-                            {
-                                //Just like the XmlFeatureSetReader, invalid geometry can bite us again
-                                m_nulls[ordinal] = true;
-                                m_items[ordinal] = NestedExceptionMessageProcessor.GetFullMessage(ex);
-                                ex.Dispose();
-                            }
-                        }
-                    }
-                    else if (parent.Columns[ordinal].Type == Utility.UnmappedType)
-                    {
-                        //Attempt to read it as a string
-                        try { m_items[ordinal] = rd.GetString(p); }
-                        catch { m_items[ordinal] = null; }
-                    }
-                    else
-                        throw new Exception("Unknown type: " + parent.Columns[ordinal].Type.FullName);
-                }
-            }
-        }
-
-        public object this[int index]
-        {
-            get
-            {
-                if (index >= m_items.Length)
-                    throw new InvalidOperationException("Index " + index.ToString() + ", was out of bounds");
-                else
-                {
-                    if (m_lazyloadGeometry[index] && !m_nulls[index])
-                    {
-                        m_items[index] = this.Reader.Read((string)m_items[index]);
-                        m_lazyloadGeometry[index] = false;
-                    }
-
-                    return m_items[index];
-                }
-            }
-        }
-    }
-
-    public class LocalNativeFeatureSetColumn : FeatureSetColumn
-    {
-        internal LocalNativeFeatureSetColumn(string name, int type)
-            : base()
-        {
-            m_name = name;
-            m_type = Utility.ConvertMgTypeToNetType(type);
-        }
-    }
-}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeRecord.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,87 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Native
+{
+    public class LocalNativeRecord : RecordBase
+    {
+        public LocalNativeRecord(MgReader reader)
+        {
+            for (int i = 0; i < reader.GetPropertyCount(); i++)
+            {
+                string name = reader.GetPropertyName(i);
+
+                _ordinalMap[i] = name;
+
+                var pt = (PropertyValueType)reader.GetPropertyType(name);
+                switch (pt)
+                {
+                    case PropertyValueType.Blob:
+                        _values[name] = new BlobValue();
+                        break;
+                    case PropertyValueType.Boolean:
+                        _values[name] = new BooleanValue();
+                        break;
+                    case PropertyValueType.Byte:
+                        _values[name] = new ByteValue();
+                        break;
+                    case PropertyValueType.Clob:
+                        _values[name] = new ClobValue();
+                        break;
+                    case PropertyValueType.DateTime:
+                        _values[name] = new DateTimeValue();
+                        break;
+                    case PropertyValueType.Double:
+                        _values[name] = new DoubleValue();
+                        break;
+                    case PropertyValueType.Feature:
+                        _values[name] = new FeatureValue();
+                        break;
+                    case PropertyValueType.Geometry:
+                        _values[name] = new GeometryValue();
+                        break;
+                    case PropertyValueType.Int16:
+                        _values[name] = new Int16Value();
+                        break;
+                    case PropertyValueType.Int32:
+                        _values[name] = new Int32Value();
+                        break;
+                    case PropertyValueType.Int64:
+                        _values[name] = new Int64Value();
+                        break;
+                    case PropertyValueType.Raster:
+                        _values[name] = new RasterValue();
+                        break;
+                    case PropertyValueType.Single:
+                        _values[name] = new SingleValue();
+                        break;
+                    case PropertyValueType.String:
+                        _values[name] = new StringValue();
+                        break;
+                }
+            }
+        }
+    }
+}

Added: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs	                        (rev 0)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/LocalNativeSqlReader.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,68 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Text;
+using OSGeo.MapGuide.MaestroAPI.Feature;
+using OSGeo.MapGuide.MaestroAPI.Schema;
+
+namespace OSGeo.MapGuide.MaestroAPI.Native
+{
+    public class LocalNativeSqlReader : ReaderBase
+    {
+        private MgSqlDataReader _reader;
+
+        public LocalNativeSqlReader(MgSqlDataReader reader) 
+        {
+            _reader = reader;
+        }
+
+        public override ReaderType ReaderType
+        {
+            get { return ReaderType.Sql; }
+        }
+
+        protected override IRecord ReadNextRecord()
+        {
+            if (_reader.ReadNext())
+                return new LocalNativeRecord(_reader);
+
+            return null;
+        }
+
+        public override void Close()
+        {
+            _reader.Close();
+        }
+
+        public override string GetName(int index)
+        {
+            return _reader.GetPropertyName(index);
+        }
+
+        public override Type GetFieldType(int i)
+        {
+            string name = GetName(i);
+            //The enum uses the same values as MgPropertyType
+            var type = (PropertyValueType)_reader.GetPropertyType(name);
+            return ClrFdoTypeMap.GetClrType(type);
+        }
+    }
+}

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/OSGeo.MapGuide.MaestroAPI.Native.csproj	2010-12-22 04:40:33 UTC (rev 5481)
@@ -12,6 +12,9 @@
     <AssemblyName>OSGeo.MapGuide.MaestroAPI.Native</AssemblyName>
     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -52,7 +55,14 @@
     <Compile Include="..\Properties\GlobalAssemblyInfo.cs">
       <Link>GlobalAssemblyInfo.cs</Link>
     </Compile>
+    <Compile Include="..\Properties\SignedAssemblyInfo.cs">
+      <Link>SignedAssemblyInfo.cs</Link>
+    </Compile>
     <Compile Include="Commands\LocalGetResourceContents.cs" />
+    <Compile Include="LocalNativeDataReader.cs" />
+    <Compile Include="LocalNativeFeature.cs" />
+    <Compile Include="LocalNativeRecord.cs" />
+    <Compile Include="LocalNativeSqlReader.cs" />
     <Compile Include="MgReadOnlyStream.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="LocalNativeCapabilities.cs" />
@@ -60,7 +70,7 @@
     <Compile Include="LocalNativeCoordinateSystem.cs" />
     <Compile Include="LocalNativeCoordinateSystemCatalog.cs" />
     <Compile Include="LocalNativeCoordinateSystemCategory.cs" />
-    <Compile Include="LocalNativeFeatureSetReader.cs" />
+    <Compile Include="LocalNativeFeatureReader.cs" />
     <Compile Include="Utility.cs" />
   </ItemGroup>
   <ItemGroup>

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Properties/AssemblyInfo.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -40,7 +40,8 @@
 // The following GUID is for the ID of the typelib if this project is exposed to COM
 [assembly: Guid("D80991DF-E4D3-43ee-AF2B-C96AD8462C70")]
 
-[assembly: InternalsVisibleTo("MaestroAPITests")]
-[assembly: InternalsVisibleTo("MaestroBaseTests")]
+// This long string is the public key of the maestroapi.key token
+[assembly: InternalsVisibleTo("MaestroAPITests, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f196e7ed5bff1e511efa3251b228582b26cbf78ea6d4282742d5c882db02b08ebc99922c0ddccf9ab79ee180250ac6716f986cf6fabdc1404b3dafee8873d4d6327be301f5ca52862065678cd5bc0c18ddc7ef6516723162c985a0c20eec07382a2090486f24393bf80976aa5ab57274620bafd62dfec34d5eed74bf41e72d2")]
+[assembly: InternalsVisibleTo("MaestroBaseTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001000f196e7ed5bff1e511efa3251b228582b26cbf78ea6d4282742d5c882db02b08ebc99922c0ddccf9ab79ee180250ac6716f986cf6fabdc1404b3dafee8873d4d6327be301f5ca52862065678cd5bc0c18ddc7ef6516723162c985a0c20eec07382a2090486f24393bf80976aa5ab57274620bafd62dfec34d5eed74bf41e72d2")]
 
 [assembly: MaestroApiProvider("Maestro.LocalNative", "Maestro wrapper for official MapGuide API", typeof(LocalNativeConnection), true)]
\ No newline at end of file

Modified: sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs
===================================================================
--- sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs	2010-12-21 22:43:00 UTC (rev 5480)
+++ sandbox/maestro-3.0/OSGeo.MapGuide.MaestroAPI.Native/Utility.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -21,6 +21,7 @@
 using System.Collections.Generic;
 using System.Text;
 using System.Drawing;
+using OSGeo.MapGuide.MaestroAPI.Schema;
 
 namespace OSGeo.MapGuide.MaestroAPI.Native
 {
@@ -233,5 +234,61 @@
 
             throw new Exception("Failed to find type for: " + type.FullName.ToString());
         }
+
+        public static ClassDefinition ConvertClassDefinition(MgClassDefinition mgClass)
+        {
+            var cls = new ClassDefinition(mgClass.Name, mgClass.Description);
+            foreach (var prop in mgClass.GetProperties())
+            {
+                if (prop.PropertyType == MgFeaturePropertyType.DataProperty)
+                {
+                    MgDataPropertyDefinition mgData = (MgDataPropertyDefinition)prop;
+                    var dp = ConvertDataProperty(mgData);
+
+                    bool identity = (mgClass.GetIdentityProperties().Contains(mgData));
+                    cls.AddProperty(dp, identity);
+                }
+                else if (prop.PropertyType == MgFeaturePropertyType.GeometricProperty)
+                {
+                    MgGeometricPropertyDefinition mgGeom = (MgGeometricPropertyDefinition)prop;
+                    var geom = ConvertGeometricProperty(mgGeom);
+
+                    cls.AddProperty(geom);
+                }
+                else if (prop.PropertyType == MgFeaturePropertyType.RasterProperty)
+                {
+                    MgRasterPropertyDefinition mgRaster = (MgRasterPropertyDefinition)prop;
+                    var raster = ConvertRasterProperty(mgRaster);
+
+                    cls.AddProperty(raster);
+                }
+                else if (prop.PropertyType == MgFeaturePropertyType.ObjectProperty)
+                {
+                    
+                }
+                else if (prop.PropertyType == MgFeaturePropertyType.AssociationProperty)
+                {
+                }
+            }
+
+            cls.DefaultGeometryPropertyName = mgClass.DefaultGeometryPropertyName;
+
+            return cls;
+        }
+
+        private static RasterPropertyDefinition ConvertRasterProperty(MgRasterPropertyDefinition mgRaster)
+        {
+            throw new NotImplementedException();
+        }
+
+        private static GeometricPropertyDefinition ConvertGeometricProperty(MgGeometricPropertyDefinition mgGeom)
+        {
+            throw new NotImplementedException();
+        }
+
+        private static DataPropertyDefinition ConvertDataProperty(MgDataPropertyDefinition mgDataPropertyDefinition)
+        {
+            throw new NotImplementedException();
+        }
     }
 }

Added: sandbox/maestro-3.0/Properties/SignedAssemblyInfo.cs
===================================================================
--- sandbox/maestro-3.0/Properties/SignedAssemblyInfo.cs	                        (rev 0)
+++ sandbox/maestro-3.0/Properties/SignedAssemblyInfo.cs	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,26 @@
+#region Disclaimer / License
+// Copyright (C) 2010, Jackie Ng
+// http://trac.osgeo.org/mapguide/wiki/maestro, jumpinjackie at gmail.com
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library 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
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+// 
+#endregion
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("..\\..\\..\\Properties\\maestroapi.key")]
+[assembly: AssemblyKeyName("")]
\ No newline at end of file

Added: sandbox/maestro-3.0/TestData/gen_default1_MySql_master.xml
===================================================================
--- sandbox/maestro-3.0/TestData/gen_default1_MySql_master.xml	                        (rev 0)
+++ sandbox/maestro-3.0/TestData/gen_default1_MySql_master.xml	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,905 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/AutoGen" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:AutoGen="http://fdo.osgeo.org/schemas/feature/AutoGen" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="rtable1" type="AutoGen:rtable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable1Key">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable2" type="AutoGen:rtable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable2Key">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable5" type="AutoGen:rtable5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable5Key">
+<xs:selector xpath=".//rtable5"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE5_ID">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable6" type="AutoGen:rtable6Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable6Key">
+<xs:selector xpath=".//rtable6"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable6Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE6_ID1">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE6_ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable7" type="AutoGen:rtable7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable7Key">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:unique name="rtable7Key_0">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="TABLE7_ID12345678901234567890"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="rtable7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE7_ID12345678901234567890" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table1" type="AutoGen:table1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table1Key">
+<xs:selector xpath=".//table1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:unique name="table1Key_0">
+<xs:selector xpath=".//table1"/>
+<xs:field xpath="AUTOINCREMENT_COLUMN"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="table1Type" abstract="false" fdo:hasGeometry="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="AUTOINCREMENT_COLUMN" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT15_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT1_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:boolean"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT2_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT31_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT32_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT8_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BIT9_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BOOL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="CHAR1_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="CHAR5_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DATE2_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="DECIMAL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ENUM_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="255"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="GEOMETRYCOLLECTION_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="multigeometry ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INSERT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="25"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN345678901234567890" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT32_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT64_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="LINESTRING_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="curve " fdo:geometryTypes="linestring ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="MEDIUMBLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="MEDIUMINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="MULTILINESTRING_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="curve " fdo:geometryTypes="multilinestring ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="MULTIPOINT_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point " fdo:geometryTypes="multipoint ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="MULTIPOLYGON_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="surface " fdo:geometryTypes="multipolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="NEW_GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring polygon multipolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="OBJECT_NAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="64"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="POINT_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point " fdo:geometryTypes="point ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="POLGON_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="surface " fdo:geometryTypes="polygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SET_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="255"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="SINGLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:float"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="65535"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TIMESTAMP_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TIME_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TINYBLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TINYINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="UINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="USMALLINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="VARBINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="YEAR_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table3" type="AutoGen:table3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table3Key">
+<xs:selector xpath=".//table3"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table4" type="AutoGen:table4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table4Key">
+<xs:selector xpath=".//table4"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table4Type" abstract="false" fdo:geometryName="GEOM_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring polygon multipolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table5" type="AutoGen:table5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table5Key">
+<xs:selector xpath=".//table5"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table6" type="AutoGen:table6Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table6Key">
+<xs:selector xpath=".//table6"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table6Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table7" type="AutoGen:table7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table7Key">
+<xs:selector xpath=".//table7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:complexType name="view1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:sequence>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="DEC_COL_RENAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+</xs:schema>
+</fdo:DataStore>

Added: sandbox/maestro-3.0/TestData/gen_default1_Oracle_master.xml
===================================================================
--- sandbox/maestro-3.0/TestData/gen_default1_Oracle_master.xml	                        (rev 0)
+++ sandbox/maestro-3.0/TestData/gen_default1_Oracle_master.xml	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,2556 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds">
+<gml:DerivedCRS gml:id="sc_1">
+<gml:metaDataProperty>
+<gml:GenericMetaData>
+<fdo:XYTolerance>
+0.001000</fdo:XYTolerance>
+</gml:GenericMetaData>
+</gml:metaDataProperty>
+<gml:remarks>
+Spatial context from Oracle metadata</gml:remarks>
+<gml:srsName>
+sc_1</gml:srsName>
+<gml:validArea>
+<gml:boundingBox>
+<gml:pos>
+-2000000.000000 -2000000.000000</gml:pos>
+<gml:pos>
+2000000.000000 2000000.000000</gml:pos>
+</gml:boundingBox>
+</gml:validArea>
+<gml:baseCRS xlink:href="http://fdo.osgeo.org/crs#default_cartesian"/>
+<gml:definedByConversion xlink:href="http://fdo.osgeo.org/coord_conversions#identity"/>
+<gml:derivedCRSType codeSpace="http://fdo.osgeo.org/crs_types">
+geographic</gml:derivedCRSType>
+<gml:usesCS xlink:href="http://fdo.osgeo.org/cs#default_cartesian"/>
+</gml:DerivedCRS>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/AutoGen" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:AutoGen="http://fdo.osgeo.org/schemas/feature/AutoGen" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType name="RAWTABLE1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:complexType>
+<xs:element name="RAWTABLE2" type="AutoGen:RAWTABLE2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="RAWTABLE2Key">
+<xs:selector xpath=".//RAWTABLE2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="RAWTABLE2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="RTABLE1" type="AutoGen:RTABLE1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="RTABLE1Key">
+<xs:selector xpath=".//RTABLE1"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="RTABLE1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE1_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_RTABLE1_FK_RTABLE1_TABLE1" refer="AutoGen:TABLE1_RTABLE1AKey">
+<xs:selector xpath=".//RTABLE1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="RTABLE2" type="AutoGen:RTABLE2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="RTABLE2Key">
+<xs:selector xpath=".//RTABLE2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="RTABLE2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE2_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_RTABLE2_FK_RTABLE2_TABLE1" refer="AutoGen:TABLE1_RTABLE2AKey">
+<xs:selector xpath=".//RTABLE2"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="FK_RTABLE2_TABLE3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_RTABLE2_FK_RTABLE2_TABLE3" refer="AutoGen:TABLE3_RTABLE2AKey">
+<xs:selector xpath=".//RTABLE2"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="RTABLE5" type="AutoGen:RTABLE5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="RTABLE5Key">
+<xs:selector xpath=".//RTABLE5"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="RTABLE5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE5_ID">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="RTABLE6" type="AutoGen:RTABLE6Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="RTABLE6Key">
+<xs:selector xpath=".//RTABLE6"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="RTABLE6Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE6_ID1">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE6_ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="RTABLE7" type="AutoGen:RTABLE7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="RTABLE7Key">
+<xs:selector xpath=".//RTABLE7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:unique name="RTABLE7Key_0">
+<xs:selector xpath=".//RTABLE7"/>
+<xs:field xpath="TABLE7_ID12345678901234567890"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="RTABLE7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE7_TABLE7" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE7_ID12345678901234567890">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="20"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_RTABLE7_FK_RTABLE7_TABLE7" refer="AutoGen:TABLE7_RTABLE7AKey">
+<xs:selector xpath=".//RTABLE7"/>
+<xs:field xpath="ID"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="20"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE7_ID12345678901234567890">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="20"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="TABLE1" type="AutoGen:TABLE1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="TABLE1Key">
+<xs:selector xpath=".//TABLE1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="TABLE1_RTABLE1AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="TABLE1_RTABLE2AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="TABLE1Type" abstract="false" fdo:hasGeometry="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="BINARY_DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BINARY_FLOAT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:float"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BOOL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="1"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="3"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DECIMAL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="FLOAT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="GEOM_COLUMN_2D_MEASURE" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="sc_1" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="GEOM_COLUMN_3D" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="true" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="GEOM_COLUMN_3D_MEASURE" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="true" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INSERT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="25"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN345678901234567890" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="5"/>
+<xs:fractionDigits value=""/>
+<xs:maxExclusive value="20000"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT32_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT64_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="20"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INTERVAL_DAY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INTERVAL_YEAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="LONG_STRING" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="4000"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NEW_GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="sc_1" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="NVARCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="OBJECT_NAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="30"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="SINGLE_CHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="SINGLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TIMESTAMP_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="TABLE3" type="AutoGen:TABLE3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="TABLE3Key">
+<xs:selector xpath=".//TABLE3"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+<xs:key name="TABLE3_RTABLE2AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="TABLE3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="TABLE4" type="AutoGen:TABLE4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="TABLE4Key">
+<xs:selector xpath=".//TABLE4"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="TABLE4Type" abstract="false" fdo:geometryName="GEOM_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="true" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="5"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="TABLE5" type="AutoGen:TABLE5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="TABLE5Key">
+<xs:selector xpath=".//TABLE5"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="TABLE5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="TABLE6" type="AutoGen:TABLE6Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="TABLE6Key">
+<xs:selector xpath=".//TABLE6"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="TABLE6Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="TABLE7" type="AutoGen:TABLE7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="TABLE7Key">
+<xs:selector xpath=".//TABLE7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:key name="TABLE7_RTABLE7AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="TABLE7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="20"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLE1" type="AutoGen:VERTABLE1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLE1Key">
+<xs:selector xpath=".//VERTABLE1"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+<xs:unique name="VERTABLE1Key_0">
+<xs:selector xpath=".//VERTABLE1"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLE1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+<xs:maxExclusive value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VERTABLE1_VERTABLELOOKUP1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE1_VERTABLE1_VERTABLELOOKUP1" refer="AutoGen:VERTABLELOOKUP1_VERTABLE1AKey">
+<xs:selector xpath=".//VERTABLE1"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="VERTABLE1_VERTABLELOOKUPB1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE1_VERTABLE1_VERTABLELOOKUPB1" refer="AutoGen:VERTABLELOOKUPB1_VERTABLE1AKey">
+<xs:selector xpath=".//VERTABLE1"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLE2" type="AutoGen:VERTABLE2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLE2Key">
+<xs:selector xpath=".//VERTABLE2"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+<xs:unique name="VERTABLE2Key_0">
+<xs:selector xpath=".//VERTABLE2"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLE2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+<xs:maxExclusive value="2"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VERTABLE2_VERTABLELOOKUP2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE2_VERTABLE2_VERTABLELOOKUP2" refer="AutoGen:VERTABLELOOKUP2_VERTABLE2AKey">
+<xs:selector xpath=".//VERTABLE2"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="VERTABLE2_VERTABLELOOKUPB2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE2_VERTABLE2_VERTABLELOOKUPB2" refer="AutoGen:VERTABLELOOKUPB2_VERTABLE2AKey">
+<xs:selector xpath=".//VERTABLE2"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLE3" type="AutoGen:VERTABLE3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLE3Key">
+<xs:selector xpath=".//VERTABLE3"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+<xs:unique name="VERTABLE3Key_0">
+<xs:selector xpath=".//VERTABLE3"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLE3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+<xs:maxExclusive value="3"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VERTABLE3_VERTABLELOOKUP3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE3_VERTABLE3_VERTABLELOOKUP3" refer="AutoGen:VERTABLELOOKUP3_VERTABLE3AKey">
+<xs:selector xpath=".//VERTABLE3"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="VERTABLE3_VERTABLELOOKUPB3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE3_VERTABLE3_VERTABLELOOKUPB3" refer="AutoGen:VERTABLELOOKUPB3_VERTABLE3AKey">
+<xs:selector xpath=".//VERTABLE3"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLE4" type="AutoGen:VERTABLE4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLE4Key">
+<xs:selector xpath=".//VERTABLE4"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+<xs:unique name="VERTABLE4Key_0">
+<xs:selector xpath=".//VERTABLE4"/>
+<xs:field xpath="ID2"/>
+<xs:field xpath="IDB1"/>
+<xs:field xpath="IDB2"/>
+</xs:unique>
+<xs:unique name="VERTABLE4Key_1">
+<xs:selector xpath=".//VERTABLE4"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLE4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+<xs:maxExclusive value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VERTABLE4_VERTABLELOOKUP4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE4_VERTABLE4_VERTABLELOOKUP4" refer="AutoGen:VERTABLELOOKUP4_VERTABLE4AKey">
+<xs:selector xpath=".//VERTABLE4"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="VERTABLE4_VERTABLELOOKUPB4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE4_VERTABLE4_VERTABLELOOKUPB4" refer="AutoGen:VERTABLELOOKUPB4_VERTABLE4AKey">
+<xs:selector xpath=".//VERTABLE4"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLE5" type="AutoGen:VERTABLE5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLE5Key">
+<xs:selector xpath=".//VERTABLE5"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+<xs:unique name="VERTABLE5Key_0">
+<xs:selector xpath=".//VERTABLE5"/>
+<xs:field xpath="ID2"/>
+<xs:field xpath="IDB1"/>
+<xs:field xpath="IDB2"/>
+</xs:unique>
+<xs:unique name="VERTABLE5Key_1">
+<xs:selector xpath=".//VERTABLE5"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLE5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+<xs:maxExclusive value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VERTABLE5_VERTABLELOOKUP5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE5_VERTABLE5_VERTABLELOOKUP5" refer="AutoGen:VERTABLELOOKUP5_VERTABLE5AKey">
+<xs:selector xpath=".//VERTABLE5"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="VERTABLE5_VERTABLELOOKUPB5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="IDB1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="IDB2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="AutoGen_VERTABLE5_VERTABLE5_VERTABLELOOKUPB5" refer="AutoGen:VERTABLELOOKUPB5_VERTABLE5AKey">
+<xs:selector xpath=".//VERTABLE5"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:keyref>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUP1" type="AutoGen:VERTABLELOOKUP1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUP1Key">
+<xs:selector xpath=".//VERTABLELOOKUP1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUP1_VERTABLE1AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:unique name="VERTABLELOOKUP1Key_0">
+<xs:selector xpath=".//VERTABLELOOKUP1"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUP1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUP2" type="AutoGen:VERTABLELOOKUP2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUP2Key">
+<xs:selector xpath=".//VERTABLELOOKUP2"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUP2_VERTABLE2AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:unique name="VERTABLELOOKUP2Key_0">
+<xs:selector xpath=".//VERTABLELOOKUP2"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUP2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUP3" type="AutoGen:VERTABLELOOKUP3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUP3Key">
+<xs:selector xpath=".//VERTABLELOOKUP3"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUP3_VERTABLE3AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:unique name="VERTABLELOOKUP3Key_0">
+<xs:selector xpath=".//VERTABLELOOKUP3"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUP3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUP4" type="AutoGen:VERTABLELOOKUP4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUP4Key">
+<xs:selector xpath=".//VERTABLELOOKUP4"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUP4_VERTABLE4AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:unique name="VERTABLELOOKUP4Key_0">
+<xs:selector xpath=".//VERTABLELOOKUP4"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUP4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUP5" type="AutoGen:VERTABLELOOKUP5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUP5Key">
+<xs:selector xpath=".//VERTABLELOOKUP5"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUP5_VERTABLE5AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:unique name="VERTABLELOOKUP5Key_0">
+<xs:selector xpath=".//VERTABLELOOKUP5"/>
+<xs:field xpath="NAME"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUP5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUPB1" type="AutoGen:VERTABLELOOKUPB1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUPB1Key">
+<xs:selector xpath=".//VERTABLELOOKUPB1"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUPB1_VERTABLE1AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUPB1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUPB2" type="AutoGen:VERTABLELOOKUPB2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUPB2Key">
+<xs:selector xpath=".//VERTABLELOOKUPB2"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUPB2_VERTABLE2AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUPB2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUPB3" type="AutoGen:VERTABLELOOKUPB3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUPB3Key">
+<xs:selector xpath=".//VERTABLELOOKUPB3"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUPB3_VERTABLE3AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUPB3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUPB4" type="AutoGen:VERTABLELOOKUPB4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUPB4Key">
+<xs:selector xpath=".//VERTABLELOOKUPB4"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUPB4_VERTABLE4AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUPB4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERTABLELOOKUPB5" type="AutoGen:VERTABLELOOKUPB5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERTABLELOOKUPB5Key">
+<xs:selector xpath=".//VERTABLELOOKUPB5"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+<xs:key name="VERTABLELOOKUPB5_VERTABLE5AKey">
+<xs:selector xpath=".//AutoGen"/>
+<xs:field xpath="ID1"/>
+<xs:field xpath="ID2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERTABLELOOKUPB5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERVIEW1" type="AutoGen:VERVIEW1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEW1Key">
+<xs:selector xpath=".//VERVIEW1"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEW1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERVIEW2" type="AutoGen:VERVIEW2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEW2Key">
+<xs:selector xpath=".//VERVIEW2"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEW2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERVIEW3" type="AutoGen:VERVIEW3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEW3Key">
+<xs:selector xpath=".//VERVIEW3"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEW3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERVIEW4" type="AutoGen:VERVIEW4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEW4Key">
+<xs:selector xpath=".//VERVIEW4"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEW4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERVIEW5" type="AutoGen:VERVIEW5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEW5Key">
+<xs:selector xpath=".//VERVIEW5"/>
+<xs:field xpath="ID1"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEW5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VERVIEWB1" type="AutoGen:VERVIEWB1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEWB1Key">
+<xs:selector xpath=".//VERVIEWB1"/>
+<xs:field xpath="NAME"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEWB1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:complexType name="VERVIEWB2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:sequence>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:element name="VERVIEWB3" type="AutoGen:VERVIEWB3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEWB3Key">
+<xs:selector xpath=".//VERVIEWB3"/>
+<xs:field xpath="NAME"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEWB3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:complexType name="VERVIEWB4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:sequence>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:element name="VERVIEWB5" type="AutoGen:VERVIEWB5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VERVIEWB5Key">
+<xs:selector xpath=".//VERVIEWB5"/>
+<xs:field xpath="NAME"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VERVIEWB5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="NAME">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VIEW1" type="AutoGen:VIEW1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VIEW1Key">
+<xs:selector xpath=".//VIEW1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VIEW1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="3"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DEC_COL_RENAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="VIEW3" type="AutoGen:VIEW3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="VIEW3Key">
+<xs:selector xpath=".//VIEW3"/>
+<xs:field xpath="STRING_COLUMN"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="VIEW3Type" abstract="false" fdo:geometryName="GEOM_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="true" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="5"/>
+<xs:fractionDigits value=""/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+</fdo:DataStore>

Added: sandbox/maestro-3.0/TestData/gen_default1_SQLServerSpatial_master.xml
===================================================================
--- sandbox/maestro-3.0/TestData/gen_default1_SQLServerSpatial_master.xml	                        (rev 0)
+++ sandbox/maestro-3.0/TestData/gen_default1_SQLServerSpatial_master.xml	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,2080 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/dbo" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:dbo="http://fdo.osgeo.org/schemas/feature/dbo" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="rtable1" type="dbo:rtable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable1Key">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE1_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable1_FK_RTABLE1_TABLE1" refer="dbo:table1_rtable1AKey">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable2" type="dbo:rtable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable2Key">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE2_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE1" refer="dbo:table1_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="FK_RTABLE2_TABLE3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE3" refer="dbo:table3_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable7" type="dbo:rtable7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable7Key">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:unique name="rtable7Key_0">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="TABLE7_ID12345678901234567890"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="rtable7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE7_ID12345678901234567890" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table1" type="dbo:table1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table1Key">
+<xs:selector xpath=".//table1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable1AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table1Type" abstract="false" fdo:geometryName="NEW_GEOM_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="BINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BOOL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:boolean"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="CHAR1_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="CHAR5_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DECIMAL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INSERT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="25"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN345678901234567890" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16">
+<xs:maxExclusive value="20000"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT32_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT64_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="LONG_STRING" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="8000"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="MONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="19"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NEW_GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="NTEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1073741823"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NUMERIC_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NVARCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NVARCHAR_MAX_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1073741823"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="OBJECT_NAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="128"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="REAL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:float"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SINGLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:float"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLDATETIME_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLMONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="2147483647"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TIMESTAMP_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TINYINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="UNIQUEID_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="36"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VARBINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="VARCHAR_MAX_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="2147483647"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table3" type="dbo:table3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table3Key">
+<xs:selector xpath=".//table3"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+<xs:key name="table3_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table4" type="dbo:table4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table4Key">
+<xs:selector xpath=".//table4"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table4Type" abstract="false" fdo:geometryName="GEOM_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table7" type="dbo:table7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table7Key">
+<xs:selector xpath=".//table7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view1" type="dbo:view1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view1Key">
+<xs:selector xpath=".//view1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="DEC_COL_RENAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view3" type="dbo:view3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view3Key">
+<xs:selector xpath=".//view3"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view3Type" abstract="false" fdo:geometryName="GEOM_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="gml:AbstractFeatureType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" type="gml:AbstractGeometryType" fdo:hasMeasure="false" fdo:hasElevation="false" fdo:srsName="Default" fdo:geometricTypes="point curve surface " fdo:geometryTypes="point multipoint linestring multilinestring curvestring multicurvestring polygon multipolygon curvepolygon multicurvepolygon ">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/guest" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:guest="http://fdo.osgeo.org/schemas/feature/guest" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="vertable1" type="guest:vertable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable1Key">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable1Key_0">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable1_guest_vertable_vertablelookup1" refer="guest:vertablelookup1_vertable1AKey">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable1_guest_vertable_vertablelookupb1" refer="guest:vertablelookupb1_vertable1AKey">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="1"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable2" type="guest:vertable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable2Key">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable2Key_0">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable2_guest_vertable_vertablelookup2" refer="guest:vertablelookup2_vertable2AKey">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable2_guest_vertable_vertablelookupb2" refer="guest:vertablelookupb2_vertable2AKey">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="2"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable3" type="guest:vertable3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable3Key">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable3Key_0">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable3_guest_vertable_vertablelookup3" refer="guest:vertablelookup3_vertable3AKey">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable3_guest_vertable_vertablelookupb3" refer="guest:vertablelookupb3_vertable3AKey">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="3"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable4" type="guest:vertable4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable4Key">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable4Key_0">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="name"/>
+</xs:unique>
+<xs:unique name="vertable4Key_1">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id2"/>
+<xs:field xpath="idb1"/>
+<xs:field xpath="idb2"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable4_guest_vertable_vertablelookup4" refer="guest:vertablelookup4_vertable4AKey">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable4_guest_vertable_vertablelookupb4" refer="guest:vertablelookupb4_vertable4AKey">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="4"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable5" type="guest:vertable5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable5Key">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable5Key_0">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="name"/>
+</xs:unique>
+<xs:unique name="vertable5Key_1">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id2"/>
+<xs:field xpath="idb1"/>
+<xs:field xpath="idb2"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable5_guest_vertable_vertablelookup5" refer="guest:vertablelookup5_vertable5AKey">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable5_guest_vertable_vertablelookupb5" refer="guest:vertablelookupb5_vertable5AKey">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="5"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup1" type="guest:vertablelookup1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup1Key">
+<xs:selector xpath=".//vertablelookup1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup1_vertable1AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup1Key_0">
+<xs:selector xpath=".//vertablelookup1"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup2" type="guest:vertablelookup2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup2Key">
+<xs:selector xpath=".//vertablelookup2"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup2_vertable2AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup2Key_0">
+<xs:selector xpath=".//vertablelookup2"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup3" type="guest:vertablelookup3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup3Key">
+<xs:selector xpath=".//vertablelookup3"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup3_vertable3AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup3Key_0">
+<xs:selector xpath=".//vertablelookup3"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup4" type="guest:vertablelookup4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup4Key">
+<xs:selector xpath=".//vertablelookup4"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup4_vertable4AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup4Key_0">
+<xs:selector xpath=".//vertablelookup4"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup5" type="guest:vertablelookup5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup5Key">
+<xs:selector xpath=".//vertablelookup5"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup5_vertable5AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup5Key_0">
+<xs:selector xpath=".//vertablelookup5"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb1" type="guest:vertablelookupb1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb1Key">
+<xs:selector xpath=".//vertablelookupb1"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb1_vertable1AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb2" type="guest:vertablelookupb2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb2Key">
+<xs:selector xpath=".//vertablelookupb2"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb2_vertable2AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb3" type="guest:vertablelookupb3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb3Key">
+<xs:selector xpath=".//vertablelookupb3"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb3_vertable3AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb4" type="guest:vertablelookupb4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb4Key">
+<xs:selector xpath=".//vertablelookupb4"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb4_vertable4AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb5" type="guest:vertablelookupb5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb5Key">
+<xs:selector xpath=".//vertablelookupb5"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb5_vertable5AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SQLServerSpatialProvider" textInRow="NotInRow" provider="OSGeo.SQLServerSpatial.3.5" name="dbo">
+<complexType name="rtable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable1" name="dbo.rtable1"/>
+</complexType>
+<complexType name="rtable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable2" name="dbo.rtable2"/>
+</complexType>
+<complexType name="rtable7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="TABLE7_ID12345678901234567890">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable7" name="dbo.rtable7"/>
+</complexType>
+<complexType name="table1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table1" name="dbo.table1"/>
+</complexType>
+<complexType name="table3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table3" name="dbo.table3"/>
+</complexType>
+<complexType name="table4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table4" name="dbo.table4"/>
+</complexType>
+<complexType name="table7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="ID">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table7" name="dbo.table7"/>
+</complexType>
+<complexType name="view1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view1" name="dbo.view1"/>
+</complexType>
+<complexType name="view3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view3" name="dbo.view3"/>
+</complexType>
+</SchemaMapping>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SQLServerSpatialProvider" textInRow="NotInRow" provider="OSGeo.SQLServerSpatial.3.5" name="guest">
+<complexType name="vertable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable1" name="guest.vertable1"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable2" name="guest.vertable2"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable3" name="guest.vertable3"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable4" name="guest.vertable4"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable5" name="guest.vertable5"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup1" name="guest.vertablelookup1"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup2" name="guest.vertablelookup2"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup3" name="guest.vertablelookup3"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup4" name="guest.vertablelookup4"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup5" name="guest.vertablelookup5"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb1" name="guest.vertablelookupb1"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb2" name="guest.vertablelookupb2"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb3" name="guest.vertablelookupb3"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb4" name="guest.vertablelookupb4"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb5" name="guest.vertablelookupb5"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+</SchemaMapping>
+</fdo:DataStore>

Added: sandbox/maestro-3.0/TestData/gen_default1_SqlServer2005_master.xml
===================================================================
--- sandbox/maestro-3.0/TestData/gen_default1_SqlServer2005_master.xml	                        (rev 0)
+++ sandbox/maestro-3.0/TestData/gen_default1_SqlServer2005_master.xml	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,2069 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/dbo" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:dbo="http://fdo.osgeo.org/schemas/feature/dbo" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="rtable1" type="dbo:rtable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable1Key">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE1_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable1_FK_RTABLE1_TABLE1" refer="dbo:table1_rtable1AKey">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable2" type="dbo:rtable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable2Key">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE2_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE1" refer="dbo:table1_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="FK_RTABLE2_TABLE3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE3" refer="dbo:table3_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable7" type="dbo:rtable7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable7Key">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:unique name="rtable7Key_0">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="TABLE7_ID12345678901234567890"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="rtable7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE7_ID12345678901234567890" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table1" type="dbo:table1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table1Key">
+<xs:selector xpath=".//table1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable1AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BOOL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="CHAR1_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="CHAR5_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DECIMAL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INSERT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="25"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN345678901234567890" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16">
+<xs:maxExclusive value="20000"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT32_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT64_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="LONG_STRING" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="8000"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="MONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="19"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NEW_GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="NTEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1073741823"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NUMERIC_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NVARCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="OBJECT_NAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="128"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="REAL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SINGLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLDATETIME_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLMONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="2147483647"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TIMESTAMP_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TINYINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="UNIQUEID_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="36"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VARBINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table3" type="dbo:table3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table3Key">
+<xs:selector xpath=".//table3"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+<xs:key name="table3_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table4" type="dbo:table4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table4Key">
+<xs:selector xpath=".//table4"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table7" type="dbo:table7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table7Key">
+<xs:selector xpath=".//table7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view1" type="dbo:view1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view1Key">
+<xs:selector xpath=".//view1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="DEC_COL_RENAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view3" type="dbo:view3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view3Key">
+<xs:selector xpath=".//view3"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/guest" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:guest="http://fdo.osgeo.org/schemas/feature/guest" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="vertable1" type="guest:vertable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable1Key">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable1Key_0">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable1_guest_vertable_vertablelookup1" refer="guest:vertablelookup1_vertable1AKey">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable1_guest_vertable_vertablelookupb1" refer="guest:vertablelookupb1_vertable1AKey">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="1"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable2" type="guest:vertable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable2Key">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable2Key_0">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable2_guest_vertable_vertablelookup2" refer="guest:vertablelookup2_vertable2AKey">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable2_guest_vertable_vertablelookupb2" refer="guest:vertablelookupb2_vertable2AKey">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="2"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable3" type="guest:vertable3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable3Key">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable3Key_0">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable3_guest_vertable_vertablelookup3" refer="guest:vertablelookup3_vertable3AKey">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable3_guest_vertable_vertablelookupb3" refer="guest:vertablelookupb3_vertable3AKey">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="3"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable4" type="guest:vertable4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable4Key">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable4Key_0">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id2"/>
+<xs:field xpath="idb1"/>
+<xs:field xpath="idb2"/>
+</xs:unique>
+<xs:unique name="vertable4Key_1">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable4_guest_vertable_vertablelookup4" refer="guest:vertablelookup4_vertable4AKey">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable4_guest_vertable_vertablelookupb4" refer="guest:vertablelookupb4_vertable4AKey">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="4"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable5" type="guest:vertable5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable5Key">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable5Key_0">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id2"/>
+<xs:field xpath="idb1"/>
+<xs:field xpath="idb2"/>
+</xs:unique>
+<xs:unique name="vertable5Key_1">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable5_guest_vertable_vertablelookup5" refer="guest:vertablelookup5_vertable5AKey">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable5_guest_vertable_vertablelookupb5" refer="guest:vertablelookupb5_vertable5AKey">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="5"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup1" type="guest:vertablelookup1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup1Key">
+<xs:selector xpath=".//vertablelookup1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup1_vertable1AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup1Key_0">
+<xs:selector xpath=".//vertablelookup1"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup2" type="guest:vertablelookup2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup2Key">
+<xs:selector xpath=".//vertablelookup2"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup2_vertable2AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup2Key_0">
+<xs:selector xpath=".//vertablelookup2"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup3" type="guest:vertablelookup3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup3Key">
+<xs:selector xpath=".//vertablelookup3"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup3_vertable3AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup3Key_0">
+<xs:selector xpath=".//vertablelookup3"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup4" type="guest:vertablelookup4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup4Key">
+<xs:selector xpath=".//vertablelookup4"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup4_vertable4AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup4Key_0">
+<xs:selector xpath=".//vertablelookup4"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup5" type="guest:vertablelookup5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup5Key">
+<xs:selector xpath=".//vertablelookup5"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup5_vertable5AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup5Key_0">
+<xs:selector xpath=".//vertablelookup5"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb1" type="guest:vertablelookupb1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb1Key">
+<xs:selector xpath=".//vertablelookupb1"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb1_vertable1AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb2" type="guest:vertablelookupb2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb2Key">
+<xs:selector xpath=".//vertablelookupb2"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb2_vertable2AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb3" type="guest:vertablelookupb3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb3Key">
+<xs:selector xpath=".//vertablelookupb3"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb3_vertable3AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb4" type="guest:vertablelookupb4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb4Key">
+<xs:selector xpath=".//vertablelookupb4"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb4_vertable4AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb5" type="guest:vertablelookupb5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb5Key">
+<xs:selector xpath=".//vertablelookupb5"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb5_vertable5AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SqlServerProvider" textInRow="NotInRow" provider="Autodesk.SqlServer.3.5" name="dbo">
+<complexType name="rtable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable1" name="dbo.rtable1"/>
+</complexType>
+<complexType name="rtable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable2" name="dbo.rtable2"/>
+</complexType>
+<complexType name="rtable7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="TABLE7_ID12345678901234567890">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable7" name="dbo.rtable7"/>
+</complexType>
+<complexType name="table1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table1" name="dbo.table1"/>
+</complexType>
+<complexType name="table3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table3" name="dbo.table3"/>
+</complexType>
+<complexType name="table4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table4" name="dbo.table4"/>
+</complexType>
+<complexType name="table7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="ID">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table7" name="dbo.table7"/>
+</complexType>
+<complexType name="view1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view1" name="dbo.view1"/>
+</complexType>
+<complexType name="view3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view3" name="dbo.view3"/>
+</complexType>
+</SchemaMapping>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SqlServerProvider" textInRow="NotInRow" provider="Autodesk.SqlServer.3.5" name="guest">
+<complexType name="vertable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable1" name="guest.vertable1"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable2" name="guest.vertable2"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable3" name="guest.vertable3"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable4" name="guest.vertable4"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable5" name="guest.vertable5"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup1" name="guest.vertablelookup1"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup2" name="guest.vertablelookup2"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup3" name="guest.vertablelookup3"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup4" name="guest.vertablelookup4"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup5" name="guest.vertablelookup5"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb1" name="guest.vertablelookupb1"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb2" name="guest.vertablelookupb2"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb3" name="guest.vertablelookupb3"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb4" name="guest.vertablelookupb4"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb5" name="guest.vertablelookupb5"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+</SchemaMapping>
+</fdo:DataStore>

Added: sandbox/maestro-3.0/TestData/gen_default1_SqlServer2008_master.xml
===================================================================
--- sandbox/maestro-3.0/TestData/gen_default1_SqlServer2008_master.xml	                        (rev 0)
+++ sandbox/maestro-3.0/TestData/gen_default1_SqlServer2008_master.xml	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,2069 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/dbo" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:dbo="http://fdo.osgeo.org/schemas/feature/dbo" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="rtable1" type="dbo:rtable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable1Key">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE1_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable1_FK_RTABLE1_TABLE1" refer="dbo:table1_rtable1AKey">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable2" type="dbo:rtable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable2Key">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE2_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE1" refer="dbo:table1_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="FK_RTABLE2_TABLE3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE3" refer="dbo:table3_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable7" type="dbo:rtable7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable7Key">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:unique name="rtable7Key_0">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="TABLE7_ID12345678901234567890"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="rtable7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE7_ID12345678901234567890" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table1" type="dbo:table1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table1Key">
+<xs:selector xpath=".//table1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable1AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BOOL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="CHAR1_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="CHAR5_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DECIMAL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INSERT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="25"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN345678901234567890" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16">
+<xs:maxExclusive value="20000"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT32_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT64_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="LONG_STRING" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="8000"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="MONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="19"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NEW_GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="NTEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1073741823"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NUMERIC_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NVARCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="OBJECT_NAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="128"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="REAL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SINGLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLDATETIME_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLMONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="2147483647"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TIMESTAMP_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TINYINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="UNIQUEID_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="36"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VARBINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table3" type="dbo:table3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table3Key">
+<xs:selector xpath=".//table3"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+<xs:key name="table3_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table4" type="dbo:table4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table4Key">
+<xs:selector xpath=".//table4"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table7" type="dbo:table7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table7Key">
+<xs:selector xpath=".//table7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view1" type="dbo:view1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view1Key">
+<xs:selector xpath=".//view1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="DEC_COL_RENAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view3" type="dbo:view3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view3Key">
+<xs:selector xpath=".//view3"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/guest" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:guest="http://fdo.osgeo.org/schemas/feature/guest" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="vertable1" type="guest:vertable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable1Key">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable1Key_0">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable1_guest_vertable_vertablelookup1" refer="guest:vertablelookup1_vertable1AKey">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable1_guest_vertable_vertablelookupb1" refer="guest:vertablelookupb1_vertable1AKey">
+<xs:selector xpath=".//vertable1"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="1"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable2" type="guest:vertable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable2Key">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable2Key_0">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable2_guest_vertable_vertablelookup2" refer="guest:vertablelookup2_vertable2AKey">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb2" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable2_guest_vertable_vertablelookupb2" refer="guest:vertablelookupb2_vertable2AKey">
+<xs:selector xpath=".//vertable2"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="2"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable3" type="guest:vertable3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable3Key">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable3Key_0">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable3_guest_vertable_vertablelookup3" refer="guest:vertablelookup3_vertable3AKey">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable3_guest_vertable_vertablelookupb3" refer="guest:vertablelookupb3_vertable3AKey">
+<xs:selector xpath=".//vertable3"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="3"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable4" type="guest:vertable4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable4Key">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable4Key_0">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="name"/>
+</xs:unique>
+<xs:unique name="vertable4Key_1">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id2"/>
+<xs:field xpath="idb1"/>
+<xs:field xpath="idb2"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable4_guest_vertable_vertablelookup4" refer="guest:vertablelookup4_vertable4AKey">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb4" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable4_guest_vertable_vertablelookupb4" refer="guest:vertablelookupb4_vertable4AKey">
+<xs:selector xpath=".//vertable4"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="4"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertable5" type="guest:vertable5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertable5Key">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id1"/>
+</xs:key>
+<xs:unique name="vertable5Key_0">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="name"/>
+</xs:unique>
+<xs:unique name="vertable5Key_1">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id2"/>
+<xs:field xpath="idb1"/>
+<xs:field xpath="idb2"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertable5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="guest_vertable_vertablelookup5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable5_guest_vertable_vertablelookup5" refer="guest:vertablelookup5_vertable5AKey">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="guest_vertable_vertablelookupb5" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="guest_vertable5_guest_vertable_vertablelookupb5" refer="guest:vertablelookupb5_vertable5AKey">
+<xs:selector xpath=".//vertable5"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32">
+<xs:maxExclusive value="5"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="idb2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup1" type="guest:vertablelookup1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup1Key">
+<xs:selector xpath=".//vertablelookup1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup1_vertable1AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup1Key_0">
+<xs:selector xpath=".//vertablelookup1"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup2" type="guest:vertablelookup2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup2Key">
+<xs:selector xpath=".//vertablelookup2"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup2_vertable2AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup2Key_0">
+<xs:selector xpath=".//vertablelookup2"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup3" type="guest:vertablelookup3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup3Key">
+<xs:selector xpath=".//vertablelookup3"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup3_vertable3AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup3Key_0">
+<xs:selector xpath=".//vertablelookup3"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup4" type="guest:vertablelookup4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup4Key">
+<xs:selector xpath=".//vertablelookup4"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup4_vertable4AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup4Key_0">
+<xs:selector xpath=".//vertablelookup4"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookup5" type="guest:vertablelookup5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookup5Key">
+<xs:selector xpath=".//vertablelookup5"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookup5_vertable5AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:unique name="vertablelookup5Key_0">
+<xs:selector xpath=".//vertablelookup5"/>
+<xs:field xpath="name"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="vertablelookup5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb1" type="guest:vertablelookupb1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb1Key">
+<xs:selector xpath=".//vertablelookupb1"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb1_vertable1AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb2" type="guest:vertablelookupb2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb2Key">
+<xs:selector xpath=".//vertablelookupb2"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb2_vertable2AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb3" type="guest:vertablelookupb3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb3Key">
+<xs:selector xpath=".//vertablelookupb3"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb3_vertable3AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb4" type="guest:vertablelookupb4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb4Key">
+<xs:selector xpath=".//vertablelookupb4"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb4_vertable4AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="vertablelookupb5" type="guest:vertablelookupb5Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="vertablelookupb5Key">
+<xs:selector xpath=".//vertablelookupb5"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+<xs:key name="vertablelookupb5_vertable5AKey">
+<xs:selector xpath=".//guest"/>
+<xs:field xpath="id1"/>
+<xs:field xpath="id2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="vertablelookupb5Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="id1">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="id2">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="name">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SqlServerProvider" textInRow="NotInRow" provider="Autodesk.SqlServer.3.5" name="dbo">
+<complexType name="rtable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable1" name="dbo.rtable1"/>
+</complexType>
+<complexType name="rtable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable2" name="dbo.rtable2"/>
+</complexType>
+<complexType name="rtable7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="TABLE7_ID12345678901234567890">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable7" name="dbo.rtable7"/>
+</complexType>
+<complexType name="table1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table1" name="dbo.table1"/>
+</complexType>
+<complexType name="table3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table3" name="dbo.table3"/>
+</complexType>
+<complexType name="table4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table4" name="dbo.table4"/>
+</complexType>
+<complexType name="table7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="ID">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table7" name="dbo.table7"/>
+</complexType>
+<complexType name="view1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view1" name="dbo.view1"/>
+</complexType>
+<complexType name="view3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view3" name="dbo.view3"/>
+</complexType>
+</SchemaMapping>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SqlServerProvider" textInRow="NotInRow" provider="Autodesk.SqlServer.3.5" name="guest">
+<complexType name="vertable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable1" name="guest.vertable1"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable2" name="guest.vertable2"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable3" name="guest.vertable3"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable4" name="guest.vertable4"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertable5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertable5" name="guest.vertable5"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="idb1">
+<Column name="idb1"/>
+</element>
+<element name="idb2">
+<Column name="idb2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup1" name="guest.vertablelookup1"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup2" name="guest.vertablelookup2"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup3" name="guest.vertablelookup3"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup4" name="guest.vertablelookup4"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookup5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookup5" name="guest.vertablelookup5"/>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb1" name="guest.vertablelookupb1"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb2" name="guest.vertablelookupb2"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb3" name="guest.vertablelookupb3"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb4" name="guest.vertablelookupb4"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+<complexType name="vertablelookupb5Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_guest_vertablelookupb5" name="guest.vertablelookupb5"/>
+<element name="id1">
+<Column name="id1"/>
+</element>
+<element name="id2">
+<Column name="id2"/>
+</element>
+<element name="name">
+<Column name="name"/>
+</element>
+</complexType>
+</SchemaMapping>
+</fdo:DataStore>

Added: sandbox/maestro-3.0/TestData/gen_default1_SqlServer_master.xml
===================================================================
--- sandbox/maestro-3.0/TestData/gen_default1_SqlServer_master.xml	                        (rev 0)
+++ sandbox/maestro-3.0/TestData/gen_default1_SqlServer_master.xml	2010-12-22 04:40:33 UTC (rev 5481)
@@ -0,0 +1,815 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<fdo:DataStore xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:fds="http://fdo.osgeo.org/schemas/fds">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://fdo.osgeo.org/schemas/feature/dbo" xmlns:fdo="http://fdo.osgeo.org/schemas" xmlns:gml="http://www.opengis.net/gml" xmlns:dbo="http://fdo.osgeo.org/schemas/feature/dbo" elementFormDefault="qualified" attributeFormDefault="unqualified">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:element name="rtable1" type="dbo:rtable1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable1Key">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE1_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable1_FK_RTABLE1_TABLE1" refer="dbo:table1_rtable1AKey">
+<xs:selector xpath=".//rtable1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable2" type="dbo:rtable2Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable2Key">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="rtable2Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="FK_RTABLE2_TABLE1" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE1" refer="dbo:table1_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="FK_RTABLE2_TABLE3" minOccurs="0" maxOccurs="1" fdo:multiplicity="" fdo:deleteRule="Break" fdo:defaultIdentity="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexType>
+<xs:sequence>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:complexType>
+<xs:keyref name="dbo_rtable2_FK_RTABLE2_TABLE3" refer="dbo:table3_rtable2AKey">
+<xs:selector xpath=".//rtable2"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:keyref>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE1_ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TABLE3_KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE3_KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="rtable7" type="dbo:rtable7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="rtable7Key">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+<xs:unique name="rtable7Key_0">
+<xs:selector xpath=".//rtable7"/>
+<xs:field xpath="TABLE7_ID12345678901234567890"/>
+</xs:unique>
+</xs:element>
+<xs:complexType name="rtable7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TABLE7_ID12345678901234567890" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table1" type="dbo:table1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table1Key">
+<xs:selector xpath=".//table1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable1AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+<xs:key name="table1_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BLOB_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BOOL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="CHAR1_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="CHAR5_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DECIMAL_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INSERT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="25"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="INT16_COLUMN345678901234567890" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16">
+<xs:maxExclusive value="20000"/>
+</xs:restriction>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT32_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT64_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="LONG_STRING" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="8000"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="MONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="19"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NEW_GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="NTEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="1073741823"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NUMERIC_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="NVARCHAR_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="OBJECT_NAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="128"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="REAL_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SINGLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLDATETIME_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="SMALLMONEY_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="4"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TEXT_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="2147483647"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="TIMESTAMP_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:dateTime"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="TINYINT_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="UNIQUEID_COLUMN" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="36"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="VARBINARY_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table3" type="dbo:table3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table3Key">
+<xs:selector xpath=".//table3"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+<xs:key name="table3_rtable2AKey">
+<xs:selector xpath=".//dbo"/>
+<xs:field xpath="KEY1"/>
+<xs:field xpath="KEY2"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="DOUBLE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:double"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="KEY1">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="KEY2">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="10"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table4" type="dbo:table4Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table4Key">
+<xs:selector xpath=".//table4"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table4Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="table7" type="dbo:table7Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="table7Key">
+<xs:selector xpath=".//table7"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="table7Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="ID" fdo:readOnly="true" fdo:autogenerated="true">
+<xs:simpleType>
+<xs:restriction base="fdo:int64"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view1" type="dbo:view1Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view1Key">
+<xs:selector xpath=".//view1"/>
+<xs:field xpath="ID3456789012345678901234567890"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view1Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="BYTE_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:byte"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="DEC_COL_RENAME" minOccurs="0">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:decimal">
+<xs:totalDigits value="10"/>
+<xs:fractionDigits value="5"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+<xs:element name="ID3456789012345678901234567890">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+<xs:element name="view3" type="dbo:view3Type" abstract="false" substitutionGroup="gml:_Feature">
+<xs:key name="view3Key">
+<xs:selector xpath=".//view3"/>
+<xs:field xpath="ID"/>
+</xs:key>
+</xs:element>
+<xs:complexType name="view3Type" abstract="false">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:complexContent>
+<xs:extension base="fdo:ClassType">
+<xs:sequence>
+<xs:element name="GEOM_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="xs:hexBinary"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="ID">
+<xs:simpleType>
+<xs:restriction base="fdo:int32"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="INT16_COLUMN" minOccurs="0">
+<xs:simpleType>
+<xs:restriction base="fdo:int16"/>
+</xs:simpleType>
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+</xs:element>
+<xs:element name="STRING_COLUMN">
+<xs:annotation>
+<xs:documentation/>
+</xs:annotation>
+<xs:simpleType>
+<xs:restriction base="xs:string">
+<xs:maxLength value="50"/>
+</xs:restriction>
+</xs:simpleType>
+</xs:element>
+</xs:sequence>
+</xs:extension>
+</xs:complexContent>
+</xs:complexType>
+</xs:schema>
+<SchemaMapping xmlns:rdb="http://fdordbms.osgeo.org/schemas" xmlns="http://www.autodesk.com/isd/fdo/SqlServerProvider" textInRow="NotInRow" provider="Autodesk.SqlServer.3.5" name="dbo">
+<complexType name="rtable1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable1" name="dbo.rtable1"/>
+</complexType>
+<complexType name="rtable2Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable2" name="dbo.rtable2"/>
+</complexType>
+<complexType name="rtable7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="TABLE7_ID12345678901234567890">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_rtable7" name="dbo.rtable7"/>
+</complexType>
+<complexType name="table1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table1" name="dbo.table1"/>
+</complexType>
+<complexType name="table3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table3" name="dbo.table3"/>
+</complexType>
+<complexType name="table4Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table4" name="dbo.table4"/>
+</complexType>
+<complexType name="table7Type" identityIsGloballyUnique="false" identitySeed="1" identityIncrement="1" identityPropertyName="ID">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_table7" name="dbo.table7"/>
+</complexType>
+<complexType name="view1Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view1" name="dbo.view1"/>
+</complexType>
+<complexType name="view3Type" identityIsGloballyUnique="false" identitySeed="0" identityIncrement="0" identityPropertyName="">
+<Table tableFilegroup="PRIMARY" textFilegroup="PRIMARY" textInRow="NotInRow" pkeyName="pk_dbo_view3" name="dbo.view3"/>
+</complexType>
+</SchemaMapping>
+</fdo:DataStore>



More information about the mapguide-commits mailing list