diff --git a/DEPENDENCIES b/DEPENDENCIES
new file mode 100644
index 0000000..e25fc4e
--- /dev/null
+++ b/DEPENDENCIES
@@ -0,0 +1,3 @@
+DotCMIS requires .NET Framework 3.5 or higher.
+
+The DotCMIS unit tests require NUnit 2.5.
diff --git a/DotCMIS.sln b/DotCMIS.sln
new file mode 100644
index 0000000..1b740cb
--- /dev/null
+++ b/DotCMIS.sln
@@ -0,0 +1,45 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotCMIS", "DotCMIS\DotCMIS.csproj", "{529EF90F-A34C-4426-A4F9-65113AC23841}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotCMISUnitTest", "DotCMISUnitTest\DotCMISUnitTest.csproj", "{B4343D5F-BA78-4925-99C5-A0FFD80F862C}"
+EndProject
+Global
+	GlobalSection(TestCaseManagementSettings) = postSolution
+		CategoryFile = DotCMIS.vsmdi
+	EndGlobalSection
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Release|Any CPU.Build.0 = Release|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{529EF90F-A34C-4426-A4F9-65113AC23841}.Release|x86.ActiveCfg = Release|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{B4343D5F-BA78-4925-99C5-A0FFD80F862C}.Release|x86.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/DotCMIS.suo b/DotCMIS.suo
new file mode 100644
index 0000000..1fde0eb
--- /dev/null
+++ b/DotCMIS.suo
Binary files differ
diff --git a/DotCMIS/DotCMIS.csproj b/DotCMIS/DotCMIS.csproj
new file mode 100644
index 0000000..8c7534a
--- /dev/null
+++ b/DotCMIS/DotCMIS.csproj
@@ -0,0 +1,159 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{529EF90F-A34C-4426-A4F9-65113AC23841}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DotCMIS</RootNamespace>
+    <AssemblyName>DotCMIS</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="binding\atompub\atompub-parser.cs" />
+    <Compile Include="binding\atompub\atompub.cs" />
+    <Compile Include="binding\atompub\atompub-linkcache.cs" />
+    <Compile Include="binding\atompub\atompub-writer.cs" />
+    <Compile Include="binding\binding-caches.cs" />
+    <Compile Include="binding\binding-impl.cs" />
+    <Compile Include="binding\binding-intf.cs" />
+    <Compile Include="binding\http.cs" />
+    <Compile Include="binding\services.cs" />
+    <Compile Include="binding\converter.cs" />
+    <Compile Include="binding\webservices\webservices.cs" />
+    <Compile Include="client\client-intf.cs" />
+    <Compile Include="client\client-impl.cs" />
+    <Compile Include="const.cs" />
+    <Compile Include="data\data-impl.cs" />
+    <Compile Include="data\data-intf.cs" />
+    <Compile Include="enums.cs" />
+    <Compile Include="exceptions.cs" />
+    <Compile Include="data\extensions.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Service References\CMISWebServicesReference\Reference.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <WCFMetadata Include="Service References\" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="Service References\CMISWebServicesReference\CMIS-Core.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\CMIS-Messaging.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\CMISWebServices.wsdl" />
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisACLType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisAllowableActionsType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisContentStreamType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisExtensionType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisObjectInFolderContainerType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisObjectListType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisObjectParentsType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisObjectType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisPropertiesType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisRenditionType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisRepositoryEntryType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisTypeContainer.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+    <None Include="Service References\CMISWebServicesReference\DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete.datasource">
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <WCFMetadataStorage Include="Service References\CMISWebServicesReference\" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Service References\CMISWebServicesReference\configuration91.svcinfo" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Service References\CMISWebServicesReference\configuration.svcinfo" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Service References\CMISWebServicesReference\Reference.svcmap">
+      <Generator>WCF Proxy Generator</Generator>
+      <LastGenOutput>Reference.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/DotCMIS/Properties/AssemblyInfo.cs b/DotCMIS/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..736b520
--- /dev/null
+++ b/DotCMIS/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("DotCMIS")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Apache Software Foundation")]
+[assembly: AssemblyProduct("DotCMIS")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ac118463-00ec-4e63-8c93-b45760f9abcf")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/DotCMIS/Service References/CMISWebServicesReference/CMIS-Core.xsd b/DotCMIS/Service References/CMISWebServicesReference/CMIS-Core.xsd
new file mode 100644
index 0000000..9456768
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/CMIS-Core.xsd
@@ -0,0 +1,907 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" elementFormDefault="qualified" targetNamespace="http://docs.oasis-open.org/ns/cmis/core/200908/" version="1.0" jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:simpleType name="enumDecimalPrecision">
+    <xs:restriction base="xs:integer">
+      <xs:enumeration value="32" />
+      <xs:enumeration value="64" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumContentStreamAllowed">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="notallowed" />
+      <xs:enumeration value="allowed" />
+      <xs:enumeration value="required" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCardinality">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="single" />
+      <xs:enumeration value="multi" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumUpdatability">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="readonly" />
+      <xs:enumeration value="readwrite" />
+      <xs:enumeration value="whencheckedout" />
+      <xs:enumeration value="oncreate" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumDateTimeResolution">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="year" />
+      <xs:enumeration value="date" />
+      <xs:enumeration value="time" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumPropertyType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="boolean" />
+      <xs:enumeration value="id" />
+      <xs:enumeration value="integer" />
+      <xs:enumeration value="datetime" />
+      <xs:enumeration value="decimal" />
+      <xs:enumeration value="html" />
+      <xs:enumeration value="string" />
+      <xs:enumeration value="uri" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumBaseObjectTypeIds">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:document" />
+      <xs:enumeration value="cmis:folder" />
+      <xs:enumeration value="cmis:relationship" />
+      <xs:enumeration value="cmis:policy" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCapabilityQuery">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="metadataonly" />
+      <xs:enumeration value="fulltextonly" />
+      <xs:enumeration value="bothseparate" />
+      <xs:enumeration value="bothcombined" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCapabilityJoin">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="inneronly" />
+      <xs:enumeration value="innerandouter" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCapabilityContentStreamUpdates">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="anytime" />
+      <xs:enumeration value="pwconly" />
+      <xs:enumeration value="none" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumVersioningState">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="checkedout" />
+      <xs:enumeration value="minor" />
+      <xs:enumeration value="major" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumUnfileObject">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="unfile" />
+      <xs:enumeration value="deletesinglefiled" />
+      <xs:enumeration value="delete" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumRelationshipDirection">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="source" />
+      <xs:enumeration value="target" />
+      <xs:enumeration value="either" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumIncludeRelationships">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="source" />
+      <xs:enumeration value="target" />
+      <xs:enumeration value="both" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumPropertiesBase">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:name" />
+      <xs:enumeration value="cmis:objectId" />
+      <xs:enumeration value="cmis:objectTypeId" />
+      <xs:enumeration value="cmis:baseTypeId" />
+      <xs:enumeration value="cmis:createdBy" />
+      <xs:enumeration value="cmis:creationDate" />
+      <xs:enumeration value="cmis:lastModifiedBy" />
+      <xs:enumeration value="cmis:lastModificationDate" />
+      <xs:enumeration value="cmis:changeToken" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumPropertiesDocument">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:isImmutable" />
+      <xs:enumeration value="cmis:isLatestVersion" />
+      <xs:enumeration value="cmis:isMajorVersion" />
+      <xs:enumeration value="cmis:isLatestMajorVersion" />
+      <xs:enumeration value="cmis:versionLabel" />
+      <xs:enumeration value="cmis:versionSeriesId" />
+      <xs:enumeration value="cmis:isVersionSeriesCheckedOut" />
+      <xs:enumeration value="cmis:versionSeriesCheckedOutBy" />
+      <xs:enumeration value="cmis:versionSeriesCheckedOutId" />
+      <xs:enumeration value="cmis:checkinComment" />
+      <xs:enumeration value="cmis:contentStreamLength" />
+      <xs:enumeration value="cmis:contentStreamMimeType" />
+      <xs:enumeration value="cmis:contentStreamFileName" />
+      <xs:enumeration value="cmis:contentStreamId" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumPropertiesFolder">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:parentId" />
+      <xs:enumeration value="cmis:allowedChildObjectTypeIds" />
+      <xs:enumeration value="cmis:path" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumPropertiesRelationship">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:sourceId" />
+      <xs:enumeration value="cmis:targetId" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumPropertiesPolicy">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:policyText" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:attributeGroup name="cmisUndefinedAttribute">
+    <xs:anyAttribute namespace="##other" processContents="lax" />
+  </xs:attributeGroup>
+  <xs:complexType name="cmisObjectType">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="allowableActions" type="cmis:cmisAllowableActionsType" />
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="relationship" type="cmis:cmisObjectType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="changeEventInfo" type="cmis:cmisChangeEventType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="acl" type="cmis:cmisAccessControlListType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="exactACL" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="policyIds" type="cmis:cmisListOfIdsType" />
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="rendition" type="cmis:cmisRenditionType" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:attribute name="key" type="xs:string" />
+  <xs:attribute name="index" type="xs:integer" />
+  <xs:complexType name="cmisPropertiesType">
+    <xs:sequence>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:annotation>
+          <xs:appinfo>
+            <jaxb:property name="property" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" />
+          </xs:appinfo>
+        </xs:annotation>
+        <xs:element name="propertyBoolean" nillable="true" type="cmis:cmisPropertyBoolean" />
+        <xs:element name="propertyId" nillable="true" type="cmis:cmisPropertyId" />
+        <xs:element name="propertyInteger" nillable="true" type="cmis:cmisPropertyInteger" />
+        <xs:element name="propertyDateTime" nillable="true" type="cmis:cmisPropertyDateTime" />
+        <xs:element name="propertyDecimal" nillable="true" type="cmis:cmisPropertyDecimal" />
+        <xs:element name="propertyHtml" nillable="true" type="cmis:cmisPropertyHtml" />
+        <xs:element name="propertyString" nillable="true" type="cmis:cmisPropertyString" />
+        <xs:element name="propertyUri" nillable="true" type="cmis:cmisPropertyUri" />
+      </xs:choice>
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisProperty">
+    <xs:attribute name="propertyDefinitionId" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+					This is the property definition id for this
+					property instance. This is
+					not required to be set when used as a
+					default value. This is
+					required to be set when used for query result
+					set or returning
+					properties on an object.
+		</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="localName" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+					This is the localname as defined by the property
+					definition
+				</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="displayName" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+					This is the displayname as defined by the property
+					definition
+				</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="queryName" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+					This is the queryName. This must be specified if
+					this is the result of a query. If aliases are used, the alias is to
+					be specified here instead of the queryName.
+				</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyBoolean">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:boolean" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyId">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:string" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyInteger">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:integer" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyDateTime">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:dateTime" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyDecimal">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:decimal" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyHtml">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:string" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyString">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:string" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyUri">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisProperty">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:anyURI" />
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoice">
+    <xs:attribute name="displayName" use="required" />
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceBoolean">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:boolean" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceBoolean" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceId">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:string" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceId" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceInteger">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:integer" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceInteger" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceDateTime">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:dateTime" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceDateTime" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceDecimal">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:decimal" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceDecimal" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceHtml">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:string" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceHtml" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceString">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:string" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceString" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisChoiceUri">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisChoice">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="value" type="xs:anyURI" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceUri" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisAllowableActionsType">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="1" name="canDeleteObject" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canUpdateProperties" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetFolderTree" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetProperties" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetObjectRelationships" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetObjectParents" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetFolderParent" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetDescendants" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canMoveObject" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canDeleteContentStream" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canCheckOut" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canCancelCheckOut" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canCheckIn" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canSetContentStream" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetAllVersions" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canAddObjectToFolder" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canRemoveObjectFromFolder" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetContentStream" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canApplyPolicy" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetAppliedPolicies" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canRemovePolicy" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetChildren" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canCreateDocument" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canCreateFolder" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canCreateRelationship" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canDeleteTree" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetRenditions" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canGetACL" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="canApplyACL" type="xs:boolean" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisListOfIdsType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="unbounded" name="id" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyDefinitionType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="id" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="localName" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="localNamespace" type="xs:anyURI" />
+      <xs:element minOccurs="0" maxOccurs="1" name="displayName" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="queryName" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="description" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="propertyType" type="cmis:enumPropertyType" />
+      <xs:element minOccurs="1" maxOccurs="1" name="cardinality" type="cmis:enumCardinality" />
+      <xs:element minOccurs="1" maxOccurs="1" name="updatability" type="cmis:enumUpdatability" />
+      <xs:element minOccurs="0" maxOccurs="1" name="inherited" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="required" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="queryable" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="orderable" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="openChoice" type="xs:boolean" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyBooleanDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyBoolean" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceBoolean" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyIdDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyId" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceId" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyIntegerDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyInteger" />
+          <xs:element minOccurs="0" maxOccurs="1" name="maxValue" type="xs:integer" />
+          <xs:element minOccurs="0" maxOccurs="1" name="minValue" type="xs:integer" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceInteger" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyDateTimeDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyDateTime" />
+          <xs:element minOccurs="0" maxOccurs="1" name="resolution" type="cmis:enumDateTimeResolution" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceDateTime" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyDecimalDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyDecimal" />
+          <xs:element minOccurs="0" maxOccurs="1" name="maxValue" type="xs:decimal" />
+          <xs:element minOccurs="0" maxOccurs="1" name="minValue" type="xs:decimal" />
+          <xs:element minOccurs="0" maxOccurs="1" name="precision" type="cmis:enumDecimalPrecision" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceDecimal" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyHtmlDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyHtml" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceHtml" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyStringDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyString" />
+          <xs:element minOccurs="0" maxOccurs="1" name="maxLength" type="xs:integer" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceString" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisPropertyUriDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisPropertyDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="1" name="defaultValue" type="cmis:cmisPropertyUri" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="choice" type="cmis:cmisChoiceUri" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisTypeDefinitionType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="id" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="localName" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="localNamespace" nillable="true" type="xs:anyURI" />
+      <xs:element minOccurs="0" maxOccurs="1" name="displayName" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="queryName" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="description" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="baseId" type="cmis:enumBaseObjectTypeIds" />
+      <xs:element minOccurs="0" maxOccurs="1" name="parentId" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+						This is the id for the parent type definition. If
+						this is a base type,
+						this is not present.
+			</xs:documentation>
+        </xs:annotation>
+      </xs:element>
+      <xs:element minOccurs="1" maxOccurs="1" name="creatable" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="fileable" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="queryable" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="fulltextIndexed" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" default="true" name="includedInSupertypeQuery" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="controllablePolicy" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="controllableACL" type="xs:boolean" />
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:annotation>
+          <xs:appinfo>
+            <jaxb:property name="propertyDefinition" />
+          </xs:appinfo>
+        </xs:annotation>
+        <xs:element name="propertyBooleanDefinition" type="cmis:cmisPropertyBooleanDefinitionType" />
+        <xs:element name="propertyDateTimeDefinition" type="cmis:cmisPropertyDateTimeDefinitionType" />
+        <xs:element name="propertyDecimalDefinition" type="cmis:cmisPropertyDecimalDefinitionType" />
+        <xs:element name="propertyIdDefinition" type="cmis:cmisPropertyIdDefinitionType" />
+        <xs:element name="propertyIntegerDefinition" type="cmis:cmisPropertyIntegerDefinitionType" />
+        <xs:element name="propertyHtmlDefinition" type="cmis:cmisPropertyHtmlDefinitionType" />
+        <xs:element name="propertyStringDefinition" type="cmis:cmisPropertyStringDefinitionType" />
+        <xs:element name="propertyUriDefinition" type="cmis:cmisPropertyUriDefinitionType" />
+      </xs:choice>
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisTypeDocumentDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisTypeDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="1" maxOccurs="1" name="versionable" type="xs:boolean" />
+          <xs:element minOccurs="1" maxOccurs="1" name="contentStreamAllowed" type="cmis:enumContentStreamAllowed" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisTypeFolderDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisTypeDefinitionType">
+        <xs:sequence />
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisTypeRelationshipDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisTypeDefinitionType">
+        <xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="allowedSourceTypes" type="xs:string" />
+          <xs:element minOccurs="0" maxOccurs="unbounded" name="allowedTargetTypes" type="xs:string" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisTypePolicyDefinitionType">
+    <xs:complexContent mixed="false">
+      <xs:extension base="cmis:cmisTypeDefinitionType">
+        <xs:sequence />
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="cmisQueryType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="statement" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="searchAllVersions" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" type="cmis:enumIncludeRelationships" />
+      <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="maxItems" type="xs:integer" />
+      <xs:element minOccurs="0" maxOccurs="1" name="skipCount" type="xs:integer" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisRepositoryInfoType">
+    <xs:sequence minOccurs="1">
+      <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="repositoryName" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="repositoryDescription" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="vendorName" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="productName" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="productVersion" type="xs:string" />
+      <xs:element name="rootFolderId" type="xs:string" />
+      <xs:element minOccurs="0" name="latestChangeLogToken" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilities" type="cmis:cmisRepositoryCapabilitiesType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="aclCapability" type="cmis:cmisACLCapabilityType" />
+      <xs:element minOccurs="1" maxOccurs="1" name="cmisVersionSupported" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="thinClientURI" type="xs:anyURI" />
+      <xs:element minOccurs="0" maxOccurs="1" name="changesIncomplete" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="changesOnType" type="cmis:enumBaseObjectTypeIds" />
+      <xs:element minOccurs="0" maxOccurs="1" name="principalAnonymous" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+						If set, this field holds the principal who is
+						used for anonymous
+						access. This principal can then be passed to the
+						ACL services to
+						specify what permissions anonymous users should
+						have
+					</xs:documentation>
+        </xs:annotation>
+      </xs:element>
+      <xs:element minOccurs="0" maxOccurs="1" name="principalAnyone" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+						If set, this field holds the principal who is
+						used for everyone's access. This principal can then be passed to
+						the
+						ACL services to
+						specify what permissions everyone should
+						have
+					</xs:documentation>
+        </xs:annotation>
+      </xs:element>
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisRepositoryCapabilitiesType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityACL" type="cmis:enumCapabilityACL" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityAllVersionsSearchable" type="xs:boolean" />
+      <xs:element name="capabilityChanges" type="cmis:enumCapabilityChanges" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityContentStreamUpdatability" type="cmis:enumCapabilityContentStreamUpdates" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityGetDescendants" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityGetFolderTree" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityMultifiling" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityPWCSearchable" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityPWCUpdatable" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityQuery" type="cmis:enumCapabilityQuery" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityRenditions" type="cmis:enumCapabilityRendition" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityUnfiling" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityVersionSpecificFiling" type="xs:boolean" />
+      <xs:element minOccurs="1" maxOccurs="1" name="capabilityJoin" type="cmis:enumCapabilityJoin" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:simpleType name="enumTypeOfChanges">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="created" />
+      <xs:enumeration value="updated" />
+      <xs:enumeration value="deleted" />
+      <xs:enumeration value="security" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCapabilityChanges">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="objectidsonly" />
+      <xs:enumeration value="properties" />
+      <xs:enumeration value="all" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:complexType name="cmisChangeEventType">
+    <xs:sequence>
+      <xs:element name="changeType" type="cmis:enumTypeOfChanges" />
+      <xs:element name="changeTime" type="xs:dateTime" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:simpleType name="enumACLPropagation">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="repositorydetermined" />
+      <xs:enumeration value="objectonly" />
+      <xs:enumeration value="propagate" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCapabilityACL">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="discover" />
+      <xs:enumeration value="manage" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumBasicPermissions">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:read" />
+      <xs:enumeration value="cmis:write" />
+      <xs:enumeration value="cmis:all" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:complexType name="cmisPermissionDefinition">
+    <xs:sequence>
+      <xs:element name="permission" type="xs:string" />
+      <xs:element minOccurs="0" maxOccurs="1" name="description" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="cmisPermissionMapping">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="key" type="cmis:enumAllowableActionsKey" />
+      <xs:element minOccurs="1" maxOccurs="unbounded" name="permission" type="xs:string">
+        <xs:annotation>
+          <xs:documentation>
+						Multiple entries are OR'ed together. Any
+						permission that specified is
+						sufficient to provide rights required
+						in key
+					</xs:documentation>
+        </xs:annotation>
+      </xs:element>
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:simpleType name="enumAllowableActionsKey">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="canGetDescendents.Folder" />
+      <xs:enumeration value="canGetChildren.Folder" />
+      <xs:enumeration value="canGetParents.Folder" />
+      <xs:enumeration value="canGetFolderParent.Object" />
+      <xs:enumeration value="canCreateDocument.Folder" />
+      <xs:enumeration value="canCreateFolder.Folder" />
+      <xs:enumeration value="canCreateRelationship.Source" />
+      <xs:enumeration value="canCreateRelationship.Target" />
+      <xs:enumeration value="canGetProperties.Object" />
+      <xs:enumeration value="canViewContent.Object" />
+      <xs:enumeration value="canUpdateProperties.Object" />
+      <xs:enumeration value="canMove.Object" />
+      <xs:enumeration value="canMove.Target" />
+      <xs:enumeration value="canMove.Source" />
+      <xs:enumeration value="canDelete.Object" />
+      <xs:enumeration value="canDeleteTree.Folder" />
+      <xs:enumeration value="canSetContent.Document" />
+      <xs:enumeration value="canDeleteContent.Document" />
+      <xs:enumeration value="canAddToFolder.Object" />
+      <xs:enumeration value="canAddToFolder.Folder" />
+      <xs:enumeration value="canRemoveFromFolder.Object" />
+      <xs:enumeration value="canRemoveFromFolder.Folder" />
+      <xs:enumeration value="canCheckout.Document" />
+      <xs:enumeration value="canCancelCheckout.Document" />
+      <xs:enumeration value="canCheckin.Document" />
+      <xs:enumeration value="canGetAllVersions.VersionSeries" />
+      <xs:enumeration value="canGetObjectRelationships.Object" />
+      <xs:enumeration value="canAddPolicy.Object" />
+      <xs:enumeration value="canAddPolicy.Policy" />
+      <xs:enumeration value="canRemovePolicy.Object" />
+      <xs:enumeration value="canRemovePolicy.Policy" />
+      <xs:enumeration value="canGetAppliedPolicies.Object" />
+      <xs:enumeration value="canGetACL.Object" />
+      <xs:enumeration value="canApplyACL.Object" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumUsers">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:user">
+        <xs:annotation>
+          <xs:documentation>
+						This user can be used on setting ACLs to specify
+						the permission this
+						user context should have.
+			</xs:documentation>
+        </xs:annotation>
+      </xs:enumeration>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:complexType name="cmisAccessControlPrincipalType">
+    <xs:sequence>
+      <xs:element name="principalId" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="cmisAccessControlEntryType">
+    <xs:sequence>
+      <xs:element name="principal" type="cmis:cmisAccessControlPrincipalType" />
+      <xs:element minOccurs="1" maxOccurs="unbounded" name="permission" type="xs:string" />
+      <xs:element name="direct" type="xs:boolean" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="cmisAccessControlListType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="unbounded" name="permission" type="cmis:cmisAccessControlEntryType" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="cmisACLCapabilityType">
+    <xs:sequence>
+      <xs:element name="supportedPermissions" type="cmis:enumSupportedPermissions" />
+      <xs:element name="propagation" type="cmis:enumACLPropagation" />
+      <xs:element minOccurs="1" maxOccurs="unbounded" name="permissions" type="cmis:cmisPermissionDefinition" />
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="mapping" type="cmis:cmisPermissionMapping" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:simpleType name="enumSupportedPermissions">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="basic" />
+      <xs:enumeration value="repository" />
+      <xs:enumeration value="both" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumCapabilityRendition">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="none" />
+      <xs:enumeration value="read" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:simpleType name="enumRenditionKind">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="cmis:thumbnail" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:complexType name="cmisRenditionType">
+    <xs:sequence>
+      <xs:element name="streamId" type="xs:string" />
+      <xs:element name="mimetype" type="xs:string" />
+      <xs:element name="length" type="xs:integer" />
+      <xs:element name="kind" type="xs:string" />
+      <xs:element minOccurs="0" name="title" type="xs:string" />
+      <xs:element minOccurs="0" name="height" type="xs:integer" />
+      <xs:element minOccurs="0" name="width" type="xs:integer" />
+      <xs:element minOccurs="0" name="renditionDocumentId" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="allowableActions" type="cmis:cmisAllowableActionsType">
+    <xs:annotation>
+      <xs:documentation>
+				This is the root tag for a CMIS AllowableActions
+				Document Type
+			</xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="query" type="cmis:cmisQueryType">
+    <xs:annotation>
+      <xs:documentation>
+				This is the root tag for a CMIS Query Document Type
+			</xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="acl" type="cmis:cmisAccessControlListType">
+    <xs:annotation>
+      <xs:documentation>
+				This is the root tag for a CMIS ACL Document Type
+			</xs:documentation>
+    </xs:annotation>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/CMIS-Messaging.xsd b/DotCMIS/Service References/CMISWebServicesReference/CMIS-Messaging.xsd
new file mode 100644
index 0000000..5d9b7cd
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/CMIS-Messaging.xsd
@@ -0,0 +1,1471 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/" xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/" elementFormDefault="qualified" targetNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/" version="1.0" jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import schemaLocation="CMIS-Core.xsd" namespace="http://docs.oasis-open.org/ns/cmis/core/200908/" />
+  <xs:complexType name="cmisFaultType">
+    <xs:sequence>
+      <xs:element name="type" type="cmism:enumServiceException" />
+      <xs:element name="code" type="xs:integer" />
+      <xs:element name="message" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="cmisFault" type="cmism:cmisFaultType" />
+  <xs:simpleType name="enumServiceException">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="constraint" />
+      <xs:enumeration value="nameConstraintViolation" />
+      <xs:enumeration value="contentAlreadyExists" />
+      <xs:enumeration value="filterNotValid" />
+      <xs:enumeration value="invalidArgument" />
+      <xs:enumeration value="notSupported" />
+      <xs:enumeration value="objectNotFound" />
+      <xs:enumeration value="permissionDenied" />
+      <xs:enumeration value="runtime" />
+      <xs:enumeration value="storage" />
+      <xs:enumeration value="streamNotSupported" />
+      <xs:enumeration value="updateConflict" />
+      <xs:enumeration value="versioning" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:complexType name="cmisExtensionType">
+    <xs:sequence>
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="cmisTypeContainer">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="type" type="cmis:cmisTypeDefinitionType" />
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="cmism:cmisTypeContainer" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisTypeDefinitionListType">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="types" type="cmis:cmisTypeDefinitionType" />
+      <xs:element minOccurs="1" maxOccurs="1" name="hasMoreItems" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="numItems" type="xs:integer" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisObjectInFolderContainerType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="objectInFolder" type="cmism:cmisObjectInFolderType" />
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="children" type="cmism:cmisObjectInFolderContainerType" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisObjectListType">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="objects" type="cmis:cmisObjectType" />
+      <xs:element minOccurs="1" maxOccurs="1" name="hasMoreItems" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="numItems" type="xs:integer" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisObjectInFolderType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="object" type="cmis:cmisObjectType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="pathSegment" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisObjectParentsType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="object" type="cmis:cmisObjectType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="relativePathSegment" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisObjectInFolderListType">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="objects" type="cmism:cmisObjectInFolderType" />
+      <xs:element minOccurs="1" maxOccurs="1" name="hasMoreItems" type="xs:boolean" />
+      <xs:element minOccurs="0" maxOccurs="1" name="numItems" type="xs:integer" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisRepositoryEntryType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+      <xs:element minOccurs="1" maxOccurs="1" name="repositoryName" type="xs:string" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisContentStreamType">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="length" type="xs:integer" />
+      <xs:element minOccurs="0" name="mimeType" type="xs:string" />
+      <xs:element minOccurs="0" name="filename" type="xs:string" />
+      <xs:element xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmime:expectedContentTypes="application/octet-stream" name="stream" type="xs:base64Binary" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:complexType name="cmisACLType">
+    <xs:sequence>
+      <xs:element minOccurs="1" maxOccurs="1" name="ACL" type="cmis:cmisAccessControlListType" />
+      <xs:element minOccurs="0" maxOccurs="1" name="exact" type="xs:boolean" />
+      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+    </xs:sequence>
+    <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+  </xs:complexType>
+  <xs:element name="getRepositories">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getRepositoriesResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="repositories" nillable="true" type="cmism:cmisRepositoryEntryType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getRepositoryInfo">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getRepositoryInfoResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryInfo" type="cmis:cmisRepositoryInfoType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getTypeChildren">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="typeId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePropertyDefinitions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="skipCount" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getTypeChildrenResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="types" type="cmism:cmisTypeDefinitionListType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getTypeDescendants">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="typeId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="depth" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePropertyDefinitions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getTypeDescendantsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="types" type="cmism:cmisTypeContainer" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getTypeDefinition">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="typeId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getTypeDefinitionResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="type" type="cmis:cmisTypeDefinitionType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getDescendants">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="depth" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePathSegment" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getDescendantsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="objects" type="cmism:cmisObjectInFolderContainerType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getFolderTree">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="depth" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePathSegment" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getFolderTreeResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="objects" type="cmism:cmisObjectInFolderContainerType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getChildren">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="orderBy" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePathSegment" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="skipCount" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getChildrenResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objects" type="cmism:cmisObjectInFolderListType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getFolderParent">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getFolderParentResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="object" type="cmis:cmisObjectType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectParents">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelativePathSegment" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectParentsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="parents" type="cmism:cmisObjectParentsType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getRenditions">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="skipCount" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getRenditionsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="renditions" type="cmis:cmisRenditionType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getCheckedOutDocs">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="folderId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="orderBy" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="skipCount" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getCheckedOutDocsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objects" type="cmism:cmisObjectListType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createDocument">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="folderId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="contentStream" nillable="true" type="cmism:cmisContentStreamType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="versioningState" nillable="true" type="cmis:enumVersioningState" />
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="policies" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createDocumentResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createDocumentFromSource">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="sourceId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="folderId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="versioningState" nillable="true" type="cmis:enumVersioningState" />
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="policies" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createDocumentFromSourceResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createFolder">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="policies" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createFolderResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createRelationship">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="policies" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createRelationshipResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createPolicy">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="folderId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="policies" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="createPolicyResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getAllowableActions">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getAllowableActionsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="allowableActions" type="cmis:cmisAllowableActionsType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getProperties">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getPropertiesResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePolicyIds" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeACL" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="object" type="cmis:cmisObjectType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectByPath">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="path" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePolicyIds" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeACL" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectByPathResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="object" type="cmis:cmisObjectType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getContentStream">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="streamId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="offset" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="length" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getContentStreamResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="contentStream" type="cmism:cmisContentStreamType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="updateProperties">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeToken" nillable="true" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="updatePropertiesResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeToken" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="moveObject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="targetFolderId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="sourceFolderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="moveObjectResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deleteObject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="allVersions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deleteObjectResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deleteTree">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="allVersions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="unfileObjects" nillable="true" type="cmis:enumUnfileObject" />
+        <xs:element minOccurs="0" maxOccurs="1" name="continueOnFailure" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deleteTreeResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="failedToDelete">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element minOccurs="0" maxOccurs="unbounded" name="objectIds" type="xs:string" />
+              <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="setContentStream">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="overwriteFlag" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeToken" nillable="true" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="contentStream" type="cmism:cmisContentStreamType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="setContentStreamResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeToken" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deleteContentStream">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeToken" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="deleteContentStreamResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeToken" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="addObjectToFolder">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="folderId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="allVersions" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="addObjectToFolderResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="removeObjectFromFolder">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="folderId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="removeObjectFromFolderResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="query">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="statement" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="searchAllVersions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="skipCount" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+      <xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="queryResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objects" type="cmism:cmisObjectListType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getContentChanges">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="changeLogToken" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeProperties" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePolicyIds" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeACL" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getContentChangesResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objects" type="cmism:cmisObjectListType" />
+        <xs:element minOccurs="1" maxOccurs="1" name="changeLogToken" type="xs:string" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="checkOut">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="checkOutResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="contentCopied" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="cancelCheckOut">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="cancelCheckOutResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="checkIn">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="major" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="properties" nillable="true" type="cmis:cmisPropertiesType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="contentStream" nillable="true" type="cmism:cmisContentStreamType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="checkinComment" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="policies" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" nillable="true" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="checkInResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getPropertiesOfLatestVersion">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="major" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getPropertiesOfLatestVersionResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="properties" type="cmis:cmisPropertiesType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectOfLatestVersion">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="major" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeRelationships" nillable="true" type="cmis:enumIncludeRelationships" />
+        <xs:element minOccurs="0" maxOccurs="1" name="renditionFilter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includePolicyIds" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeACL" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectOfLatestVersionResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="object" type="cmis:cmisObjectType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getAllVersions">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getAllVersionsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="objects" type="cmis:cmisObjectType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectRelationships">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeSubRelationshipTypes" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="relationshipDirection" nillable="true" type="cmis:enumRelationshipDirection" />
+        <xs:element minOccurs="0" maxOccurs="1" name="typeId" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="includeAllowableActions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="maxItems" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="skipCount" nillable="true" type="xs:integer" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getObjectRelationshipsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="objects" type="cmism:cmisObjectListType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="applyPolicy">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="policyId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="applyPolicyResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="removePolicy">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="policyId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="removePolicyResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getAppliedPolicies">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="filter" nillable="true" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getAppliedPoliciesResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="objects" type="cmis:cmisObjectType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getACL">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="onlyBasicPermissions" nillable="true" type="xs:boolean" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="getACLResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="ACL" type="cmism:cmisACLType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="applyACL">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="repositoryId" type="xs:string" />
+        <xs:element minOccurs="1" maxOccurs="1" name="objectId" type="xs:string" />
+        <xs:element minOccurs="0" maxOccurs="1" name="addACEs" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="removeACEs" type="cmis:cmisAccessControlListType" />
+        <xs:element minOccurs="0" maxOccurs="1" name="ACLPropagation" nillable="true" type="cmis:enumACLPropagation" />
+        <xs:element minOccurs="0" maxOccurs="1" name="extension" nillable="true" type="cmism:cmisExtensionType">
+          <xs:annotation>
+            <xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+          </xs:annotation>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="applyACLResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="1" maxOccurs="1" name="ACL" type="cmism:cmisACLType" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/CMISWebServices.wsdl b/DotCMIS/Service References/CMISWebServicesReference/CMISWebServices.wsdl
new file mode 100644
index 0000000..1060067
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/CMISWebServices.wsdl
@@ -0,0 +1,1114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<definitions xmlns:cmisw="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/" xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns="http://schemas.xmlsoap.org/soap/encoding/" name="CMISWebServices" targetNamespace="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns="http://schemas.xmlsoap.org/wsdl/">
+  <types>
+    <xsd:schema elementFormDefault="qualified" targetNamespace="http://docs.oasis-open.org/ns/cmis/ws/200908/">
+      <xsd:import schemaLocation="CMIS-Core.xsd" namespace="http://docs.oasis-open.org/ns/cmis/core/200908/" />
+      <xsd:import schemaLocation="CMIS-Messaging.xsd" namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/" />
+    </xsd:schema>
+  </types>
+  <message name="cmisException">
+    <part name="fault" element="cmism:cmisFault" />
+  </message>
+  <message name="getACLRequest">
+    <part name="parameters" element="cmism:getACL" />
+  </message>
+  <message name="getACLResponse">
+    <part name="parameters" element="cmism:getACLResponse" />
+  </message>
+  <message name="applyACLRequest">
+    <part name="parameters" element="cmism:applyACL" />
+  </message>
+  <message name="applyACLResponse">
+    <part name="parameters" element="cmism:applyACLResponse" />
+  </message>
+  <message name="queryRequest">
+    <part name="parameters" element="cmism:query" />
+  </message>
+  <message name="queryResponse">
+    <part name="parameters" element="cmism:queryResponse" />
+  </message>
+  <message name="getContentChangesRequest">
+    <part name="parameters" element="cmism:getContentChanges" />
+  </message>
+  <message name="getContentChangesResponse">
+    <part name="parameters" element="cmism:getContentChangesResponse" />
+  </message>
+  <message name="addObjectToFolderRequest">
+    <part name="parameters" element="cmism:addObjectToFolder" />
+  </message>
+  <message name="addObjectToFolderResponse">
+    <part name="parameters" element="cmism:addObjectToFolderResponse" />
+  </message>
+  <message name="removeObjectFromFolderRequest">
+    <part name="parameters" element="cmism:removeObjectFromFolder" />
+  </message>
+  <message name="removeObjectFromFolderResponse">
+    <part name="parameters" element="cmism:removeObjectFromFolderResponse" />
+  </message>
+  <message name="getDescendantsRequest">
+    <part name="parameters" element="cmism:getDescendants" />
+  </message>
+  <message name="getDescendantsResponse">
+    <part name="parameters" element="cmism:getDescendantsResponse" />
+  </message>
+  <message name="getChildrenRequest">
+    <part name="parameters" element="cmism:getChildren" />
+  </message>
+  <message name="getChildrenResponse">
+    <part name="parameters" element="cmism:getChildrenResponse" />
+  </message>
+  <message name="getFolderParentRequest">
+    <part name="parameters" element="cmism:getFolderParent" />
+  </message>
+  <message name="getFolderParentResponse">
+    <part name="parameters" element="cmism:getFolderParentResponse" />
+  </message>
+  <message name="getObjectParentsRequest">
+    <part name="parameters" element="cmism:getObjectParents" />
+  </message>
+  <message name="getObjectParentsResponse">
+    <part name="parameters" element="cmism:getObjectParentsResponse" />
+  </message>
+  <message name="getRenditionsRequest">
+    <part name="parameters" element="cmism:getRenditions" />
+  </message>
+  <message name="getRenditionsResponse">
+    <part name="parameters" element="cmism:getRenditionsResponse" />
+  </message>
+  <message name="getCheckedOutDocsRequest">
+    <part name="parameters" element="cmism:getCheckedOutDocs" />
+  </message>
+  <message name="getCheckedOutDocsResponse">
+    <part name="parameters" element="cmism:getCheckedOutDocsResponse" />
+  </message>
+  <message name="createDocumentRequest">
+    <part name="parameters" element="cmism:createDocument" />
+  </message>
+  <message name="createDocumentResponse">
+    <part name="parameters" element="cmism:createDocumentResponse" />
+  </message>
+  <message name="createDocumentFromSourceRequest">
+    <part name="parameters" element="cmism:createDocumentFromSource" />
+  </message>
+  <message name="createDocumentFromSourceResponse">
+    <part name="parameters" element="cmism:createDocumentFromSourceResponse" />
+  </message>
+  <message name="createFolderRequest">
+    <part name="parameters" element="cmism:createFolder" />
+  </message>
+  <message name="createFolderResponse">
+    <part name="parameters" element="cmism:createFolderResponse" />
+  </message>
+  <message name="createRelationshipRequest">
+    <part name="parameters" element="cmism:createRelationship" />
+  </message>
+  <message name="createRelationshipResponse">
+    <part name="parameters" element="cmism:createRelationshipResponse" />
+  </message>
+  <message name="createPolicyRequest">
+    <part name="parameters" element="cmism:createPolicy" />
+  </message>
+  <message name="createPolicyResponse">
+    <part name="parameters" element="cmism:createPolicyResponse" />
+  </message>
+  <message name="getAllowableActionsRequest">
+    <part name="parameters" element="cmism:getAllowableActions" />
+  </message>
+  <message name="getAllowableActionsResponse">
+    <part name="parameters" element="cmism:getAllowableActionsResponse" />
+  </message>
+  <message name="getObjectRequest">
+    <part name="parameters" element="cmism:getObject" />
+  </message>
+  <message name="getObjectResponse">
+    <part name="parameters" element="cmism:getObjectResponse" />
+  </message>
+  <message name="getPropertiesRequest">
+    <part name="parameters" element="cmism:getProperties" />
+  </message>
+  <message name="getPropertiesResponse">
+    <part name="parameters" element="cmism:getPropertiesResponse" />
+  </message>
+  <message name="getObjectByPathRequest">
+    <part name="parameters" element="cmism:getObjectByPath" />
+  </message>
+  <message name="getObjectByPathResponse">
+    <part name="parameters" element="cmism:getObjectByPathResponse" />
+  </message>
+  <message name="getContentStreamRequest">
+    <part name="parameters" element="cmism:getContentStream" />
+  </message>
+  <message name="getContentStreamResponse">
+    <part name="parameters" element="cmism:getContentStreamResponse" />
+  </message>
+  <message name="updatePropertiesRequest">
+    <part name="parameters" element="cmism:updateProperties" />
+  </message>
+  <message name="updatePropertiesResponse">
+    <part name="parameters" element="cmism:updatePropertiesResponse" />
+  </message>
+  <message name="moveObjectRequest">
+    <part name="parameters" element="cmism:moveObject" />
+  </message>
+  <message name="moveObjectResponse">
+    <part name="parameters" element="cmism:moveObjectResponse" />
+  </message>
+  <message name="deleteObjectRequest">
+    <part name="parameters" element="cmism:deleteObject" />
+  </message>
+  <message name="deleteObjectResponse">
+    <part name="parameters" element="cmism:deleteObjectResponse" />
+  </message>
+  <message name="deleteTreeRequest">
+    <part name="parameters" element="cmism:deleteTree" />
+  </message>
+  <message name="deleteTreeResponse">
+    <part name="parameters" element="cmism:deleteTreeResponse" />
+  </message>
+  <message name="setContentStreamRequest">
+    <part name="parameters" element="cmism:setContentStream" />
+  </message>
+  <message name="setContentStreamResponse">
+    <part name="parameters" element="cmism:setContentStreamResponse" />
+  </message>
+  <message name="deleteContentStreamRequest">
+    <part name="parameters" element="cmism:deleteContentStream" />
+  </message>
+  <message name="deleteContentStreamResponse">
+    <part name="parameters" element="cmism:deleteContentStreamResponse" />
+  </message>
+  <message name="applyPolicyRequest">
+    <part name="parameters" element="cmism:applyPolicy" />
+  </message>
+  <message name="applyPolicyResponse">
+    <part name="parameters" element="cmism:applyPolicyResponse" />
+  </message>
+  <message name="removePolicyRequest">
+    <part name="parameters" element="cmism:removePolicy" />
+  </message>
+  <message name="removePolicyResponse">
+    <part name="parameters" element="cmism:removePolicyResponse" />
+  </message>
+  <message name="getAppliedPoliciesRequest">
+    <part name="parameters" element="cmism:getAppliedPolicies" />
+  </message>
+  <message name="getAppliedPoliciesResponse">
+    <part name="parameters" element="cmism:getAppliedPoliciesResponse" />
+  </message>
+  <message name="getObjectRelationshipsRequest">
+    <part name="parameters" element="cmism:getObjectRelationships" />
+  </message>
+  <message name="getObjectRelationshipsResponse">
+    <part name="parameters" element="cmism:getObjectRelationshipsResponse" />
+  </message>
+  <message name="getRepositoriesRequest">
+    <part name="parameters" element="cmism:getRepositories" />
+  </message>
+  <message name="getRepositoriesResponse">
+    <part name="parameters" element="cmism:getRepositoriesResponse" />
+  </message>
+  <message name="getRepositoryInfoRequest">
+    <part name="parameters" element="cmism:getRepositoryInfo" />
+  </message>
+  <message name="getRepositoryInfoResponse">
+    <part name="parameters" element="cmism:getRepositoryInfoResponse" />
+  </message>
+  <message name="getTypeChildrenRequest">
+    <part name="parameters" element="cmism:getTypeChildren" />
+  </message>
+  <message name="getTypeChildrenResponse">
+    <part name="parameters" element="cmism:getTypeChildrenResponse" />
+  </message>
+  <message name="getTypeDescendantsRequest">
+    <part name="parameters" element="cmism:getTypeDescendants" />
+  </message>
+  <message name="getTypeDescendantsResponse">
+    <part name="parameters" element="cmism:getTypeDescendantsResponse" />
+  </message>
+  <message name="getTypeDefinitionRequest">
+    <part name="parameters" element="cmism:getTypeDefinition" />
+  </message>
+  <message name="getTypeDefinitionResponse">
+    <part name="parameters" element="cmism:getTypeDefinitionResponse" />
+  </message>
+  <message name="checkOutRequest">
+    <part name="parameters" element="cmism:checkOut" />
+  </message>
+  <message name="checkOutResponse">
+    <part name="parameters" element="cmism:checkOutResponse" />
+  </message>
+  <message name="cancelCheckOutRequest">
+    <part name="parameters" element="cmism:cancelCheckOut" />
+  </message>
+  <message name="cancelCheckOutResponse">
+    <part name="parameters" element="cmism:cancelCheckOutResponse" />
+  </message>
+  <message name="checkInRequest">
+    <part name="parameters" element="cmism:checkIn" />
+  </message>
+  <message name="checkInResponse">
+    <part name="parameters" element="cmism:checkInResponse" />
+  </message>
+  <message name="getObjectOfLatestVersionRequest">
+    <part name="parameters" element="cmism:getObjectOfLatestVersion" />
+  </message>
+  <message name="getObjectOfLatestVersionResponse">
+    <part name="parameters" element="cmism:getObjectOfLatestVersionResponse" />
+  </message>
+  <message name="getPropertiesOfLatestVersionRequest">
+    <part name="parameters" element="cmism:getPropertiesOfLatestVersion" />
+  </message>
+  <message name="getPropertiesOfLatestVersionResponse">
+    <part name="parameters" element="cmism:getPropertiesOfLatestVersionResponse" />
+  </message>
+  <message name="getAllVersionsRequest">
+    <part name="parameters" element="cmism:getAllVersions" />
+  </message>
+  <message name="getAllVersionsResponse">
+    <part name="parameters" element="cmism:getAllVersionsResponse" />
+  </message>
+  <message name="getFolderTreeRequest">
+    <part name="parameters" element="cmism:getFolderTree" />
+  </message>
+  <message name="getFolderTreeResponse">
+    <part name="parameters" element="cmism:getFolderTreeResponse" />
+  </message>
+  <portType name="DiscoveryServicePort">
+    <operation name="query">
+      <input message="cmisw:queryRequest" />
+      <output message="cmisw:queryResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getContentChanges">
+      <input message="cmisw:getContentChangesRequest" />
+      <output message="cmisw:getContentChangesResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="MultiFilingServicePort">
+    <operation name="addObjectToFolder">
+      <input message="cmisw:addObjectToFolderRequest" />
+      <output message="cmisw:addObjectToFolderResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="removeObjectFromFolder">
+      <input message="cmisw:removeObjectFromFolderRequest" />
+      <output message="cmisw:removeObjectFromFolderResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="NavigationServicePort">
+    <operation name="getDescendants">
+      <input message="cmisw:getDescendantsRequest" />
+      <output message="cmisw:getDescendantsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getChildren">
+      <input message="cmisw:getChildrenRequest" />
+      <output message="cmisw:getChildrenResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getFolderParent">
+      <input message="cmisw:getFolderParentRequest" />
+      <output message="cmisw:getFolderParentResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getFolderTree">
+      <input message="cmisw:getFolderTreeRequest" />
+      <output message="cmisw:getFolderTreeResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getObjectParents">
+      <input message="cmisw:getObjectParentsRequest" />
+      <output message="cmisw:getObjectParentsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getCheckedOutDocs">
+      <input message="cmisw:getCheckedOutDocsRequest" />
+      <output message="cmisw:getCheckedOutDocsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="ObjectServicePort">
+    <operation name="createDocument">
+      <input message="cmisw:createDocumentRequest" />
+      <output message="cmisw:createDocumentResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="createDocumentFromSource">
+      <input message="cmisw:createDocumentFromSourceRequest" />
+      <output message="cmisw:createDocumentFromSourceResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="createFolder">
+      <input message="cmisw:createFolderRequest" />
+      <output message="cmisw:createFolderResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="createRelationship">
+      <input message="cmisw:createRelationshipRequest" />
+      <output message="cmisw:createRelationshipResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="createPolicy">
+      <input message="cmisw:createPolicyRequest" />
+      <output message="cmisw:createPolicyResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getAllowableActions">
+      <input message="cmisw:getAllowableActionsRequest" />
+      <output message="cmisw:getAllowableActionsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getObject">
+      <input message="cmisw:getObjectRequest" />
+      <output message="cmisw:getObjectResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getProperties">
+      <input message="cmisw:getPropertiesRequest" />
+      <output message="cmisw:getPropertiesResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getRenditions">
+      <input message="cmisw:getRenditionsRequest" />
+      <output message="cmisw:getRenditionsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getObjectByPath">
+      <input message="cmisw:getObjectByPathRequest" />
+      <output message="cmisw:getObjectByPathResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getContentStream">
+      <input message="cmisw:getContentStreamRequest" />
+      <output message="cmisw:getContentStreamResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="updateProperties">
+      <input message="cmisw:updatePropertiesRequest" />
+      <output message="cmisw:updatePropertiesResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="moveObject">
+      <input message="cmisw:moveObjectRequest" />
+      <output message="cmisw:moveObjectResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="deleteObject">
+      <input message="cmisw:deleteObjectRequest" />
+      <output message="cmisw:deleteObjectResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="deleteTree">
+      <input message="cmisw:deleteTreeRequest" />
+      <output message="cmisw:deleteTreeResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="setContentStream">
+      <input message="cmisw:setContentStreamRequest" />
+      <output message="cmisw:setContentStreamResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="deleteContentStream">
+      <input message="cmisw:deleteContentStreamRequest" />
+      <output message="cmisw:deleteContentStreamResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="PolicyServicePort">
+    <operation name="applyPolicy">
+      <input message="cmisw:applyPolicyRequest" />
+      <output message="cmisw:applyPolicyResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="removePolicy">
+      <input message="cmisw:removePolicyRequest" />
+      <output message="cmisw:removePolicyResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getAppliedPolicies">
+      <input message="cmisw:getAppliedPoliciesRequest" />
+      <output message="cmisw:getAppliedPoliciesResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="RelationshipServicePort">
+    <operation name="getObjectRelationships">
+      <input message="cmisw:getObjectRelationshipsRequest" />
+      <output message="cmisw:getObjectRelationshipsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="RepositoryServicePort">
+    <operation name="getRepositories">
+      <input message="cmisw:getRepositoriesRequest" />
+      <output message="cmisw:getRepositoriesResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getRepositoryInfo">
+      <input message="cmisw:getRepositoryInfoRequest" />
+      <output message="cmisw:getRepositoryInfoResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getTypeChildren">
+      <input message="cmisw:getTypeChildrenRequest" />
+      <output message="cmisw:getTypeChildrenResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getTypeDescendants">
+      <input message="cmisw:getTypeDescendantsRequest" />
+      <output message="cmisw:getTypeDescendantsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getTypeDefinition">
+      <input message="cmisw:getTypeDefinitionRequest" />
+      <output message="cmisw:getTypeDefinitionResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="VersioningServicePort">
+    <operation name="checkOut">
+      <input message="cmisw:checkOutRequest" />
+      <output message="cmisw:checkOutResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="cancelCheckOut">
+      <input message="cmisw:cancelCheckOutRequest" />
+      <output message="cmisw:cancelCheckOutResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="checkIn">
+      <input message="cmisw:checkInRequest" />
+      <output message="cmisw:checkInResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getObjectOfLatestVersion">
+      <input message="cmisw:getObjectOfLatestVersionRequest" />
+      <output message="cmisw:getObjectOfLatestVersionResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getPropertiesOfLatestVersion">
+      <input message="cmisw:getPropertiesOfLatestVersionRequest" />
+      <output message="cmisw:getPropertiesOfLatestVersionResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="getAllVersions">
+      <input message="cmisw:getAllVersionsRequest" />
+      <output message="cmisw:getAllVersionsResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <portType name="ACLServicePort">
+    <operation name="getACL">
+      <input message="cmisw:getACLRequest" />
+      <output message="cmisw:getACLResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+    <operation name="applyACL">
+      <input message="cmisw:applyACLRequest" />
+      <output message="cmisw:applyACLResponse" />
+      <fault name="cmisException" message="cmisw:cmisException" />
+    </operation>
+  </portType>
+  <binding name="DiscoveryServicePortBinding" type="cmisw:DiscoveryServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="query">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getContentChanges">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="MultiFilingServicePortBinding" type="cmisw:MultiFilingServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="addObjectToFolder">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="removeObjectFromFolder">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="NavigationServicePortBinding" type="cmisw:NavigationServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="getDescendants">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getChildren">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getFolderParent">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getFolderTree">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getObjectParents">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getCheckedOutDocs">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="ObjectServicePortBinding" type="cmisw:ObjectServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="createDocument">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="createDocumentFromSource">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="createFolder">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="createRelationship">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="createPolicy">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getAllowableActions">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getObject">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getProperties">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getRenditions">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getObjectByPath">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getContentStream">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="updateProperties">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="moveObject">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="deleteObject">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="deleteTree">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="setContentStream">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="deleteContentStream">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="PolicyServicePortBinding" type="cmisw:PolicyServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="applyPolicy">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="removePolicy">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getAppliedPolicies">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="RelationshipServicePortBinding" type="cmisw:RelationshipServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="getObjectRelationships">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="RepositoryServicePortBinding" type="cmisw:RepositoryServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="getRepositories">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getRepositoryInfo">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getTypeChildren">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getTypeDescendants">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getTypeDefinition">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="VersioningServicePortBinding" type="cmisw:VersioningServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="checkOut">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="cancelCheckOut">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="checkIn">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getObjectOfLatestVersion">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getPropertiesOfLatestVersion">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="getAllVersions">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <binding name="ACLServicePortBinding" type="cmisw:ACLServicePort">
+    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="getACL">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+    <operation name="applyACL">
+      <soap:operation soapAction="" />
+      <input>
+        <soap:body use="literal" />
+      </input>
+      <output>
+        <soap:body use="literal" />
+      </output>
+      <fault name="cmisException">
+        <soap:fault use="literal" name="cmisException" namespace="" />
+      </fault>
+    </operation>
+  </binding>
+  <service name="DiscoveryService">
+    <port name="DiscoveryServicePort" binding="cmisw:DiscoveryServicePortBinding">
+      <soap:address location="http://cmis/services/DiscoveryService.DiscoveryServicePort" />
+    </port>
+  </service>
+  <service name="MultiFilingService">
+    <port name="MultiFilingServicePort" binding="cmisw:MultiFilingServicePortBinding">
+      <soap:address location="http://cmis/services/MultiFilingService.MultiFilingServicePort" />
+    </port>
+  </service>
+  <service name="NavigationService">
+    <port name="NavigationServicePort" binding="cmisw:NavigationServicePortBinding">
+      <soap:address location="http://cmis/services/NavigationService.NavigationServicePort" />
+    </port>
+  </service>
+  <service name="ObjectService">
+    <port name="ObjectServicePort" binding="cmisw:ObjectServicePortBinding">
+      <soap:address location="http://cmis/services/ObjectService.ObjectServicePort" />
+    </port>
+  </service>
+  <service name="PolicyService">
+    <port name="PolicyServicePort" binding="cmisw:PolicyServicePortBinding">
+      <soap:address location="http://cmis/services/PolicyService.PolicyServicePort" />
+    </port>
+  </service>
+  <service name="RelationshipService">
+    <port name="RelationshipServicePort" binding="cmisw:RelationshipServicePortBinding">
+      <soap:address location="http://cmis/services/RelationshipService.RelationshipServicePort" />
+    </port>
+  </service>
+  <service name="RepositoryService">
+    <port name="RepositoryServicePort" binding="cmisw:RepositoryServicePortBinding">
+      <soap:address location="http://cmis/services/RepositoryService.RepositoryServicePort" />
+    </port>
+  </service>
+  <service name="VersioningService">
+    <port name="VersioningServicePort" binding="cmisw:VersioningServicePortBinding">
+      <soap:address location="http://cmis/services/VersioningService.VersioningServicePort" />
+    </port>
+  </service>
+  <service name="ACLService">
+    <port name="ACLServicePort" binding="cmisw:ACLServicePortBinding">
+      <soap:address location="http://cmis/services/ACLService.ACLServicePort" />
+    </port>
+  </service>
+</definitions>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisACLType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisACLType.datasource
new file mode 100644
index 0000000..db1abfb
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisACLType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisACLType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisACLType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisAllowableActionsType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisAllowableActionsType.datasource
new file mode 100644
index 0000000..443ead7
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisAllowableActionsType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisAllowableActionsType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisAllowableActionsType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisContentStreamType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisContentStreamType.datasource
new file mode 100644
index 0000000..e5fa164
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisContentStreamType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisContentStreamType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisContentStreamType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisExtensionType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisExtensionType.datasource
new file mode 100644
index 0000000..c2e0ce6
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisExtensionType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisExtensionType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisExtensionType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectInFolderContainerType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectInFolderContainerType.datasource
new file mode 100644
index 0000000..f7bb4c9
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectInFolderContainerType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisObjectInFolderContainerType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisObjectInFolderContainerType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType.datasource
new file mode 100644
index 0000000..6ff9534
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisObjectInFolderListType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectListType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectListType.datasource
new file mode 100644
index 0000000..b3d41f8
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectListType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisObjectListType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisObjectListType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectParentsType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectParentsType.datasource
new file mode 100644
index 0000000..b74e650
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectParentsType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisObjectParentsType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisObjectParentsType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectType.datasource
new file mode 100644
index 0000000..5f84a0d
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisObjectType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisObjectType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisObjectType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisPropertiesType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisPropertiesType.datasource
new file mode 100644
index 0000000..f961985
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisPropertiesType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisPropertiesType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisPropertiesType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRenditionType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRenditionType.datasource
new file mode 100644
index 0000000..f5fc306
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRenditionType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisRenditionType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisRenditionType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRepositoryEntryType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRepositoryEntryType.datasource
new file mode 100644
index 0000000..225d3a5
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRepositoryEntryType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisRepositoryEntryType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisRepositoryEntryType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType.datasource
new file mode 100644
index 0000000..214195e
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisRepositoryInfoType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeContainer.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeContainer.datasource
new file mode 100644
index 0000000..483ed2d
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeContainer.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisTypeContainer" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisTypeContainer, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType.datasource
new file mode 100644
index 0000000..c44614e
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisTypeDefinitionListType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType.datasource
new file mode 100644
index 0000000..fe40f4d
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="cmisTypeDefinitionType" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete.datasource b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete.datasource
new file mode 100644
index 0000000..4392e06
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete.datasource
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="deleteTreeResponseFailedToDelete" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete, Service References.CMISWebServicesReference.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/Reference.cs b/DotCMIS/Service References/CMISWebServicesReference/Reference.cs
new file mode 100644
index 0000000..355de0d
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/Reference.cs
@@ -0,0 +1,9652 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace DotCMIS.CMISWebServicesReference {
+    
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisFaultType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private enumServiceException typeField;
+        
+        private string codeField;
+        
+        private string messageField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public enumServiceException type {
+            get {
+                return this.typeField;
+            }
+            set {
+                this.typeField = value;
+                this.RaisePropertyChanged("type");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1)]
+        public string code {
+            get {
+                return this.codeField;
+            }
+            set {
+                this.codeField = value;
+                this.RaisePropertyChanged("code");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public string message {
+            get {
+                return this.messageField;
+            }
+            set {
+                this.messageField = value;
+                this.RaisePropertyChanged("message");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public enum enumServiceException {
+        
+        /// <remarks/>
+        constraint,
+        
+        /// <remarks/>
+        nameConstraintViolation,
+        
+        /// <remarks/>
+        contentAlreadyExists,
+        
+        /// <remarks/>
+        filterNotValid,
+        
+        /// <remarks/>
+        invalidArgument,
+        
+        /// <remarks/>
+        notSupported,
+        
+        /// <remarks/>
+        objectNotFound,
+        
+        /// <remarks/>
+        permissionDenied,
+        
+        /// <remarks/>
+        runtime,
+        
+        /// <remarks/>
+        storage,
+        
+        /// <remarks/>
+        streamNotSupported,
+        
+        /// <remarks/>
+        updateConflict,
+        
+        /// <remarks/>
+        versioning,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisRenditionType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string streamIdField;
+        
+        private string mimetypeField;
+        
+        private string lengthField;
+        
+        private string kindField;
+        
+        private string titleField;
+        
+        private string heightField;
+        
+        private string widthField;
+        
+        private string renditionDocumentIdField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string streamId {
+            get {
+                return this.streamIdField;
+            }
+            set {
+                this.streamIdField = value;
+                this.RaisePropertyChanged("streamId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string mimetype {
+            get {
+                return this.mimetypeField;
+            }
+            set {
+                this.mimetypeField = value;
+                this.RaisePropertyChanged("mimetype");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
+        public string length {
+            get {
+                return this.lengthField;
+            }
+            set {
+                this.lengthField = value;
+                this.RaisePropertyChanged("length");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public string kind {
+            get {
+                return this.kindField;
+            }
+            set {
+                this.kindField = value;
+                this.RaisePropertyChanged("kind");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public string title {
+            get {
+                return this.titleField;
+            }
+            set {
+                this.titleField = value;
+                this.RaisePropertyChanged("title");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=5)]
+        public string height {
+            get {
+                return this.heightField;
+            }
+            set {
+                this.heightField = value;
+                this.RaisePropertyChanged("height");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=6)]
+        public string width {
+            get {
+                return this.widthField;
+            }
+            set {
+                this.widthField = value;
+                this.RaisePropertyChanged("width");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
+        public string renditionDocumentId {
+            get {
+                return this.renditionDocumentIdField;
+            }
+            set {
+                this.renditionDocumentIdField = value;
+                this.RaisePropertyChanged("renditionDocumentId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=8)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisListOfIdsType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string[] idField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("id", Order=0)]
+        public string[] id {
+            get {
+                return this.idField;
+            }
+            set {
+                this.idField = value;
+                this.RaisePropertyChanged("id");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisAccessControlPrincipalType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string principalIdField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string principalId {
+            get {
+                return this.principalIdField;
+            }
+            set {
+                this.principalIdField = value;
+                this.RaisePropertyChanged("principalId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisAccessControlEntryType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisAccessControlPrincipalType principalField;
+        
+        private string[] permissionField;
+        
+        private bool directField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisAccessControlPrincipalType principal {
+            get {
+                return this.principalField;
+            }
+            set {
+                this.principalField = value;
+                this.RaisePropertyChanged("principal");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("permission", Order=1)]
+        public string[] permission {
+            get {
+                return this.permissionField;
+            }
+            set {
+                this.permissionField = value;
+                this.RaisePropertyChanged("permission");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public bool direct {
+            get {
+                return this.directField;
+            }
+            set {
+                this.directField = value;
+                this.RaisePropertyChanged("direct");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisAccessControlListType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisAccessControlEntryType[] permissionField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("permission", Order=0)]
+        public cmisAccessControlEntryType[] permission {
+            get {
+                return this.permissionField;
+            }
+            set {
+                this.permissionField = value;
+                this.RaisePropertyChanged("permission");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChangeEventType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private enumTypeOfChanges changeTypeField;
+        
+        private System.DateTime changeTimeField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public enumTypeOfChanges changeType {
+            get {
+                return this.changeTypeField;
+            }
+            set {
+                this.changeTypeField = value;
+                this.RaisePropertyChanged("changeType");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public System.DateTime changeTime {
+            get {
+                return this.changeTimeField;
+            }
+            set {
+                this.changeTimeField = value;
+                this.RaisePropertyChanged("changeTime");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumTypeOfChanges {
+        
+        /// <remarks/>
+        created,
+        
+        /// <remarks/>
+        updated,
+        
+        /// <remarks/>
+        deleted,
+        
+        /// <remarks/>
+        security,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisAllowableActionsType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private bool canDeleteObjectField;
+        
+        private bool canDeleteObjectFieldSpecified;
+        
+        private bool canUpdatePropertiesField;
+        
+        private bool canUpdatePropertiesFieldSpecified;
+        
+        private bool canGetFolderTreeField;
+        
+        private bool canGetFolderTreeFieldSpecified;
+        
+        private bool canGetPropertiesField;
+        
+        private bool canGetPropertiesFieldSpecified;
+        
+        private bool canGetObjectRelationshipsField;
+        
+        private bool canGetObjectRelationshipsFieldSpecified;
+        
+        private bool canGetObjectParentsField;
+        
+        private bool canGetObjectParentsFieldSpecified;
+        
+        private bool canGetFolderParentField;
+        
+        private bool canGetFolderParentFieldSpecified;
+        
+        private bool canGetDescendantsField;
+        
+        private bool canGetDescendantsFieldSpecified;
+        
+        private bool canMoveObjectField;
+        
+        private bool canMoveObjectFieldSpecified;
+        
+        private bool canDeleteContentStreamField;
+        
+        private bool canDeleteContentStreamFieldSpecified;
+        
+        private bool canCheckOutField;
+        
+        private bool canCheckOutFieldSpecified;
+        
+        private bool canCancelCheckOutField;
+        
+        private bool canCancelCheckOutFieldSpecified;
+        
+        private bool canCheckInField;
+        
+        private bool canCheckInFieldSpecified;
+        
+        private bool canSetContentStreamField;
+        
+        private bool canSetContentStreamFieldSpecified;
+        
+        private bool canGetAllVersionsField;
+        
+        private bool canGetAllVersionsFieldSpecified;
+        
+        private bool canAddObjectToFolderField;
+        
+        private bool canAddObjectToFolderFieldSpecified;
+        
+        private bool canRemoveObjectFromFolderField;
+        
+        private bool canRemoveObjectFromFolderFieldSpecified;
+        
+        private bool canGetContentStreamField;
+        
+        private bool canGetContentStreamFieldSpecified;
+        
+        private bool canApplyPolicyField;
+        
+        private bool canApplyPolicyFieldSpecified;
+        
+        private bool canGetAppliedPoliciesField;
+        
+        private bool canGetAppliedPoliciesFieldSpecified;
+        
+        private bool canRemovePolicyField;
+        
+        private bool canRemovePolicyFieldSpecified;
+        
+        private bool canGetChildrenField;
+        
+        private bool canGetChildrenFieldSpecified;
+        
+        private bool canCreateDocumentField;
+        
+        private bool canCreateDocumentFieldSpecified;
+        
+        private bool canCreateFolderField;
+        
+        private bool canCreateFolderFieldSpecified;
+        
+        private bool canCreateRelationshipField;
+        
+        private bool canCreateRelationshipFieldSpecified;
+        
+        private bool canDeleteTreeField;
+        
+        private bool canDeleteTreeFieldSpecified;
+        
+        private bool canGetRenditionsField;
+        
+        private bool canGetRenditionsFieldSpecified;
+        
+        private bool canGetACLField;
+        
+        private bool canGetACLFieldSpecified;
+        
+        private bool canApplyACLField;
+        
+        private bool canApplyACLFieldSpecified;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public bool canDeleteObject {
+            get {
+                return this.canDeleteObjectField;
+            }
+            set {
+                this.canDeleteObjectField = value;
+                this.RaisePropertyChanged("canDeleteObject");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canDeleteObjectSpecified {
+            get {
+                return this.canDeleteObjectFieldSpecified;
+            }
+            set {
+                this.canDeleteObjectFieldSpecified = value;
+                this.RaisePropertyChanged("canDeleteObjectSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public bool canUpdateProperties {
+            get {
+                return this.canUpdatePropertiesField;
+            }
+            set {
+                this.canUpdatePropertiesField = value;
+                this.RaisePropertyChanged("canUpdateProperties");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canUpdatePropertiesSpecified {
+            get {
+                return this.canUpdatePropertiesFieldSpecified;
+            }
+            set {
+                this.canUpdatePropertiesFieldSpecified = value;
+                this.RaisePropertyChanged("canUpdatePropertiesSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public bool canGetFolderTree {
+            get {
+                return this.canGetFolderTreeField;
+            }
+            set {
+                this.canGetFolderTreeField = value;
+                this.RaisePropertyChanged("canGetFolderTree");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetFolderTreeSpecified {
+            get {
+                return this.canGetFolderTreeFieldSpecified;
+            }
+            set {
+                this.canGetFolderTreeFieldSpecified = value;
+                this.RaisePropertyChanged("canGetFolderTreeSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public bool canGetProperties {
+            get {
+                return this.canGetPropertiesField;
+            }
+            set {
+                this.canGetPropertiesField = value;
+                this.RaisePropertyChanged("canGetProperties");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetPropertiesSpecified {
+            get {
+                return this.canGetPropertiesFieldSpecified;
+            }
+            set {
+                this.canGetPropertiesFieldSpecified = value;
+                this.RaisePropertyChanged("canGetPropertiesSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public bool canGetObjectRelationships {
+            get {
+                return this.canGetObjectRelationshipsField;
+            }
+            set {
+                this.canGetObjectRelationshipsField = value;
+                this.RaisePropertyChanged("canGetObjectRelationships");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetObjectRelationshipsSpecified {
+            get {
+                return this.canGetObjectRelationshipsFieldSpecified;
+            }
+            set {
+                this.canGetObjectRelationshipsFieldSpecified = value;
+                this.RaisePropertyChanged("canGetObjectRelationshipsSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
+        public bool canGetObjectParents {
+            get {
+                return this.canGetObjectParentsField;
+            }
+            set {
+                this.canGetObjectParentsField = value;
+                this.RaisePropertyChanged("canGetObjectParents");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetObjectParentsSpecified {
+            get {
+                return this.canGetObjectParentsFieldSpecified;
+            }
+            set {
+                this.canGetObjectParentsFieldSpecified = value;
+                this.RaisePropertyChanged("canGetObjectParentsSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
+        public bool canGetFolderParent {
+            get {
+                return this.canGetFolderParentField;
+            }
+            set {
+                this.canGetFolderParentField = value;
+                this.RaisePropertyChanged("canGetFolderParent");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetFolderParentSpecified {
+            get {
+                return this.canGetFolderParentFieldSpecified;
+            }
+            set {
+                this.canGetFolderParentFieldSpecified = value;
+                this.RaisePropertyChanged("canGetFolderParentSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
+        public bool canGetDescendants {
+            get {
+                return this.canGetDescendantsField;
+            }
+            set {
+                this.canGetDescendantsField = value;
+                this.RaisePropertyChanged("canGetDescendants");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetDescendantsSpecified {
+            get {
+                return this.canGetDescendantsFieldSpecified;
+            }
+            set {
+                this.canGetDescendantsFieldSpecified = value;
+                this.RaisePropertyChanged("canGetDescendantsSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
+        public bool canMoveObject {
+            get {
+                return this.canMoveObjectField;
+            }
+            set {
+                this.canMoveObjectField = value;
+                this.RaisePropertyChanged("canMoveObject");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canMoveObjectSpecified {
+            get {
+                return this.canMoveObjectFieldSpecified;
+            }
+            set {
+                this.canMoveObjectFieldSpecified = value;
+                this.RaisePropertyChanged("canMoveObjectSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
+        public bool canDeleteContentStream {
+            get {
+                return this.canDeleteContentStreamField;
+            }
+            set {
+                this.canDeleteContentStreamField = value;
+                this.RaisePropertyChanged("canDeleteContentStream");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canDeleteContentStreamSpecified {
+            get {
+                return this.canDeleteContentStreamFieldSpecified;
+            }
+            set {
+                this.canDeleteContentStreamFieldSpecified = value;
+                this.RaisePropertyChanged("canDeleteContentStreamSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
+        public bool canCheckOut {
+            get {
+                return this.canCheckOutField;
+            }
+            set {
+                this.canCheckOutField = value;
+                this.RaisePropertyChanged("canCheckOut");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canCheckOutSpecified {
+            get {
+                return this.canCheckOutFieldSpecified;
+            }
+            set {
+                this.canCheckOutFieldSpecified = value;
+                this.RaisePropertyChanged("canCheckOutSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
+        public bool canCancelCheckOut {
+            get {
+                return this.canCancelCheckOutField;
+            }
+            set {
+                this.canCancelCheckOutField = value;
+                this.RaisePropertyChanged("canCancelCheckOut");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canCancelCheckOutSpecified {
+            get {
+                return this.canCancelCheckOutFieldSpecified;
+            }
+            set {
+                this.canCancelCheckOutFieldSpecified = value;
+                this.RaisePropertyChanged("canCancelCheckOutSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
+        public bool canCheckIn {
+            get {
+                return this.canCheckInField;
+            }
+            set {
+                this.canCheckInField = value;
+                this.RaisePropertyChanged("canCheckIn");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canCheckInSpecified {
+            get {
+                return this.canCheckInFieldSpecified;
+            }
+            set {
+                this.canCheckInFieldSpecified = value;
+                this.RaisePropertyChanged("canCheckInSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
+        public bool canSetContentStream {
+            get {
+                return this.canSetContentStreamField;
+            }
+            set {
+                this.canSetContentStreamField = value;
+                this.RaisePropertyChanged("canSetContentStream");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canSetContentStreamSpecified {
+            get {
+                return this.canSetContentStreamFieldSpecified;
+            }
+            set {
+                this.canSetContentStreamFieldSpecified = value;
+                this.RaisePropertyChanged("canSetContentStreamSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=14)]
+        public bool canGetAllVersions {
+            get {
+                return this.canGetAllVersionsField;
+            }
+            set {
+                this.canGetAllVersionsField = value;
+                this.RaisePropertyChanged("canGetAllVersions");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetAllVersionsSpecified {
+            get {
+                return this.canGetAllVersionsFieldSpecified;
+            }
+            set {
+                this.canGetAllVersionsFieldSpecified = value;
+                this.RaisePropertyChanged("canGetAllVersionsSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=15)]
+        public bool canAddObjectToFolder {
+            get {
+                return this.canAddObjectToFolderField;
+            }
+            set {
+                this.canAddObjectToFolderField = value;
+                this.RaisePropertyChanged("canAddObjectToFolder");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canAddObjectToFolderSpecified {
+            get {
+                return this.canAddObjectToFolderFieldSpecified;
+            }
+            set {
+                this.canAddObjectToFolderFieldSpecified = value;
+                this.RaisePropertyChanged("canAddObjectToFolderSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=16)]
+        public bool canRemoveObjectFromFolder {
+            get {
+                return this.canRemoveObjectFromFolderField;
+            }
+            set {
+                this.canRemoveObjectFromFolderField = value;
+                this.RaisePropertyChanged("canRemoveObjectFromFolder");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canRemoveObjectFromFolderSpecified {
+            get {
+                return this.canRemoveObjectFromFolderFieldSpecified;
+            }
+            set {
+                this.canRemoveObjectFromFolderFieldSpecified = value;
+                this.RaisePropertyChanged("canRemoveObjectFromFolderSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=17)]
+        public bool canGetContentStream {
+            get {
+                return this.canGetContentStreamField;
+            }
+            set {
+                this.canGetContentStreamField = value;
+                this.RaisePropertyChanged("canGetContentStream");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetContentStreamSpecified {
+            get {
+                return this.canGetContentStreamFieldSpecified;
+            }
+            set {
+                this.canGetContentStreamFieldSpecified = value;
+                this.RaisePropertyChanged("canGetContentStreamSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=18)]
+        public bool canApplyPolicy {
+            get {
+                return this.canApplyPolicyField;
+            }
+            set {
+                this.canApplyPolicyField = value;
+                this.RaisePropertyChanged("canApplyPolicy");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canApplyPolicySpecified {
+            get {
+                return this.canApplyPolicyFieldSpecified;
+            }
+            set {
+                this.canApplyPolicyFieldSpecified = value;
+                this.RaisePropertyChanged("canApplyPolicySpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=19)]
+        public bool canGetAppliedPolicies {
+            get {
+                return this.canGetAppliedPoliciesField;
+            }
+            set {
+                this.canGetAppliedPoliciesField = value;
+                this.RaisePropertyChanged("canGetAppliedPolicies");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetAppliedPoliciesSpecified {
+            get {
+                return this.canGetAppliedPoliciesFieldSpecified;
+            }
+            set {
+                this.canGetAppliedPoliciesFieldSpecified = value;
+                this.RaisePropertyChanged("canGetAppliedPoliciesSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=20)]
+        public bool canRemovePolicy {
+            get {
+                return this.canRemovePolicyField;
+            }
+            set {
+                this.canRemovePolicyField = value;
+                this.RaisePropertyChanged("canRemovePolicy");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canRemovePolicySpecified {
+            get {
+                return this.canRemovePolicyFieldSpecified;
+            }
+            set {
+                this.canRemovePolicyFieldSpecified = value;
+                this.RaisePropertyChanged("canRemovePolicySpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=21)]
+        public bool canGetChildren {
+            get {
+                return this.canGetChildrenField;
+            }
+            set {
+                this.canGetChildrenField = value;
+                this.RaisePropertyChanged("canGetChildren");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetChildrenSpecified {
+            get {
+                return this.canGetChildrenFieldSpecified;
+            }
+            set {
+                this.canGetChildrenFieldSpecified = value;
+                this.RaisePropertyChanged("canGetChildrenSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=22)]
+        public bool canCreateDocument {
+            get {
+                return this.canCreateDocumentField;
+            }
+            set {
+                this.canCreateDocumentField = value;
+                this.RaisePropertyChanged("canCreateDocument");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canCreateDocumentSpecified {
+            get {
+                return this.canCreateDocumentFieldSpecified;
+            }
+            set {
+                this.canCreateDocumentFieldSpecified = value;
+                this.RaisePropertyChanged("canCreateDocumentSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=23)]
+        public bool canCreateFolder {
+            get {
+                return this.canCreateFolderField;
+            }
+            set {
+                this.canCreateFolderField = value;
+                this.RaisePropertyChanged("canCreateFolder");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canCreateFolderSpecified {
+            get {
+                return this.canCreateFolderFieldSpecified;
+            }
+            set {
+                this.canCreateFolderFieldSpecified = value;
+                this.RaisePropertyChanged("canCreateFolderSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=24)]
+        public bool canCreateRelationship {
+            get {
+                return this.canCreateRelationshipField;
+            }
+            set {
+                this.canCreateRelationshipField = value;
+                this.RaisePropertyChanged("canCreateRelationship");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canCreateRelationshipSpecified {
+            get {
+                return this.canCreateRelationshipFieldSpecified;
+            }
+            set {
+                this.canCreateRelationshipFieldSpecified = value;
+                this.RaisePropertyChanged("canCreateRelationshipSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=25)]
+        public bool canDeleteTree {
+            get {
+                return this.canDeleteTreeField;
+            }
+            set {
+                this.canDeleteTreeField = value;
+                this.RaisePropertyChanged("canDeleteTree");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canDeleteTreeSpecified {
+            get {
+                return this.canDeleteTreeFieldSpecified;
+            }
+            set {
+                this.canDeleteTreeFieldSpecified = value;
+                this.RaisePropertyChanged("canDeleteTreeSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=26)]
+        public bool canGetRenditions {
+            get {
+                return this.canGetRenditionsField;
+            }
+            set {
+                this.canGetRenditionsField = value;
+                this.RaisePropertyChanged("canGetRenditions");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetRenditionsSpecified {
+            get {
+                return this.canGetRenditionsFieldSpecified;
+            }
+            set {
+                this.canGetRenditionsFieldSpecified = value;
+                this.RaisePropertyChanged("canGetRenditionsSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=27)]
+        public bool canGetACL {
+            get {
+                return this.canGetACLField;
+            }
+            set {
+                this.canGetACLField = value;
+                this.RaisePropertyChanged("canGetACL");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canGetACLSpecified {
+            get {
+                return this.canGetACLFieldSpecified;
+            }
+            set {
+                this.canGetACLFieldSpecified = value;
+                this.RaisePropertyChanged("canGetACLSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=28)]
+        public bool canApplyACL {
+            get {
+                return this.canApplyACLField;
+            }
+            set {
+                this.canApplyACLField = value;
+                this.RaisePropertyChanged("canApplyACL");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool canApplyACLSpecified {
+            get {
+                return this.canApplyACLFieldSpecified;
+            }
+            set {
+                this.canApplyACLFieldSpecified = value;
+                this.RaisePropertyChanged("canApplyACLSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=29)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyUri))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyString))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyHtml))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDecimal))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDateTime))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyInteger))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyId))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyBoolean))]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisProperty : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string propertyDefinitionIdField;
+        
+        private string localNameField;
+        
+        private string displayNameField;
+        
+        private string queryNameField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAttributeAttribute()]
+        public string propertyDefinitionId {
+            get {
+                return this.propertyDefinitionIdField;
+            }
+            set {
+                this.propertyDefinitionIdField = value;
+                this.RaisePropertyChanged("propertyDefinitionId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAttributeAttribute()]
+        public string localName {
+            get {
+                return this.localNameField;
+            }
+            set {
+                this.localNameField = value;
+                this.RaisePropertyChanged("localName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAttributeAttribute()]
+        public string displayName {
+            get {
+                return this.displayNameField;
+            }
+            set {
+                this.displayNameField = value;
+                this.RaisePropertyChanged("displayName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAttributeAttribute()]
+        public string queryName {
+            get {
+                return this.queryNameField;
+            }
+            set {
+                this.queryNameField = value;
+                this.RaisePropertyChanged("queryName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyUri : cmisProperty {
+        
+        private string[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", DataType="anyURI", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyString : cmisProperty {
+        
+        private string[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyHtml : cmisProperty {
+        
+        private string[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyDecimal : cmisProperty {
+        
+        private decimal[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public decimal[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyDateTime : cmisProperty {
+        
+        private System.DateTime[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public System.DateTime[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyInteger : cmisProperty {
+        
+        private string[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", DataType="integer", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyId : cmisProperty {
+        
+        private string[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyBoolean : cmisProperty {
+        
+        private bool[] valueField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public bool[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertiesType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisProperty[] itemsField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("propertyBoolean", typeof(cmisPropertyBoolean), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyDateTime", typeof(cmisPropertyDateTime), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyDecimal", typeof(cmisPropertyDecimal), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyHtml", typeof(cmisPropertyHtml), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyId", typeof(cmisPropertyId), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyInteger", typeof(cmisPropertyInteger), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyString", typeof(cmisPropertyString), IsNullable=true, Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyUri", typeof(cmisPropertyUri), IsNullable=true, Order=0)]
+        public cmisProperty[] Items {
+            get {
+                return this.itemsField;
+            }
+            set {
+                this.itemsField = value;
+                this.RaisePropertyChanged("Items");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisObjectType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisPropertiesType propertiesField;
+        
+        private cmisAllowableActionsType allowableActionsField;
+        
+        private cmisObjectType[] relationshipField;
+        
+        private cmisChangeEventType changeEventInfoField;
+        
+        private cmisAccessControlListType aclField;
+        
+        private bool exactACLField;
+        
+        private bool exactACLFieldSpecified;
+        
+        private cmisListOfIdsType policyIdsField;
+        
+        private cmisRenditionType[] renditionField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertiesType properties {
+            get {
+                return this.propertiesField;
+            }
+            set {
+                this.propertiesField = value;
+                this.RaisePropertyChanged("properties");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public cmisAllowableActionsType allowableActions {
+            get {
+                return this.allowableActionsField;
+            }
+            set {
+                this.allowableActionsField = value;
+                this.RaisePropertyChanged("allowableActions");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("relationship", Order=2)]
+        public cmisObjectType[] relationship {
+            get {
+                return this.relationshipField;
+            }
+            set {
+                this.relationshipField = value;
+                this.RaisePropertyChanged("relationship");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public cmisChangeEventType changeEventInfo {
+            get {
+                return this.changeEventInfoField;
+            }
+            set {
+                this.changeEventInfoField = value;
+                this.RaisePropertyChanged("changeEventInfo");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public cmisAccessControlListType acl {
+            get {
+                return this.aclField;
+            }
+            set {
+                this.aclField = value;
+                this.RaisePropertyChanged("acl");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
+        public bool exactACL {
+            get {
+                return this.exactACLField;
+            }
+            set {
+                this.exactACLField = value;
+                this.RaisePropertyChanged("exactACL");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool exactACLSpecified {
+            get {
+                return this.exactACLFieldSpecified;
+            }
+            set {
+                this.exactACLFieldSpecified = value;
+                this.RaisePropertyChanged("exactACLSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
+        public cmisListOfIdsType policyIds {
+            get {
+                return this.policyIdsField;
+            }
+            set {
+                this.policyIdsField = value;
+                this.RaisePropertyChanged("policyIds");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("rendition", Order=7)]
+        public cmisRenditionType[] rendition {
+            get {
+                return this.renditionField;
+            }
+            set {
+                this.renditionField = value;
+                this.RaisePropertyChanged("rendition");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=8)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisObjectListType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisObjectType[] objectsField;
+        
+        private bool hasMoreItemsField;
+        
+        private string numItemsField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("objects", Order=0)]
+        public cmisObjectType[] objects {
+            get {
+                return this.objectsField;
+            }
+            set {
+                this.objectsField = value;
+                this.RaisePropertyChanged("objects");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public bool hasMoreItems {
+            get {
+                return this.hasMoreItemsField;
+            }
+            set {
+                this.hasMoreItemsField = value;
+                this.RaisePropertyChanged("hasMoreItems");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
+        public string numItems {
+            get {
+                return this.numItemsField;
+            }
+            set {
+                this.numItemsField = value;
+                this.RaisePropertyChanged("numItems");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisExtensionType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=0)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.DiscoveryServicePort")]
+    internal interface DiscoveryServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message queryRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.queryResponse query(DotCMIS.CMISWebServicesReference.queryRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getContentChangesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getContentChangesResponse getContentChanges(DotCMIS.CMISWebServicesReference.getContentChangesRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumIncludeRelationships {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        source,
+        
+        /// <remarks/>
+        target,
+        
+        /// <remarks/>
+        both,
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="query", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class queryRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string statement;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> searchAllVersions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string skipCount;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=9)]
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr;
+        
+        public queryRequest() {
+        }
+        
+        public queryRequest(string repositoryId, string statement, System.Nullable<bool> searchAllVersions, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension, System.Xml.XmlAttribute[] AnyAttr) {
+            this.repositoryId = repositoryId;
+            this.statement = statement;
+            this.searchAllVersions = searchAllVersions;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+            this.extension = extension;
+            this.AnyAttr = AnyAttr;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="queryResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class queryResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
+        
+        public queryResponse() {
+        }
+        
+        public queryResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects) {
+            this.objects = objects;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentChanges", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getContentChangesRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string changeLogToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeProperties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePolicyIds;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeACL;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getContentChangesRequest() {
+        }
+        
+        public getContentChangesRequest(string repositoryId, string changeLogToken, System.Nullable<bool> includeProperties, string filter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, string maxItems, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.changeLogToken = changeLogToken;
+            this.includeProperties = includeProperties;
+            this.filter = filter;
+            this.includePolicyIds = includePolicyIds;
+            this.includeACL = includeACL;
+            this.maxItems = maxItems;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentChangesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getContentChangesResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string changeLogToken;
+        
+        public getContentChangesResponse() {
+        }
+        
+        public getContentChangesResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects, string changeLogToken) {
+            this.objects = objects;
+            this.changeLogToken = changeLogToken;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface DiscoveryServicePortChannel : DotCMIS.CMISWebServicesReference.DiscoveryServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class DiscoveryServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.DiscoveryServicePort>, DotCMIS.CMISWebServicesReference.DiscoveryServicePort {
+        
+        public DiscoveryServicePortClient() {
+        }
+        
+        public DiscoveryServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public DiscoveryServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public DiscoveryServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public DiscoveryServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.queryResponse DotCMIS.CMISWebServicesReference.DiscoveryServicePort.query(DotCMIS.CMISWebServicesReference.queryRequest request) {
+            return base.Channel.query(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType query(string repositoryId, string statement, System.Nullable<bool> searchAllVersions, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension, System.Xml.XmlAttribute[] AnyAttr) {
+            DotCMIS.CMISWebServicesReference.queryRequest inValue = new DotCMIS.CMISWebServicesReference.queryRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.statement = statement;
+            inValue.searchAllVersions = searchAllVersions;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.maxItems = maxItems;
+            inValue.skipCount = skipCount;
+            inValue.extension = extension;
+            inValue.AnyAttr = AnyAttr;
+            DotCMIS.CMISWebServicesReference.queryResponse retVal = ((DotCMIS.CMISWebServicesReference.DiscoveryServicePort)(this)).query(inValue);
+            return retVal.objects;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getContentChangesResponse DotCMIS.CMISWebServicesReference.DiscoveryServicePort.getContentChanges(DotCMIS.CMISWebServicesReference.getContentChangesRequest request) {
+            return base.Channel.getContentChanges(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType getContentChanges(string repositoryId, ref string changeLogToken, System.Nullable<bool> includeProperties, string filter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, string maxItems, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getContentChangesRequest inValue = new DotCMIS.CMISWebServicesReference.getContentChangesRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.changeLogToken = changeLogToken;
+            inValue.includeProperties = includeProperties;
+            inValue.filter = filter;
+            inValue.includePolicyIds = includePolicyIds;
+            inValue.includeACL = includeACL;
+            inValue.maxItems = maxItems;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getContentChangesResponse retVal = ((DotCMIS.CMISWebServicesReference.DiscoveryServicePort)(this)).getContentChanges(inValue);
+            changeLogToken = retVal.changeLogToken;
+            return retVal.objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.MultiFilingServicePort")]
+    internal interface MultiFilingServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message addObjectToFolderRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.addObjectToFolderResponse addObjectToFolder(DotCMIS.CMISWebServicesReference.addObjectToFolderRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message removeObjectFromFolderRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.removeObjectFromFolderResponse removeObjectFromFolder(DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest request);
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="addObjectToFolder", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class addObjectToFolderRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        public bool allVersions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public addObjectToFolderRequest() {
+        }
+        
+        public addObjectToFolderRequest(string repositoryId, string objectId, string folderId, bool allVersions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.folderId = folderId;
+            this.allVersions = allVersions;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="addObjectToFolderResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class addObjectToFolderResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public addObjectToFolderResponse() {
+        }
+        
+        public addObjectToFolderResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="removeObjectFromFolder", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class removeObjectFromFolderRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public removeObjectFromFolderRequest() {
+        }
+        
+        public removeObjectFromFolderRequest(string repositoryId, string objectId, string folderId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.folderId = folderId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="removeObjectFromFolderResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class removeObjectFromFolderResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public removeObjectFromFolderResponse() {
+        }
+        
+        public removeObjectFromFolderResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface MultiFilingServicePortChannel : DotCMIS.CMISWebServicesReference.MultiFilingServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class MultiFilingServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.MultiFilingServicePort>, DotCMIS.CMISWebServicesReference.MultiFilingServicePort {
+        
+        public MultiFilingServicePortClient() {
+        }
+        
+        public MultiFilingServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public MultiFilingServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public MultiFilingServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public MultiFilingServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.addObjectToFolderResponse DotCMIS.CMISWebServicesReference.MultiFilingServicePort.addObjectToFolder(DotCMIS.CMISWebServicesReference.addObjectToFolderRequest request) {
+            return base.Channel.addObjectToFolder(request);
+        }
+        
+        public void addObjectToFolder(string repositoryId, string objectId, string folderId, bool allVersions, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.addObjectToFolderRequest inValue = new DotCMIS.CMISWebServicesReference.addObjectToFolderRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.folderId = folderId;
+            inValue.allVersions = allVersions;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.addObjectToFolderResponse retVal = ((DotCMIS.CMISWebServicesReference.MultiFilingServicePort)(this)).addObjectToFolder(inValue);
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.removeObjectFromFolderResponse DotCMIS.CMISWebServicesReference.MultiFilingServicePort.removeObjectFromFolder(DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest request) {
+            return base.Channel.removeObjectFromFolder(request);
+        }
+        
+        public void removeObjectFromFolder(string repositoryId, string objectId, string folderId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest inValue = new DotCMIS.CMISWebServicesReference.removeObjectFromFolderRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.folderId = folderId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.removeObjectFromFolderResponse retVal = ((DotCMIS.CMISWebServicesReference.MultiFilingServicePort)(this)).removeObjectFromFolder(inValue);
+            extension = retVal.extension;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.NavigationServicePort")]
+    internal interface NavigationServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getDescendantsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getDescendantsResponse getDescendants(DotCMIS.CMISWebServicesReference.getDescendantsRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getChildrenRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getChildrenResponse getChildren(DotCMIS.CMISWebServicesReference.getChildrenRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getFolderParentRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getFolderParentResponse getFolderParent(DotCMIS.CMISWebServicesReference.getFolderParentRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getFolderTreeRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getFolderTreeResponse getFolderTree(DotCMIS.CMISWebServicesReference.getFolderTreeRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectParentsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getObjectParentsResponse getObjectParents(DotCMIS.CMISWebServicesReference.getObjectParentsRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getCheckedOutDocsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getCheckedOutDocsResponse getCheckedOutDocs(DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisObjectInFolderContainerType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisObjectInFolderType objectInFolderField;
+        
+        private cmisObjectInFolderContainerType[] childrenField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisObjectInFolderType objectInFolder {
+            get {
+                return this.objectInFolderField;
+            }
+            set {
+                this.objectInFolderField = value;
+                this.RaisePropertyChanged("objectInFolder");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("children", Order=1)]
+        public cmisObjectInFolderContainerType[] children {
+            get {
+                return this.childrenField;
+            }
+            set {
+                this.childrenField = value;
+                this.RaisePropertyChanged("children");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisObjectInFolderType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisObjectType objectField;
+        
+        private string pathSegmentField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisObjectType @object {
+            get {
+                return this.objectField;
+            }
+            set {
+                this.objectField = value;
+                this.RaisePropertyChanged("object");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string pathSegment {
+            get {
+                return this.pathSegmentField;
+            }
+            set {
+                this.pathSegmentField = value;
+                this.RaisePropertyChanged("pathSegment");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getDescendants", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getDescendantsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string depth;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePathSegment;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getDescendantsRequest() {
+        }
+        
+        public getDescendantsRequest(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.folderId = folderId;
+            this.depth = depth;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includePathSegment = includePathSegment;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getDescendantsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getDescendantsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("objects")]
+        public cmisObjectInFolderContainerType[] objects;
+        
+        public getDescendantsResponse() {
+        }
+        
+        public getDescendantsResponse(cmisObjectInFolderContainerType[] objects) {
+            this.objects = objects;
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisObjectInFolderListType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisObjectInFolderType[] objectsField;
+        
+        private bool hasMoreItemsField;
+        
+        private string numItemsField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("objects", Order=0)]
+        public cmisObjectInFolderType[] objects {
+            get {
+                return this.objectsField;
+            }
+            set {
+                this.objectsField = value;
+                this.RaisePropertyChanged("objects");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public bool hasMoreItems {
+            get {
+                return this.hasMoreItemsField;
+            }
+            set {
+                this.hasMoreItemsField = value;
+                this.RaisePropertyChanged("hasMoreItems");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
+        public string numItems {
+            get {
+                return this.numItemsField;
+            }
+            set {
+                this.numItemsField = value;
+                this.RaisePropertyChanged("numItems");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getChildren", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getChildrenRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string orderBy;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePathSegment;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string skipCount;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=10)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getChildrenRequest() {
+        }
+        
+        public getChildrenRequest(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.folderId = folderId;
+            this.filter = filter;
+            this.orderBy = orderBy;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includePathSegment = includePathSegment;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getChildrenResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getChildrenResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType objects;
+        
+        public getChildrenResponse() {
+        }
+        
+        public getChildrenResponse(DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType objects) {
+            this.objects = objects;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderParent", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getFolderParentRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getFolderParentRequest() {
+        }
+        
+        public getFolderParentRequest(string repositoryId, string folderId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.folderId = folderId;
+            this.filter = filter;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderParentResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getFolderParentResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
+        
+        public getFolderParentResponse() {
+        }
+        
+        public getFolderParentResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
+            this.@object = @object;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderTree", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getFolderTreeRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string depth;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePathSegment;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getFolderTreeRequest() {
+        }
+        
+        public getFolderTreeRequest(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.folderId = folderId;
+            this.depth = depth;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includePathSegment = includePathSegment;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getFolderTreeResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getFolderTreeResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("objects")]
+        public cmisObjectInFolderContainerType[] objects;
+        
+        public getFolderTreeResponse() {
+        }
+        
+        public getFolderTreeResponse(cmisObjectInFolderContainerType[] objects) {
+            this.objects = objects;
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisObjectParentsType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisObjectType objectField;
+        
+        private string relativePathSegmentField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisObjectType @object {
+            get {
+                return this.objectField;
+            }
+            set {
+                this.objectField = value;
+                this.RaisePropertyChanged("object");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string relativePathSegment {
+            get {
+                return this.relativePathSegmentField;
+            }
+            set {
+                this.relativePathSegmentField = value;
+                this.RaisePropertyChanged("relativePathSegment");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectParents", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectParentsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeRelativePathSegment;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getObjectParentsRequest() {
+        }
+        
+        public getObjectParentsRequest(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includeRelativePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includeRelativePathSegment = includeRelativePathSegment;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectParentsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectParentsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("parents")]
+        public cmisObjectParentsType[] parents;
+        
+        public getObjectParentsResponse() {
+        }
+        
+        public getObjectParentsResponse(cmisObjectParentsType[] parents) {
+            this.parents = parents;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getCheckedOutDocs", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getCheckedOutDocsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string orderBy;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string skipCount;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getCheckedOutDocsRequest() {
+        }
+        
+        public getCheckedOutDocsRequest(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.folderId = folderId;
+            this.filter = filter;
+            this.orderBy = orderBy;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getCheckedOutDocsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getCheckedOutDocsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
+        
+        public getCheckedOutDocsResponse() {
+        }
+        
+        public getCheckedOutDocsResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects) {
+            this.objects = objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface NavigationServicePortChannel : DotCMIS.CMISWebServicesReference.NavigationServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class NavigationServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.NavigationServicePort>, DotCMIS.CMISWebServicesReference.NavigationServicePort {
+        
+        public NavigationServicePortClient() {
+        }
+        
+        public NavigationServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public NavigationServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public NavigationServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public NavigationServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getDescendantsResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getDescendants(DotCMIS.CMISWebServicesReference.getDescendantsRequest request) {
+            return base.Channel.getDescendants(request);
+        }
+        
+        public cmisObjectInFolderContainerType[] getDescendants(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getDescendantsRequest inValue = new DotCMIS.CMISWebServicesReference.getDescendantsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.folderId = folderId;
+            inValue.depth = depth;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includePathSegment = includePathSegment;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getDescendantsResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getDescendants(inValue);
+            return retVal.objects;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getChildrenResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getChildren(DotCMIS.CMISWebServicesReference.getChildrenRequest request) {
+            return base.Channel.getChildren(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectInFolderListType getChildren(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getChildrenRequest inValue = new DotCMIS.CMISWebServicesReference.getChildrenRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.folderId = folderId;
+            inValue.filter = filter;
+            inValue.orderBy = orderBy;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includePathSegment = includePathSegment;
+            inValue.maxItems = maxItems;
+            inValue.skipCount = skipCount;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getChildrenResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getChildren(inValue);
+            return retVal.objects;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getFolderParentResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getFolderParent(DotCMIS.CMISWebServicesReference.getFolderParentRequest request) {
+            return base.Channel.getFolderParent(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectType getFolderParent(string repositoryId, string folderId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getFolderParentRequest inValue = new DotCMIS.CMISWebServicesReference.getFolderParentRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.folderId = folderId;
+            inValue.filter = filter;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getFolderParentResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getFolderParent(inValue);
+            return retVal.@object;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getFolderTreeResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getFolderTree(DotCMIS.CMISWebServicesReference.getFolderTreeRequest request) {
+            return base.Channel.getFolderTree(request);
+        }
+        
+        public cmisObjectInFolderContainerType[] getFolderTree(string repositoryId, string folderId, string depth, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getFolderTreeRequest inValue = new DotCMIS.CMISWebServicesReference.getFolderTreeRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.folderId = folderId;
+            inValue.depth = depth;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includePathSegment = includePathSegment;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getFolderTreeResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getFolderTree(inValue);
+            return retVal.objects;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getObjectParentsResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getObjectParents(DotCMIS.CMISWebServicesReference.getObjectParentsRequest request) {
+            return base.Channel.getObjectParents(request);
+        }
+        
+        public cmisObjectParentsType[] getObjectParents(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includeRelativePathSegment, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getObjectParentsRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectParentsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includeRelativePathSegment = includeRelativePathSegment;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getObjectParentsResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getObjectParents(inValue);
+            return retVal.parents;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getCheckedOutDocsResponse DotCMIS.CMISWebServicesReference.NavigationServicePort.getCheckedOutDocs(DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest request) {
+            return base.Channel.getCheckedOutDocs(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType getCheckedOutDocs(string repositoryId, string folderId, string filter, string orderBy, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest inValue = new DotCMIS.CMISWebServicesReference.getCheckedOutDocsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.folderId = folderId;
+            inValue.filter = filter;
+            inValue.orderBy = orderBy;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.maxItems = maxItems;
+            inValue.skipCount = skipCount;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getCheckedOutDocsResponse retVal = ((DotCMIS.CMISWebServicesReference.NavigationServicePort)(this)).getCheckedOutDocs(inValue);
+            return retVal.objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.ObjectServicePort")]
+    internal interface ObjectServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createDocumentRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.createDocumentResponse createDocument(DotCMIS.CMISWebServicesReference.createDocumentRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createDocumentFromSourceRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.createDocumentFromSourceResponse createDocumentFromSource(DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createFolderRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.createFolderResponse createFolder(DotCMIS.CMISWebServicesReference.createFolderRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createRelationshipRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.createRelationshipResponse createRelationship(DotCMIS.CMISWebServicesReference.createRelationshipRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message createPolicyRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.createPolicyResponse createPolicy(DotCMIS.CMISWebServicesReference.createPolicyRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getAllowableActionsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getAllowableActionsResponse getAllowableActions(DotCMIS.CMISWebServicesReference.getAllowableActionsRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getObjectResponse getObject(DotCMIS.CMISWebServicesReference.getObjectRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getPropertiesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getPropertiesResponse getProperties(DotCMIS.CMISWebServicesReference.getPropertiesRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getRenditionsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getRenditionsResponse getRenditions(DotCMIS.CMISWebServicesReference.getRenditionsRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectByPathRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getObjectByPathResponse getObjectByPath(DotCMIS.CMISWebServicesReference.getObjectByPathRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getContentStreamRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getContentStreamResponse getContentStream(DotCMIS.CMISWebServicesReference.getContentStreamRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message updatePropertiesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.updatePropertiesResponse updateProperties(DotCMIS.CMISWebServicesReference.updatePropertiesRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message moveObjectRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.moveObjectResponse moveObject(DotCMIS.CMISWebServicesReference.moveObjectRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message deleteObjectRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.deleteObjectResponse deleteObject(DotCMIS.CMISWebServicesReference.deleteObjectRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message deleteTreeRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.deleteTreeResponse deleteTree(DotCMIS.CMISWebServicesReference.deleteTreeRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message setContentStreamRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.setContentStreamResponse setContentStream(DotCMIS.CMISWebServicesReference.setContentStreamRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message deleteContentStreamRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.deleteContentStreamResponse deleteContentStream(DotCMIS.CMISWebServicesReference.deleteContentStreamRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisContentStreamType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string lengthField;
+        
+        private string mimeTypeField;
+        
+        private string filenameField;
+        
+        private byte[] streamField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=0)]
+        public string length {
+            get {
+                return this.lengthField;
+            }
+            set {
+                this.lengthField = value;
+                this.RaisePropertyChanged("length");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string mimeType {
+            get {
+                return this.mimeTypeField;
+            }
+            set {
+                this.mimeTypeField = value;
+                this.RaisePropertyChanged("mimeType");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public string filename {
+            get {
+                return this.filenameField;
+            }
+            set {
+                this.filenameField = value;
+                this.RaisePropertyChanged("filename");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary", Order=3)]
+        public byte[] stream {
+            get {
+                return this.streamField;
+            }
+            set {
+                this.streamField = value;
+                this.RaisePropertyChanged("stream");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=4)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumVersioningState {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        checkedout,
+        
+        /// <remarks/>
+        minor,
+        
+        /// <remarks/>
+        major,
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocument", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createDocumentRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumVersioningState> versioningState;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
+        public string[] policies;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createDocumentRequest() {
+        }
+        
+        public createDocumentRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.properties = properties;
+            this.folderId = folderId;
+            this.contentStream = contentStream;
+            this.versioningState = versioningState;
+            this.policies = policies;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocumentResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createDocumentResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createDocumentResponse() {
+        }
+        
+        public createDocumentResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocumentFromSource", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createDocumentFromSourceRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string sourceId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumVersioningState> versioningState;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
+        public string[] policies;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createDocumentFromSourceRequest() {
+        }
+        
+        public createDocumentFromSourceRequest(string repositoryId, string sourceId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.sourceId = sourceId;
+            this.properties = properties;
+            this.folderId = folderId;
+            this.versioningState = versioningState;
+            this.policies = policies;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createDocumentFromSourceResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createDocumentFromSourceResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createDocumentFromSourceResponse() {
+        }
+        
+        public createDocumentFromSourceResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createFolder", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createFolderRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
+        public string[] policies;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createFolderRequest() {
+        }
+        
+        public createFolderRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.properties = properties;
+            this.folderId = folderId;
+            this.policies = policies;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createFolderResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createFolderResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createFolderResponse() {
+        }
+        
+        public createFolderResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createRelationship", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createRelationshipRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
+        public string[] policies;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createRelationshipRequest() {
+        }
+        
+        public createRelationshipRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.properties = properties;
+            this.policies = policies;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createRelationshipResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createRelationshipResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createRelationshipResponse() {
+        }
+        
+        public createRelationshipResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createPolicy", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createPolicyRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
+        public string[] policies;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createPolicyRequest() {
+        }
+        
+        public createPolicyRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.properties = properties;
+            this.folderId = folderId;
+            this.policies = policies;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="createPolicyResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class createPolicyResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public createPolicyResponse() {
+        }
+        
+        public createPolicyResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllowableActions", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getAllowableActionsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getAllowableActionsRequest() {
+        }
+        
+        public getAllowableActionsRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllowableActionsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getAllowableActionsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisAllowableActionsType allowableActions;
+        
+        public getAllowableActionsResponse() {
+        }
+        
+        public getAllowableActionsResponse(DotCMIS.CMISWebServicesReference.cmisAllowableActionsType allowableActions) {
+            this.allowableActions = allowableActions;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObject", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePolicyIds;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeACL;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getObjectRequest() {
+        }
+        
+        public getObjectRequest(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includePolicyIds = includePolicyIds;
+            this.includeACL = includeACL;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
+        
+        public getObjectResponse() {
+        }
+        
+        public getObjectResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
+            this.@object = @object;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getProperties", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getPropertiesRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getPropertiesRequest() {
+        }
+        
+        public getPropertiesRequest(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.filter = filter;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getPropertiesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getPropertiesResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        public getPropertiesResponse() {
+        }
+        
+        public getPropertiesResponse(DotCMIS.CMISWebServicesReference.cmisPropertiesType properties) {
+            this.properties = properties;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getRenditions", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getRenditionsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string skipCount;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getRenditionsRequest() {
+        }
+        
+        public getRenditionsRequest(string repositoryId, string objectId, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.renditionFilter = renditionFilter;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getRenditionsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getRenditionsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("renditions")]
+        public cmisRenditionType[] renditions;
+        
+        public getRenditionsResponse() {
+        }
+        
+        public getRenditionsResponse(cmisRenditionType[] renditions) {
+            this.renditions = renditions;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectByPath", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectByPathRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string path;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePolicyIds;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeACL;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getObjectByPathRequest() {
+        }
+        
+        public getObjectByPathRequest(string repositoryId, string path, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.path = path;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includePolicyIds = includePolicyIds;
+            this.includeACL = includeACL;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectByPathResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectByPathResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
+        
+        public getObjectByPathResponse() {
+        }
+        
+        public getObjectByPathResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
+            this.@object = @object;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentStream", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getContentStreamRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string streamId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string offset;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string length;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getContentStreamRequest() {
+        }
+        
+        public getContentStreamRequest(string repositoryId, string objectId, string streamId, string offset, string length, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.streamId = streamId;
+            this.offset = offset;
+            this.length = length;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getContentStreamResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getContentStreamResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
+        
+        public getContentStreamResponse() {
+        }
+        
+        public getContentStreamResponse(DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream) {
+            this.contentStream = contentStream;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="updateProperties", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class updatePropertiesRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string changeToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public updatePropertiesRequest() {
+        }
+        
+        public updatePropertiesRequest(string repositoryId, string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.changeToken = changeToken;
+            this.properties = properties;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="updatePropertiesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class updatePropertiesResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string changeToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public updatePropertiesResponse() {
+        }
+        
+        public updatePropertiesResponse(string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.changeToken = changeToken;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="moveObject", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class moveObjectRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string targetFolderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        public string sourceFolderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public moveObjectRequest() {
+        }
+        
+        public moveObjectRequest(string repositoryId, string objectId, string targetFolderId, string sourceFolderId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.targetFolderId = targetFolderId;
+            this.sourceFolderId = sourceFolderId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="moveObjectResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class moveObjectResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public moveObjectResponse() {
+        }
+        
+        public moveObjectResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteObject", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class deleteObjectRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> allVersions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public deleteObjectRequest() {
+        }
+        
+        public deleteObjectRequest(string repositoryId, string objectId, System.Nullable<bool> allVersions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.allVersions = allVersions;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteObjectResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class deleteObjectResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public deleteObjectResponse() {
+        }
+        
+        public deleteObjectResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumUnfileObject {
+        
+        /// <remarks/>
+        unfile,
+        
+        /// <remarks/>
+        deletesinglefiled,
+        
+        /// <remarks/>
+        delete,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class deleteTreeResponseFailedToDelete : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string[] objectIdsField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("objectIds", Order=0)]
+        public string[] objectIds {
+            get {
+                return this.objectIdsField;
+            }
+            set {
+                this.objectIdsField = value;
+                this.RaisePropertyChanged("objectIds");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=1)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteTree", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class deleteTreeRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string folderId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> allVersions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumUnfileObject> unfileObjects;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> continueOnFailure;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public deleteTreeRequest() {
+        }
+        
+        public deleteTreeRequest(string repositoryId, string folderId, System.Nullable<bool> allVersions, System.Nullable<enumUnfileObject> unfileObjects, System.Nullable<bool> continueOnFailure, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.folderId = folderId;
+            this.allVersions = allVersions;
+            this.unfileObjects = unfileObjects;
+            this.continueOnFailure = continueOnFailure;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteTreeResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class deleteTreeResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete failedToDelete;
+        
+        public deleteTreeResponse() {
+        }
+        
+        public deleteTreeResponse(DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete failedToDelete) {
+            this.failedToDelete = failedToDelete;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="setContentStream", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class setContentStreamRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> overwriteFlag;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string changeToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public setContentStreamRequest() {
+        }
+        
+        public setContentStreamRequest(string repositoryId, string objectId, System.Nullable<bool> overwriteFlag, string changeToken, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.overwriteFlag = overwriteFlag;
+            this.changeToken = changeToken;
+            this.contentStream = contentStream;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="setContentStreamResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class setContentStreamResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string changeToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public setContentStreamResponse() {
+        }
+        
+        public setContentStreamResponse(string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.changeToken = changeToken;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteContentStream", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class deleteContentStreamRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string changeToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public deleteContentStreamRequest() {
+        }
+        
+        public deleteContentStreamRequest(string repositoryId, string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.changeToken = changeToken;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="deleteContentStreamResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class deleteContentStreamResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string changeToken;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public deleteContentStreamResponse() {
+        }
+        
+        public deleteContentStreamResponse(string objectId, string changeToken, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.changeToken = changeToken;
+            this.extension = extension;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface ObjectServicePortChannel : DotCMIS.CMISWebServicesReference.ObjectServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class ObjectServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.ObjectServicePort>, DotCMIS.CMISWebServicesReference.ObjectServicePort {
+        
+        public ObjectServicePortClient() {
+        }
+        
+        public ObjectServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public ObjectServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public ObjectServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public ObjectServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.createDocumentResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createDocument(DotCMIS.CMISWebServicesReference.createDocumentRequest request) {
+            return base.Channel.createDocument(request);
+        }
+        
+        public string createDocument(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.createDocumentRequest inValue = new DotCMIS.CMISWebServicesReference.createDocumentRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.properties = properties;
+            inValue.folderId = folderId;
+            inValue.contentStream = contentStream;
+            inValue.versioningState = versioningState;
+            inValue.policies = policies;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.createDocumentResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createDocument(inValue);
+            extension = retVal.extension;
+            return retVal.objectId;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.createDocumentFromSourceResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createDocumentFromSource(DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest request) {
+            return base.Channel.createDocumentFromSource(request);
+        }
+        
+        public string createDocumentFromSource(string repositoryId, string sourceId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, System.Nullable<enumVersioningState> versioningState, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest inValue = new DotCMIS.CMISWebServicesReference.createDocumentFromSourceRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.sourceId = sourceId;
+            inValue.properties = properties;
+            inValue.folderId = folderId;
+            inValue.versioningState = versioningState;
+            inValue.policies = policies;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.createDocumentFromSourceResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createDocumentFromSource(inValue);
+            extension = retVal.extension;
+            return retVal.objectId;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.createFolderResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createFolder(DotCMIS.CMISWebServicesReference.createFolderRequest request) {
+            return base.Channel.createFolder(request);
+        }
+        
+        public string createFolder(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.createFolderRequest inValue = new DotCMIS.CMISWebServicesReference.createFolderRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.properties = properties;
+            inValue.folderId = folderId;
+            inValue.policies = policies;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.createFolderResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createFolder(inValue);
+            extension = retVal.extension;
+            return retVal.objectId;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.createRelationshipResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createRelationship(DotCMIS.CMISWebServicesReference.createRelationshipRequest request) {
+            return base.Channel.createRelationship(request);
+        }
+        
+        public string createRelationship(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.createRelationshipRequest inValue = new DotCMIS.CMISWebServicesReference.createRelationshipRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.properties = properties;
+            inValue.policies = policies;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.createRelationshipResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createRelationship(inValue);
+            extension = retVal.extension;
+            return retVal.objectId;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.createPolicyResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.createPolicy(DotCMIS.CMISWebServicesReference.createPolicyRequest request) {
+            return base.Channel.createPolicy(request);
+        }
+        
+        public string createPolicy(string repositoryId, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, string folderId, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.createPolicyRequest inValue = new DotCMIS.CMISWebServicesReference.createPolicyRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.properties = properties;
+            inValue.folderId = folderId;
+            inValue.policies = policies;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.createPolicyResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).createPolicy(inValue);
+            extension = retVal.extension;
+            return retVal.objectId;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getAllowableActionsResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getAllowableActions(DotCMIS.CMISWebServicesReference.getAllowableActionsRequest request) {
+            return base.Channel.getAllowableActions(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisAllowableActionsType getAllowableActions(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getAllowableActionsRequest inValue = new DotCMIS.CMISWebServicesReference.getAllowableActionsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getAllowableActionsResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getAllowableActions(inValue);
+            return retVal.allowableActions;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getObjectResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getObject(DotCMIS.CMISWebServicesReference.getObjectRequest request) {
+            return base.Channel.getObject(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectType getObject(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getObjectRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includePolicyIds = includePolicyIds;
+            inValue.includeACL = includeACL;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getObjectResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getObject(inValue);
+            return retVal.@object;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getPropertiesResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getProperties(DotCMIS.CMISWebServicesReference.getPropertiesRequest request) {
+            return base.Channel.getProperties(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType getProperties(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getPropertiesRequest inValue = new DotCMIS.CMISWebServicesReference.getPropertiesRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.filter = filter;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getPropertiesResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getProperties(inValue);
+            return retVal.properties;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getRenditionsResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getRenditions(DotCMIS.CMISWebServicesReference.getRenditionsRequest request) {
+            return base.Channel.getRenditions(request);
+        }
+        
+        public cmisRenditionType[] getRenditions(string repositoryId, string objectId, string renditionFilter, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getRenditionsRequest inValue = new DotCMIS.CMISWebServicesReference.getRenditionsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.renditionFilter = renditionFilter;
+            inValue.maxItems = maxItems;
+            inValue.skipCount = skipCount;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getRenditionsResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getRenditions(inValue);
+            return retVal.renditions;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getObjectByPathResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getObjectByPath(DotCMIS.CMISWebServicesReference.getObjectByPathRequest request) {
+            return base.Channel.getObjectByPath(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectType getObjectByPath(string repositoryId, string path, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getObjectByPathRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectByPathRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.path = path;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includePolicyIds = includePolicyIds;
+            inValue.includeACL = includeACL;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getObjectByPathResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getObjectByPath(inValue);
+            return retVal.@object;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getContentStreamResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.getContentStream(DotCMIS.CMISWebServicesReference.getContentStreamRequest request) {
+            return base.Channel.getContentStream(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisContentStreamType getContentStream(string repositoryId, string objectId, string streamId, string offset, string length, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getContentStreamRequest inValue = new DotCMIS.CMISWebServicesReference.getContentStreamRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.streamId = streamId;
+            inValue.offset = offset;
+            inValue.length = length;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getContentStreamResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).getContentStream(inValue);
+            return retVal.contentStream;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.updatePropertiesResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.updateProperties(DotCMIS.CMISWebServicesReference.updatePropertiesRequest request) {
+            return base.Channel.updateProperties(request);
+        }
+        
+        public void updateProperties(string repositoryId, ref string objectId, ref string changeToken, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.updatePropertiesRequest inValue = new DotCMIS.CMISWebServicesReference.updatePropertiesRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.changeToken = changeToken;
+            inValue.properties = properties;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.updatePropertiesResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).updateProperties(inValue);
+            objectId = retVal.objectId;
+            changeToken = retVal.changeToken;
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.moveObjectResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.moveObject(DotCMIS.CMISWebServicesReference.moveObjectRequest request) {
+            return base.Channel.moveObject(request);
+        }
+        
+        public void moveObject(string repositoryId, ref string objectId, string targetFolderId, string sourceFolderId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.moveObjectRequest inValue = new DotCMIS.CMISWebServicesReference.moveObjectRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.targetFolderId = targetFolderId;
+            inValue.sourceFolderId = sourceFolderId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.moveObjectResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).moveObject(inValue);
+            objectId = retVal.objectId;
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.deleteObjectResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.deleteObject(DotCMIS.CMISWebServicesReference.deleteObjectRequest request) {
+            return base.Channel.deleteObject(request);
+        }
+        
+        public void deleteObject(string repositoryId, string objectId, System.Nullable<bool> allVersions, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.deleteObjectRequest inValue = new DotCMIS.CMISWebServicesReference.deleteObjectRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.allVersions = allVersions;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.deleteObjectResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).deleteObject(inValue);
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.deleteTreeResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.deleteTree(DotCMIS.CMISWebServicesReference.deleteTreeRequest request) {
+            return base.Channel.deleteTree(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.deleteTreeResponseFailedToDelete deleteTree(string repositoryId, string folderId, System.Nullable<bool> allVersions, System.Nullable<enumUnfileObject> unfileObjects, System.Nullable<bool> continueOnFailure, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.deleteTreeRequest inValue = new DotCMIS.CMISWebServicesReference.deleteTreeRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.folderId = folderId;
+            inValue.allVersions = allVersions;
+            inValue.unfileObjects = unfileObjects;
+            inValue.continueOnFailure = continueOnFailure;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.deleteTreeResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).deleteTree(inValue);
+            return retVal.failedToDelete;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.setContentStreamResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.setContentStream(DotCMIS.CMISWebServicesReference.setContentStreamRequest request) {
+            return base.Channel.setContentStream(request);
+        }
+        
+        public void setContentStream(string repositoryId, ref string objectId, System.Nullable<bool> overwriteFlag, ref string changeToken, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.setContentStreamRequest inValue = new DotCMIS.CMISWebServicesReference.setContentStreamRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.overwriteFlag = overwriteFlag;
+            inValue.changeToken = changeToken;
+            inValue.contentStream = contentStream;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.setContentStreamResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).setContentStream(inValue);
+            objectId = retVal.objectId;
+            changeToken = retVal.changeToken;
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.deleteContentStreamResponse DotCMIS.CMISWebServicesReference.ObjectServicePort.deleteContentStream(DotCMIS.CMISWebServicesReference.deleteContentStreamRequest request) {
+            return base.Channel.deleteContentStream(request);
+        }
+        
+        public void deleteContentStream(string repositoryId, ref string objectId, ref string changeToken, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.deleteContentStreamRequest inValue = new DotCMIS.CMISWebServicesReference.deleteContentStreamRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.changeToken = changeToken;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.deleteContentStreamResponse retVal = ((DotCMIS.CMISWebServicesReference.ObjectServicePort)(this)).deleteContentStream(inValue);
+            objectId = retVal.objectId;
+            changeToken = retVal.changeToken;
+            extension = retVal.extension;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.PolicyServicePort")]
+    internal interface PolicyServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message applyPolicyRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.applyPolicyResponse applyPolicy(DotCMIS.CMISWebServicesReference.applyPolicyRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message removePolicyRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.removePolicyResponse removePolicy(DotCMIS.CMISWebServicesReference.removePolicyRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getAppliedPoliciesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getAppliedPoliciesResponse getAppliedPolicies(DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest request);
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="applyPolicy", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class applyPolicyRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string policyId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public applyPolicyRequest() {
+        }
+        
+        public applyPolicyRequest(string repositoryId, string policyId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.policyId = policyId;
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="applyPolicyResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class applyPolicyResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public applyPolicyResponse() {
+        }
+        
+        public applyPolicyResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="removePolicy", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class removePolicyRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string policyId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public removePolicyRequest() {
+        }
+        
+        public removePolicyRequest(string repositoryId, string policyId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.policyId = policyId;
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="removePolicyResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class removePolicyResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public removePolicyResponse() {
+        }
+        
+        public removePolicyResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getAppliedPolicies", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getAppliedPoliciesRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getAppliedPoliciesRequest() {
+        }
+        
+        public getAppliedPoliciesRequest(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.filter = filter;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getAppliedPoliciesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getAppliedPoliciesResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("objects")]
+        public cmisObjectType[] objects;
+        
+        public getAppliedPoliciesResponse() {
+        }
+        
+        public getAppliedPoliciesResponse(cmisObjectType[] objects) {
+            this.objects = objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface PolicyServicePortChannel : DotCMIS.CMISWebServicesReference.PolicyServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class PolicyServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.PolicyServicePort>, DotCMIS.CMISWebServicesReference.PolicyServicePort {
+        
+        public PolicyServicePortClient() {
+        }
+        
+        public PolicyServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public PolicyServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public PolicyServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public PolicyServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.applyPolicyResponse DotCMIS.CMISWebServicesReference.PolicyServicePort.applyPolicy(DotCMIS.CMISWebServicesReference.applyPolicyRequest request) {
+            return base.Channel.applyPolicy(request);
+        }
+        
+        public void applyPolicy(string repositoryId, string policyId, string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.applyPolicyRequest inValue = new DotCMIS.CMISWebServicesReference.applyPolicyRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.policyId = policyId;
+            inValue.objectId = objectId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.applyPolicyResponse retVal = ((DotCMIS.CMISWebServicesReference.PolicyServicePort)(this)).applyPolicy(inValue);
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.removePolicyResponse DotCMIS.CMISWebServicesReference.PolicyServicePort.removePolicy(DotCMIS.CMISWebServicesReference.removePolicyRequest request) {
+            return base.Channel.removePolicy(request);
+        }
+        
+        public void removePolicy(string repositoryId, string policyId, string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.removePolicyRequest inValue = new DotCMIS.CMISWebServicesReference.removePolicyRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.policyId = policyId;
+            inValue.objectId = objectId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.removePolicyResponse retVal = ((DotCMIS.CMISWebServicesReference.PolicyServicePort)(this)).removePolicy(inValue);
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getAppliedPoliciesResponse DotCMIS.CMISWebServicesReference.PolicyServicePort.getAppliedPolicies(DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest request) {
+            return base.Channel.getAppliedPolicies(request);
+        }
+        
+        public cmisObjectType[] getAppliedPolicies(string repositoryId, string objectId, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest inValue = new DotCMIS.CMISWebServicesReference.getAppliedPoliciesRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.filter = filter;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getAppliedPoliciesResponse retVal = ((DotCMIS.CMISWebServicesReference.PolicyServicePort)(this)).getAppliedPolicies(inValue);
+            return retVal.objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.RelationshipServicePort")]
+    internal interface RelationshipServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectRelationshipsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getObjectRelationshipsResponse getObjectRelationships(DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumRelationshipDirection {
+        
+        /// <remarks/>
+        source,
+        
+        /// <remarks/>
+        target,
+        
+        /// <remarks/>
+        either,
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectRelationships", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectRelationshipsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public bool includeSubRelationshipTypes;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumRelationshipDirection> relationshipDirection;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string typeId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string skipCount;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getObjectRelationshipsRequest() {
+        }
+        
+        public getObjectRelationshipsRequest(string repositoryId, string objectId, bool includeSubRelationshipTypes, System.Nullable<enumRelationshipDirection> relationshipDirection, string typeId, string filter, System.Nullable<bool> includeAllowableActions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.includeSubRelationshipTypes = includeSubRelationshipTypes;
+            this.relationshipDirection = relationshipDirection;
+            this.typeId = typeId;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectRelationshipsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectRelationshipsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType objects;
+        
+        public getObjectRelationshipsResponse() {
+        }
+        
+        public getObjectRelationshipsResponse(DotCMIS.CMISWebServicesReference.cmisObjectListType objects) {
+            this.objects = objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface RelationshipServicePortChannel : DotCMIS.CMISWebServicesReference.RelationshipServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class RelationshipServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.RelationshipServicePort>, DotCMIS.CMISWebServicesReference.RelationshipServicePort {
+        
+        public RelationshipServicePortClient() {
+        }
+        
+        public RelationshipServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public RelationshipServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public RelationshipServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public RelationshipServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getObjectRelationshipsResponse DotCMIS.CMISWebServicesReference.RelationshipServicePort.getObjectRelationships(DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest request) {
+            return base.Channel.getObjectRelationships(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectListType getObjectRelationships(string repositoryId, string objectId, bool includeSubRelationshipTypes, System.Nullable<enumRelationshipDirection> relationshipDirection, string typeId, string filter, System.Nullable<bool> includeAllowableActions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectRelationshipsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.includeSubRelationshipTypes = includeSubRelationshipTypes;
+            inValue.relationshipDirection = relationshipDirection;
+            inValue.typeId = typeId;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.maxItems = maxItems;
+            inValue.skipCount = skipCount;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getObjectRelationshipsResponse retVal = ((DotCMIS.CMISWebServicesReference.RelationshipServicePort)(this)).getObjectRelationships(inValue);
+            return retVal.objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.RepositoryServicePort")]
+    internal interface RepositoryServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getRepositoriesRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getRepositoriesResponse getRepositories(DotCMIS.CMISWebServicesReference.getRepositoriesRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getRepositoryInfoRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getRepositoryInfoResponse getRepositoryInfo(DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getTypeChildrenRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getTypeChildrenResponse getTypeChildren(DotCMIS.CMISWebServicesReference.getTypeChildrenRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getTypeDescendantsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getTypeDescendantsResponse getTypeDescendants(DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getTypeDefinitionRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getTypeDefinitionResponse getTypeDefinition(DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisRepositoryEntryType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string repositoryIdField;
+        
+        private string repositoryNameField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string repositoryId {
+            get {
+                return this.repositoryIdField;
+            }
+            set {
+                this.repositoryIdField = value;
+                this.RaisePropertyChanged("repositoryId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string repositoryName {
+            get {
+                return this.repositoryNameField;
+            }
+            set {
+                this.repositoryNameField = value;
+                this.RaisePropertyChanged("repositoryName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositories", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getRepositoriesRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getRepositoriesRequest() {
+        }
+        
+        public getRepositoriesRequest(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositoriesResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getRepositoriesResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("repositories", IsNullable=true)]
+        public cmisRepositoryEntryType[] repositories;
+        
+        public getRepositoriesResponse() {
+        }
+        
+        public getRepositoriesResponse(cmisRepositoryEntryType[] repositories) {
+            this.repositories = repositories;
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisRepositoryInfoType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string repositoryIdField;
+        
+        private string repositoryNameField;
+        
+        private string repositoryDescriptionField;
+        
+        private string vendorNameField;
+        
+        private string productNameField;
+        
+        private string productVersionField;
+        
+        private string rootFolderIdField;
+        
+        private string latestChangeLogTokenField;
+        
+        private cmisRepositoryCapabilitiesType capabilitiesField;
+        
+        private cmisACLCapabilityType aclCapabilityField;
+        
+        private string cmisVersionSupportedField;
+        
+        private string thinClientURIField;
+        
+        private bool changesIncompleteField;
+        
+        private bool changesIncompleteFieldSpecified;
+        
+        private enumBaseObjectTypeIds[] changesOnTypeField;
+        
+        private string principalAnonymousField;
+        
+        private string principalAnyoneField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string repositoryId {
+            get {
+                return this.repositoryIdField;
+            }
+            set {
+                this.repositoryIdField = value;
+                this.RaisePropertyChanged("repositoryId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string repositoryName {
+            get {
+                return this.repositoryNameField;
+            }
+            set {
+                this.repositoryNameField = value;
+                this.RaisePropertyChanged("repositoryName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public string repositoryDescription {
+            get {
+                return this.repositoryDescriptionField;
+            }
+            set {
+                this.repositoryDescriptionField = value;
+                this.RaisePropertyChanged("repositoryDescription");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public string vendorName {
+            get {
+                return this.vendorNameField;
+            }
+            set {
+                this.vendorNameField = value;
+                this.RaisePropertyChanged("vendorName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public string productName {
+            get {
+                return this.productNameField;
+            }
+            set {
+                this.productNameField = value;
+                this.RaisePropertyChanged("productName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
+        public string productVersion {
+            get {
+                return this.productVersionField;
+            }
+            set {
+                this.productVersionField = value;
+                this.RaisePropertyChanged("productVersion");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
+        public string rootFolderId {
+            get {
+                return this.rootFolderIdField;
+            }
+            set {
+                this.rootFolderIdField = value;
+                this.RaisePropertyChanged("rootFolderId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
+        public string latestChangeLogToken {
+            get {
+                return this.latestChangeLogTokenField;
+            }
+            set {
+                this.latestChangeLogTokenField = value;
+                this.RaisePropertyChanged("latestChangeLogToken");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
+        public cmisRepositoryCapabilitiesType capabilities {
+            get {
+                return this.capabilitiesField;
+            }
+            set {
+                this.capabilitiesField = value;
+                this.RaisePropertyChanged("capabilities");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
+        public cmisACLCapabilityType aclCapability {
+            get {
+                return this.aclCapabilityField;
+            }
+            set {
+                this.aclCapabilityField = value;
+                this.RaisePropertyChanged("aclCapability");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
+        public string cmisVersionSupported {
+            get {
+                return this.cmisVersionSupportedField;
+            }
+            set {
+                this.cmisVersionSupportedField = value;
+                this.RaisePropertyChanged("cmisVersionSupported");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI", Order=11)]
+        public string thinClientURI {
+            get {
+                return this.thinClientURIField;
+            }
+            set {
+                this.thinClientURIField = value;
+                this.RaisePropertyChanged("thinClientURI");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
+        public bool changesIncomplete {
+            get {
+                return this.changesIncompleteField;
+            }
+            set {
+                this.changesIncompleteField = value;
+                this.RaisePropertyChanged("changesIncomplete");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool changesIncompleteSpecified {
+            get {
+                return this.changesIncompleteFieldSpecified;
+            }
+            set {
+                this.changesIncompleteFieldSpecified = value;
+                this.RaisePropertyChanged("changesIncompleteSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("changesOnType", Order=13)]
+        public enumBaseObjectTypeIds[] changesOnType {
+            get {
+                return this.changesOnTypeField;
+            }
+            set {
+                this.changesOnTypeField = value;
+                this.RaisePropertyChanged("changesOnType");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=14)]
+        public string principalAnonymous {
+            get {
+                return this.principalAnonymousField;
+            }
+            set {
+                this.principalAnonymousField = value;
+                this.RaisePropertyChanged("principalAnonymous");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=15)]
+        public string principalAnyone {
+            get {
+                return this.principalAnyoneField;
+            }
+            set {
+                this.principalAnyoneField = value;
+                this.RaisePropertyChanged("principalAnyone");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=16)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisRepositoryCapabilitiesType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private enumCapabilityACL capabilityACLField;
+        
+        private bool capabilityAllVersionsSearchableField;
+        
+        private enumCapabilityChanges capabilityChangesField;
+        
+        private enumCapabilityContentStreamUpdates capabilityContentStreamUpdatabilityField;
+        
+        private bool capabilityGetDescendantsField;
+        
+        private bool capabilityGetFolderTreeField;
+        
+        private bool capabilityMultifilingField;
+        
+        private bool capabilityPWCSearchableField;
+        
+        private bool capabilityPWCUpdatableField;
+        
+        private enumCapabilityQuery capabilityQueryField;
+        
+        private enumCapabilityRendition capabilityRenditionsField;
+        
+        private bool capabilityUnfilingField;
+        
+        private bool capabilityVersionSpecificFilingField;
+        
+        private enumCapabilityJoin capabilityJoinField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public enumCapabilityACL capabilityACL {
+            get {
+                return this.capabilityACLField;
+            }
+            set {
+                this.capabilityACLField = value;
+                this.RaisePropertyChanged("capabilityACL");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public bool capabilityAllVersionsSearchable {
+            get {
+                return this.capabilityAllVersionsSearchableField;
+            }
+            set {
+                this.capabilityAllVersionsSearchableField = value;
+                this.RaisePropertyChanged("capabilityAllVersionsSearchable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public enumCapabilityChanges capabilityChanges {
+            get {
+                return this.capabilityChangesField;
+            }
+            set {
+                this.capabilityChangesField = value;
+                this.RaisePropertyChanged("capabilityChanges");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public enumCapabilityContentStreamUpdates capabilityContentStreamUpdatability {
+            get {
+                return this.capabilityContentStreamUpdatabilityField;
+            }
+            set {
+                this.capabilityContentStreamUpdatabilityField = value;
+                this.RaisePropertyChanged("capabilityContentStreamUpdatability");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public bool capabilityGetDescendants {
+            get {
+                return this.capabilityGetDescendantsField;
+            }
+            set {
+                this.capabilityGetDescendantsField = value;
+                this.RaisePropertyChanged("capabilityGetDescendants");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
+        public bool capabilityGetFolderTree {
+            get {
+                return this.capabilityGetFolderTreeField;
+            }
+            set {
+                this.capabilityGetFolderTreeField = value;
+                this.RaisePropertyChanged("capabilityGetFolderTree");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
+        public bool capabilityMultifiling {
+            get {
+                return this.capabilityMultifilingField;
+            }
+            set {
+                this.capabilityMultifilingField = value;
+                this.RaisePropertyChanged("capabilityMultifiling");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
+        public bool capabilityPWCSearchable {
+            get {
+                return this.capabilityPWCSearchableField;
+            }
+            set {
+                this.capabilityPWCSearchableField = value;
+                this.RaisePropertyChanged("capabilityPWCSearchable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
+        public bool capabilityPWCUpdatable {
+            get {
+                return this.capabilityPWCUpdatableField;
+            }
+            set {
+                this.capabilityPWCUpdatableField = value;
+                this.RaisePropertyChanged("capabilityPWCUpdatable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
+        public enumCapabilityQuery capabilityQuery {
+            get {
+                return this.capabilityQueryField;
+            }
+            set {
+                this.capabilityQueryField = value;
+                this.RaisePropertyChanged("capabilityQuery");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
+        public enumCapabilityRendition capabilityRenditions {
+            get {
+                return this.capabilityRenditionsField;
+            }
+            set {
+                this.capabilityRenditionsField = value;
+                this.RaisePropertyChanged("capabilityRenditions");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
+        public bool capabilityUnfiling {
+            get {
+                return this.capabilityUnfilingField;
+            }
+            set {
+                this.capabilityUnfilingField = value;
+                this.RaisePropertyChanged("capabilityUnfiling");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
+        public bool capabilityVersionSpecificFiling {
+            get {
+                return this.capabilityVersionSpecificFilingField;
+            }
+            set {
+                this.capabilityVersionSpecificFilingField = value;
+                this.RaisePropertyChanged("capabilityVersionSpecificFiling");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
+        public enumCapabilityJoin capabilityJoin {
+            get {
+                return this.capabilityJoinField;
+            }
+            set {
+                this.capabilityJoinField = value;
+                this.RaisePropertyChanged("capabilityJoin");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=14)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCapabilityACL {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        discover,
+        
+        /// <remarks/>
+        manage,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCapabilityChanges {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        objectidsonly,
+        
+        /// <remarks/>
+        properties,
+        
+        /// <remarks/>
+        all,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCapabilityContentStreamUpdates {
+        
+        /// <remarks/>
+        anytime,
+        
+        /// <remarks/>
+        pwconly,
+        
+        /// <remarks/>
+        none,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCapabilityQuery {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        metadataonly,
+        
+        /// <remarks/>
+        fulltextonly,
+        
+        /// <remarks/>
+        bothseparate,
+        
+        /// <remarks/>
+        bothcombined,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCapabilityRendition {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        read,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCapabilityJoin {
+        
+        /// <remarks/>
+        none,
+        
+        /// <remarks/>
+        inneronly,
+        
+        /// <remarks/>
+        innerandouter,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisACLCapabilityType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private enumSupportedPermissions supportedPermissionsField;
+        
+        private enumACLPropagation propagationField;
+        
+        private cmisPermissionDefinition[] permissionsField;
+        
+        private cmisPermissionMapping[] mappingField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public enumSupportedPermissions supportedPermissions {
+            get {
+                return this.supportedPermissionsField;
+            }
+            set {
+                this.supportedPermissionsField = value;
+                this.RaisePropertyChanged("supportedPermissions");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public enumACLPropagation propagation {
+            get {
+                return this.propagationField;
+            }
+            set {
+                this.propagationField = value;
+                this.RaisePropertyChanged("propagation");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("permissions", Order=2)]
+        public cmisPermissionDefinition[] permissions {
+            get {
+                return this.permissionsField;
+            }
+            set {
+                this.permissionsField = value;
+                this.RaisePropertyChanged("permissions");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("mapping", Order=3)]
+        public cmisPermissionMapping[] mapping {
+            get {
+                return this.mappingField;
+            }
+            set {
+                this.mappingField = value;
+                this.RaisePropertyChanged("mapping");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumSupportedPermissions {
+        
+        /// <remarks/>
+        basic,
+        
+        /// <remarks/>
+        repository,
+        
+        /// <remarks/>
+        both,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumACLPropagation {
+        
+        /// <remarks/>
+        repositorydetermined,
+        
+        /// <remarks/>
+        objectonly,
+        
+        /// <remarks/>
+        propagate,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPermissionDefinition : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string permissionField;
+        
+        private string descriptionField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string permission {
+            get {
+                return this.permissionField;
+            }
+            set {
+                this.permissionField = value;
+                this.RaisePropertyChanged("permission");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string description {
+            get {
+                return this.descriptionField;
+            }
+            set {
+                this.descriptionField = value;
+                this.RaisePropertyChanged("description");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPermissionMapping : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private enumAllowableActionsKey keyField;
+        
+        private string[] permissionField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public enumAllowableActionsKey key {
+            get {
+                return this.keyField;
+            }
+            set {
+                this.keyField = value;
+                this.RaisePropertyChanged("key");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("permission", Order=1)]
+        public string[] permission {
+            get {
+                return this.permissionField;
+            }
+            set {
+                this.permissionField = value;
+                this.RaisePropertyChanged("permission");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumAllowableActionsKey {
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetDescendents.Folder")]
+        canGetDescendentsFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetChildren.Folder")]
+        canGetChildrenFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetParents.Folder")]
+        canGetParentsFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetFolderParent.Object")]
+        canGetFolderParentObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCreateDocument.Folder")]
+        canCreateDocumentFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCreateFolder.Folder")]
+        canCreateFolderFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCreateRelationship.Source")]
+        canCreateRelationshipSource,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCreateRelationship.Target")]
+        canCreateRelationshipTarget,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetProperties.Object")]
+        canGetPropertiesObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canViewContent.Object")]
+        canViewContentObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canUpdateProperties.Object")]
+        canUpdatePropertiesObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canMove.Object")]
+        canMoveObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canMove.Target")]
+        canMoveTarget,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canMove.Source")]
+        canMoveSource,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canDelete.Object")]
+        canDeleteObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canDeleteTree.Folder")]
+        canDeleteTreeFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canSetContent.Document")]
+        canSetContentDocument,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canDeleteContent.Document")]
+        canDeleteContentDocument,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canAddToFolder.Object")]
+        canAddToFolderObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canAddToFolder.Folder")]
+        canAddToFolderFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canRemoveFromFolder.Object")]
+        canRemoveFromFolderObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canRemoveFromFolder.Folder")]
+        canRemoveFromFolderFolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCheckout.Document")]
+        canCheckoutDocument,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCancelCheckout.Document")]
+        canCancelCheckoutDocument,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canCheckin.Document")]
+        canCheckinDocument,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetAllVersions.VersionSeries")]
+        canGetAllVersionsVersionSeries,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetObjectRelationships.Object")]
+        canGetObjectRelationshipsObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canAddPolicy.Object")]
+        canAddPolicyObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canAddPolicy.Policy")]
+        canAddPolicyPolicy,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canRemovePolicy.Object")]
+        canRemovePolicyObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canRemovePolicy.Policy")]
+        canRemovePolicyPolicy,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetAppliedPolicies.Object")]
+        canGetAppliedPoliciesObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canGetACL.Object")]
+        canGetACLObject,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("canApplyACL.Object")]
+        canApplyACLObject,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumBaseObjectTypeIds {
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("cmis:document")]
+        cmisdocument,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("cmis:folder")]
+        cmisfolder,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("cmis:relationship")]
+        cmisrelationship,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("cmis:policy")]
+        cmispolicy,
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositoryInfo", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getRepositoryInfoRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getRepositoryInfoRequest() {
+        }
+        
+        public getRepositoryInfoRequest(string repositoryId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getRepositoryInfoResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getRepositoryInfoResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType repositoryInfo;
+        
+        public getRepositoryInfoResponse() {
+        }
+        
+        public getRepositoryInfoResponse(DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType repositoryInfo) {
+            this.repositoryInfo = repositoryInfo;
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisTypeDefinitionListType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisTypeDefinitionType[] typesField;
+        
+        private bool hasMoreItemsField;
+        
+        private string numItemsField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("types", Order=0)]
+        public cmisTypeDefinitionType[] types {
+            get {
+                return this.typesField;
+            }
+            set {
+                this.typesField = value;
+                this.RaisePropertyChanged("types");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public bool hasMoreItems {
+            get {
+                return this.hasMoreItemsField;
+            }
+            set {
+                this.hasMoreItemsField = value;
+                this.RaisePropertyChanged("hasMoreItems");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
+        public string numItems {
+            get {
+                return this.numItemsField;
+            }
+            set {
+                this.numItemsField = value;
+                this.RaisePropertyChanged("numItems");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=3)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypePolicyDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypeRelationshipDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypeFolderDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisTypeDocumentDefinitionType))]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisTypeDefinitionType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string idField;
+        
+        private string localNameField;
+        
+        private string localNamespaceField;
+        
+        private string displayNameField;
+        
+        private string queryNameField;
+        
+        private string descriptionField;
+        
+        private enumBaseObjectTypeIds baseIdField;
+        
+        private string parentIdField;
+        
+        private bool creatableField;
+        
+        private bool fileableField;
+        
+        private bool queryableField;
+        
+        private bool fulltextIndexedField;
+        
+        private bool includedInSupertypeQueryField;
+        
+        private bool controllablePolicyField;
+        
+        private bool controllableACLField;
+        
+        private cmisPropertyDefinitionType[] itemsField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        public cmisTypeDefinitionType() {
+            this.includedInSupertypeQueryField = true;
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string id {
+            get {
+                return this.idField;
+            }
+            set {
+                this.idField = value;
+                this.RaisePropertyChanged("id");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string localName {
+            get {
+                return this.localNameField;
+            }
+            set {
+                this.localNameField = value;
+                this.RaisePropertyChanged("localName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI", IsNullable=true, Order=2)]
+        public string localNamespace {
+            get {
+                return this.localNamespaceField;
+            }
+            set {
+                this.localNamespaceField = value;
+                this.RaisePropertyChanged("localNamespace");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public string displayName {
+            get {
+                return this.displayNameField;
+            }
+            set {
+                this.displayNameField = value;
+                this.RaisePropertyChanged("displayName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public string queryName {
+            get {
+                return this.queryNameField;
+            }
+            set {
+                this.queryNameField = value;
+                this.RaisePropertyChanged("queryName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
+        public string description {
+            get {
+                return this.descriptionField;
+            }
+            set {
+                this.descriptionField = value;
+                this.RaisePropertyChanged("description");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
+        public enumBaseObjectTypeIds baseId {
+            get {
+                return this.baseIdField;
+            }
+            set {
+                this.baseIdField = value;
+                this.RaisePropertyChanged("baseId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
+        public string parentId {
+            get {
+                return this.parentIdField;
+            }
+            set {
+                this.parentIdField = value;
+                this.RaisePropertyChanged("parentId");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
+        public bool creatable {
+            get {
+                return this.creatableField;
+            }
+            set {
+                this.creatableField = value;
+                this.RaisePropertyChanged("creatable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
+        public bool fileable {
+            get {
+                return this.fileableField;
+            }
+            set {
+                this.fileableField = value;
+                this.RaisePropertyChanged("fileable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
+        public bool queryable {
+            get {
+                return this.queryableField;
+            }
+            set {
+                this.queryableField = value;
+                this.RaisePropertyChanged("queryable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
+        public bool fulltextIndexed {
+            get {
+                return this.fulltextIndexedField;
+            }
+            set {
+                this.fulltextIndexedField = value;
+                this.RaisePropertyChanged("fulltextIndexed");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
+        public bool includedInSupertypeQuery {
+            get {
+                return this.includedInSupertypeQueryField;
+            }
+            set {
+                this.includedInSupertypeQueryField = value;
+                this.RaisePropertyChanged("includedInSupertypeQuery");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
+        public bool controllablePolicy {
+            get {
+                return this.controllablePolicyField;
+            }
+            set {
+                this.controllablePolicyField = value;
+                this.RaisePropertyChanged("controllablePolicy");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=14)]
+        public bool controllableACL {
+            get {
+                return this.controllableACLField;
+            }
+            set {
+                this.controllableACLField = value;
+                this.RaisePropertyChanged("controllableACL");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("propertyBooleanDefinition", typeof(cmisPropertyBooleanDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyDateTimeDefinition", typeof(cmisPropertyDateTimeDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyDecimalDefinition", typeof(cmisPropertyDecimalDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyHtmlDefinition", typeof(cmisPropertyHtmlDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyIdDefinition", typeof(cmisPropertyIdDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyIntegerDefinition", typeof(cmisPropertyIntegerDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyStringDefinition", typeof(cmisPropertyStringDefinitionType), Order=15)]
+        [System.Xml.Serialization.XmlElementAttribute("propertyUriDefinition", typeof(cmisPropertyUriDefinitionType), Order=15)]
+        public cmisPropertyDefinitionType[] Items {
+            get {
+                return this.itemsField;
+            }
+            set {
+                this.itemsField = value;
+                this.RaisePropertyChanged("Items");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=16)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyBooleanDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyBoolean defaultValueField;
+        
+        private cmisChoiceBoolean[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyBoolean defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceBoolean[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceBoolean : cmisChoice {
+        
+        private bool[] valueField;
+        
+        private cmisChoiceBoolean[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public bool[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceBoolean[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceUri))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceString))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceHtml))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceDecimal))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceDateTime))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceInteger))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceId))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisChoiceBoolean))]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoice : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string displayNameField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAttributeAttribute()]
+        public string displayName {
+            get {
+                return this.displayNameField;
+            }
+            set {
+                this.displayNameField = value;
+                this.RaisePropertyChanged("displayName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceUri : cmisChoice {
+        
+        private string[] valueField;
+        
+        private cmisChoiceUri[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", DataType="anyURI", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceUri[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceString : cmisChoice {
+        
+        private string[] valueField;
+        
+        private cmisChoiceString[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceString[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceHtml : cmisChoice {
+        
+        private string[] valueField;
+        
+        private cmisChoiceHtml[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceHtml[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceDecimal : cmisChoice {
+        
+        private decimal[] valueField;
+        
+        private cmisChoiceDecimal[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public decimal[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceDecimal[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceDateTime : cmisChoice {
+        
+        private System.DateTime[] valueField;
+        
+        private cmisChoiceDateTime[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public System.DateTime[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceDateTime[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceInteger : cmisChoice {
+        
+        private string[] valueField;
+        
+        private cmisChoiceInteger[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", DataType="integer", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceInteger[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisChoiceId : cmisChoice {
+        
+        private string[] valueField;
+        
+        private cmisChoiceId[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("value", Order=0)]
+        public string[] value {
+            get {
+                return this.valueField;
+            }
+            set {
+                this.valueField = value;
+                this.RaisePropertyChanged("value");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceId[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyUriDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyStringDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyHtmlDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDecimalDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyDateTimeDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyIntegerDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyIdDefinitionType))]
+    [System.Xml.Serialization.XmlIncludeAttribute(typeof(cmisPropertyBooleanDefinitionType))]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyDefinitionType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private string idField;
+        
+        private string localNameField;
+        
+        private string localNamespaceField;
+        
+        private string displayNameField;
+        
+        private string queryNameField;
+        
+        private string descriptionField;
+        
+        private enumPropertyType propertyTypeField;
+        
+        private enumCardinality cardinalityField;
+        
+        private enumUpdatability updatabilityField;
+        
+        private bool inheritedField;
+        
+        private bool inheritedFieldSpecified;
+        
+        private bool requiredField;
+        
+        private bool queryableField;
+        
+        private bool orderableField;
+        
+        private bool openChoiceField;
+        
+        private bool openChoiceFieldSpecified;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public string id {
+            get {
+                return this.idField;
+            }
+            set {
+                this.idField = value;
+                this.RaisePropertyChanged("id");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public string localName {
+            get {
+                return this.localNameField;
+            }
+            set {
+                this.localNameField = value;
+                this.RaisePropertyChanged("localName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI", Order=2)]
+        public string localNamespace {
+            get {
+                return this.localNamespaceField;
+            }
+            set {
+                this.localNamespaceField = value;
+                this.RaisePropertyChanged("localNamespace");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public string displayName {
+            get {
+                return this.displayNameField;
+            }
+            set {
+                this.displayNameField = value;
+                this.RaisePropertyChanged("displayName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=4)]
+        public string queryName {
+            get {
+                return this.queryNameField;
+            }
+            set {
+                this.queryNameField = value;
+                this.RaisePropertyChanged("queryName");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=5)]
+        public string description {
+            get {
+                return this.descriptionField;
+            }
+            set {
+                this.descriptionField = value;
+                this.RaisePropertyChanged("description");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=6)]
+        public enumPropertyType propertyType {
+            get {
+                return this.propertyTypeField;
+            }
+            set {
+                this.propertyTypeField = value;
+                this.RaisePropertyChanged("propertyType");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=7)]
+        public enumCardinality cardinality {
+            get {
+                return this.cardinalityField;
+            }
+            set {
+                this.cardinalityField = value;
+                this.RaisePropertyChanged("cardinality");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=8)]
+        public enumUpdatability updatability {
+            get {
+                return this.updatabilityField;
+            }
+            set {
+                this.updatabilityField = value;
+                this.RaisePropertyChanged("updatability");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=9)]
+        public bool inherited {
+            get {
+                return this.inheritedField;
+            }
+            set {
+                this.inheritedField = value;
+                this.RaisePropertyChanged("inherited");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool inheritedSpecified {
+            get {
+                return this.inheritedFieldSpecified;
+            }
+            set {
+                this.inheritedFieldSpecified = value;
+                this.RaisePropertyChanged("inheritedSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=10)]
+        public bool required {
+            get {
+                return this.requiredField;
+            }
+            set {
+                this.requiredField = value;
+                this.RaisePropertyChanged("required");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=11)]
+        public bool queryable {
+            get {
+                return this.queryableField;
+            }
+            set {
+                this.queryableField = value;
+                this.RaisePropertyChanged("queryable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=12)]
+        public bool orderable {
+            get {
+                return this.orderableField;
+            }
+            set {
+                this.orderableField = value;
+                this.RaisePropertyChanged("orderable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=13)]
+        public bool openChoice {
+            get {
+                return this.openChoiceField;
+            }
+            set {
+                this.openChoiceField = value;
+                this.RaisePropertyChanged("openChoice");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool openChoiceSpecified {
+            get {
+                return this.openChoiceFieldSpecified;
+            }
+            set {
+                this.openChoiceFieldSpecified = value;
+                this.RaisePropertyChanged("openChoiceSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=14)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumPropertyType {
+        
+        /// <remarks/>
+        boolean,
+        
+        /// <remarks/>
+        id,
+        
+        /// <remarks/>
+        integer,
+        
+        /// <remarks/>
+        datetime,
+        
+        /// <remarks/>
+        @decimal,
+        
+        /// <remarks/>
+        html,
+        
+        /// <remarks/>
+        @string,
+        
+        /// <remarks/>
+        uri,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumCardinality {
+        
+        /// <remarks/>
+        single,
+        
+        /// <remarks/>
+        multi,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumUpdatability {
+        
+        /// <remarks/>
+        @readonly,
+        
+        /// <remarks/>
+        readwrite,
+        
+        /// <remarks/>
+        whencheckedout,
+        
+        /// <remarks/>
+        oncreate,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyUriDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyUri defaultValueField;
+        
+        private cmisChoiceUri[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyUri defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceUri[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyStringDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyString defaultValueField;
+        
+        private string maxLengthField;
+        
+        private cmisChoiceString[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyString defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1)]
+        public string maxLength {
+            get {
+                return this.maxLengthField;
+            }
+            set {
+                this.maxLengthField = value;
+                this.RaisePropertyChanged("maxLength");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=2)]
+        public cmisChoiceString[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyHtmlDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyHtml defaultValueField;
+        
+        private cmisChoiceHtml[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyHtml defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceHtml[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyDecimalDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyDecimal defaultValueField;
+        
+        private decimal maxValueField;
+        
+        private bool maxValueFieldSpecified;
+        
+        private decimal minValueField;
+        
+        private bool minValueFieldSpecified;
+        
+        private enumDecimalPrecision precisionField;
+        
+        private bool precisionFieldSpecified;
+        
+        private cmisChoiceDecimal[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyDecimal defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public decimal maxValue {
+            get {
+                return this.maxValueField;
+            }
+            set {
+                this.maxValueField = value;
+                this.RaisePropertyChanged("maxValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool maxValueSpecified {
+            get {
+                return this.maxValueFieldSpecified;
+            }
+            set {
+                this.maxValueFieldSpecified = value;
+                this.RaisePropertyChanged("maxValueSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=2)]
+        public decimal minValue {
+            get {
+                return this.minValueField;
+            }
+            set {
+                this.minValueField = value;
+                this.RaisePropertyChanged("minValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool minValueSpecified {
+            get {
+                return this.minValueFieldSpecified;
+            }
+            set {
+                this.minValueFieldSpecified = value;
+                this.RaisePropertyChanged("minValueSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=3)]
+        public enumDecimalPrecision precision {
+            get {
+                return this.precisionField;
+            }
+            set {
+                this.precisionField = value;
+                this.RaisePropertyChanged("precision");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool precisionSpecified {
+            get {
+                return this.precisionFieldSpecified;
+            }
+            set {
+                this.precisionFieldSpecified = value;
+                this.RaisePropertyChanged("precisionSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=4)]
+        public cmisChoiceDecimal[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumDecimalPrecision {
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("32")]
+        Item32,
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlEnumAttribute("64")]
+        Item64,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyDateTimeDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyDateTime defaultValueField;
+        
+        private enumDateTimeResolution resolutionField;
+        
+        private bool resolutionFieldSpecified;
+        
+        private cmisChoiceDateTime[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyDateTime defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public enumDateTimeResolution resolution {
+            get {
+                return this.resolutionField;
+            }
+            set {
+                this.resolutionField = value;
+                this.RaisePropertyChanged("resolution");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool resolutionSpecified {
+            get {
+                return this.resolutionFieldSpecified;
+            }
+            set {
+                this.resolutionFieldSpecified = value;
+                this.RaisePropertyChanged("resolutionSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=2)]
+        public cmisChoiceDateTime[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumDateTimeResolution {
+        
+        /// <remarks/>
+        year,
+        
+        /// <remarks/>
+        date,
+        
+        /// <remarks/>
+        time,
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyIntegerDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyInteger defaultValueField;
+        
+        private string maxValueField;
+        
+        private string minValueField;
+        
+        private cmisChoiceInteger[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyInteger defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=1)]
+        public string maxValue {
+            get {
+                return this.maxValueField;
+            }
+            set {
+                this.maxValueField = value;
+                this.RaisePropertyChanged("maxValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order=2)]
+        public string minValue {
+            get {
+                return this.minValueField;
+            }
+            set {
+                this.minValueField = value;
+                this.RaisePropertyChanged("minValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=3)]
+        public cmisChoiceInteger[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisPropertyIdDefinitionType : cmisPropertyDefinitionType {
+        
+        private cmisPropertyId defaultValueField;
+        
+        private cmisChoiceId[] choiceField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisPropertyId defaultValue {
+            get {
+                return this.defaultValueField;
+            }
+            set {
+                this.defaultValueField = value;
+                this.RaisePropertyChanged("defaultValue");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("choice", Order=1)]
+        public cmisChoiceId[] choice {
+            get {
+                return this.choiceField;
+            }
+            set {
+                this.choiceField = value;
+                this.RaisePropertyChanged("choice");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisTypePolicyDefinitionType : cmisTypeDefinitionType {
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisTypeRelationshipDefinitionType : cmisTypeDefinitionType {
+        
+        private string[] allowedSourceTypesField;
+        
+        private string[] allowedTargetTypesField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("allowedSourceTypes", Order=0)]
+        public string[] allowedSourceTypes {
+            get {
+                return this.allowedSourceTypesField;
+            }
+            set {
+                this.allowedSourceTypesField = value;
+                this.RaisePropertyChanged("allowedSourceTypes");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("allowedTargetTypes", Order=1)]
+        public string[] allowedTargetTypes {
+            get {
+                return this.allowedTargetTypesField;
+            }
+            set {
+                this.allowedTargetTypesField = value;
+                this.RaisePropertyChanged("allowedTargetTypes");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisTypeFolderDefinitionType : cmisTypeDefinitionType {
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public partial class cmisTypeDocumentDefinitionType : cmisTypeDefinitionType {
+        
+        private bool versionableField;
+        
+        private enumContentStreamAllowed contentStreamAllowedField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public bool versionable {
+            get {
+                return this.versionableField;
+            }
+            set {
+                this.versionableField = value;
+                this.RaisePropertyChanged("versionable");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public enumContentStreamAllowed contentStreamAllowed {
+            get {
+                return this.contentStreamAllowedField;
+            }
+            set {
+                this.contentStreamAllowedField = value;
+                this.RaisePropertyChanged("contentStreamAllowed");
+            }
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/core/200908/")]
+    public enum enumContentStreamAllowed {
+        
+        /// <remarks/>
+        notallowed,
+        
+        /// <remarks/>
+        allowed,
+        
+        /// <remarks/>
+        required,
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeChildren", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getTypeChildrenRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string typeId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePropertyDefinitions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string maxItems;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string skipCount;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getTypeChildrenRequest() {
+        }
+        
+        public getTypeChildrenRequest(string repositoryId, string typeId, System.Nullable<bool> includePropertyDefinitions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.typeId = typeId;
+            this.includePropertyDefinitions = includePropertyDefinitions;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeChildrenResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getTypeChildrenResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType types;
+        
+        public getTypeChildrenResponse() {
+        }
+        
+        public getTypeChildrenResponse(DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType types) {
+            this.types = types;
+        }
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisTypeContainer : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisTypeDefinitionType typeField;
+        
+        private cmisTypeContainer[] childrenField;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisTypeDefinitionType type {
+            get {
+                return this.typeField;
+            }
+            set {
+                this.typeField = value;
+                this.RaisePropertyChanged("type");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute("children", Order=1)]
+        public cmisTypeContainer[] children {
+            get {
+                return this.childrenField;
+            }
+            set {
+                this.childrenField = value;
+                this.RaisePropertyChanged("children");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDescendants", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getTypeDescendantsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string typeId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", IsNullable=true)]
+        public string depth;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePropertyDefinitions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getTypeDescendantsRequest() {
+        }
+        
+        public getTypeDescendantsRequest(string repositoryId, string typeId, string depth, System.Nullable<bool> includePropertyDefinitions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.typeId = typeId;
+            this.depth = depth;
+            this.includePropertyDefinitions = includePropertyDefinitions;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDescendantsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getTypeDescendantsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("types")]
+        public cmisTypeContainer[] types;
+        
+        public getTypeDescendantsResponse() {
+        }
+        
+        public getTypeDescendantsResponse(cmisTypeContainer[] types) {
+            this.types = types;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDefinition", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getTypeDefinitionRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string typeId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getTypeDefinitionRequest() {
+        }
+        
+        public getTypeDefinitionRequest(string repositoryId, string typeId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.typeId = typeId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getTypeDefinitionResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getTypeDefinitionResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType type;
+        
+        public getTypeDefinitionResponse() {
+        }
+        
+        public getTypeDefinitionResponse(DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType type) {
+            this.type = type;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface RepositoryServicePortChannel : DotCMIS.CMISWebServicesReference.RepositoryServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class RepositoryServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.RepositoryServicePort>, DotCMIS.CMISWebServicesReference.RepositoryServicePort {
+        
+        public RepositoryServicePortClient() {
+        }
+        
+        public RepositoryServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public RepositoryServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public RepositoryServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public RepositoryServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getRepositoriesResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getRepositories(DotCMIS.CMISWebServicesReference.getRepositoriesRequest request) {
+            return base.Channel.getRepositories(request);
+        }
+        
+        public cmisRepositoryEntryType[] getRepositories(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getRepositoriesRequest inValue = new DotCMIS.CMISWebServicesReference.getRepositoriesRequest();
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getRepositoriesResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getRepositories(inValue);
+            return retVal.repositories;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getRepositoryInfoResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getRepositoryInfo(DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest request) {
+            return base.Channel.getRepositoryInfo(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisRepositoryInfoType getRepositoryInfo(string repositoryId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest inValue = new DotCMIS.CMISWebServicesReference.getRepositoryInfoRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getRepositoryInfoResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getRepositoryInfo(inValue);
+            return retVal.repositoryInfo;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getTypeChildrenResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getTypeChildren(DotCMIS.CMISWebServicesReference.getTypeChildrenRequest request) {
+            return base.Channel.getTypeChildren(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionListType getTypeChildren(string repositoryId, string typeId, System.Nullable<bool> includePropertyDefinitions, string maxItems, string skipCount, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getTypeChildrenRequest inValue = new DotCMIS.CMISWebServicesReference.getTypeChildrenRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.typeId = typeId;
+            inValue.includePropertyDefinitions = includePropertyDefinitions;
+            inValue.maxItems = maxItems;
+            inValue.skipCount = skipCount;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getTypeChildrenResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getTypeChildren(inValue);
+            return retVal.types;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getTypeDescendantsResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getTypeDescendants(DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest request) {
+            return base.Channel.getTypeDescendants(request);
+        }
+        
+        public cmisTypeContainer[] getTypeDescendants(string repositoryId, string typeId, string depth, System.Nullable<bool> includePropertyDefinitions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest inValue = new DotCMIS.CMISWebServicesReference.getTypeDescendantsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.typeId = typeId;
+            inValue.depth = depth;
+            inValue.includePropertyDefinitions = includePropertyDefinitions;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getTypeDescendantsResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getTypeDescendants(inValue);
+            return retVal.types;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getTypeDefinitionResponse DotCMIS.CMISWebServicesReference.RepositoryServicePort.getTypeDefinition(DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest request) {
+            return base.Channel.getTypeDefinition(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisTypeDefinitionType getTypeDefinition(string repositoryId, string typeId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest inValue = new DotCMIS.CMISWebServicesReference.getTypeDefinitionRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.typeId = typeId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getTypeDefinitionResponse retVal = ((DotCMIS.CMISWebServicesReference.RepositoryServicePort)(this)).getTypeDefinition(inValue);
+            return retVal.type;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.VersioningServicePort")]
+    internal interface VersioningServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message checkOutRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.checkOutResponse checkOut(DotCMIS.CMISWebServicesReference.checkOutRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message cancelCheckOutRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.cancelCheckOutResponse cancelCheckOut(DotCMIS.CMISWebServicesReference.cancelCheckOutRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message checkInRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.checkInResponse checkIn(DotCMIS.CMISWebServicesReference.checkInRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getObjectOfLatestVersionRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionResponse getObjectOfLatestVersion(DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getPropertiesOfLatestVersionRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionResponse getPropertiesOfLatestVersion(DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getAllVersionsRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getAllVersionsResponse getAllVersions(DotCMIS.CMISWebServicesReference.getAllVersionsRequest request);
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="checkOut", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class checkOutRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public checkOutRequest() {
+        }
+        
+        public checkOutRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="checkOutResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class checkOutResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public bool contentCopied;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public checkOutResponse() {
+        }
+        
+        public checkOutResponse(string objectId, bool contentCopied, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.contentCopied = contentCopied;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="cancelCheckOut", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class cancelCheckOutRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public cancelCheckOutRequest() {
+        }
+        
+        public cancelCheckOutRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="cancelCheckOutResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class cancelCheckOutResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public cancelCheckOutResponse() {
+        }
+        
+        public cancelCheckOutResponse(DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="checkIn", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class checkInRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> major;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string checkinComment;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute("policies", IsNullable=true)]
+        public string[] policies;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public checkInRequest() {
+        }
+        
+        public checkInRequest(string repositoryId, string objectId, System.Nullable<bool> major, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, string checkinComment, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.major = major;
+            this.properties = properties;
+            this.contentStream = contentStream;
+            this.checkinComment = checkinComment;
+            this.policies = policies;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="checkInResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class checkInResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public checkInResponse() {
+        }
+        
+        public checkInResponse(string objectId, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.objectId = objectId;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectOfLatestVersion", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectOfLatestVersionRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public bool major;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumIncludeRelationships> includeRelationships;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=6)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string renditionFilter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=7)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includePolicyIds;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=8)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeACL;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=9)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getObjectOfLatestVersionRequest() {
+        }
+        
+        public getObjectOfLatestVersionRequest(string repositoryId, string objectId, bool major, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.major = major;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.includePolicyIds = includePolicyIds;
+            this.includeACL = includeACL;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getObjectOfLatestVersionResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getObjectOfLatestVersionResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisObjectType @object;
+        
+        public getObjectOfLatestVersionResponse() {
+        }
+        
+        public getObjectOfLatestVersionResponse(DotCMIS.CMISWebServicesReference.cmisObjectType @object) {
+            this.@object = @object;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getPropertiesOfLatestVersion", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getPropertiesOfLatestVersionRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public bool major;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getPropertiesOfLatestVersionRequest() {
+        }
+        
+        public getPropertiesOfLatestVersionRequest(string repositoryId, string objectId, bool major, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.major = major;
+            this.filter = filter;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getPropertiesOfLatestVersionResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getPropertiesOfLatestVersionResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType properties;
+        
+        public getPropertiesOfLatestVersionResponse() {
+        }
+        
+        public getPropertiesOfLatestVersionResponse(DotCMIS.CMISWebServicesReference.cmisPropertiesType properties) {
+            this.properties = properties;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllVersions", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getAllVersionsRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public string filter;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> includeAllowableActions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getAllVersionsRequest() {
+        }
+        
+        public getAllVersionsRequest(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.filter = filter;
+            this.includeAllowableActions = includeAllowableActions;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getAllVersionsResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getAllVersionsResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        [System.Xml.Serialization.XmlElementAttribute("objects")]
+        public cmisObjectType[] objects;
+        
+        public getAllVersionsResponse() {
+        }
+        
+        public getAllVersionsResponse(cmisObjectType[] objects) {
+            this.objects = objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface VersioningServicePortChannel : DotCMIS.CMISWebServicesReference.VersioningServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class VersioningServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.VersioningServicePort>, DotCMIS.CMISWebServicesReference.VersioningServicePort {
+        
+        public VersioningServicePortClient() {
+        }
+        
+        public VersioningServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public VersioningServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public VersioningServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public VersioningServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.checkOutResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.checkOut(DotCMIS.CMISWebServicesReference.checkOutRequest request) {
+            return base.Channel.checkOut(request);
+        }
+        
+        public bool checkOut(string repositoryId, ref string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.checkOutRequest inValue = new DotCMIS.CMISWebServicesReference.checkOutRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.checkOutResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).checkOut(inValue);
+            objectId = retVal.objectId;
+            extension = retVal.extension;
+            return retVal.contentCopied;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.cancelCheckOutResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.cancelCheckOut(DotCMIS.CMISWebServicesReference.cancelCheckOutRequest request) {
+            return base.Channel.cancelCheckOut(request);
+        }
+        
+        public void cancelCheckOut(string repositoryId, string objectId, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.cancelCheckOutRequest inValue = new DotCMIS.CMISWebServicesReference.cancelCheckOutRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.cancelCheckOutResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).cancelCheckOut(inValue);
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.checkInResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.checkIn(DotCMIS.CMISWebServicesReference.checkInRequest request) {
+            return base.Channel.checkIn(request);
+        }
+        
+        public void checkIn(string repositoryId, ref string objectId, System.Nullable<bool> major, DotCMIS.CMISWebServicesReference.cmisPropertiesType properties, DotCMIS.CMISWebServicesReference.cmisContentStreamType contentStream, string checkinComment, string[] policies, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, ref DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.checkInRequest inValue = new DotCMIS.CMISWebServicesReference.checkInRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.major = major;
+            inValue.properties = properties;
+            inValue.contentStream = contentStream;
+            inValue.checkinComment = checkinComment;
+            inValue.policies = policies;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.checkInResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).checkIn(inValue);
+            objectId = retVal.objectId;
+            extension = retVal.extension;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.getObjectOfLatestVersion(DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest request) {
+            return base.Channel.getObjectOfLatestVersion(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisObjectType getObjectOfLatestVersion(string repositoryId, string objectId, bool major, string filter, System.Nullable<bool> includeAllowableActions, System.Nullable<enumIncludeRelationships> includeRelationships, string renditionFilter, System.Nullable<bool> includePolicyIds, System.Nullable<bool> includeACL, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest inValue = new DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.major = major;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.includeRelationships = includeRelationships;
+            inValue.renditionFilter = renditionFilter;
+            inValue.includePolicyIds = includePolicyIds;
+            inValue.includeACL = includeACL;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getObjectOfLatestVersionResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).getObjectOfLatestVersion(inValue);
+            return retVal.@object;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.getPropertiesOfLatestVersion(DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest request) {
+            return base.Channel.getPropertiesOfLatestVersion(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisPropertiesType getPropertiesOfLatestVersion(string repositoryId, string objectId, bool major, string filter, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest inValue = new DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.major = major;
+            inValue.filter = filter;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getPropertiesOfLatestVersionResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).getPropertiesOfLatestVersion(inValue);
+            return retVal.properties;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getAllVersionsResponse DotCMIS.CMISWebServicesReference.VersioningServicePort.getAllVersions(DotCMIS.CMISWebServicesReference.getAllVersionsRequest request) {
+            return base.Channel.getAllVersions(request);
+        }
+        
+        public cmisObjectType[] getAllVersions(string repositoryId, string objectId, string filter, System.Nullable<bool> includeAllowableActions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getAllVersionsRequest inValue = new DotCMIS.CMISWebServicesReference.getAllVersionsRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.filter = filter;
+            inValue.includeAllowableActions = includeAllowableActions;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getAllVersionsResponse retVal = ((DotCMIS.CMISWebServicesReference.VersioningServicePort)(this)).getAllVersions(inValue);
+            return retVal.objects;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/ws/200908/", ConfigurationName="CMISWebServicesReference.ACLServicePort")]
+    internal interface ACLServicePort {
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message getACLRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.getACLResponse getACL(DotCMIS.CMISWebServicesReference.getACLRequest request);
+        
+        // CODEGEN: Generating message contract since the wrapper namespace (http://docs.oasis-open.org/ns/cmis/messaging/200908/) of message applyACLRequest does not match the default value (http://docs.oasis-open.org/ns/cmis/ws/200908/)
+        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
+        [System.ServiceModel.FaultContractAttribute(typeof(DotCMIS.CMISWebServicesReference.cmisFaultType), Action="", Name="cmisFault", Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+        [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(cmisProperty))]
+        DotCMIS.CMISWebServicesReference.applyACLResponse applyACL(DotCMIS.CMISWebServicesReference.applyACLRequest request);
+    }
+    
+    /// <remarks/>
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
+    [System.SerializableAttribute()]
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.ComponentModel.DesignerCategoryAttribute("code")]
+    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/")]
+    public partial class cmisACLType : object, System.ComponentModel.INotifyPropertyChanged {
+        
+        private cmisAccessControlListType aCLField;
+        
+        private bool exactField;
+        
+        private bool exactFieldSpecified;
+        
+        private System.Xml.XmlElement[] anyField;
+        
+        private System.Xml.XmlAttribute[] anyAttrField;
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=0)]
+        public cmisAccessControlListType ACL {
+            get {
+                return this.aCLField;
+            }
+            set {
+                this.aCLField = value;
+                this.RaisePropertyChanged("ACL");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlElementAttribute(Order=1)]
+        public bool exact {
+            get {
+                return this.exactField;
+            }
+            set {
+                this.exactField = value;
+                this.RaisePropertyChanged("exact");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlIgnoreAttribute()]
+        public bool exactSpecified {
+            get {
+                return this.exactFieldSpecified;
+            }
+            set {
+                this.exactFieldSpecified = value;
+                this.RaisePropertyChanged("exactSpecified");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyElementAttribute(Order=2)]
+        public System.Xml.XmlElement[] Any {
+            get {
+                return this.anyField;
+            }
+            set {
+                this.anyField = value;
+                this.RaisePropertyChanged("Any");
+            }
+        }
+        
+        /// <remarks/>
+        [System.Xml.Serialization.XmlAnyAttributeAttribute()]
+        public System.Xml.XmlAttribute[] AnyAttr {
+            get {
+                return this.anyAttrField;
+            }
+            set {
+                this.anyAttrField = value;
+                this.RaisePropertyChanged("AnyAttr");
+            }
+        }
+        
+        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
+        
+        protected void RaisePropertyChanged(string propertyName) {
+            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
+            if ((propertyChanged != null)) {
+                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getACL", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getACLRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<bool> onlyBasicPermissions;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public getACLRequest() {
+        }
+        
+        public getACLRequest(string repositoryId, string objectId, System.Nullable<bool> onlyBasicPermissions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.onlyBasicPermissions = onlyBasicPermissions;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="getACLResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class getACLResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisACLType ACL;
+        
+        public getACLResponse() {
+        }
+        
+        public getACLResponse(DotCMIS.CMISWebServicesReference.cmisACLType ACL) {
+            this.ACL = ACL;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="applyACL", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class applyACLRequest {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public string repositoryId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=1)]
+        public string objectId;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=2)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=3)]
+        public DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=4)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public System.Nullable<enumACLPropagation> ACLPropagation;
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=5)]
+        [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
+        public DotCMIS.CMISWebServicesReference.cmisExtensionType extension;
+        
+        public applyACLRequest() {
+        }
+        
+        public applyACLRequest(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, System.Nullable<enumACLPropagation> ACLPropagation, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            this.repositoryId = repositoryId;
+            this.objectId = objectId;
+            this.addACEs = addACEs;
+            this.removeACEs = removeACEs;
+            this.ACLPropagation = ACLPropagation;
+            this.extension = extension;
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+    [System.ServiceModel.MessageContractAttribute(WrapperName="applyACLResponse", WrapperNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", IsWrapped=true)]
+    internal partial class applyACLResponse {
+        
+        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/", Order=0)]
+        public DotCMIS.CMISWebServicesReference.cmisACLType ACL;
+        
+        public applyACLResponse() {
+        }
+        
+        public applyACLResponse(DotCMIS.CMISWebServicesReference.cmisACLType ACL) {
+            this.ACL = ACL;
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal interface ACLServicePortChannel : DotCMIS.CMISWebServicesReference.ACLServicePort, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    internal partial class ACLServicePortClient : System.ServiceModel.ClientBase<DotCMIS.CMISWebServicesReference.ACLServicePort>, DotCMIS.CMISWebServicesReference.ACLServicePort {
+        
+        public ACLServicePortClient() {
+        }
+        
+        public ACLServicePortClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public ACLServicePortClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public ACLServicePortClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public ACLServicePortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.getACLResponse DotCMIS.CMISWebServicesReference.ACLServicePort.getACL(DotCMIS.CMISWebServicesReference.getACLRequest request) {
+            return base.Channel.getACL(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisACLType getACL(string repositoryId, string objectId, System.Nullable<bool> onlyBasicPermissions, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.getACLRequest inValue = new DotCMIS.CMISWebServicesReference.getACLRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.onlyBasicPermissions = onlyBasicPermissions;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.getACLResponse retVal = ((DotCMIS.CMISWebServicesReference.ACLServicePort)(this)).getACL(inValue);
+            return retVal.ACL;
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        DotCMIS.CMISWebServicesReference.applyACLResponse DotCMIS.CMISWebServicesReference.ACLServicePort.applyACL(DotCMIS.CMISWebServicesReference.applyACLRequest request) {
+            return base.Channel.applyACL(request);
+        }
+        
+        public DotCMIS.CMISWebServicesReference.cmisACLType applyACL(string repositoryId, string objectId, DotCMIS.CMISWebServicesReference.cmisAccessControlListType addACEs, DotCMIS.CMISWebServicesReference.cmisAccessControlListType removeACEs, System.Nullable<enumACLPropagation> ACLPropagation, DotCMIS.CMISWebServicesReference.cmisExtensionType extension) {
+            DotCMIS.CMISWebServicesReference.applyACLRequest inValue = new DotCMIS.CMISWebServicesReference.applyACLRequest();
+            inValue.repositoryId = repositoryId;
+            inValue.objectId = objectId;
+            inValue.addACEs = addACEs;
+            inValue.removeACEs = removeACEs;
+            inValue.ACLPropagation = ACLPropagation;
+            inValue.extension = extension;
+            DotCMIS.CMISWebServicesReference.applyACLResponse retVal = ((DotCMIS.CMISWebServicesReference.ACLServicePort)(this)).applyACL(inValue);
+            return retVal.ACL;
+        }
+    }
+}
diff --git a/DotCMIS/Service References/CMISWebServicesReference/Reference.svcmap b/DotCMIS/Service References/CMISWebServicesReference/Reference.svcmap
new file mode 100644
index 0000000..48d6a68
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/Reference.svcmap
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ReferenceGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="3d5abe42-7fbf-4694-8527-bfbf3463347e" xmlns="urn:schemas-microsoft-com:xml-wcfservicemap">
+  <ClientOptions>
+    <GenerateAsynchronousMethods>false</GenerateAsynchronousMethods>
+    <EnableDataBinding>true</EnableDataBinding>
+    <ExcludedTypes />
+    <ImportXmlTypes>false</ImportXmlTypes>
+    <GenerateInternalTypes>true</GenerateInternalTypes>
+    <GenerateMessageContracts>false</GenerateMessageContracts>
+    <NamespaceMappings />
+    <CollectionMappings />
+    <GenerateSerializableTypes>true</GenerateSerializableTypes>
+    <Serializer>Auto</Serializer>
+    <UseSerializerForFaults>true</UseSerializerForFaults>
+    <ReferenceAllAssemblies>true</ReferenceAllAssemblies>
+    <ReferencedAssemblies />
+    <ReferencedDataContractTypes />
+    <ServiceContractMappings />
+  </ClientOptions>
+  <MetadataSources>
+    <MetadataSource Address="C:\projects\opencmis\DotCMIS\DotCMIS\wsdl\CMISWS-Service.wsdl" Protocol="file" SourceId="1" />
+  </MetadataSources>
+  <Metadata>
+    <MetadataFile FileName="CMIS-Messaging.xsd" MetadataType="Schema" ID="a67cdce6-4ed5-4a16-9a77-3681a58e7436" SourceId="1" SourceUrl="file:///C:/projects/opencmis/DotCMIS/DotCMIS/wsdl/CMIS-Messaging.xsd" />
+    <MetadataFile FileName="CMIS-Core.xsd" MetadataType="Schema" ID="308bb947-3023-485c-aa3d-1b44b4f62b3e" SourceId="1" SourceUrl="file:///C:/projects/opencmis/DotCMIS/DotCMIS/wsdl/CMIS-Core.xsd" />
+    <MetadataFile FileName="CMISWebServices.wsdl" MetadataType="Wsdl" ID="51836210-8920-4bad-af93-ce566d98ae3a" SourceId="1" SourceUrl="file:///C:/projects/opencmis/DotCMIS/DotCMIS/wsdl/CMISWS-Service.wsdl" />
+  </Metadata>
+  <Extensions>
+    <ExtensionFile FileName="configuration91.svcinfo" Name="configuration91.svcinfo" />
+    <ExtensionFile FileName="configuration.svcinfo" Name="configuration.svcinfo" />
+  </Extensions>
+</ReferenceGroup>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/configuration.svcinfo b/DotCMIS/Service References/CMISWebServicesReference/configuration.svcinfo
new file mode 100644
index 0000000..854a2e8
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/configuration.svcinfo
@@ -0,0 +1,26 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<configurationSnapshot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:xml-wcfconfigurationsnapshot">
+  <behaviors />
+  <bindings>
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;DiscoveryServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="DiscoveryServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;MultiFilingServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="MultiFilingServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;NavigationServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="NavigationServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;ObjectServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="ObjectServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;PolicyServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="PolicyServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;RelationshipServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="RelationshipServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;RepositoryServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="RepositoryServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;VersioningServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="VersioningServicePortBinding" />
+    <binding digest="System.ServiceModel.Configuration.BasicHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; maxBufferSize=&quot;65536&quot; messageEncoding=&quot;Text&quot; name=&quot;ACLServicePortBinding&quot; textEncoding=&quot;utf-8&quot; transferMode=&quot;Buffered&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;security mode=&quot;None&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;None&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="basicHttpBinding" name="ACLServicePortBinding" />
+  </bindings>
+  <endpoints>
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/DiscoveryService.DiscoveryServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;DiscoveryServicePortBinding&quot; contract=&quot;CMISWebServicesReference.DiscoveryServicePort&quot; name=&quot;DiscoveryServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/DiscoveryService.DiscoveryServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;DiscoveryServicePortBinding&quot; contract=&quot;CMISWebServicesReference.DiscoveryServicePort&quot; name=&quot;DiscoveryServicePort&quot; /&gt;" contractName="CMISWebServicesReference.DiscoveryServicePort" name="DiscoveryServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/MultiFilingService.MultiFilingServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;MultiFilingServicePortBinding&quot; contract=&quot;CMISWebServicesReference.MultiFilingServicePort&quot; name=&quot;MultiFilingServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/MultiFilingService.MultiFilingServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;MultiFilingServicePortBinding&quot; contract=&quot;CMISWebServicesReference.MultiFilingServicePort&quot; name=&quot;MultiFilingServicePort&quot; /&gt;" contractName="CMISWebServicesReference.MultiFilingServicePort" name="MultiFilingServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/NavigationService.NavigationServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;NavigationServicePortBinding&quot; contract=&quot;CMISWebServicesReference.NavigationServicePort&quot; name=&quot;NavigationServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/NavigationService.NavigationServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;NavigationServicePortBinding&quot; contract=&quot;CMISWebServicesReference.NavigationServicePort&quot; name=&quot;NavigationServicePort&quot; /&gt;" contractName="CMISWebServicesReference.NavigationServicePort" name="NavigationServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/ObjectService.ObjectServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;ObjectServicePortBinding&quot; contract=&quot;CMISWebServicesReference.ObjectServicePort&quot; name=&quot;ObjectServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/ObjectService.ObjectServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;ObjectServicePortBinding&quot; contract=&quot;CMISWebServicesReference.ObjectServicePort&quot; name=&quot;ObjectServicePort&quot; /&gt;" contractName="CMISWebServicesReference.ObjectServicePort" name="ObjectServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/PolicyService.PolicyServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;PolicyServicePortBinding&quot; contract=&quot;CMISWebServicesReference.PolicyServicePort&quot; name=&quot;PolicyServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/PolicyService.PolicyServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;PolicyServicePortBinding&quot; contract=&quot;CMISWebServicesReference.PolicyServicePort&quot; name=&quot;PolicyServicePort&quot; /&gt;" contractName="CMISWebServicesReference.PolicyServicePort" name="PolicyServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/RelationshipService.RelationshipServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;RelationshipServicePortBinding&quot; contract=&quot;CMISWebServicesReference.RelationshipServicePort&quot; name=&quot;RelationshipServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/RelationshipService.RelationshipServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;RelationshipServicePortBinding&quot; contract=&quot;CMISWebServicesReference.RelationshipServicePort&quot; name=&quot;RelationshipServicePort&quot; /&gt;" contractName="CMISWebServicesReference.RelationshipServicePort" name="RelationshipServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/RepositoryService.RepositoryServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;RepositoryServicePortBinding&quot; contract=&quot;CMISWebServicesReference.RepositoryServicePort&quot; name=&quot;RepositoryServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/RepositoryService.RepositoryServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;RepositoryServicePortBinding&quot; contract=&quot;CMISWebServicesReference.RepositoryServicePort&quot; name=&quot;RepositoryServicePort&quot; /&gt;" contractName="CMISWebServicesReference.RepositoryServicePort" name="RepositoryServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/VersioningService.VersioningServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;VersioningServicePortBinding&quot; contract=&quot;CMISWebServicesReference.VersioningServicePort&quot; name=&quot;VersioningServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/VersioningService.VersioningServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;VersioningServicePortBinding&quot; contract=&quot;CMISWebServicesReference.VersioningServicePort&quot; name=&quot;VersioningServicePort&quot; /&gt;" contractName="CMISWebServicesReference.VersioningServicePort" name="VersioningServicePort" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/ACLService.ACLServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;ACLServicePortBinding&quot; contract=&quot;CMISWebServicesReference.ACLServicePort&quot; name=&quot;ACLServicePort&quot; /&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://cmis/services/ACLService.ACLServicePort&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;ACLServicePortBinding&quot; contract=&quot;CMISWebServicesReference.ACLServicePort&quot; name=&quot;ACLServicePort&quot; /&gt;" contractName="CMISWebServicesReference.ACLServicePort" name="ACLServicePort" />
+  </endpoints>
+</configurationSnapshot>
\ No newline at end of file
diff --git a/DotCMIS/Service References/CMISWebServicesReference/configuration91.svcinfo b/DotCMIS/Service References/CMISWebServicesReference/configuration91.svcinfo
new file mode 100644
index 0000000..8f10281
--- /dev/null
+++ b/DotCMIS/Service References/CMISWebServicesReference/configuration91.svcinfo
@@ -0,0 +1,1753 @@
+<?xml version="1.0" encoding="utf-8"?>
+<SavedWcfConfigurationInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="9.1" CheckSum="wtnVK4WWzbkR4CP0ACq1tygHNKM=">
+  <bindingConfigurations>
+    <bindingConfiguration bindingType="basicHttpBinding" name="DiscoveryServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>DiscoveryServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="MultiFilingServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>MultiFilingServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="NavigationServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>NavigationServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="ObjectServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>ObjectServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="PolicyServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>PolicyServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="RelationshipServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>RelationshipServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="RepositoryServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>RepositoryServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="VersioningServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>VersioningServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="basicHttpBinding" name="ACLServicePortBinding">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>ACLServicePortBinding</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpSecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.HttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.HttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.BasicHttpMessageSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.BasicHttpMessageSecurityElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.BasicHttpMessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Buffered</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+  </bindingConfigurations>
+  <endpoints>
+    <endpoint name="DiscoveryServicePort" contract="CMISWebServicesReference.DiscoveryServicePort" bindingType="basicHttpBinding" address="http://cmis/services/DiscoveryService.DiscoveryServicePort" bindingConfiguration="DiscoveryServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/DiscoveryService.DiscoveryServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>DiscoveryServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.DiscoveryServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>DiscoveryServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="MultiFilingServicePort" contract="CMISWebServicesReference.MultiFilingServicePort" bindingType="basicHttpBinding" address="http://cmis/services/MultiFilingService.MultiFilingServicePort" bindingConfiguration="MultiFilingServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/MultiFilingService.MultiFilingServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>MultiFilingServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.MultiFilingServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>MultiFilingServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="NavigationServicePort" contract="CMISWebServicesReference.NavigationServicePort" bindingType="basicHttpBinding" address="http://cmis/services/NavigationService.NavigationServicePort" bindingConfiguration="NavigationServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/NavigationService.NavigationServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>NavigationServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.NavigationServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>NavigationServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="ObjectServicePort" contract="CMISWebServicesReference.ObjectServicePort" bindingType="basicHttpBinding" address="http://cmis/services/ObjectService.ObjectServicePort" bindingConfiguration="ObjectServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/ObjectService.ObjectServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>ObjectServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.ObjectServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>ObjectServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="PolicyServicePort" contract="CMISWebServicesReference.PolicyServicePort" bindingType="basicHttpBinding" address="http://cmis/services/PolicyService.PolicyServicePort" bindingConfiguration="PolicyServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/PolicyService.PolicyServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>PolicyServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.PolicyServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>PolicyServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="RelationshipServicePort" contract="CMISWebServicesReference.RelationshipServicePort" bindingType="basicHttpBinding" address="http://cmis/services/RelationshipService.RelationshipServicePort" bindingConfiguration="RelationshipServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/RelationshipService.RelationshipServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>RelationshipServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.RelationshipServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>RelationshipServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="RepositoryServicePort" contract="CMISWebServicesReference.RepositoryServicePort" bindingType="basicHttpBinding" address="http://cmis/services/RepositoryService.RepositoryServicePort" bindingConfiguration="RepositoryServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/RepositoryService.RepositoryServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>RepositoryServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.RepositoryServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>RepositoryServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="VersioningServicePort" contract="CMISWebServicesReference.VersioningServicePort" bindingType="basicHttpBinding" address="http://cmis/services/VersioningService.VersioningServicePort" bindingConfiguration="VersioningServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/VersioningService.VersioningServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>VersioningServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.VersioningServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>VersioningServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="ACLServicePort" contract="CMISWebServicesReference.ACLServicePort" bindingType="basicHttpBinding" address="http://cmis/services/ACLService.ACLServicePort" bindingConfiguration="ACLServicePortBinding">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://cmis/services/ACLService.ACLServicePort</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>basicHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>ACLServicePortBinding</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>CMISWebServicesReference.ACLServicePort</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>ACLServicePort</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+  </endpoints>
+</SavedWcfConfigurationInformation>
\ No newline at end of file
diff --git a/DotCMIS/app.config b/DotCMIS/app.config
new file mode 100644
index 0000000..92ec810
--- /dev/null
+++ b/DotCMIS/app.config
@@ -0,0 +1,169 @@
+﻿<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <system.serviceModel>
+        <bindings>
+            <basicHttpBinding>
+                <binding name="DiscoveryServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="MultiFilingServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="NavigationServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="ObjectServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="PolicyServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="RelationshipServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="RepositoryServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="VersioningServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+                <binding name="ACLServicePortBinding" closeTimeout="00:01:00"
+                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
+                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
+                    useDefaultWebProxy="true">
+                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+                    <security mode="None">
+                        <transport clientCredentialType="None" proxyCredentialType="None"
+                            realm="" />
+                        <message clientCredentialType="UserName" algorithmSuite="Default" />
+                    </security>
+                </binding>
+            </basicHttpBinding>
+        </bindings>
+        <client>
+            <endpoint address="http://cmis/services/DiscoveryService.DiscoveryServicePort"
+                binding="basicHttpBinding" bindingConfiguration="DiscoveryServicePortBinding"
+                contract="CMISWebServicesReference.DiscoveryServicePort" name="DiscoveryServicePort" />
+            <endpoint address="http://cmis/services/MultiFilingService.MultiFilingServicePort"
+                binding="basicHttpBinding" bindingConfiguration="MultiFilingServicePortBinding"
+                contract="CMISWebServicesReference.MultiFilingServicePort"
+                name="MultiFilingServicePort" />
+            <endpoint address="http://cmis/services/NavigationService.NavigationServicePort"
+                binding="basicHttpBinding" bindingConfiguration="NavigationServicePortBinding"
+                contract="CMISWebServicesReference.NavigationServicePort"
+                name="NavigationServicePort" />
+            <endpoint address="http://cmis/services/ObjectService.ObjectServicePort"
+                binding="basicHttpBinding" bindingConfiguration="ObjectServicePortBinding"
+                contract="CMISWebServicesReference.ObjectServicePort" name="ObjectServicePort" />
+            <endpoint address="http://cmis/services/PolicyService.PolicyServicePort"
+                binding="basicHttpBinding" bindingConfiguration="PolicyServicePortBinding"
+                contract="CMISWebServicesReference.PolicyServicePort" name="PolicyServicePort" />
+            <endpoint address="http://cmis/services/RelationshipService.RelationshipServicePort"
+                binding="basicHttpBinding" bindingConfiguration="RelationshipServicePortBinding"
+                contract="CMISWebServicesReference.RelationshipServicePort"
+                name="RelationshipServicePort" />
+            <endpoint address="http://cmis/services/RepositoryService.RepositoryServicePort"
+                binding="basicHttpBinding" bindingConfiguration="RepositoryServicePortBinding"
+                contract="CMISWebServicesReference.RepositoryServicePort"
+                name="RepositoryServicePort" />
+            <endpoint address="http://cmis/services/VersioningService.VersioningServicePort"
+                binding="basicHttpBinding" bindingConfiguration="VersioningServicePortBinding"
+                contract="CMISWebServicesReference.VersioningServicePort"
+                name="VersioningServicePort" />
+            <endpoint address="http://cmis/services/ACLService.ACLServicePort"
+                binding="basicHttpBinding" bindingConfiguration="ACLServicePortBinding"
+                contract="CMISWebServicesReference.ACLServicePort" name="ACLServicePort" />
+        </client>
+    </system.serviceModel>
+</configuration>
\ No newline at end of file
diff --git a/DotCMIS/binding/atompub/atompub-linkcache.cs b/DotCMIS/binding/atompub/atompub-linkcache.cs
new file mode 100644
index 0000000..4d8c718
--- /dev/null
+++ b/DotCMIS/binding/atompub/atompub-linkcache.cs
@@ -0,0 +1,377 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DotCMIS.Binding.Impl;
+using System.Web;
+
+namespace DotCMIS.Binding.AtomPub
+{
+    internal class LinkCache
+    {
+        private const int CacheSizeRepositories = 10;
+        private const int CacheSizeTypes = 100;
+        private const int CacheSizeLinks = 400;
+
+        private ICache linkCache;
+        private ICache typeLinkCache;
+        private ICache collectionLinkCache;
+        private ICache templateCache;
+        private ICache repositoryLinkCache;
+
+        public LinkCache(BindingSession session)
+        {
+            int repCount = session.GetValue(SessionParameter.CacheSizeRepositories, CacheSizeRepositories);
+            if (repCount < 1)
+            {
+                repCount = CacheSizeRepositories;
+            }
+
+            int typeCount = session.GetValue(SessionParameter.CacheSizeTypes, CacheSizeTypes);
+            if (typeCount < 1)
+            {
+                typeCount = CacheSizeTypes;
+            }
+
+            int objCount = session.GetValue(SessionParameter.CacheSizeLinks, CacheSizeLinks);
+            if (objCount < 1)
+            {
+                objCount = CacheSizeLinks;
+            }
+
+            linkCache = new Cache("Link Cache");
+            linkCache.Initialize(new string[] {
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount, // repository
+                typeof(LruCacheLevel).FullName + " " + LruCacheLevel.MaxEntries + "=" + objCount, // id
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=16", // rel
+                typeof(ContentTypeCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=3,"
+                        + DictionaryCacheLevel.SingleValue + "=true" // type
+        });
+
+            typeLinkCache = new Cache("Type Link Cache");
+            typeLinkCache.Initialize(new string[] {
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount, // repository
+                typeof(LruCacheLevel).FullName + " " + LruCacheLevel.MaxEntries + "=" + typeCount, // id
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=16", // rel
+                typeof(ContentTypeCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=3,"
+                        + DictionaryCacheLevel.SingleValue + "=true"// type
+        });
+
+            collectionLinkCache = new Cache("Collection Link Cache");
+            collectionLinkCache.Initialize(new string[] {
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount, // repository
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=8" // collection
+        });
+
+            templateCache = new Cache("URI Template Cache");
+            templateCache.Initialize(new string[] {
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount, // repository
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=6" // type
+        });
+
+            repositoryLinkCache = new Cache("Repository Link Cache");
+            repositoryLinkCache.Initialize(new string[] {
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount, // repository
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=6" // rel
+        });
+        }
+
+        // ---- links ---
+
+        public void AddLink(string repositoryId, string id, string rel, string type, string link)
+        {
+            linkCache.Put(new string[] { repositoryId, id, rel, type }, link);
+        }
+
+        public void RemoveLinks(string repositoryId, string id)
+        {
+            linkCache.Remove(new string[] { repositoryId, id });
+        }
+
+        public string GetLink(string repositoryId, string id, string rel, string type)
+        {
+            return (string)linkCache.Get(new string[] { repositoryId, id, rel, type });
+        }
+
+        public string GetLink(string repositoryId, string id, string rel)
+        {
+            return GetLink(repositoryId, id, rel, null);
+        }
+
+        public int CheckLink(string repositoryId, string id, string rel, string type)
+        {
+            return linkCache.Check(new string[] { repositoryId, id, rel, type });
+        }
+
+        public void LockLinks()
+        {
+            linkCache.Lock();
+        }
+
+        public void UnlockLinks()
+        {
+            linkCache.Unlock();
+        }
+
+        // ---- type links ---
+
+        public void AddTypeLink(string repositoryId, string id, string rel, string type, string link)
+        {
+            typeLinkCache.Put(new string[] { repositoryId, id, rel, type }, link);
+        }
+
+        public void RemoveTypeLinks(string repositoryId, string id)
+        {
+            typeLinkCache.Remove(new string[] { repositoryId, id });
+        }
+
+        public string GetTypeLink(string repositoryId, string id, string rel, string type)
+        {
+            return (string)typeLinkCache.Get(new string[] { repositoryId, id, rel, type });
+        }
+
+        public void LockTypeLinks()
+        {
+            typeLinkCache.Lock();
+        }
+
+        public void UnlockTypeLinks()
+        {
+            typeLinkCache.Unlock();
+        }
+
+        // ---- collections ----
+
+        public void AddCollection(string repositoryId, string collection, string link)
+        {
+            collectionLinkCache.Put(new string[] { repositoryId, collection }, link);
+        }
+
+        public string GetCollection(string repositoryId, string collection)
+        {
+            return (string)collectionLinkCache.Get(new string[] { repositoryId, collection });
+        }
+
+        // ---- templates ----
+
+        public void AddTemplate(string repositoryId, string type, string link)
+        {
+            templateCache.Put(new string[] { repositoryId, type }, link);
+        }
+
+        public string GetTemplateLink(string repositoryId, string type, IDictionary<string, object> parameters)
+        {
+            string template = (string)templateCache.Get(new string[] { repositoryId, type });
+            if (template == null)
+            {
+                return null;
+            }
+
+            StringBuilder result = new StringBuilder();
+            StringBuilder param = new StringBuilder();
+
+            bool paramMode = false;
+            for (int i = 0; i < template.Length; i++)
+            {
+                char c = template[i];
+
+                if (paramMode)
+                {
+                    if (c == '}')
+                    {
+                        paramMode = false;
+
+                        object paramValue;
+                        if (parameters.TryGetValue(param.ToString(), out paramValue))
+                        {
+                            result.Append(HttpUtility.UrlEncode(UrlBuilder.NormalizeParameter(paramValue)));
+                        }
+
+                        param = new StringBuilder();
+                    }
+                    else
+                    {
+                        param.Append(c);
+                    }
+                }
+                else
+                {
+                    if (c == '{')
+                    {
+                        paramMode = true;
+                    }
+                    else
+                    {
+                        result.Append(c);
+                    }
+                }
+            }
+
+            return result.ToString();
+        }
+
+        // ---- repository links ----
+
+        public void AddRepositoryLink(string repositoryId, string rel, string link)
+        {
+            repositoryLinkCache.Put(new string[] { repositoryId, rel }, link);
+        }
+
+        public string GetRepositoryLink(string repositoryId, string rel)
+        {
+            return (string)repositoryLinkCache.Get(new string[] { repositoryId, rel });
+        }
+
+        // ---- clear ----
+
+        public void ClearRepository(string repositoryId)
+        {
+            linkCache.Remove(new string[] { repositoryId });
+            typeLinkCache.Remove(new string[] { repositoryId });
+            collectionLinkCache.Remove(new string[] { repositoryId });
+            templateCache.Remove(new string[] { repositoryId });
+            repositoryLinkCache.Remove(new string[] { repositoryId });
+        }
+    }
+
+    internal class ContentTypeCacheLevel : DictionaryCacheLevel
+    {
+        public ContentTypeCacheLevel()
+        {
+            EnableKeyFallback(null);
+        }
+
+        public override object this[string key]
+        {
+            get
+            {
+                return base[Normalize(key)];
+            }
+            set
+            {
+                base[Normalize(key)] = value;
+            }
+        }
+
+        public override void Remove(string key)
+        {
+            base.Remove(Normalize(key));
+        }
+
+        private string Normalize(string key)
+        {
+            if (key == null)
+            {
+                return null;
+            }
+
+            StringBuilder sb = new StringBuilder();
+            int parameterStart = 0;
+
+            // first, get the MIME type
+            for (int i = 0; i < key.Length; i++)
+            {
+                char c = key[i];
+
+                if (Char.IsWhiteSpace(c))
+                {
+                    continue;
+                }
+                else if (c == ';')
+                {
+                    parameterStart = i;
+                    break;
+                }
+
+                sb.Append(Char.ToLower(c));
+            }
+
+            // if parameters have been found, gather them
+            if (parameterStart > 0)
+            {
+                SortedList<string, string> parameter = new SortedList<string, string>();
+                StringBuilder ksb = new StringBuilder();
+                StringBuilder vsb = new StringBuilder();
+                bool isKey = true;
+
+                for (int i = parameterStart + 1; i < key.Length; i++)
+                {
+                    char c = key[i];
+                    if (Char.IsWhiteSpace(c))
+                    {
+                        continue;
+                    }
+
+                    if (isKey)
+                    {
+                        if (c == '=')
+                        {
+                            // value start
+                            isKey = false;
+                            continue;
+                        }
+
+                        ksb.Append(Char.ToLower(c));
+                    }
+                    else
+                    {
+                        if (c == ';')
+                        {
+                            // next key
+                            isKey = true;
+
+                            parameter.Add(ksb.ToString(), vsb.ToString());
+
+                            ksb = new StringBuilder();
+                            vsb = new StringBuilder();
+
+                            continue;
+                        }
+                        else if (c == '"')
+                        {
+                            // filter quotes
+                            continue;
+                        }
+
+                        vsb.Append(Char.ToLower(c));
+                    }
+                }
+
+                // add last parameter
+                if (ksb.Length > 0)
+                {
+                    parameter.Add(ksb.ToString(), vsb.ToString());
+                }
+
+                // write parameters sorted by key
+                for (int i = 0; i < parameter.Count; i++)
+                {
+                    sb.Append(";");
+                    sb.Append(parameter.Keys[i]);
+                    sb.Append("=");
+                    sb.Append(parameter.Values[i]);
+                }
+            }
+
+            return sb.ToString();
+        }
+    }
+}
diff --git a/DotCMIS/binding/atompub/atompub-parser.cs b/DotCMIS/binding/atompub/atompub-parser.cs
new file mode 100644
index 0000000..060f464
--- /dev/null
+++ b/DotCMIS/binding/atompub/atompub-parser.cs
@@ -0,0 +1,808 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+using DotCMIS.CMISWebServicesReference;
+using DotCMIS.Exceptions;
+using System.Globalization;
+
+namespace DotCMIS.Binding.AtomPub
+{
+    internal class AtomPubParser
+    {
+        private static XmlSerializer RepositoryInfoSerializer;
+        private static XmlSerializer TypeDefintionSerializer;
+        private static XmlSerializer ObjectSerializer;
+        private static XmlSerializer AllowableActionsSerializer;
+        private static XmlSerializer AclSerializer;
+
+        static AtomPubParser()
+        {
+            XmlRootAttribute repositoryInfoXmlRoot = new XmlRootAttribute("repositoryInfo");
+            repositoryInfoXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            RepositoryInfoSerializer = new XmlSerializer(typeof(cmisRepositoryInfoType), repositoryInfoXmlRoot);
+
+            XmlRootAttribute typeDefinitionXmlRoot = new XmlRootAttribute("type");
+            typeDefinitionXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            TypeDefintionSerializer = new XmlSerializer(typeof(cmisTypeDefinitionType), typeDefinitionXmlRoot);
+
+            XmlRootAttribute objectXmlRoot = new XmlRootAttribute("object");
+            objectXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            ObjectSerializer = new XmlSerializer(typeof(cmisObjectType), objectXmlRoot);
+
+            XmlRootAttribute allowableActionsXmlRoot = new XmlRootAttribute("allowableActions");
+            allowableActionsXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            AllowableActionsSerializer = new XmlSerializer(typeof(cmisAllowableActionsType), objectXmlRoot);
+
+            XmlRootAttribute aclXmlRoot = new XmlRootAttribute("accessControlList");
+            aclXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            AclSerializer = new XmlSerializer(typeof(cmisAccessControlListType), objectXmlRoot);
+        }
+
+        private Stream stream;
+        private AtomBase parseResult;
+
+        public AtomPubParser(Stream stream)
+        {
+            if (stream == null)
+            {
+                throw new ArgumentNullException("stream");
+            }
+
+            this.stream = stream;
+        }
+
+        public AtomBase GetParseResults()
+        {
+            return parseResult;
+        }
+
+        public void Parse()
+        {
+            XmlReaderSettings settings = new XmlReaderSettings();
+            settings.IgnoreWhitespace = true;
+            settings.IgnoreComments = true;
+
+            XmlReader reader = XmlReader.Create(stream, settings);
+            try
+            {
+                while (true)
+                {
+                    if (reader.IsStartElement())
+                    {
+                        if (AtomPubConstants.NamespaceAtom == reader.NamespaceURI)
+                        {
+                            if (AtomPubConstants.TagFeed == reader.LocalName)
+                            {
+                                parseResult = ParseFeed(reader);
+                                break;
+                            }
+                            else if (AtomPubConstants.TagEntry == reader.LocalName)
+                            {
+                                parseResult = ParseEntry(reader);
+                                break;
+                            }
+                        }
+                        else if (AtomPubConstants.NamespaceCMIS == reader.NamespaceURI)
+                        {
+                            if (AtomPubConstants.TagAllowableActions == reader.LocalName)
+                            {
+                                parseResult = ParseAllowableActions(reader);
+                                break;
+                            }
+                            else if (AtomPubConstants.TagACL == reader.LocalName)
+                            {
+                                parseResult = ParseACL(reader);
+                                break;
+                            }
+                        }
+                        else if (AtomPubConstants.NamespaceAPP == reader.NamespaceURI)
+                        {
+                            if (AtomPubConstants.TagService == reader.LocalName)
+                            {
+                                parseResult = ParseServiceDoc(reader);
+                                break;
+                            }
+                        }
+                    }
+
+                    if (!reader.Read()) { break; }
+                }
+            }
+            finally
+            {
+                try { reader.Close(); }
+                catch (Exception) { }
+                try { stream.Close(); }
+                catch (Exception) { }
+            }
+        }
+
+        private ServiceDoc ParseServiceDoc(XmlReader reader)
+        {
+            ServiceDoc result = new ServiceDoc();
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    if (AtomPubConstants.NamespaceAPP == reader.NamespaceURI)
+                    {
+                        if (AtomPubConstants.TagWorkspace == reader.LocalName)
+                        {
+                            result.AddWorkspace(ParseWorkspace(reader));
+                        }
+                        else
+                        {
+                            skip(reader);
+                        }
+                    }
+                    else
+                    {
+                        skip(reader);
+                    }
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            return result;
+        }
+
+        private RepositoryWorkspace ParseWorkspace(XmlReader reader)
+        {
+            RepositoryWorkspace workspace = new RepositoryWorkspace();
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    AtomElement element = ParseWorkspaceElement(reader);
+
+                    if (element != null && element.Object is cmisRepositoryInfoType)
+                    {
+                        workspace.Id = ((cmisRepositoryInfoType)element.Object).repositoryId;
+                    }
+
+                    workspace.AddElement(element);
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            reader.Read();
+
+            return workspace;
+        }
+
+        private AtomElement ParseWorkspaceElement(XmlReader reader)
+        {
+            if (AtomPubConstants.NamespaceRestAtom == reader.NamespaceURI)
+            {
+                if (AtomPubConstants.TagRepositoryInfo == reader.LocalName)
+                {
+                    return DeserializeRepositoryInfo(reader);
+                }
+                else if (AtomPubConstants.TagUriTemplate == reader.LocalName)
+                {
+                    return ParseTemplate(reader);
+                }
+            }
+            else if (AtomPubConstants.NamespaceAtom == reader.NamespaceURI)
+            {
+                if (AtomPubConstants.TagLink == reader.LocalName)
+                {
+                    return ParseLink(reader);
+                }
+            }
+            else if (AtomPubConstants.NamespaceAPP == reader.NamespaceURI)
+            {
+                if (AtomPubConstants.TagCollection == reader.LocalName)
+                {
+                    return ParseCollection(reader);
+                }
+            }
+
+            skip(reader);
+
+            return null;
+        }
+
+        private AtomElement ParseTemplate(XmlReader reader)
+        {
+            Dictionary<string, string> result = new Dictionary<string, string>();
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    if (AtomPubConstants.NamespaceRestAtom == reader.NamespaceURI)
+                    {
+                        if (AtomPubConstants.TagTemplateTemplate == reader.LocalName)
+                        {
+                            result["template"] = ReadText(reader);
+                        }
+                        else if (AtomPubConstants.TagTemplateType == reader.LocalName)
+                        {
+                            result["type"] = ReadText(reader);
+                        }
+                        else
+                        {
+                            skip(reader);
+                        }
+                    }
+                    else
+                    {
+                        skip(reader);
+                    }
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            reader.Read();
+
+            return new AtomElement(ns, ln, result);
+        }
+
+        private AtomElement ParseCollection(XmlReader reader)
+        {
+            Dictionary<string, string> result = new Dictionary<string, string>();
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+
+            if (reader.MoveToAttribute("href"))
+            {
+                result["href"] = reader.Value;
+                reader.MoveToElement();
+            }
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    if (AtomPubConstants.NamespaceRestAtom == reader.NamespaceURI && AtomPubConstants.TagCollectionType == reader.LocalName)
+                    {
+                        result["collectionType"] = ReadText(reader);
+                    }
+                    else
+                    {
+                        skip(reader);
+                    }
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            reader.Read();
+
+            return new AtomElement(ns, ln, result);
+        }
+
+        private AtomElement ParseLink(XmlReader reader)
+        {
+            AtomLink result = new AtomLink();
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+
+            if (reader.HasAttributes)
+            {
+                while (reader.MoveToNextAttribute())
+                {
+                    if (AtomPubConstants.LinkRel == reader.Name)
+                    {
+                        result.Rel = reader.Value;
+                    }
+                    else if (AtomPubConstants.LinkHref == reader.Name)
+                    {
+                        result.Href = reader.Value;
+                    }
+                    else if (AtomPubConstants.LinkType == reader.Name)
+                    {
+                        result.Type = reader.Value;
+                    }
+                }
+                reader.MoveToElement();
+            }
+
+            skip(reader);
+
+            return new AtomElement(ns, ln, result);
+        }
+
+        private AtomFeed ParseFeed(XmlReader reader)
+        {
+            AtomFeed feed = new AtomFeed();
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    if (AtomPubConstants.NamespaceAtom == reader.NamespaceURI)
+                    {
+                        if (AtomPubConstants.TagLink == reader.LocalName)
+                        {
+                            feed.AddElement(ParseLink(reader));
+                        }
+                        else if (AtomPubConstants.TagEntry == reader.LocalName)
+                        {
+                            feed.AddEntry(ParseEntry(reader));
+                        }
+                        else
+                        {
+                            skip(reader);
+                        }
+                    }
+                    else if (AtomPubConstants.NamespaceRestAtom == reader.NamespaceURI)
+                    {
+                        if (AtomPubConstants.TagNumItems == reader.LocalName)
+                        {
+                            feed.AddElement(ParseLong(reader));
+                        }
+                        else
+                        {
+                            skip(reader);
+                        }
+                    }
+                    else
+                    {
+                        skip(reader);
+                    }
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            reader.Read();
+
+            return feed;
+        }
+
+        private AtomEntry ParseEntry(XmlReader reader)
+        {
+            AtomEntry entry = new AtomEntry();
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    AtomElement element = ParseElement(reader);
+
+                    if (element != null)
+                    {
+                        entry.AddElement(element);
+
+                        if (element.Object is cmisObjectType && ((cmisObjectType)element.Object).properties != null)
+                        {
+                            foreach (cmisProperty prop in ((cmisObjectType)element.Object).properties.Items)
+                            {
+                                if (PropertyIds.ObjectId == prop.propertyDefinitionId)
+                                {
+                                    entry.Id = ((cmisPropertyId)prop).value[0];
+                                }
+                            }
+                        }
+                        else if (element.Object is cmisTypeDefinitionType)
+                        {
+                            entry.Id = ((cmisTypeDefinitionType)element.Object).id;
+                        }
+                    }
+
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            reader.Read();
+
+            return entry;
+        }
+
+        private AtomAcl ParseACL(XmlReader reader)
+        {
+            AtomAcl result = new AtomAcl();
+            result.ACL = DeserializeACL(reader);
+            return result;
+        }
+
+        private AtomAllowableActions ParseAllowableActions(XmlReader reader)
+        {
+            AtomAllowableActions result = new AtomAllowableActions();
+            result.AllowableActions = DeserializeAllowableActions(reader);
+            return result;
+        }
+
+        private AtomElement ParseElement(XmlReader reader)
+        {
+            if (AtomPubConstants.NamespaceRestAtom == reader.NamespaceURI)
+            {
+                if (AtomPubConstants.TagObject == reader.LocalName)
+                {
+                    return DeserializeObject(reader);
+                }
+                else if (AtomPubConstants.TagPathSegment == reader.LocalName
+                      || AtomPubConstants.TagRelativePathSegment == reader.LocalName)
+                {
+                    return ParseText(reader);
+                }
+                else if (AtomPubConstants.TagType == reader.LocalName)
+                {
+                    return DeserializeTypeDefinition(reader);
+                }
+                else if (AtomPubConstants.TagChildren == reader.LocalName)
+                {
+                    return ParseChildren(reader);
+                }
+            }
+            else if (AtomPubConstants.NamespaceAtom == reader.NamespaceURI)
+            {
+                if (AtomPubConstants.TagLink == reader.LocalName)
+                {
+                    return ParseLink(reader);
+                }
+                else if (AtomPubConstants.TagContent == reader.LocalName)
+                {
+                    return ParseAtomContentSrc(reader);
+                }
+            }
+
+            skip(reader);
+
+            return null;
+        }
+
+        private AtomElement ParseChildren(XmlReader reader)
+        {
+            AtomElement result = null;
+            string childName = reader.LocalName;
+            string childNamespace = reader.NamespaceURI;
+
+            reader.Read();
+            while (true)
+            {
+                if (reader.NodeType == XmlNodeType.Element)
+                {
+                    if (AtomPubConstants.NamespaceAtom == reader.NamespaceURI && AtomPubConstants.TagFeed == reader.LocalName)
+                    {
+                        result = new AtomElement(childNamespace, childName, ParseFeed(reader));
+                    }
+                    else
+                    {
+                        skip(reader);
+                    }
+                }
+                else if (reader.NodeType == XmlNodeType.EndElement)
+                {
+                    break;
+                }
+                else
+                {
+                    if (!reader.Read()) { break; }
+                }
+            }
+
+            reader.Read();
+
+            return result;
+        }
+
+        private AtomElement ParseAtomContentSrc(XmlReader reader)
+        {
+            AtomLink result = new AtomLink();
+            result.Rel = AtomPubConstants.LinkRelContent;
+
+            if (reader.MoveToAttribute(AtomPubConstants.ContentSrc))
+            {
+                result.Href = reader.Value;
+                reader.MoveToElement();
+            }
+
+            skip(reader);
+
+            return new AtomElement(reader.NamespaceURI, reader.LocalName, result);
+        }
+
+        private AtomElement ParseText(XmlReader reader)
+        {
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+            return new AtomElement(ns, ln, ReadText(reader));
+        }
+
+        private AtomElement ParseLong(XmlReader reader)
+        {
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+            return new AtomElement(ns, ln, Int64.Parse(ReadText(reader)));
+        }
+
+        private AtomElement DeserializeRepositoryInfo(XmlReader reader)
+        {
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+            return new AtomElement(ns, ln, RepositoryInfoSerializer.Deserialize(reader));
+        }
+
+        private AtomElement DeserializeTypeDefinition(XmlReader reader)
+        {
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+            return new AtomElement(ns, ln, TypeDefintionSerializer.Deserialize(reader));
+        }
+
+        private AtomElement DeserializeObject(XmlReader reader)
+        {
+            string ns = reader.NamespaceURI;
+            string ln = reader.LocalName;
+            return new AtomElement(ns, ln, ObjectSerializer.Deserialize(reader));
+        }
+
+        private cmisAccessControlListType DeserializeACL(XmlReader reader)
+        {
+            return (cmisAccessControlListType)AclSerializer.Deserialize(reader);
+        }
+
+
+        private cmisAllowableActionsType DeserializeAllowableActions(XmlReader reader)
+        {
+            return (cmisAllowableActionsType)AllowableActionsSerializer.Deserialize(reader);
+        }
+
+        private string ReadText(XmlReader reader)
+        {
+            string text = null;
+            if (reader.Read())
+            {
+                text = reader.ReadContentAsString();
+                reader.Read();
+            }
+
+            return text;
+        }
+
+        private void skip(XmlReader reader)
+        {
+            if (!reader.IsEmptyElement)
+            {
+                int level = 1;
+                while (reader.Read())
+                {
+                    if (reader.NodeType == XmlNodeType.Element)
+                    {
+                        level++;
+                    }
+                    else if (reader.NodeType == XmlNodeType.EndElement)
+                    {
+                        level--;
+                        if (level == 0)
+                        {
+                            break;
+                        }
+                    }
+                }
+            }
+
+            reader.Read();
+        }
+    }
+
+    internal class AtomElement
+    {
+        public string Namespace { get; private set; }
+        public string LocalName { get; private set; }
+        public object Object { get; private set; }
+
+        public AtomElement(string elementNamespace, string elementLocalName, object elementObject)
+        {
+            Namespace = elementNamespace;
+            LocalName = elementLocalName;
+            Object = elementObject;
+        }
+
+        public override string ToString()
+        {
+            return "{" + Namespace + "}" + LocalName + ": " + Object;
+        }
+    }
+
+    internal abstract class AtomBase
+    {
+        public IList<AtomElement> elements = new List<AtomElement>();
+
+        public abstract string GetAtomType();
+
+        public IList<AtomElement> GetElements()
+        {
+            return elements;
+        }
+
+        public void AddElement(AtomElement element)
+        {
+            if (element != null)
+            {
+                elements.Add(element);
+            }
+        }
+    }
+
+    internal class ServiceDoc : AtomBase
+    {
+        private IList<RepositoryWorkspace> workspaces = new List<RepositoryWorkspace>();
+
+        public override string GetAtomType()
+        {
+            return "Service Document";
+        }
+
+        public IList<RepositoryWorkspace> GetWorkspaces()
+        {
+            return workspaces;
+        }
+
+        public void AddWorkspace(RepositoryWorkspace ws)
+        {
+            if (ws != null)
+            {
+                workspaces.Add(ws);
+            }
+        }
+
+        public override string ToString()
+        {
+            return "Service Doc: " + workspaces;
+        }
+    }
+
+    internal class RepositoryWorkspace : AtomBase
+    {
+        public string Id { get; set; }
+
+        public override string GetAtomType()
+        {
+            return "Repository Workspace";
+        }
+
+        public override string ToString()
+        {
+            return "Workspace \"" + Id + "\": " + GetElements();
+        }
+    }
+
+    internal class AtomEntry : AtomBase
+    {
+        public string Id { get; set; }
+
+        public override string GetAtomType()
+        {
+            return "Atom Entry";
+        }
+
+        public override string ToString()
+        {
+            return "Entry \"" + Id + "\": " + GetElements();
+        }
+    }
+
+    internal class AtomFeed : AtomBase
+    {
+        private IList<AtomEntry> entries = new List<AtomEntry>();
+
+        public override string GetAtomType()
+        {
+            return "Atom Feed";
+        }
+
+        public IList<AtomEntry> GetEntries()
+        {
+            return entries;
+        }
+
+        public void AddEntry(AtomEntry entry)
+        {
+            if (entry != null)
+            {
+                entries.Add(entry);
+            }
+        }
+
+        public override string ToString()
+        {
+            return "Feed : " + GetElements() + " " + entries;
+        }
+    }
+
+    internal class AtomAcl : AtomBase
+    {
+        public cmisAccessControlListType ACL { get; set; }
+
+        public override string GetAtomType()
+        {
+            return "ACL";
+        }
+    }
+
+    internal class AtomAllowableActions : AtomBase
+    {
+        public cmisAllowableActionsType AllowableActions { get; set; }
+
+        public override string GetAtomType()
+        {
+            return "Allowable Actions";
+        }
+    }
+
+    internal class AtomLink
+    {
+        public string Rel { get; set; }
+        public string Type { get; set; }
+        public string Href { get; set; }
+
+        public override string ToString()
+        {
+            return "Link: rel=\"" + Rel + "\" type=\"" + Type + "\" href=\"" + Href + "\"";
+        }
+    }
+}
diff --git a/DotCMIS/binding/atompub/atompub-writer.cs b/DotCMIS/binding/atompub/atompub-writer.cs
new file mode 100644
index 0000000..ff38fdf
--- /dev/null
+++ b/DotCMIS/binding/atompub/atompub-writer.cs
@@ -0,0 +1,290 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DotCMIS.CMISWebServicesReference;
+using System.IO;
+using DotCMIS.Exceptions;
+using System.Xml;
+using System.Globalization;
+using System.Xml.Serialization;
+using DotCMIS.Enums;
+
+namespace DotCMIS.Binding.AtomPub
+{
+    internal class AtomWriter
+    {
+        public static XmlSerializer ObjectSerializer;
+        public static XmlSerializer AclSerializer;
+
+        static AtomWriter()
+        {
+            XmlRootAttribute objectXmlRoot = new XmlRootAttribute("object");
+            objectXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            ObjectSerializer = new XmlSerializer(typeof(cmisObjectType), objectXmlRoot);
+
+            XmlRootAttribute aclXmlRoot = new XmlRootAttribute("acl");
+            aclXmlRoot.Namespace = AtomPubConstants.NamespaceRestAtom;
+            AclSerializer = new XmlSerializer(typeof(cmisAccessControlListType), objectXmlRoot);
+        }
+
+        public const string PrefixAtom = "atom";
+        public const string PrefixCMIS = "cmis";
+        public const string PrefixRestAtom = "cmisra";
+    }
+
+    internal class AtomEntryWriter
+    {
+        private const int BufferSize = 64 * 1024;
+
+        private cmisObjectType cmisObject;
+        private Stream stream;
+        private string mediaType;
+
+        public AtomEntryWriter(cmisObjectType cmisObject)
+            : this(cmisObject, null, null)
+        {
+        }
+
+        public AtomEntryWriter(cmisObjectType cmisObject, string mediaType, Stream stream)
+        {
+            if (cmisObject == null || cmisObject.properties == null)
+            {
+                throw new CmisInvalidArgumentException("Object and properties must not be null!");
+            }
+
+            if (stream != null && mediaType == null)
+            {
+                throw new CmisInvalidArgumentException("Media type must be set if a stream is present!");
+            }
+
+            this.cmisObject = cmisObject;
+            this.mediaType = mediaType;
+            this.stream = stream;
+        }
+
+        public void Write(Stream outStream)
+        {
+            using (XmlWriter writer = XmlWriter.Create(outStream))
+            {
+                // start doc
+                writer.WriteStartDocument();
+
+                // start entry
+                writer.WriteStartElement(AtomWriter.PrefixAtom, AtomPubConstants.TagEntry, AtomPubConstants.NamespaceAtom);
+                writer.WriteAttributeString("xmlns", AtomWriter.PrefixAtom, null, AtomPubConstants.NamespaceAtom);
+                writer.WriteAttributeString("xmlns", AtomWriter.PrefixCMIS, null, AtomPubConstants.NamespaceCMIS);
+                writer.WriteAttributeString("xmlns", AtomWriter.PrefixRestAtom, null, AtomPubConstants.NamespaceRestAtom);
+
+                // atom:id
+                writer.WriteStartElement(AtomWriter.PrefixAtom, AtomPubConstants.TagAtomId, AtomPubConstants.NamespaceAtom);
+                writer.WriteString("urn:uuid:00000000-0000-0000-0000-00000000000");
+                writer.WriteEndElement();
+
+                // atom:title
+                writer.WriteStartElement(AtomWriter.PrefixAtom, AtomPubConstants.TagAtomTitle, AtomPubConstants.NamespaceAtom);
+                writer.WriteString(GetTitle());
+                writer.WriteEndElement();
+
+                // atom:updated
+                writer.WriteStartElement(AtomWriter.PrefixAtom, AtomPubConstants.TagAtomUpdated, AtomPubConstants.NamespaceAtom);
+                writer.WriteString(GetUpdated());
+                writer.WriteEndElement();
+
+                // content
+                if (stream != null)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixRestAtom, AtomPubConstants.TagContent, AtomPubConstants.NamespaceRestAtom);
+
+                    writer.WriteStartElement(AtomWriter.PrefixRestAtom, AtomPubConstants.TagContentMediatype, AtomPubConstants.NamespaceRestAtom);
+                    writer.WriteString(mediaType);
+                    writer.WriteEndElement();
+
+                    writer.WriteStartElement(AtomWriter.PrefixRestAtom, AtomPubConstants.TagContentBase64, AtomPubConstants.NamespaceRestAtom);
+                    WriteContent(writer);
+                    writer.WriteEndElement();
+
+                    writer.WriteEndElement();
+                }
+
+                // object
+                AtomWriter.ObjectSerializer.Serialize(writer, cmisObject);
+
+                // end entry
+                writer.WriteEndElement();
+
+                // end document
+                writer.WriteEndDocument();
+
+                writer.Flush();
+            }
+        }
+
+        // ---- internal ----
+
+        private string GetTitle()
+        {
+            string result = "";
+
+            foreach (cmisProperty property in cmisObject.properties.Items)
+            {
+                if (PropertyIds.Name == property.propertyDefinitionId && property is cmisPropertyString)
+                {
+                    string[] values = ((cmisPropertyString)property).value;
+                    if (values != null && values.Length > 0)
+                    {
+                        return values[0];
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        private string GetUpdated()
+        {
+            return DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'", CultureInfo.InvariantCulture);
+        }
+
+        private void WriteContent(XmlWriter writer)
+        {
+            byte[] byteArray = null;
+
+            if (stream is MemoryStream)
+            {
+                byteArray = ((MemoryStream)stream).ToArray();
+            }
+            else
+            {
+                MemoryStream memStream = new MemoryStream();
+                byte[] buffer = new byte[BufferSize];
+                int bytes;
+                while ((bytes = stream.Read(buffer, 0, buffer.Length)) > 0)
+                {
+                    memStream.Write(buffer, 0, bytes);
+                }
+                byteArray = memStream.ToArray();
+            }
+
+            writer.WriteBase64(byteArray, 0, byteArray.Length);
+        }
+    }
+
+    internal class AtomQueryWriter
+    {
+        private string statement;
+        private bool? searchAllVersions;
+        private bool? includeAllowableActions;
+        private IncludeRelationships? includeRelationships;
+        private string renditionFilter;
+        private long? maxItems;
+        private long? skipCount;
+
+        public AtomQueryWriter(string statement, bool? searchAllVersions,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            long? maxItems, long? skipCount)
+        {
+            this.statement = statement;
+            this.searchAllVersions = searchAllVersions;
+            this.includeAllowableActions = includeAllowableActions;
+            this.includeRelationships = includeRelationships;
+            this.renditionFilter = renditionFilter;
+            this.maxItems = maxItems;
+            this.skipCount = skipCount;
+        }
+
+        public void Write(Stream outStream)
+        {
+            using (XmlWriter writer = XmlWriter.Create(outStream))
+            {
+                // start doc
+                writer.WriteStartDocument();
+
+                // start query
+                writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagQuery, AtomPubConstants.NamespaceCMIS);
+                writer.WriteAttributeString("xmlns", AtomWriter.PrefixAtom, null, AtomPubConstants.NamespaceAtom);
+                writer.WriteAttributeString("xmlns", AtomWriter.PrefixCMIS, null, AtomPubConstants.NamespaceCMIS);
+                writer.WriteAttributeString("xmlns", AtomWriter.PrefixRestAtom, null, AtomPubConstants.NamespaceRestAtom);
+
+                // cmis:statement
+                writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagStatement, AtomPubConstants.NamespaceCMIS);
+                writer.WriteString(statement);
+                writer.WriteEndElement();
+
+                // cmis:searchAllVersions
+                if (searchAllVersions.HasValue)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagSearchAllVersions, AtomPubConstants.NamespaceCMIS);
+                    writer.WriteString(searchAllVersions.Value ? "true" : "false");
+                    writer.WriteEndElement();
+                }
+
+                // cmis:includeAllowableActions
+                if (includeAllowableActions.HasValue)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagIncludeAllowableActions, AtomPubConstants.NamespaceCMIS);
+                    writer.WriteString(includeAllowableActions.Value ? "true" : "false");
+                    writer.WriteEndElement();
+                }
+
+                // cmis:includeRelationships
+                if (includeRelationships.HasValue)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagIncludeRelationships, AtomPubConstants.NamespaceCMIS);
+                    writer.WriteString(includeRelationships.GetCmisValue());
+                    writer.WriteEndElement();
+                }
+
+                // cmis:renditionFilter
+                if (renditionFilter != null)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagRenditionFilter, AtomPubConstants.NamespaceCMIS);
+                    writer.WriteString(renditionFilter);
+                    writer.WriteEndElement();
+                }
+
+                // cmis:maxItems
+                if (maxItems.HasValue)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagMaxItems, AtomPubConstants.NamespaceCMIS);
+                    writer.WriteString(maxItems.ToString());
+                    writer.WriteEndElement();
+                }
+
+                // cmis:skipCount
+                if (skipCount.HasValue)
+                {
+                    writer.WriteStartElement(AtomWriter.PrefixCMIS, AtomPubConstants.TagSkipCount, AtomPubConstants.NamespaceCMIS);
+                    writer.WriteString(skipCount.ToString());
+                    writer.WriteEndElement();
+                }
+
+                // end query
+                writer.WriteEndElement();
+
+                // end document
+                writer.WriteEndDocument();
+
+                writer.Flush();
+            }
+        }
+    }
+}
diff --git a/DotCMIS/binding/atompub/atompub.cs b/DotCMIS/binding/atompub/atompub.cs
new file mode 100644
index 0000000..a26f66d
--- /dev/null
+++ b/DotCMIS/binding/atompub/atompub.cs
@@ -0,0 +1,2818 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using DotCMIS.Binding.Impl;
+using DotCMIS.Binding.Services;
+using DotCMIS.CMISWebServicesReference;
+using DotCMIS.Data;
+using DotCMIS.Data.Extensions;
+using DotCMIS.Exceptions;
+using DotCMIS.Enums;
+
+namespace DotCMIS.Binding.AtomPub
+{
+    /// <summary>
+    /// AtomPub binding SPI.
+    /// </summary>
+    internal class CmisAtomPubSpi : ICmisSpi
+    {
+        private RepositoryService repositoryService;
+        private NavigationService navigationService;
+        private ObjectService objectService;
+        private VersioningService versioningService;
+        private DiscoveryService discoveryService;
+        private MultiFilingService multiFilingService;
+        private RelationshipService relationshipService;
+        private PolicyService policyService;
+        private AclService aclService;
+
+        public void initialize(BindingSession session)
+        {
+            repositoryService = new RepositoryService(session);
+            navigationService = new NavigationService(session);
+            objectService = new ObjectService(session);
+            versioningService = new VersioningService(session);
+            discoveryService = new DiscoveryService(session);
+            multiFilingService = new MultiFilingService(session);
+            relationshipService = new RelationshipService(session);
+            policyService = new PolicyService(session);
+            aclService = new AclService(session);
+        }
+
+        public IRepositoryService GetRepositoryService()
+        {
+            return repositoryService;
+        }
+
+        public INavigationService GetNavigationService()
+        {
+            return navigationService;
+        }
+
+        public IObjectService GetObjectService()
+        {
+            return objectService;
+        }
+
+        public IVersioningService GetVersioningService()
+        {
+            return versioningService;
+        }
+
+        public IRelationshipService GetRelationshipService()
+        {
+            return relationshipService;
+        }
+
+        public IDiscoveryService GetDiscoveryService()
+        {
+            return discoveryService;
+        }
+
+        public IMultiFilingService GetMultiFilingService()
+        {
+            return multiFilingService;
+        }
+
+        public IAclService GetAclService()
+        {
+            return aclService;
+        }
+
+        public IPolicyService GetPolicyService()
+        {
+            return policyService;
+        }
+
+        public void ClearAllCaches()
+        {
+            // nothing to do
+        }
+
+        public void ClearRepositoryCache(string repositoryId)
+        {
+            // nothing to do
+        }
+
+        public void Close()
+        {
+            // nothing to do
+        }
+    }
+
+    internal abstract class AbstractAtomPubService
+    {
+        protected const string NameCollection = "collection";
+        protected const string NameURITemplate = "uritemplate";
+        protected const string NamePathSegment = "pathSegment";
+        protected const string NameRelativePathSegment = "relativePathSegment";
+        protected const string NameNumItems = "numItems";
+
+        private const string SessionLinkCache = "org.apache.chemistry.dotcmis.binding.atompub.linkcache";
+
+        protected enum IdentifierType
+        {
+            Id, Path
+        };
+
+        protected BindingSession Session { get; set; }
+
+
+        // ---- link cache ----
+
+        protected LinkCache GetLinkCache()
+        {
+            LinkCache linkCache = (LinkCache)Session.GetValue(SessionLinkCache);
+            if (linkCache == null)
+            {
+                linkCache = new LinkCache(Session);
+                Session.PutValue(SessionLinkCache, linkCache);
+            }
+
+            return linkCache;
+        }
+
+        protected string GetLink(string repositoryId, string id, string rel, string type)
+        {
+            if (repositoryId == null)
+            {
+                throw new CmisInvalidArgumentException("Repository id must be set!");
+            }
+
+            if (id == null)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            return GetLinkCache().GetLink(repositoryId, id, rel, type);
+        }
+
+        protected string GetLink(string repositoryId, string id, string rel)
+        {
+            return GetLink(repositoryId, id, rel, null);
+        }
+
+        protected string LoadLink(string repositoryId, string id, string rel, string type)
+        {
+            string link = GetLink(repositoryId, id, rel, type);
+            if (link == null)
+            {
+                GetObjectInternal(repositoryId, IdentifierType.Id, id, ReturnVersion.This, null, null, null, null, null, null, null);
+                link = GetLink(repositoryId, id, rel, type);
+            }
+
+            return link;
+        }
+
+        protected void AddLink(string repositoryId, string id, string rel, string type, string link)
+        {
+            GetLinkCache().AddLink(repositoryId, id, rel, type, link);
+        }
+
+        protected void AddLink(string repositoryId, string id, AtomLink link)
+        {
+            GetLinkCache().AddLink(repositoryId, id, link.Rel, link.Type, link.Href);
+        }
+
+        protected void RemoveLinks(string repositoryId, string id)
+        {
+            GetLinkCache().RemoveLinks(repositoryId, id);
+        }
+
+        protected void LockLinks()
+        {
+            GetLinkCache().LockLinks();
+        }
+
+        protected void UnlockLinks()
+        {
+            GetLinkCache().UnlockLinks();
+        }
+
+        protected string GetTypeLink(string repositoryId, string typeId, string rel, string type)
+        {
+            if (repositoryId == null)
+            {
+                throw new CmisInvalidArgumentException("Repository id must be set!");
+            }
+
+            if (typeId == null)
+            {
+                throw new CmisInvalidArgumentException("Type id must be set!");
+            }
+
+            return GetLinkCache().GetTypeLink(repositoryId, typeId, rel, type);
+        }
+
+        protected string GetTypeLink(string repositoryId, string typeId, string rel)
+        {
+            return GetTypeLink(repositoryId, typeId, rel, null);
+        }
+
+        protected string LoadTypeLink(string repositoryId, string typeId, string rel, string type)
+        {
+            string link = GetTypeLink(repositoryId, typeId, rel, type);
+            if (link == null)
+            {
+                GetTypeDefinitionInternal(repositoryId, typeId);
+                link = GetTypeLink(repositoryId, typeId, rel, type);
+            }
+
+            return link;
+        }
+
+        protected void AddTypeLink(string repositoryId, string typeId, string rel, string type, string link)
+        {
+            GetLinkCache().AddTypeLink(repositoryId, typeId, rel, type, link);
+        }
+
+        protected void AddTypeLink(string repositoryId, string typeId, AtomLink link)
+        {
+            GetLinkCache().AddTypeLink(repositoryId, typeId, link.Rel, link.Type, link.Href);
+        }
+
+        protected void RemoveTypeLinks(string repositoryId, string id)
+        {
+            GetLinkCache().RemoveTypeLinks(repositoryId, id);
+        }
+
+        protected void LockTypeLinks()
+        {
+            GetLinkCache().LockTypeLinks();
+        }
+
+        protected void UnlockTypeLinks()
+        {
+            GetLinkCache().UnlockTypeLinks();
+        }
+
+        protected string GetCollection(string repositoryId, string collection)
+        {
+            return GetLinkCache().GetCollection(repositoryId, collection);
+        }
+
+        protected string LoadCollection(string repositoryId, string collection)
+        {
+            string link = GetCollection(repositoryId, collection);
+            if (link == null)
+            {
+                GetRepositoriesInternal(repositoryId);
+                link = GetCollection(repositoryId, collection);
+            }
+
+            return link;
+        }
+
+        protected void AddCollection(string repositoryId, string collection, string link)
+        {
+            GetLinkCache().AddCollection(repositoryId, collection, link);
+        }
+
+        protected void AddCollection(string repositoryId, IDictionary<string, string> colDict)
+        {
+            string collection = null;
+            colDict.TryGetValue("collectionType", out collection);
+
+            string link = null;
+            colDict.TryGetValue("href", out link);
+
+            AddCollection(repositoryId, collection, link);
+        }
+
+        protected string GetRepositoryLink(string repositoryId, string rel)
+        {
+            return GetLinkCache().GetRepositoryLink(repositoryId, rel);
+        }
+
+        protected string LoadRepositoryLink(string repositoryId, string rel)
+        {
+            string link = GetRepositoryLink(repositoryId, rel);
+            if (link == null)
+            {
+                GetRepositoriesInternal(repositoryId);
+                link = GetRepositoryLink(repositoryId, rel);
+            }
+
+            return link;
+        }
+
+        protected void AddRepositoryLink(string repositoryId, string rel, string link)
+        {
+            GetLinkCache().AddRepositoryLink(repositoryId, rel, link);
+        }
+
+        protected void AddRepositoryLink(string repositoryId, AtomLink link)
+        {
+            AddRepositoryLink(repositoryId, link.Rel, link.Href);
+        }
+
+        protected string GetTemplateLink(string repositoryId, string type, IDictionary<string, object> parameters)
+        {
+            return GetLinkCache().GetTemplateLink(repositoryId, type, parameters);
+        }
+
+        protected string LoadTemplateLink(string repositoryId, string type, IDictionary<string, object> parameters)
+        {
+            string link = GetTemplateLink(repositoryId, type, parameters);
+            if (link == null)
+            {
+                GetRepositoriesInternal(repositoryId);
+                link = GetTemplateLink(repositoryId, type, parameters);
+            }
+
+            return link;
+        }
+
+        protected void AddTemplate(string repositoryId, string type, string link)
+        {
+            GetLinkCache().AddTemplate(repositoryId, type, link);
+        }
+
+        protected void AddTemplate(string repositoryId, IDictionary<string, string> tempDict)
+        {
+            string type = null;
+            tempDict.TryGetValue("type", out type);
+
+            string template = null;
+            tempDict.TryGetValue("template", out template);
+
+            AddTemplate(repositoryId, type, template);
+        }
+
+        // ---- exceptions ----
+
+        protected CmisBaseException ConvertStatusCode(HttpStatusCode code, string message, string errorContent, Exception e)
+        {
+            switch (code)
+            {
+                case HttpStatusCode.BadRequest:
+                    return new CmisInvalidArgumentException(message, errorContent, e);
+                case HttpStatusCode.NotFound:
+                    return new CmisObjectNotFoundException(message, errorContent, e);
+                case HttpStatusCode.Forbidden:
+                    return new CmisPermissionDeniedException(message, errorContent, e);
+                case HttpStatusCode.MethodNotAllowed:
+                    return new CmisNotSupportedException(message, errorContent, e);
+                case HttpStatusCode.Conflict:
+                    return new CmisConstraintException(message, errorContent, e);
+                default:
+                    return new CmisRuntimeException(message, errorContent, e);
+            }
+        }
+
+        protected void ThrowLinkException(String repositoryId, String id, String rel, String type)
+        {
+            int index = GetLinkCache().CheckLink(repositoryId, id, rel, type);
+
+            switch (index)
+            {
+                case 0:
+                    throw new CmisObjectNotFoundException("Unknown repository!");
+                case 1:
+                    throw new CmisObjectNotFoundException("Unknown object!");
+                case 2:
+                    throw new CmisNotSupportedException("Operation not supported by the repository for this object!");
+                case 3:
+                    throw new CmisNotSupportedException("No link with matching media type!");
+                case 4:
+                    throw new CmisRuntimeException("Nothing wrong! Either this is a bug or threading issue.");
+                default:
+                    throw new CmisRuntimeException("Unknown error!");
+            }
+        }
+
+        // ---- helpers ----
+
+        protected T Parse<T>(Stream stream) where T : AtomBase
+        {
+            AtomPubParser parser = new AtomPubParser(stream);
+
+            try
+            {
+                parser.Parse();
+            }
+            catch (Exception e)
+            {
+                throw new CmisConnectionException("Parsing exception!", e);
+            }
+
+            AtomBase parseResult = parser.GetParseResults();
+
+            if (!typeof(T).IsInstanceOfType(parseResult))
+            {
+                throw new CmisConnectionException("Unexpected document! Received "
+                        + (parseResult == null ? "something unknown" : parseResult.GetAtomType()) + "!");
+            }
+
+            return (T)parseResult;
+        }
+
+        protected HttpUtils.Response Read(UrlBuilder url)
+        {
+            HttpUtils.Response resp = HttpUtils.InvokeGET(url, Session);
+
+            if (resp.StatusCode != HttpStatusCode.OK)
+            {
+                throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+            }
+
+            return resp;
+        }
+
+        protected HttpUtils.Response Post(UrlBuilder url, string contentType, HttpUtils.Output writer)
+        {
+            HttpUtils.Response resp = HttpUtils.InvokePOST(url, contentType, writer, Session);
+
+            if (resp.StatusCode != HttpStatusCode.Created)
+            {
+                throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+            }
+
+            return resp;
+        }
+
+        protected HttpUtils.Response Put(UrlBuilder url, string contentType, HttpUtils.Output writer)
+        {
+            HttpUtils.Response resp = HttpUtils.InvokePUT(url, contentType, writer, Session);
+
+            if ((int)resp.StatusCode < 200 || (int)resp.StatusCode > 299)
+            {
+                throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+            }
+
+            return resp;
+        }
+
+        protected void Delete(UrlBuilder url)
+        {
+            HttpUtils.Response resp = HttpUtils.InvokeDELETE(url, Session);
+
+            if (resp.StatusCode != HttpStatusCode.NoContent)
+            {
+                throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+            }
+        }
+
+        protected string GetServiceDocURL()
+        {
+            return Session.GetValue(SessionParameter.AtomPubUrl) as string;
+        }
+
+        protected bool IsNextLink(AtomElement element)
+        {
+            return AtomPubConstants.RelNext == ((AtomLink)element.Object).Rel;
+        }
+
+        protected bool IsStr(string name, AtomElement element)
+        {
+            return name == element.LocalName && element.Object is string;
+        }
+
+        protected bool IsInt(string name, AtomElement element)
+        {
+            return name == element.LocalName && element.Object is Int64;
+        }
+
+        // ---- common methods ----
+
+        protected cmisObjectType CreateIdObject(string objectId)
+        {
+            cmisObjectType cmisObject = new cmisObjectType();
+
+            cmisPropertiesType properties = new cmisPropertiesType();
+            cmisObject.properties = properties;
+
+            cmisPropertyId idProperty = new cmisPropertyId();
+            properties.Items = new cmisProperty[] { idProperty };
+            idProperty.propertyDefinitionId = PropertyIds.ObjectId;
+            idProperty.value = new string[] { objectId };
+
+            return cmisObject;
+        }
+
+        protected bool IsAclMergeRequired(IAcl addAces, IAcl removeAces)
+        {
+            return (addAces != null && addAces.Aces != null && addAces.Aces.Count > 0)
+                    || (removeAces != null && removeAces.Aces != null && removeAces.Aces.Count > 0);
+        }
+
+        protected IAcl MergeAcls(IAcl originalAces, IAcl addAces, IAcl removeAces)
+        {
+            IDictionary<string, HashSet<string>> originals = ConvertAclToDict(originalAces);
+            IDictionary<string, HashSet<string>> adds = ConvertAclToDict(addAces);
+            IDictionary<string, HashSet<string>> removes = ConvertAclToDict(removeAces);
+            IList<IAce> newACEs = new List<IAce>();
+
+            // iterate through the original ACEs
+            foreach (KeyValuePair<string, HashSet<string>> ace in originals)
+            {
+                // add permissions
+                HashSet<string> addPermissions = adds[ace.Key];
+                if (addPermissions != null)
+                {
+                    foreach (string perm in addPermissions)
+                    {
+                        ace.Value.Add(perm);
+                    }
+                }
+
+                // remove permissions
+                HashSet<string> removePermissions = removes[ace.Key];
+                if (removePermissions != null)
+                {
+                    foreach (string perm in removePermissions)
+                    {
+                        ace.Value.Remove(perm);
+                    }
+                }
+
+                // create new ACE
+                Ace resultAce = new Ace();
+                Principal resultPrincipal = new Principal();
+                resultPrincipal.Id = ace.Key;
+                resultAce.Principal = resultPrincipal;
+                resultAce.Permissions = new List<string>(ace.Value);
+
+                newACEs.Add(resultAce);
+            }
+
+            // find all ACEs that should be added but are not in the original ACE list
+            foreach (KeyValuePair<string, HashSet<string>> ace in adds)
+            {
+                if (!originals.ContainsKey(ace.Key) && ace.Value.Count > 0)
+                {
+                    Ace resultAce = new Ace();
+                    Principal resultPrincipal = new Principal();
+                    resultPrincipal.Id = ace.Key;
+                    resultAce.Principal = resultPrincipal;
+                    resultAce.Permissions = new List<string>(ace.Value);
+
+                    newACEs.Add(resultAce);
+                }
+            }
+
+            Acl result = new Acl();
+            result.Aces = newACEs;
+
+            return result;
+        }
+
+        private IDictionary<string, HashSet<string>> ConvertAclToDict(IAcl acl)
+        {
+            IDictionary<string, HashSet<string>> result = new Dictionary<string, HashSet<string>>();
+
+            if (acl == null || acl.Aces == null)
+            {
+                return result;
+            }
+
+            foreach (Ace ace in acl.Aces)
+            {
+                // don't consider indirect ACEs - we can't change them
+                if (!ace.IsDirect)
+                {
+                    // ignore
+                    continue;
+                }
+
+                // although a principal must not be null, check it
+                if ((ace.Principal == null) || (ace.Principal.Id == null))
+                {
+                    // ignore
+                    continue;
+                }
+
+                if (ace.Permissions == null)
+                {
+                    continue;
+                }
+
+                HashSet<string> permissions;
+                if (!result.TryGetValue(ace.Principal.Id, out permissions))
+                {
+                    permissions = new HashSet<string>();
+                    result[ace.Principal.Id] = permissions;
+                }
+
+                foreach (string perm in ace.Permissions)
+                {
+                    permissions.Add(perm);
+                }
+            }
+
+            return result;
+        }
+
+
+        protected AtomAcl UpdateAcl(string repositoryId, string objectId, IAcl acl, AclPropagation? aclPropagation)
+        {
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelACL, AtomPubConstants.MediatypeACL);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelACL, AtomPubConstants.MediatypeACL);
+            }
+
+            UrlBuilder aclUrl = new UrlBuilder(link);
+            aclUrl.AddParameter(AtomPubConstants.ParamACLPropagation, aclPropagation);
+
+            // set up object and writer
+            cmisAccessControlListType cmisAcl = Converter.Convert(acl);
+            HttpUtils.Output output = delegate(Stream stream)
+            {
+                AtomWriter.AclSerializer.Serialize(stream, cmisAcl);
+            };
+
+            // update
+            HttpUtils.Response resp = Put(aclUrl, AtomPubConstants.MediatypeACL, output);
+
+            // parse new acl
+            return Parse<AtomAcl>(resp.Stream);
+        }
+
+        protected IList<IRepositoryInfo> GetRepositoriesInternal(string repositoryId)
+        {
+            IList<IRepositoryInfo> repInfos = new List<IRepositoryInfo>();
+
+            // retrieve service doc
+            UrlBuilder url = new UrlBuilder(GetServiceDocURL());
+            url.AddParameter(AtomPubConstants.ParamRepositoryId, repositoryId);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            ServiceDoc serviceDoc = Parse<ServiceDoc>(resp.Stream);
+
+            // walk through the workspaces
+            foreach (RepositoryWorkspace ws in serviceDoc.GetWorkspaces())
+            {
+                if (ws.Id == null)
+                {
+                    // found a non-CMIS workspace
+                    continue;
+                }
+
+                foreach (AtomElement element in ws.GetElements())
+                {
+                    if (element.LocalName == NameCollection)
+                    {
+                        AddCollection(ws.Id, (IDictionary<string, string>)element.Object);
+                    }
+                    else if (element.Object is AtomLink)
+                    {
+                        AddRepositoryLink(ws.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.LocalName == NameURITemplate)
+                    {
+                        AddTemplate(ws.Id, (IDictionary<string, string>)element.Object);
+                    }
+                    else if (element.Object is cmisRepositoryInfoType)
+                    {
+                        repInfos.Add(Converter.Convert((cmisRepositoryInfoType)element.Object));
+                    }
+                }
+            }
+
+            return repInfos;
+        }
+
+        protected IObjectData GetObjectInternal(string repositoryId, IdentifierType idOrPath, string objectIdOrPath,
+            ReturnVersion? returnVersion, string filter, bool? includeAllowableActions, IncludeRelationships? includeRelationships,
+            string renditionFilter, bool? includePolicyIds, bool? includeAcl, IExtensionsData extension)
+        {
+            IObjectData result = null;
+
+            Dictionary<string, object> parameters = new Dictionary<string, object>();
+            parameters[AtomPubConstants.ParamId] = objectIdOrPath;
+            parameters[AtomPubConstants.ParamPath] = objectIdOrPath;
+            parameters[AtomPubConstants.ParamReturnVersion] = returnVersion;
+            parameters[AtomPubConstants.ParamFilter] = filter;
+            parameters[AtomPubConstants.ParamAllowableActions] = includeAllowableActions;
+            parameters[AtomPubConstants.ParamACL] = includeAcl;
+            parameters[AtomPubConstants.ParamPolicyIds] = includePolicyIds;
+            parameters[AtomPubConstants.ParamRelationships] = includeRelationships;
+            parameters[AtomPubConstants.ParamRenditionFilter] = renditionFilter;
+
+            string link = LoadTemplateLink(repositoryId, (idOrPath == IdentifierType.Id ? AtomPubConstants.TemplateObjectById
+                    : AtomPubConstants.TemplateObjectByPath), parameters);
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            // workaround for missing template parameter in the CMIS spec
+            if ((returnVersion != null) && (returnVersion != ReturnVersion.This))
+            {
+                url.AddParameter(AtomPubConstants.ParamReturnVersion, returnVersion);
+            }
+
+            HttpUtils.Response resp = Read(url);
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            if (entry.Id == null)
+            {
+                throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
+            }
+
+            LockLinks();
+            try
+            {
+                RemoveLinks(repositoryId, entry.Id);
+
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.Object is cmisObjectType)
+                    {
+                        result = Converter.Convert((cmisObjectType)element.Object);
+                    }
+                }
+            }
+            finally
+            {
+                UnlockLinks();
+            }
+
+            return result;
+        }
+
+        protected ITypeDefinition GetTypeDefinitionInternal(string repositoryId, string typeId)
+        {
+            ITypeDefinition result = null;
+
+            Dictionary<string, object> parameters = new Dictionary<string, object>();
+            parameters[AtomPubConstants.ParamId] = typeId;
+
+            string link = LoadTemplateLink(repositoryId, AtomPubConstants.TemplateTypeById, parameters);
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository!");
+            }
+
+            // read and parse
+            HttpUtils.Response resp = Read(new UrlBuilder(link));
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // we expect a CMIS entry
+            if (entry.Id == null)
+            {
+                throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
+            }
+
+            LockTypeLinks();
+            try
+            {
+                // clean up cache
+                RemoveTypeLinks(repositoryId, entry.Id);
+
+                // walk through the entry
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddTypeLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.Object is cmisTypeDefinitionType)
+                    {
+                        result = Converter.Convert((cmisTypeDefinitionType)element.Object);
+                    }
+                }
+            }
+            finally
+            {
+                UnlockTypeLinks();
+            }
+
+            return result;
+        }
+    }
+
+    internal class RepositoryService : AbstractAtomPubService, IRepositoryService
+    {
+        public RepositoryService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public IList<IRepositoryInfo> GetRepositoryInfos(IExtensionsData extension)
+        {
+            return GetRepositoriesInternal(null);
+        }
+
+        public IRepositoryInfo GetRepositoryInfo(string repositoryId, IExtensionsData extension)
+        {
+            IList<IRepositoryInfo> repositoryInfos = GetRepositoriesInternal(repositoryId);
+
+            // find the repository
+            foreach (IRepositoryInfo info in repositoryInfos)
+            {
+                if (info.Id == null) { continue; }
+                if (info.Id == repositoryId) { return info; }
+            }
+
+            throw new CmisObjectNotFoundException("Repository not found!");
+        }
+
+        public ITypeDefinitionList GetTypeChildren(string repositoryId, string typeId, bool? includePropertyDefinitions,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            TypeDefinitionList result = new TypeDefinitionList();
+
+            // find the link
+            string link = null;
+            if (typeId == null)
+            {
+                link = LoadCollection(repositoryId, AtomPubConstants.CollectionTypes);
+            }
+            else
+            {
+                link = LoadTypeLink(repositoryId, typeId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or type!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamTypeId, typeId);
+            url.AddParameter(AtomPubConstants.ParamPropertyDefinitions, includePropertyDefinitions);
+            url.AddParameter(AtomPubConstants.ParamMaxItems, maxItems);
+            url.AddParameter(AtomPubConstants.ParamSkipCount, skipCount);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // handle top level
+            foreach (AtomElement element in feed.GetElements())
+            {
+                if (element.Object is AtomLink)
+                {
+                    if (IsNextLink(element)) { result.HasMoreItems = true; }
+                }
+                else if (IsInt(NameNumItems, element))
+                {
+                    result.NumItems = (long)element.Object;
+                }
+            }
+
+            result.List = new List<ITypeDefinition>(feed.GetEntries().Count);
+
+            // get the children
+            foreach (AtomEntry entry in feed.GetEntries())
+            {
+                ITypeDefinition child = null;
+
+                LockTypeLinks();
+                try
+                {
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is AtomLink)
+                        {
+                            AddTypeLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                        }
+                        else if (element.Object is cmisTypeDefinitionType)
+                        {
+                            child = Converter.Convert((cmisTypeDefinitionType)element.Object);
+                        }
+                    }
+                }
+                finally
+                {
+                    UnlockTypeLinks();
+                }
+
+                if (child != null)
+                {
+                    result.List.Add(child);
+                }
+            }
+
+            return result;
+        }
+
+        public IList<ITypeDefinitionContainer> GetTypeDescendants(string repositoryId, string typeId, long? depth,
+            bool? includePropertyDefinitions, IExtensionsData extension)
+        {
+            List<ITypeDefinitionContainer> result = new List<ITypeDefinitionContainer>();
+
+            // find the link
+            string link = null;
+            if (typeId == null)
+            {
+                link = LoadRepositoryLink(repositoryId, AtomPubConstants.RepRelTypeDesc);
+            }
+            else
+            {
+                link = LoadTypeLink(repositoryId, typeId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeDescendants);
+            }
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or type!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamTypeId, typeId);
+            url.AddParameter(AtomPubConstants.ParamDepth, depth);
+            url.AddParameter(AtomPubConstants.ParamPropertyDefinitions, includePropertyDefinitions);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // process tree
+            AddTypeDescendantsLevel(repositoryId, feed, result);
+
+            return result;
+        }
+
+        private void AddTypeDescendantsLevel(string repositoryId, AtomFeed feed, List<ITypeDefinitionContainer> containerList)
+        {
+            if (feed == null || feed.GetEntries().Count == 0)
+            {
+                return;
+            }
+
+            foreach (AtomEntry entry in feed.GetEntries())
+            {
+                TypeDefinitionContainer childContainer = null;
+                List<ITypeDefinitionContainer> childContainerList = new List<ITypeDefinitionContainer>();
+
+                // walk through the entry
+                LockTypeLinks();
+                try
+                {
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is AtomLink)
+                        {
+                            AddTypeLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                        }
+                        else if (element.Object is cmisTypeDefinitionType)
+                        {
+                            childContainer = new TypeDefinitionContainer();
+                            childContainer.TypeDefinition = Converter.Convert((cmisTypeDefinitionType)element.Object);
+                        }
+                        else if (element.Object is AtomFeed)
+                        {
+                            AddTypeDescendantsLevel(repositoryId, (AtomFeed)element.Object, childContainerList);
+                        }
+                    }
+                }
+                finally
+                {
+                    UnlockTypeLinks();
+                }
+
+                if (childContainer != null)
+                {
+                    childContainer.Children = childContainerList;
+                    containerList.Add(childContainer);
+                }
+            }
+        }
+
+        public ITypeDefinition GetTypeDefinition(string repositoryId, string typeId, IExtensionsData extension)
+        {
+            return GetTypeDefinitionInternal(repositoryId, typeId);
+        }
+    }
+
+    internal class NavigationService : AbstractAtomPubService, INavigationService
+    {
+        public NavigationService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public IObjectInFolderList GetChildren(string repositoryId, string folderId, string filter, string orderBy,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            ObjectInFolderList result = new ObjectInFolderList();
+
+            // find the link
+            String link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamOrderBy, orderBy);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+            url.AddParameter(AtomPubConstants.ParamRelationships, includeRelationships);
+            url.AddParameter(AtomPubConstants.ParamRenditionFilter, renditionFilter);
+            url.AddParameter(AtomPubConstants.ParamPathSegment, includePathSegment);
+            url.AddParameter(AtomPubConstants.ParamMaxItems, maxItems);
+            url.AddParameter(AtomPubConstants.ParamSkipCount, skipCount);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // handle top level
+            foreach (AtomElement element in feed.GetElements())
+            {
+                if (element.Object is AtomLink)
+                {
+                    if (IsNextLink(element)) { result.HasMoreItems = true; }
+                }
+                else if (IsInt(NameNumItems, element))
+                {
+                    result.NumItems = (long)element.Object;
+                }
+            }
+
+            // get the children
+            if (feed.GetEntries().Count > 0)
+            {
+                result.Objects = new List<IObjectInFolderData>(feed.GetEntries().Count);
+
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    ObjectInFolderData child = null;
+                    String pathSegment = null;
+
+                    LockLinks();
+                    try
+                    {
+                        // clean up cache
+                        RemoveLinks(repositoryId, entry.Id);
+
+                        // walk through the entry
+                        foreach (AtomElement element in entry.GetElements())
+                        {
+                            if (element.Object is AtomLink)
+                            {
+                                AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                            }
+                            else if (IsStr(NamePathSegment, element))
+                            {
+                                pathSegment = (string)element.Object;
+                            }
+                            else if (element.Object is cmisObjectType)
+                            {
+                                child = new ObjectInFolderData();
+                                child.Object = Converter.Convert((cmisObjectType)element.Object);
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        UnlockLinks();
+                    }
+
+                    if (child != null)
+                    {
+                        child.PathSegment = pathSegment;
+                        result.Objects.Add(child);
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        public IList<IObjectInFolderContainer> GetDescendants(string repositoryId, string folderId, long? depth, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, IExtensionsData extension)
+        {
+            IList<IObjectInFolderContainer> result = new List<IObjectInFolderContainer>();
+
+            // find the link
+            String link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeDescendants);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeDescendants);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamDepth, depth);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+            url.AddParameter(AtomPubConstants.ParamRelationships, includeRelationships);
+            url.AddParameter(AtomPubConstants.ParamRenditionFilter, renditionFilter);
+            url.AddParameter(AtomPubConstants.ParamPathSegment, includePathSegment);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // process tree
+            AddDescendantsLevel(repositoryId, feed, result);
+
+            return result;
+        }
+
+        public IList<IObjectInFolderContainer> GetFolderTree(string repositoryId, string folderId, long? depth, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, IExtensionsData extension)
+        {
+            IList<IObjectInFolderContainer> result = new List<IObjectInFolderContainer>();
+
+            // find the link
+            string link = LoadLink(repositoryId, folderId, AtomPubConstants.RelFolderTree, AtomPubConstants.MediatypeDescendants);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelFolderTree, AtomPubConstants.MediatypeDescendants);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamDepth, depth);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+            url.AddParameter(AtomPubConstants.ParamRelationships, includeRelationships);
+            url.AddParameter(AtomPubConstants.ParamRenditionFilter, renditionFilter);
+            url.AddParameter(AtomPubConstants.ParamPathSegment, includePathSegment);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // process tree
+            AddDescendantsLevel(repositoryId, feed, result);
+
+            return result;
+        }
+
+        public IList<IObjectParentData> GetObjectParents(string repositoryId, string objectId, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includeRelativePathSegment, IExtensionsData extension)
+        {
+            IList<IObjectParentData> result = new List<IObjectParentData>();
+
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelUp, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                // root and unfiled objects have no UP link
+                return result;
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+            url.AddParameter(AtomPubConstants.ParamRelationships, includeRelationships);
+            url.AddParameter(AtomPubConstants.ParamRenditionFilter, renditionFilter);
+            url.AddParameter(AtomPubConstants.ParamRelativePathSegment, includeRelativePathSegment);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomBase atomBase = Parse<AtomBase>(resp.Stream);
+
+            if (atomBase is AtomFeed)
+            {
+                // it's a feed
+                AtomFeed feed = (AtomFeed)atomBase;
+
+                // walk through the feed
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectParentData objectParent = ProcessParentEntry(entry, repositoryId);
+
+                    if (objectParent != null)
+                    {
+                        result.Add(objectParent);
+                    }
+                }
+            }
+            else if (atomBase is AtomEntry)
+            {
+                // it's an entry
+                AtomEntry entry = (AtomEntry)atomBase;
+
+                IObjectParentData objectParent = ProcessParentEntry(entry, repositoryId);
+
+                if (objectParent != null)
+                {
+                    result.Add(objectParent);
+                }
+            }
+
+            return result;
+        }
+
+        private IObjectParentData ProcessParentEntry(AtomEntry entry, string repositoryId)
+        {
+            ObjectParentData result = null;
+            String relativePathSegment = null;
+
+            LockLinks();
+            try
+            {
+                // clean up cache
+                RemoveLinks(repositoryId, entry.Id);
+
+                // walk through the entry
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.Object is cmisObjectType)
+                    {
+                        result = new ObjectParentData();
+                        result.Object = Converter.Convert((cmisObjectType)element.Object);
+                    }
+                    else if (IsStr(NameRelativePathSegment, element))
+                    {
+                        relativePathSegment = (string)element.Object;
+                    }
+                }
+            }
+            finally
+            {
+                UnlockLinks();
+            }
+
+            if (result != null)
+            {
+                result.RelativePathSegment = relativePathSegment;
+            }
+
+            return result;
+        }
+
+        public IObjectData GetFolderParent(string repositoryId, string folderId, string filter, ExtensionsData extension)
+        {
+            IObjectData result = null;
+
+            // find the link
+            String link = LoadLink(repositoryId, folderId, AtomPubConstants.RelUp, AtomPubConstants.MediatypeEntry);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelUp, AtomPubConstants.MediatypeEntry);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+
+            // read
+            HttpUtils.Response resp = Read(url);
+            AtomBase atomBase = Parse<AtomBase>(resp.Stream);
+
+            // get the entry
+            AtomEntry entry = null;
+            if (atomBase is AtomFeed)
+            {
+                AtomFeed feed = (AtomFeed)atomBase;
+                if (feed.GetEntries().Count == 0)
+                {
+                    throw new CmisRuntimeException("Parent feed is empty!");
+                }
+                entry = feed.GetEntries()[0];
+            }
+            else if (atomBase is AtomEntry)
+            {
+                entry = (AtomEntry)atomBase;
+            }
+            else
+            {
+                throw new CmisRuntimeException("Unexpected document!");
+            }
+
+            LockLinks();
+            try
+            {
+                // clean up cache
+                RemoveLinks(repositoryId, entry.Id);
+
+                // walk through the entry
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.Object is cmisObjectType)
+                    {
+                        result = Converter.Convert((cmisObjectType)element.Object);
+                    }
+                }
+            }
+            finally
+            {
+                UnlockLinks();
+            }
+
+            return result;
+        }
+
+        public IObjectList GetCheckedOutDocs(string repositoryId, string folderId, string filter, string orderBy,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            ObjectList result = new ObjectList();
+
+            // find the link
+            String link = LoadCollection(repositoryId, AtomPubConstants.CollectionCheckedout);
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or checkedout collection not supported!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFolderId, folderId);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamOrderBy, orderBy);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+            url.AddParameter(AtomPubConstants.ParamRelationships, includeRelationships);
+            url.AddParameter(AtomPubConstants.ParamRenditionFilter, renditionFilter);
+            url.AddParameter(AtomPubConstants.ParamMaxItems, maxItems);
+            url.AddParameter(AtomPubConstants.ParamSkipCount, skipCount);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // handle top level
+            foreach (AtomElement element in feed.GetElements())
+            {
+                if (element.Object is AtomLink)
+                {
+                    if (IsNextLink(element))
+                    {
+                        result.HasMoreItems = true;
+                    }
+                }
+                else if (IsInt(NameNumItems, element))
+                {
+                    result.NumItems = (long)element.Object;
+                }
+            }
+
+            // get the documents
+            if (feed.GetEntries().Count > 0)
+            {
+                result.Objects = new List<IObjectData>(feed.GetEntries().Count);
+
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectData child = null;
+
+                    LockLinks();
+                    try
+                    {
+                        // clean up cache
+                        RemoveLinks(repositoryId, entry.Id);
+
+                        // walk through the entry
+                        foreach (AtomElement element in entry.GetElements())
+                        {
+                            if (element.Object is AtomLink)
+                            {
+                                AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                            }
+                            else if (element.Object is cmisObjectType)
+                            {
+                                child = Converter.Convert((cmisObjectType)element.Object);
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        UnlockLinks();
+                    }
+
+                    if (child != null)
+                    {
+                        result.Objects.Add(child);
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        private void AddDescendantsLevel(String repositoryId, AtomFeed feed, IList<IObjectInFolderContainer> containerList)
+        {
+            if ((feed == null) || (feed.GetEntries().Count == 0))
+            {
+                return;
+            }
+
+            // walk through the feed
+            foreach (AtomEntry entry in feed.GetEntries())
+            {
+                ObjectInFolderData objectInFolder = null;
+                string pathSegment = null;
+                IList<IObjectInFolderContainer> childContainerList = new List<IObjectInFolderContainer>();
+
+                LockLinks();
+                try
+                {
+                    // clean up cache
+                    RemoveLinks(repositoryId, entry.Id);
+
+                    // walk through the entry
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is AtomLink)
+                        {
+                            AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                        }
+                        else if (element.Object is cmisObjectType)
+                        {
+                            objectInFolder = new ObjectInFolderData();
+                            objectInFolder.Object = Converter.Convert((cmisObjectType)element.Object);
+                        }
+                        else if (IsStr(NamePathSegment, element))
+                        {
+                            pathSegment = (string)element.Object;
+                        }
+                        else if (element.Object is AtomFeed)
+                        {
+                            AddDescendantsLevel(repositoryId, (AtomFeed)element.Object, childContainerList);
+                        }
+                    }
+                }
+                finally
+                {
+                    UnlockLinks();
+                }
+
+                if (objectInFolder != null)
+                {
+                    objectInFolder.PathSegment = pathSegment;
+                    ObjectInFolderContainer childContainer = new ObjectInFolderContainer();
+                    childContainer.Object = objectInFolder;
+                    childContainer.Children = childContainerList;
+                    containerList.Add(childContainer);
+                }
+            }
+        }
+    }
+
+    internal class ObjectService : AbstractAtomPubService, IObjectService
+    {
+        public ObjectService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public string CreateDocument(string repositoryId, IProperties properties, string folderId, IContentStream contentStream,
+            VersioningState? versioningState, IList<string> policies, IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            CheckCreateProperties(properties);
+
+            // find the link
+            string link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamVersioningState, versioningState);
+
+            // set up object and writer
+            cmisObjectType cmisObject = new cmisObjectType();
+            cmisObject.properties = Converter.Convert(properties);
+            cmisObject.policyIds = Converter.ConvertPolicies(policies);
+
+            String mediaType = null;
+            Stream stream = null;
+
+            if (contentStream != null)
+            {
+                mediaType = contentStream.MimeType;
+                stream = contentStream.Stream;
+            }
+
+            AtomEntryWriter entryWriter = new AtomEntryWriter(cmisObject, mediaType, stream);
+
+            // post the new folder object
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse the response
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // handle ACL modifications
+            HandleAclModifications(repositoryId, entry, addAces, removeAces);
+
+            return entry.Id;
+        }
+
+        public string CreateDocumentFromSource(string repositoryId, string sourceId, IProperties properties, string folderId,
+            VersioningState? versioningState, IList<string> policies, IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            throw new CmisNotSupportedException("createDocumentFromSource is not supported by the AtomPub binding!");
+        }
+
+        public string CreateFolder(string repositoryId, IProperties properties, string folderId, IList<string> policies,
+            IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            CheckCreateProperties(properties);
+
+            // find the link
+            string link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+
+            // set up object and writer
+            cmisObjectType cmisObject = new cmisObjectType();
+            cmisObject.properties = Converter.Convert(properties);
+            cmisObject.policyIds = Converter.ConvertPolicies(policies);
+
+            AtomEntryWriter entryWriter = new AtomEntryWriter(cmisObject);
+
+            // post the new folder object
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse the response
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // handle ACL modifications
+            HandleAclModifications(repositoryId, entry, addAces, removeAces);
+
+            return entry.Id;
+        }
+
+        public string CreateRelationship(string repositoryId, IProperties properties, IList<string> policies, IAcl addAces,
+            IAcl removeAces, IExtensionsData extension)
+        {
+            CheckCreateProperties(properties);
+
+            // find source id
+            IPropertyData sourceIdProperty = properties[PropertyIds.SourceId];
+            if (!(sourceIdProperty is IPropertyId))
+            {
+                throw new CmisInvalidArgumentException("Source Id is not set!");
+            }
+
+            string sourceId = ((IPropertyId)sourceIdProperty).FirstValue;
+            if (sourceId == null)
+            {
+                throw new CmisInvalidArgumentException("Source Id is not set!");
+            }
+
+            // find the link
+            string link = LoadLink(repositoryId, sourceId, AtomPubConstants.RelRelationships, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, sourceId, AtomPubConstants.RelRelationships, AtomPubConstants.MediatypeFeed);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+            // set up object and writer
+            cmisObjectType cmisObject = new cmisObjectType();
+            cmisObject.properties = Converter.Convert(properties);
+            cmisObject.policyIds = Converter.ConvertPolicies(policies);
+
+            AtomEntryWriter entryWriter = new AtomEntryWriter(cmisObject);
+
+            // post the new folder object
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse the response
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // handle ACL modifications
+            HandleAclModifications(repositoryId, entry, addAces, removeAces);
+
+            return entry.Id;
+        }
+
+        public string CreatePolicy(string repositoryId, IProperties properties, string folderId, IList<string> policies,
+            IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            CheckCreateProperties(properties);
+
+            // find the link
+            string link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+
+            // set up object and writer
+            cmisObjectType cmisObject = new cmisObjectType();
+            cmisObject.properties = Converter.Convert(properties);
+            cmisObject.policyIds = Converter.ConvertPolicies(policies);
+
+            AtomEntryWriter entryWriter = new AtomEntryWriter(cmisObject);
+
+            // post the new folder object
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse the response
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // handle ACL modifications
+            HandleAclModifications(repositoryId, entry, addAces, removeAces);
+
+            return entry.Id;
+        }
+
+        public IAllowableActions GetAllowableActions(string repositoryId, string objectId, IExtensionsData extension)
+        {
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelAllowableActions, AtomPubConstants.MediatypeAllowableAction);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelAllowableActions, AtomPubConstants.MediatypeAllowableAction);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomAllowableActions allowableActions = Parse<AtomAllowableActions>(resp.Stream);
+
+            return Converter.Convert(allowableActions.AllowableActions);
+        }
+
+        public IProperties GetProperties(string repositoryId, string objectId, string filter, IExtensionsData extension)
+        {
+            IObjectData obj = GetObjectInternal(repositoryId, IdentifierType.Id, objectId, ReturnVersion.This, filter,
+                    false, IncludeRelationships.None, "cmis:none", false, false, extension);
+
+            return obj.Properties;
+        }
+
+        public IList<IRenditionData> GetRenditions(string repositoryId, string objectId, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            IObjectData obj = GetObjectInternal(repositoryId, IdentifierType.Id, objectId, ReturnVersion.This,
+                PropertyIds.ObjectId, false, IncludeRelationships.None, renditionFilter, false, false, extension);
+
+            IList<IRenditionData> result = obj.Renditions;
+            if (result == null)
+            {
+                result = new List<IRenditionData>();
+            }
+
+            return result;
+        }
+
+        public IObjectData GetObject(string repositoryId, string objectId, string filter, bool? includeAllowableActions,
+            IncludeRelationships? includeRelationships, string renditionFilter, bool? includePolicyIds,
+            bool? includeAcl, IExtensionsData extension)
+        {
+            return GetObjectInternal(repositoryId, IdentifierType.Id, objectId, ReturnVersion.This, filter, includeAllowableActions,
+                includeRelationships, renditionFilter, includePolicyIds, includeAcl, extension);
+        }
+
+        public IObjectData GetObjectByPath(string repositoryId, string path, string filter, bool? includeAllowableActions,
+            IncludeRelationships? includeRelationships, string renditionFilter, bool? includePolicyIds, bool? includeAcl,
+            IExtensionsData extension)
+        {
+            return GetObjectInternal(repositoryId, IdentifierType.Path, path, ReturnVersion.This, filter, includeAllowableActions,
+                includeRelationships, renditionFilter, includePolicyIds, includeAcl, extension);
+        }
+
+        public IContentStream GetContentStream(string repositoryId, string objectId, string streamId, long? offset, long? length,
+            IExtensionsData extension)
+        {
+            ContentStream result = new ContentStream();
+
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.LinkRelContent, null);
+
+            if (link == null)
+            {
+                throw new CmisConstraintException("No content stream");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamStreamId, streamId);
+
+            // get the content
+            if (offset != null && offset > Int32.MaxValue)
+            {
+                throw new CmisInvalidArgumentException("Offset >" + Int32.MaxValue);
+            }
+            if (length != null && length > Int32.MaxValue)
+            {
+                throw new CmisInvalidArgumentException("Length >" + Int32.MaxValue);
+            }
+            HttpUtils.Response resp = HttpUtils.InvokeGET(url, Session, (int?)offset, (int?)length);
+
+            // check response code
+            if (resp.StatusCode != HttpStatusCode.OK && resp.StatusCode != HttpStatusCode.PartialContent)
+            {
+                throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+            }
+
+            result.FileName = null;
+            result.Length = resp.ContentLength;
+            result.MimeType = resp.ContentType;
+            result.Stream = resp.Stream;
+
+            return result;
+        }
+
+        public void UpdateProperties(string repositoryId, ref string objectId, ref string changeToken, IProperties properties,
+            IExtensionsData extension)
+        {
+            // we need an object id
+            if (objectId == null || objectId.Length == 0)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamChangeToken, changeToken);
+
+            // set up object and writer
+            cmisObjectType cmisObject = new cmisObjectType();
+            cmisObject.properties = Converter.Convert(properties);
+
+            AtomEntryWriter entryWriter = new AtomEntryWriter(cmisObject);
+
+            // update
+            HttpUtils.Response resp = Put(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse new entry
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // we expect a CMIS entry
+            if (entry.Id == null)
+            {
+                throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
+            }
+
+            // set object id
+            objectId = entry.Id;
+            changeToken = null;
+
+            LockLinks();
+            try
+            {
+                // clean up cache
+                RemoveLinks(repositoryId, entry.Id);
+
+                // walk through the entry
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.Object is cmisObjectType)
+                    {
+                        // extract new change token
+                        cmisObject = (cmisObjectType)element.Object;
+                        if (cmisObject.properties != null)
+                        {
+                            foreach (cmisProperty property in cmisObject.properties.Items)
+                            {
+                                if (PropertyIds.ChangeToken == property.propertyDefinitionId && property is cmisPropertyString)
+                                {
+                                    cmisPropertyString changeTokenProperty = (cmisPropertyString)property;
+                                    if (changeTokenProperty.value != null && changeTokenProperty.value.Length > 0)
+                                    {
+                                        changeToken = changeTokenProperty.value[0];
+                                    }
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            finally
+            {
+                UnlockLinks();
+            }
+        }
+
+        public void MoveObject(string repositoryId, ref string objectId, string targetFolderId, string sourceFolderId,
+            IExtensionsData extension)
+        {
+            if (objectId == null || objectId.Length == 0)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            if (targetFolderId == null || targetFolderId.Length == 0 || sourceFolderId == null || sourceFolderId.Length == 0)
+            {
+                throw new CmisInvalidArgumentException("Source and target folder must be set!");
+            }
+
+            // find the link
+            String link = LoadLink(repositoryId, targetFolderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, targetFolderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamSourceFolderId, sourceFolderId);
+
+            // set up object and writer
+            AtomEntryWriter entryWriter = new AtomEntryWriter(CreateIdObject(objectId));
+
+            // post move request
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse the response
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            objectId = entry.Id;
+        }
+
+        public void DeleteObject(string repositoryId, string objectId, bool? allVersions, IExtensionsData extension)
+        {
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamAllVersions, allVersions);
+
+            Delete(url);
+        }
+
+        public IFailedToDeleteData DeleteTree(string repositoryId, string folderId, bool? allVersions, UnfileObject? unfileObjects,
+            bool? continueOnFailure, ExtensionsData extension)
+        {
+            // find the link
+            String link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeDescendants);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeDescendants);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamAllVersions, allVersions);
+            url.AddParameter(AtomPubConstants.ParamUnfildeObjects, unfileObjects);
+            url.AddParameter(AtomPubConstants.ParamContinueOnFailure, continueOnFailure);
+
+            // make the call
+            HttpUtils.Response resp = HttpUtils.InvokeDELETE(url, Session);
+
+            // check response code
+            if (resp.StatusCode == HttpStatusCode.OK || resp.StatusCode == HttpStatusCode.Accepted || resp.StatusCode == HttpStatusCode.NoContent)
+            {
+                return new FailedToDeleteData();
+            }
+
+            throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+        }
+
+        public void SetContentStream(string repositoryId, ref string objectId, bool? overwriteFlag, ref string changeToken,
+            IContentStream contentStream, IExtensionsData extension)
+        {
+            if (objectId == null)
+            {
+                throw new CmisInvalidArgumentException("Object ID must be set!");
+            }
+
+            // we need content
+            if (contentStream == null || contentStream.Stream == null || contentStream.MimeType == null)
+            {
+                throw new CmisInvalidArgumentException("Content must be set!");
+            }
+
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelEditMedia, null);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelEditMedia, null);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamChangeToken, changeToken);
+            url.AddParameter(AtomPubConstants.ParamOverwriteFlag, overwriteFlag);
+
+            HttpUtils.Output output = delegate(Stream stream)
+            {
+                int b;
+                byte[] buffer = new byte[4096];
+                while ((b = contentStream.Stream.Read(buffer, 0, buffer.Length)) > -1)
+                {
+                    stream.Write(buffer, 0, b);
+                }
+
+                contentStream.Stream.Close();
+            };
+
+            // send content
+            HttpUtils.Response resp = HttpUtils.InvokePUT(url, contentStream.MimeType, output, Session);
+
+            // check response code
+            if (resp.StatusCode != HttpStatusCode.OK && resp.StatusCode != HttpStatusCode.Created && resp.StatusCode != HttpStatusCode.NoContent)
+            {
+                throw ConvertStatusCode(resp.StatusCode, resp.Message, resp.ErrorContent, null);
+            }
+
+            objectId = null;
+            changeToken = null;
+        }
+
+        public void DeleteContentStream(string repositoryId, ref string objectId, ref string changeToken, IExtensionsData extension)
+        {
+            if (objectId == null)
+            {
+                throw new CmisInvalidArgumentException("Object ID must be set!");
+            }
+
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelEditMedia, null);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelEditMedia, null);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            if (changeToken != null)
+            {
+                url.AddParameter(AtomPubConstants.ParamChangeToken, changeToken);
+            }
+
+            Delete(url);
+
+            objectId = null;
+            changeToken = null;
+        }
+
+        // ---- internal ---
+
+        private void CheckCreateProperties(IProperties properties)
+        {
+            if (properties == null || properties.PropertyList == null)
+            {
+                throw new CmisInvalidArgumentException("Properties must be set!");
+            }
+
+            if (properties[PropertyIds.ObjectTypeId] == null)
+            {
+                throw new CmisInvalidArgumentException("Property " + PropertyIds.ObjectTypeId + " must be set!");
+            }
+
+            if (properties[PropertyIds.ObjectId] != null)
+            {
+                throw new CmisInvalidArgumentException("Property " + PropertyIds.ObjectId + " must not be set!");
+            }
+        }
+
+        private void HandleAclModifications(String repositoryId, AtomEntry entry, IAcl addAces, IAcl removeAces)
+        {
+            if (!IsAclMergeRequired(addAces, removeAces))
+            {
+                return;
+            }
+
+            IAcl originalAces = null;
+
+            // walk through the entry and find the current ACL
+            foreach (AtomElement element in entry.GetElements())
+            {
+                if (element.Object is cmisObjectType)
+                {
+                    // extract current ACL
+                    cmisObjectType cmisObject = (cmisObjectType)element.Object;
+                    originalAces = Converter.Convert(cmisObject.acl, cmisObject.exactACLSpecified ? (bool?)cmisObject.exactACL : null);
+
+                    break;
+                }
+            }
+
+            if (originalAces != null)
+            {
+                // merge and update ACL
+                IAcl newACL = MergeAcls(originalAces, addAces, removeAces);
+                if (newACL != null)
+                {
+                    UpdateAcl(repositoryId, entry.Id, newACL, null);
+                }
+            }
+        }
+    }
+
+    internal class VersioningService : AbstractAtomPubService, IVersioningService
+    {
+        public VersioningService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public void CheckOut(string repositoryId, ref string objectId, IExtensionsData extension, out bool? contentCopied)
+        {
+            if (objectId == null || objectId.Length == 0)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            // find the link
+            String link = LoadCollection(repositoryId, AtomPubConstants.CollectionCheckedout);
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or checkedout collection not supported!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+            // set up object and writer
+            AtomEntryWriter entryWriter = new AtomEntryWriter(CreateIdObject(objectId));
+
+            // post move request
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse the response
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            objectId = entry.Id;
+
+            LockLinks();
+            try
+            {
+                // clean up cache
+                RemoveLinks(repositoryId, entry.Id);
+
+                // walk through the entry
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                }
+            }
+            finally
+            {
+                UnlockLinks();
+            }
+
+            contentCopied = null;
+        }
+
+        public void CancelCheckOut(string repositoryId, string objectId, IExtensionsData extension)
+        {
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+            }
+
+            Delete(new UrlBuilder(link));
+        }
+
+        public void CheckIn(string repositoryId, ref string objectId, bool? major, IProperties properties,
+            IContentStream contentStream, string checkinComment, List<string> policies, IAcl addAces, IAcl removeAces,
+            IExtensionsData extension)
+        {
+            // we need an object id
+            if (objectId == null || objectId.Length == 0)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelSelf, AtomPubConstants.MediatypeEntry);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamCheckinComment, checkinComment);
+            url.AddParameter(AtomPubConstants.ParamMajor, major);
+            url.AddParameter(AtomPubConstants.ParamCheckIn, "true");
+
+            // set up object and writer
+            cmisObjectType cmisObject = new cmisObjectType();
+            cmisObject.properties = Converter.Convert(properties);
+            cmisObject.policyIds = Converter.ConvertPolicies(policies);
+
+            if (cmisObject.properties == null)
+            {
+                cmisObject.properties = new cmisPropertiesType();
+            }
+
+            string mediaType = null;
+            Stream stream = null;
+
+            if (contentStream != null)
+            {
+                mediaType = contentStream.MimeType;
+                stream = contentStream.Stream;
+            }
+
+            AtomEntryWriter entryWriter = new AtomEntryWriter(cmisObject, mediaType, stream);
+
+            // update
+            HttpUtils.Response resp = Put(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+
+            // parse new entry
+            AtomEntry entry = Parse<AtomEntry>(resp.Stream);
+
+            // we expect a CMIS entry
+            if (entry.Id == null)
+            {
+                throw new CmisConnectionException("Received Atom entry is not a CMIS entry!");
+            }
+
+            // set object id
+            objectId = entry.Id;
+
+            IAcl originalAces = null;
+
+            LockLinks();
+            try
+            {
+                // clean up cache
+                RemoveLinks(repositoryId, entry.Id);
+
+                // walk through the entry
+                foreach (AtomElement element in entry.GetElements())
+                {
+                    if (element.Object is AtomLink)
+                    {
+                        AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                    }
+                    else if (element.Object is cmisObjectType)
+                    {
+                        // extract current ACL
+                        cmisObject = (cmisObjectType)element.Object;
+                        originalAces = Converter.Convert(cmisObject.acl, cmisObject.exactACLSpecified ? (bool?)cmisObject.exactACL : null);
+                    }
+                }
+            }
+            finally
+            {
+                UnlockLinks();
+            }
+
+            // handle ACL modifications
+            if ((originalAces != null) && (IsAclMergeRequired(addAces, removeAces)))
+            {
+                // merge and update ACL
+                IAcl newACL = MergeAcls(originalAces, addAces, removeAces);
+                if (newACL != null)
+                {
+                    UpdateAcl(repositoryId, entry.Id, newACL, null);
+                }
+            }
+        }
+
+        public IObjectData GetObjectOfLatestVersion(string repositoryId, string objectId, string versionSeriesId, bool major,
+            string filter, bool? includeAllowableActions, IncludeRelationships? includeRelationships,
+            string renditionFilter, bool? includePolicyIds, bool? includeAcl, IExtensionsData extension)
+        {
+            ReturnVersion returnVersion = ReturnVersion.Latest;
+            if (major)
+            {
+                returnVersion = ReturnVersion.LatestMajor;
+            }
+
+            return GetObjectInternal(repositoryId, IdentifierType.Id, objectId, returnVersion, filter,
+                    includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds, includeAcl, extension);
+        }
+
+        public IProperties GetPropertiesOfLatestVersion(string repositoryId, string objectId, string versionSeriesId, bool major,
+            string filter, IExtensionsData extension)
+        {
+            ReturnVersion returnVersion = ReturnVersion.Latest;
+            if (major)
+            {
+                returnVersion = ReturnVersion.LatestMajor;
+            }
+
+            IObjectData objectData = GetObjectInternal(repositoryId, IdentifierType.Id, objectId, returnVersion, filter,
+                    false, IncludeRelationships.None, "cmis:none", false, false, extension);
+
+            return objectData.Properties;
+        }
+
+        public IList<IObjectData> GetAllVersions(string repositoryId, string objectId, string versionSeriesId, string filter,
+            bool? includeAllowableActions, IExtensionsData extension)
+        {
+            IList<IObjectData> result = new List<IObjectData>();
+
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelVersionHistory, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelVersionHistory, AtomPubConstants.MediatypeFeed);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // get the versions
+            if (feed.GetEntries().Count > 0)
+            {
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectData version = null;
+
+                    LockLinks();
+                    try
+                    {
+                        // clean up cache
+                        RemoveLinks(repositoryId, entry.Id);
+
+                        // walk through the entry
+                        foreach (AtomElement element in entry.GetElements())
+                        {
+                            if (element.Object is AtomLink)
+                            {
+                                AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                            }
+                            else if (element.Object is cmisObjectType)
+                            {
+                                version = Converter.Convert((cmisObjectType)element.Object);
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        UnlockLinks();
+                    }
+
+                    if (version != null)
+                    {
+                        result.Add(version);
+                    }
+                }
+            }
+
+            return result;
+        }
+    }
+
+    internal class RelationshipService : AbstractAtomPubService, IRelationshipService
+    {
+        public RelationshipService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public IObjectList GetObjectRelationships(string repositoryId, string objectId, bool? includeSubRelationshipTypes,
+            RelationshipDirection? relationshipDirection, string typeId, string filter, bool? includeAllowableActions,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            ObjectList result = new ObjectList();
+
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelRelationships, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelRelationships, AtomPubConstants.MediatypeFeed);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamSubRelationshipTypes, includeSubRelationshipTypes);
+            url.AddParameter(AtomPubConstants.ParamRelationshipDirection, relationshipDirection);
+            url.AddParameter(AtomPubConstants.ParamTypeId, typeId);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamAllowableActions, includeAllowableActions);
+            url.AddParameter(AtomPubConstants.ParamMaxItems, maxItems);
+            url.AddParameter(AtomPubConstants.ParamSkipCount, skipCount);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // handle top level
+            foreach (AtomElement element in feed.GetElements())
+            {
+                if (element.Object is AtomLink)
+                {
+                    if (IsNextLink(element))
+                    {
+                        result.HasMoreItems = true;
+                    }
+                }
+                else if (IsInt(NameNumItems, element))
+                {
+                    result.NumItems = (long)element.Object;
+                }
+            }
+
+            // get the children
+            if (feed.GetEntries().Count > 0)
+            {
+                result.Objects = new List<IObjectData>(feed.GetEntries().Count);
+
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectData relationship = null;
+
+                    LockLinks();
+                    try
+                    {
+                        // clean up cache
+                        RemoveLinks(repositoryId, entry.Id);
+
+                        // walk through the entry
+                        foreach (AtomElement element in entry.GetElements())
+                        {
+                            if (element.Object is AtomLink)
+                            {
+                                AddLink(repositoryId, entry.Id, (AtomLink)element.Object);
+                            }
+                            else if (element.Object is cmisObjectType)
+                            {
+                                relationship = Converter.Convert((cmisObjectType)element.Object);
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        UnlockLinks();
+                    }
+
+                    if (relationship != null)
+                    {
+                        result.Objects.Add(relationship);
+                    }
+                }
+            }
+
+            return result;
+        }
+    }
+
+    internal class DiscoveryService : AbstractAtomPubService, IDiscoveryService
+    {
+        public DiscoveryService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public IObjectList Query(string repositoryId, string statement, bool? searchAllVersions,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            ObjectList result = new ObjectList();
+
+            // find the link
+            String link = LoadCollection(repositoryId, AtomPubConstants.CollectionQuery);
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or query not supported!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+            // compile query request
+            AtomQueryWriter queryWriter = new AtomQueryWriter(statement, searchAllVersions, includeAllowableActions,
+                includeRelationships, renditionFilter, maxItems, skipCount);
+
+            // post the query and parse results
+            HttpUtils.Response resp = Post(url, AtomPubConstants.MediatypeQuery, new HttpUtils.Output(queryWriter.Write));
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // handle top level
+            foreach (AtomElement element in feed.GetElements())
+            {
+                if (element.Object is AtomLink)
+                {
+                    if (IsNextLink(element))
+                    {
+                        result.HasMoreItems = true;
+                    }
+                }
+                else if (IsInt(NameNumItems, element))
+                {
+                    result.NumItems = (long)element.Object;
+                }
+            }
+
+            // get the result set
+            if (feed.GetEntries().Count > 0)
+            {
+                result.Objects = new List<IObjectData>(feed.GetEntries().Count);
+
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectData hit = null;
+
+                    // walk through the entry
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is cmisObjectType)
+                        {
+                            hit = Converter.Convert((cmisObjectType)element.Object);
+                        }
+                    }
+
+                    if (hit != null)
+                    {
+                        result.Objects.Add(hit);
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        public IObjectList GetContentChanges(string repositoryId, ref string changeLogToken, bool? includeProperties,
+           string filter, bool? includePolicyIds, bool? includeAcl, long? maxItems, IExtensionsData extension)
+        {
+            ObjectList result = new ObjectList();
+
+            // find the link
+            String link = LoadRepositoryLink(repositoryId, AtomPubConstants.RepRelChanges);
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or content changes not supported!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamChangeLogToken, changeLogToken);
+            url.AddParameter(AtomPubConstants.ParamProperties, includeProperties);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+            url.AddParameter(AtomPubConstants.ParamPolicyIds, includePolicyIds);
+            url.AddParameter(AtomPubConstants.ParamACL, includeAcl);
+            url.AddParameter(AtomPubConstants.ParamMaxItems, maxItems);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // handle top level
+            foreach (AtomElement element in feed.GetElements())
+            {
+                if (element.Object is AtomLink)
+                {
+                    if (IsNextLink(element))
+                    {
+                        result.HasMoreItems = true;
+                    }
+                }
+                else if (IsInt(NameNumItems, element))
+                {
+                    result.NumItems = (long)element.Object;
+                }
+            }
+
+            // get the changes
+            if (feed.GetEntries().Count > 0)
+            {
+                result.Objects = new List<IObjectData>(feed.GetEntries().Count);
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectData hit = null;
+
+                    // walk through the entry
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is cmisObjectType)
+                        {
+                            hit = Converter.Convert((cmisObjectType)element.Object);
+                        }
+                    }
+
+                    if (hit != null)
+                    {
+                        result.Objects.Add(hit);
+                    }
+                }
+            }
+
+            return result;
+        }
+    }
+
+    internal class MultiFilingService : AbstractAtomPubService, IMultiFilingService
+    {
+        public MultiFilingService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public void AddObjectToFolder(string repositoryId, string objectId, string folderId, bool? allVersions, IExtensionsData extension)
+        {
+            if (objectId == null)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            // find the link
+            string link = LoadLink(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, folderId, AtomPubConstants.RelDown, AtomPubConstants.MediatypeChildren);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamAllVersions, allVersions);
+
+            // set up object and writer
+            AtomEntryWriter entryWriter = new AtomEntryWriter(CreateIdObject(objectId));
+
+            // post addObjectToFolder request
+            Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+        }
+
+        public void RemoveObjectFromFolder(string repositoryId, string objectId, string folderId, IExtensionsData extension)
+        {
+            if (objectId == null)
+            {
+                throw new CmisInvalidArgumentException("Object id must be set!");
+            }
+
+            // find the link
+            string link = LoadCollection(repositoryId, AtomPubConstants.CollectionUnfiled);
+
+            if (link == null)
+            {
+                throw new CmisObjectNotFoundException("Unknown repository or unfiling not supported!");
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamRemoveFrom, folderId);
+
+            // set up object and writer
+            AtomEntryWriter entryWriter = new AtomEntryWriter(CreateIdObject(objectId));
+
+            // post removeObjectFromFolder request
+            Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+        }
+    }
+
+    internal class AclService : AbstractAtomPubService, IAclService
+    {
+        public AclService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public IAcl GetAcl(string repositoryId, string objectId, bool? onlyBasicPermissions, IExtensionsData extension)
+        {
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelACL, AtomPubConstants.MediatypeACL);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelACL, AtomPubConstants.MediatypeACL);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamOnlyBasicPermissions, onlyBasicPermissions);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomAcl acl = Parse<AtomAcl>(resp.Stream);
+
+            return Converter.Convert(acl.ACL, null);
+        }
+
+        public IAcl ApplyAcl(string repositoryId, string objectId, IAcl addAces, IAcl removeAces, AclPropagation? aclPropagation,
+            IExtensionsData extension)
+        {
+            IAcl result = null;
+
+            // fetch the current ACL
+            IAcl originalAces = GetAcl(repositoryId, objectId, false, null);
+
+            // if no changes required, just return the ACL
+            if (!IsAclMergeRequired(addAces, removeAces))
+            {
+                return originalAces;
+            }
+
+            // merge ACLs
+            IAcl newACL = MergeAcls(originalAces, addAces, removeAces);
+
+            // update ACL
+            AtomAcl acl = UpdateAcl(repositoryId, objectId, newACL, aclPropagation);
+            result = Converter.Convert(acl.ACL, null);
+
+            return result;
+        }
+    }
+
+    internal class PolicyService : AbstractAtomPubService, IPolicyService
+    {
+        public PolicyService(BindingSession session)
+        {
+            Session = session;
+        }
+
+        public void ApplyPolicy(string repositoryId, string policyId, string objectId, IExtensionsData extension)
+        {
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelPolicies, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelPolicies, AtomPubConstants.MediatypeFeed);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+
+            // set up object and writer
+            AtomEntryWriter entryWriter = new AtomEntryWriter(CreateIdObject(objectId));
+
+            // post applyPolicy request
+            Post(url, AtomPubConstants.MediatypeEntry, new HttpUtils.Output(entryWriter.Write));
+        }
+
+        public void RemovePolicy(string repositoryId, string policyId, string objectId, IExtensionsData extension)
+        {
+            // we need a policy id
+            if (policyId == null || policyId.Length == 0)
+            {
+                throw new CmisInvalidArgumentException("Policy id must be set!");
+            }
+
+            // find the link
+            String link = LoadLink(repositoryId, objectId, AtomPubConstants.RelPolicies, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelPolicies, AtomPubConstants.MediatypeFeed);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFilter, PropertyIds.ObjectId);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // find the policy
+            string policyLink = null;
+            bool found = false;
+
+            if (feed.GetEntries().Count > 0)
+            {
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    // walk through the entry
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is AtomLink)
+                        {
+                            AtomLink atomLink = (AtomLink)element.Object;
+                            if (AtomPubConstants.RelSelf == atomLink.Rel)
+                            {
+                                policyLink = atomLink.Href;
+                            }
+                        }
+                        else if (element.Object is cmisObjectType)
+                        {
+                            string id = FindIdProperty((cmisObjectType)element.Object);
+                            if (policyId == id)
+                            {
+                                found = true;
+                            }
+                        }
+                    }
+
+                    if (found)
+                    {
+                        break;
+                    }
+                }
+            }
+
+            // if found, delete it
+            if (found && policyLink != null)
+            {
+                Delete(new UrlBuilder(policyLink));
+            }
+        }
+
+        public IList<IObjectData> GetAppliedPolicies(string repositoryId, string objectId, string filter, IExtensionsData extension)
+        {
+            IList<IObjectData> result = new List<IObjectData>();
+
+            // find the link
+            string link = LoadLink(repositoryId, objectId, AtomPubConstants.RelPolicies, AtomPubConstants.MediatypeFeed);
+
+            if (link == null)
+            {
+                ThrowLinkException(repositoryId, objectId, AtomPubConstants.RelPolicies, AtomPubConstants.MediatypeFeed);
+            }
+
+            UrlBuilder url = new UrlBuilder(link);
+            url.AddParameter(AtomPubConstants.ParamFilter, filter);
+
+            // read and parse
+            HttpUtils.Response resp = Read(url);
+            AtomFeed feed = Parse<AtomFeed>(resp.Stream);
+
+            // get the policies
+            if (feed.GetEntries().Count > 0)
+            {
+                foreach (AtomEntry entry in feed.GetEntries())
+                {
+                    IObjectData policy = null;
+
+                    // walk through the entry
+                    foreach (AtomElement element in entry.GetElements())
+                    {
+                        if (element.Object is cmisObjectType)
+                        {
+                            policy = Converter.Convert((cmisObjectType)element.Object);
+                        }
+                    }
+
+                    if (policy != null)
+                    {
+                        result.Add(policy);
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        private string FindIdProperty(cmisObjectType cmisObject)
+        {
+            if (cmisObject == null || cmisObject.properties == null)
+            {
+                return null;
+            }
+
+            foreach (cmisProperty property in cmisObject.properties.Items)
+            {
+                if (PropertyIds.ObjectId == property.propertyDefinitionId && property is cmisPropertyId)
+                {
+                    string[] values = ((cmisPropertyId)property).value;
+                    if (values.Length == 1)
+                    {
+                        return values[0];
+                    }
+                }
+            }
+
+            return null;
+        }
+    }
+}
diff --git a/DotCMIS/binding/binding-caches.cs b/DotCMIS/binding/binding-caches.cs
new file mode 100644
index 0000000..2ee5f23
--- /dev/null
+++ b/DotCMIS/binding/binding-caches.cs
@@ -0,0 +1,662 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using DotCMIS.Binding.Impl;
+using DotCMIS.Data;
+
+namespace DotCMIS.Binding
+{
+    // --- base cache implementation ---
+
+    internal interface ICache
+    {
+        void Initialize(string[] cacheLevelConfig);
+
+        void Put(string[] keys, object value);
+
+        object Get(string[] keys);
+
+        void Remove(string[] keys);
+
+        int Check(string[] keys);
+
+        void Lock();
+
+        void Unlock();
+    }
+
+    internal interface ICacheLevel
+    {
+        void Initialize(IDictionary<string, string> cacheLevelConfig);
+
+        object this[string key] { get; set; }
+
+        void Remove(string key);
+    }
+
+    internal class Cache : ICache
+    {
+        private IList<Type> cacheLevels;
+        private IList<IDictionary<string, string>> cacheLevelParameters;
+        private ICacheLevel root;
+        private string name;
+        private object cacheLock = new object();
+ 
+        public Cache()
+            : this("Cache")
+        {
+        }
+
+        public Cache(string name)
+        {
+            this.name = name;
+        }
+
+        public void Initialize(string[] cacheLevelConfig)
+        {
+            if (cacheLevels != null)
+            {
+                throw new ApplicationException("Cache already initialize!");
+            }
+
+            if ((cacheLevelConfig == null) || (cacheLevelConfig.Length == 0))
+            {
+                throw new ArgumentException("Cache config must not be empty!");
+            }
+
+            Lock();
+            try
+            {
+                cacheLevels = new List<Type>();
+                cacheLevelParameters = new List<IDictionary<string, string>>();
+
+                // build level lists
+                foreach (string config in cacheLevelConfig)
+                {
+                    int x = config.IndexOf(' ');
+                    if (x == -1)
+                    {
+                        AddLevel(config, null);
+                    }
+                    else
+                    {
+                        AddLevel(config.Substring(0, x), config.Substring(x + 1));
+                    }
+                }
+
+                root = CreateCacheLevel(0);
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public void Put(string[] keys, object value)
+        {
+            if (keys == null) { return; }
+
+            if (keys.Length != cacheLevels.Count)
+            {
+                throw new ArgumentException("Wrong number of keys!");
+            }
+
+            Lock();
+            try
+            {
+                ICacheLevel cacheLevel = root;
+
+                // follow the branch
+                for (int i = 0; i < keys.Length - 1; i++)
+                {
+                    object level = cacheLevel[keys[i]];
+
+                    // does the branch exist?
+                    if (level == null)
+                    {
+                        level = CreateCacheLevel(i + 1);
+                        cacheLevel[keys[i]] = level;
+                    }
+
+                    // next level
+                    cacheLevel = (ICacheLevel)level;
+                }
+
+                cacheLevel[keys[keys.Length - 1]] = value;
+
+                Trace.WriteLine(name + ": put [" + GetFormattedKeys(keys) + "] = " + value);
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public object Get(string[] keys)
+        {
+            if (keys == null) { return null; }
+
+            if (keys.Length != cacheLevels.Count)
+            {
+                throw new ArgumentException("Wrong number of keys!");
+            }
+
+            object result = null;
+
+            Lock();
+            try
+            {
+                ICacheLevel cacheLevel = root;
+
+                // follow the branch
+                for (int i = 0; i < keys.Length - 1; i++)
+                {
+                    object level = cacheLevel[keys[i]];
+
+                    // does the branch exist?
+                    if (level == null) { return null; }
+
+                    // next level
+                    cacheLevel = (ICacheLevel)level;
+                }
+
+                // get the value
+                result = cacheLevel[keys[keys.Length - 1]];
+            }
+            finally
+            {
+                Unlock();
+            }
+
+            return result;
+        }
+
+        public void Remove(string[] keys)
+        {
+            if (keys == null) { return; }
+
+            Lock();
+            try
+            {
+                ICacheLevel cacheLevel = root;
+
+                // follow the branch
+                for (int i = 0; i < keys.Length - 1; i++)
+                {
+                    object level = cacheLevel[keys[i]];
+
+                    // does the branch exist?
+                    if (level == null) { return; }
+
+                    // next level
+                    cacheLevel = (ICacheLevel)level;
+                }
+
+                cacheLevel.Remove(keys[keys.Length - 1]);
+
+                Trace.WriteLine(name + ": removed [" + GetFormattedKeys(keys) + "]");
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public int Check(string[] keys)
+        {
+            if (keys == null) { return -1; }
+
+            Lock();
+            try
+            {
+                ICacheLevel cacheLevel = root;
+
+                // follow the branch
+                for (int i = 0; i < keys.Length - 1; i++)
+                {
+                    object level = cacheLevel[keys[i]];
+
+                    // does the branch exist?
+                    if (level == null) { return i; }
+
+                    // next level
+                    cacheLevel = (ICacheLevel)level;
+                }
+
+                return keys.Length;
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public void Lock()
+        {
+            Monitor.Enter(cacheLock);
+        }
+
+        public void Unlock()
+        {
+            Monitor.Exit(cacheLock);
+        }
+
+        // --- internal ---
+
+        private void AddLevel(string typeName, string parameters)
+        {
+            Type levelType;
+
+            try
+            {
+                levelType = Type.GetType(typeName);
+            }
+            catch (Exception e)
+            {
+                throw new ArgumentException("Class '" + typeName + "' not found!", e);
+            }
+
+            if (!typeof(ICacheLevel).IsAssignableFrom(levelType))
+            {
+                throw new ArgumentException("Class '" + typeName + "' does not implement the ICacheLevel interface!");
+            }
+
+            cacheLevels.Add(levelType);
+
+            // process parameters
+            if (parameters == null)
+            {
+                cacheLevelParameters.Add(null);
+            }
+            else
+            {
+                Dictionary<string, string> parameterDict = new Dictionary<string, string>();
+                cacheLevelParameters.Add(parameterDict);
+
+                foreach (string pair in parameters.Split(','))
+                {
+                    string[] keyValue = pair.Split('=');
+                    if (keyValue.Length == 1)
+                    {
+                        parameterDict[keyValue[0]] = "";
+                    }
+                    else
+                    {
+                        parameterDict[keyValue[0]] = keyValue[1];
+                    }
+                }
+            }
+        }
+
+        private ICacheLevel CreateCacheLevel(int level)
+        {
+            if ((level < 0) || (level >= cacheLevels.Count))
+            {
+                throw new ArgumentException("Cache level doesn't fit the configuration!");
+            }
+
+            // get the class and create an instance
+            Type levelType = cacheLevels[level];
+            ICacheLevel cacheLevel = null;
+            try
+            {
+                cacheLevel = (ICacheLevel)Activator.CreateInstance(levelType);
+            }
+            catch (Exception e)
+            {
+                throw new ArgumentException("Cache level problem?!", e);
+            }
+
+            // initialize it
+            cacheLevel.Initialize(cacheLevelParameters[level]);
+
+            return cacheLevel;
+        }
+
+        private string GetFormattedKeys(string[] keys)
+        {
+            StringBuilder sb = new StringBuilder();
+            foreach (string k in keys)
+            {
+                if (sb.Length > 0)
+                {
+                    sb.Append(", ");
+                }
+                sb.Append(k);
+            }
+
+            return sb.ToString();
+        }
+    }
+
+    internal abstract class AbstractDictionaryCacheLevel : ICacheLevel
+    {
+        private static string NullKey = "";
+
+        private IDictionary<string, object> dict;
+        private bool fallbackEnabled = false;
+        private string fallbackKey = null;
+        private bool singleValueEnabled = false;
+
+        public abstract void Initialize(IDictionary<string, string> cacheLevelConfig);
+
+        public virtual object this[string key]
+        {
+            get
+            {
+                object value = null;
+                if (dict.TryGetValue(key == null ? NullKey : key, out value))
+                {
+                    return value;
+                }
+
+                if (fallbackEnabled && dict.TryGetValue(fallbackKey, out value))
+                {
+                    return value;
+                }
+
+                if (singleValueEnabled && dict.Count == 1)
+                {
+                    value = dict.Values.First();
+                }
+
+                return value;
+            }
+            set
+            {
+                if (value != null)
+                {
+                    dict[key == null ? NullKey : key] = value;
+                }
+            }
+        }
+
+        public virtual void Remove(string key)
+        {
+            dict.Remove(key);
+        }
+
+        public void SetDictionary(IDictionary<string, object> dict)
+        {
+            this.dict = dict;
+        }
+
+        protected void EnableKeyFallback(string key)
+        {
+            fallbackKey = key;
+            fallbackEnabled = true;
+        }
+
+        protected void DisableKeyFallback()
+        {
+            fallbackEnabled = false;
+        }
+
+        protected void EnableSingeValueFallback()
+        {
+            singleValueEnabled = true;
+        }
+
+        protected void DisableSingeValueFallback()
+        {
+            singleValueEnabled = false;
+        }
+
+        protected int GetIntParameter(IDictionary<string, string> parameters, string name, int defValue)
+        {
+            if (parameters == null)
+            {
+                return defValue;
+            }
+
+            string value;
+            if (!parameters.TryGetValue(name, out value))
+            {
+                return defValue;
+            }
+
+            try
+            {
+                return Int32.Parse(value);
+            }
+            catch (Exception)
+            {
+                return defValue;
+            }
+        }
+
+        protected bool GetBooleanParameter(IDictionary<string, string> parameters, string name, bool defValue)
+        {
+            if (parameters == null)
+            {
+                return defValue;
+            }
+
+            string value;
+            if (!parameters.TryGetValue(name, out value))
+            {
+                return defValue;
+            }
+
+            try
+            {
+                return Boolean.Parse(value);
+            }
+            catch (Exception)
+            {
+                return defValue;
+            }
+        }
+    }
+
+    internal class DictionaryCacheLevel : AbstractDictionaryCacheLevel
+    {
+        public const string Capacity = "capacity";
+        public const string SingleValue = "singleValue";
+
+        public override void Initialize(IDictionary<string, string> parameters)
+        {
+            int initialCapacity = GetIntParameter(parameters, Capacity, 32);
+            bool singleValue = GetBooleanParameter(parameters, SingleValue, false);
+
+            SetDictionary(new Dictionary<string, object>(initialCapacity));
+            if (singleValue)
+            {
+                EnableSingeValueFallback();
+            }
+        }
+    }
+
+    internal class LruCacheLevel : AbstractDictionaryCacheLevel
+    {
+        public const string MaxEntries = "maxEntries";
+
+        private LinkedList<string> keyList;
+        private int maxEntries;
+
+        public override void Initialize(IDictionary<string, string> parameters)
+        {
+            maxEntries = GetIntParameter(parameters, MaxEntries, 100);
+            keyList = new LinkedList<string>();
+            SetDictionary(new Dictionary<string, object>(maxEntries + 1));
+        }
+
+        public override object this[string key]
+        {
+            get
+            {
+                object value = base[key];
+                if (value != null)
+                {
+                    LinkedListNode<string> node = keyList.Find(key);
+                    if (node == null)
+                    {
+                        throw new ApplicationException("Cache error!");
+                    }
+                    else
+                    {
+                        keyList.Remove(node);
+                        keyList.AddFirst(node);
+                    }
+                }
+
+                return value;
+            }
+            set
+            {
+                if (value == null)
+                {
+                    return;
+                }
+
+                LinkedListNode<string> node = keyList.Find(key);
+                if (node == null)
+                {
+                    keyList.AddFirst(key);
+                    while (keyList.Count > maxEntries)
+                    {
+                        LinkedListNode<string> lastNode = keyList.Last;
+                        base.Remove(lastNode.Value);
+                        keyList.RemoveLast();
+                    }
+                }
+                else
+                {
+                    keyList.Remove(node);
+                    keyList.AddFirst(node);
+                }
+
+                base[key] = value;
+            }
+        }
+
+        public override void Remove(string key)
+        {
+            keyList.Remove(key);
+            base.Remove(key);
+        }
+    }
+
+    // ---- Caches ----
+
+    /// <summary>
+    /// Repository Info cache.
+    /// </summary>
+    internal class RepositoryInfoCache
+    {
+        private const int CacheSizeRepositories = 10;
+
+        private ICache cache;
+
+        public RepositoryInfoCache(BindingSession session)
+        {
+            int repCount = session.GetValue(SessionParameter.CacheSizeRepositories, CacheSizeRepositories);
+            if (repCount < 1)
+            {
+                repCount = CacheSizeRepositories;
+            }
+
+            cache = new Cache("Repository Info Cache");
+            cache.Initialize(new string[] { 
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount });
+        }
+
+        public void Put(IRepositoryInfo repositoryInfo)
+        {
+            if ((repositoryInfo == null) || (repositoryInfo.Id == null))
+            {
+                return;
+            }
+
+            cache.Put(new string[] { repositoryInfo.Id }, repositoryInfo);
+        }
+
+        public IRepositoryInfo Get(string repositoryId)
+        {
+            return (IRepositoryInfo)cache.Get(new string[] { repositoryId });
+        }
+
+        public void Remove(string repositoryId)
+        {
+            cache.Remove(new string[] { repositoryId });
+        }
+    }
+
+    /// <summary>
+    /// Type Definition cache.
+    /// </summary>
+    internal class TypeDefinitionCache
+    {
+        private const int CacheSizeRepositories = 10;
+        private const int CacheSizeTypes = 100;
+
+        private ICache cache;
+
+        public TypeDefinitionCache(BindingSession session)
+        {
+            int repCount = session.GetValue(SessionParameter.CacheSizeRepositories, CacheSizeRepositories);
+            if (repCount < 1)
+            {
+                repCount = CacheSizeRepositories;
+            }
+
+            int typeCount = session.GetValue(SessionParameter.CacheSizeTypes, CacheSizeTypes);
+            if (typeCount < 1)
+            {
+                typeCount = CacheSizeTypes;
+            }
+
+            cache = new Cache("Type Definition Cache");
+            cache.Initialize(new string[] {
+                typeof(DictionaryCacheLevel).FullName + " " + DictionaryCacheLevel.Capacity + "=" + repCount, // repository
+                typeof(LruCacheLevel).FullName + " " + LruCacheLevel.MaxEntries + "=" + typeCount // type
+        });
+        }
+
+        public void Put(string repositoryId, ITypeDefinition typeDefinition)
+        {
+            if ((typeDefinition == null) || (typeDefinition.Id == null))
+            {
+                return;
+            }
+
+            cache.Put(new string[] { repositoryId, typeDefinition.Id }, typeDefinition);
+        }
+
+        public ITypeDefinition Get(string repositoryId, string typeId)
+        {
+            return (ITypeDefinition)cache.Get(new string[] { repositoryId, typeId });
+        }
+
+        public void Remove(string repositoryId, string typeId)
+        {
+            cache.Remove(new string[] { repositoryId, typeId });
+        }
+
+        public void Remove(string repositoryId)
+        {
+            cache.Remove(new string[] { repositoryId });
+        }
+    }
+}
diff --git a/DotCMIS/binding/binding-impl.cs b/DotCMIS/binding/binding-impl.cs
new file mode 100644
index 0000000..450034a
--- /dev/null
+++ b/DotCMIS/binding/binding-impl.cs
@@ -0,0 +1,604 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DotCMIS.Binding;
+using DotCMIS.Binding.Services;
+using System.Threading;
+using DotCMIS.Exceptions;
+using DotCMIS.Data;
+using DotCMIS.Data.Extensions;
+
+namespace DotCMIS.Binding.Impl
+{
+    /// <summary>
+    /// Binding layer implementation.
+    /// </summary>
+    internal class CmisBinding : ICmisBinding
+    {
+        private BindingSession session;
+        private BindingsObjectFactory objectFactory;
+        private BindingRepositoryService repositoryServiceWrapper;
+
+        public CmisBinding(IDictionary<string, string> sessionParameters)
+        {
+            if (sessionParameters == null)
+            {
+                throw new ArgumentNullException("sessionParameters");
+            }
+
+            if (!sessionParameters.ContainsKey(SessionParameter.BindingSpiClass))
+            {
+                throw new ArgumentException("Session parameters do not contain a SPI class name!");
+            }
+
+            // initialize session
+            session = new BindingSession();
+            foreach (string key in sessionParameters.Keys)
+            {
+                session.PutValue(key, sessionParameters[key]);
+            }
+
+            // set up object factory
+            objectFactory = new BindingsObjectFactory();
+
+            // set up authentication provider
+            string authenticationProviderClass;
+            if (sessionParameters.TryGetValue(SessionParameter.AuthenticationProviderClass, out authenticationProviderClass))
+            {
+                try
+                {
+                    Type authProvType = Type.GetType(authenticationProviderClass);
+                    AbstractAuthenticationProvider authenticationProvider = (AbstractAuthenticationProvider)Activator.CreateInstance(authProvType);
+                    authenticationProvider.Session = session;
+                    session.PutValue(BindingSession.AuthenticationProvider, authenticationProvider);
+                }
+                catch (Exception e)
+                {
+                    throw new CmisRuntimeException("Could not load authentictaion provider: " + e.Message, e);
+                }
+            }
+
+            // initialize the SPI
+            GetSpi();
+
+            // set up caches
+            ClearAllCaches();
+
+            // set up repository service
+            repositoryServiceWrapper = new BindingRepositoryService(session);
+        }
+
+        public IRepositoryService GetRepositoryService()
+        {
+            CheckSession();
+            return repositoryServiceWrapper;
+        }
+
+        public INavigationService GetNavigationService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetNavigationService();
+        }
+
+        public IObjectService GetObjectService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetObjectService();
+        }
+
+        public IVersioningService GetVersioningService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetVersioningService();
+        }
+
+        public IRelationshipService GetRelationshipService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetRelationshipService();
+        }
+
+        public IDiscoveryService GetDiscoveryService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetDiscoveryService();
+        }
+
+        public IMultiFilingService GetMultiFilingService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetMultiFilingService();
+        }
+
+        public IAclService GetAclService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetAclService();
+        }
+
+        public IPolicyService GetPolicyService()
+        {
+            CheckSession();
+            ICmisSpi spi = GetSpi();
+            return spi.GetPolicyService();
+        }
+
+        public IBindingsObjectFactory GetObjectFactory()
+        {
+            return objectFactory;
+        }
+
+        public void ClearAllCaches()
+        {
+            CheckSession();
+
+            session.Lock();
+            try
+            {
+                session.PutValue(BindingSession.RepositoryInfoCache, new RepositoryInfoCache(session));
+                session.PutValue(BindingSession.TypeDefinitionCache, new TypeDefinitionCache(session));
+
+                ICmisSpi spi = GetSpi();
+                spi.ClearAllCaches();
+            }
+            finally
+            {
+                session.Unlock();
+            }
+        }
+
+        public void ClearRepositoryCache(string repositoryId)
+        {
+            CheckSession();
+
+            if (repositoryId == null)
+            {
+                return;
+            }
+
+            session.Lock();
+            try
+            {
+                RepositoryInfoCache repInfoCache = session.GetRepositoryInfoCache();
+                repInfoCache.Remove(repositoryId);
+
+                TypeDefinitionCache typeDefCache = session.GetTypeDefinitionCache();
+                typeDefCache.Remove(repositoryId);
+
+                ICmisSpi spi = GetSpi();
+                spi.ClearRepositoryCache(repositoryId);
+            }
+            finally
+            {
+                session.Unlock();
+            }
+        }
+
+        public void Close()
+        {
+            CheckSession();
+
+            session.Lock();
+            try
+            {
+                GetSpi().Close();
+            }
+            finally
+            {
+                session.Unlock();
+                session = null;
+            }
+        }
+
+        private void CheckSession()
+        {
+            if (session == null)
+            {
+                throw new ApplicationException("Already closed.");
+            }
+        }
+
+        private ICmisSpi GetSpi()
+        {
+            return session.GetSpi();
+        }
+    }
+
+    /// <summary>
+    /// Session object implementation of the binding layer.
+    /// </summary>
+    internal class BindingSession : IBindingSession
+    {
+        public const string RepositoryInfoCache = "org.apache.chemistry.dotcmis.bindings.repositoryInfoCache";
+        public const string TypeDefinitionCache = "org.apache.chemistry.dotcmis.bindings.typeDefintionCache";
+        public const string AuthenticationProvider = "org.apache.chemistry.dotcmis.bindings.authenticationProvider";
+        public const string SpiObject = "org.apache.chemistry.dotcmis.bindings.spi.object";
+
+        private Dictionary<string, object> data;
+        private object sessionLock = new object();
+
+        public BindingSession()
+        {
+            data = new Dictionary<string, object>();
+        }
+
+        public object GetValue(string key)
+        {
+            return GetValue(key, null);
+        }
+
+        public object GetValue(string key, object defValue)
+        {
+            object result = null;
+
+            Lock();
+            try
+            {
+                if (data.TryGetValue(key, out result))
+                {
+                    return result;
+                }
+                else
+                {
+                    return defValue;
+                }
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public int GetValue(string key, int defValue)
+        {
+            object value = GetValue(key);
+
+            try
+            {
+                if (value is string)
+                {
+                    return Int32.Parse((string)value);
+                }
+                else if (value is int)
+                {
+                    return (int)value;
+                }
+            }
+            catch (Exception)
+            {
+            }
+
+            return defValue;
+        }
+
+        public void PutValue(string key, object value)
+        {
+            Lock();
+            try
+            {
+                data[key] = value;
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public void RemoveValue(string key)
+        {
+            Lock();
+            try
+            {
+                data.Remove(key);
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public ICmisSpi GetSpi()
+        {
+            Lock();
+            try
+            {
+                ICmisSpi spi = GetValue(SpiObject) as ICmisSpi;
+                if (spi != null)
+                {
+                    return spi;
+                }
+
+
+                // ok, we have to create it...
+                try
+                {
+                    object spiObject;
+                    if (data.TryGetValue(SessionParameter.BindingSpiClass, out spiObject))
+                    {
+                        string spiClassName = spiObject as string;
+                        if (spiClassName != null)
+                        {
+                            Type spiClass = Type.GetType(spiClassName);
+                            spi = (ICmisSpi)Activator.CreateInstance(spiClass);
+                            spi.initialize(this);
+                        }
+                        else
+                        {
+                            throw new CmisRuntimeException("SPI class is not set!");
+                        }
+                    }
+                    else
+                    {
+                        throw new CmisRuntimeException("SPI class is not set!");
+                    }
+                }
+                catch (CmisBaseException ce)
+                {
+                    throw ce;
+                }
+                catch (Exception e)
+                {
+                    throw new CmisRuntimeException("SPI cannot be initialized: " + e.Message, e);
+                }
+
+                // we have a SPI object -> put it into the session
+                data[SpiObject] = spi;
+
+                return spi;
+            }
+            finally
+            {
+                Unlock();
+            }
+        }
+
+        public RepositoryInfoCache GetRepositoryInfoCache()
+        {
+            return GetValue(RepositoryInfoCache) as RepositoryInfoCache;
+        }
+
+        public TypeDefinitionCache GetTypeDefinitionCache()
+        {
+            return GetValue(TypeDefinitionCache) as TypeDefinitionCache;
+        }
+
+        public AbstractAuthenticationProvider GetAuthenticationProvider()
+        {
+            return GetValue(AuthenticationProvider) as AbstractAuthenticationProvider;
+        }
+
+        public void Lock()
+        {
+            Monitor.Enter(sessionLock);
+        }
+
+        public void Unlock()
+        {
+            Monitor.Exit(sessionLock);
+        }
+
+        public override string ToString()
+        {
+            return data.ToString();
+        }
+    }
+
+    /// <summary>
+    /// Repository service proxy that caches repository infos and type defintions.
+    /// </summary>
+    internal class BindingRepositoryService : IRepositoryService
+    {
+        private BindingSession session;
+
+        public BindingRepositoryService(BindingSession session)
+        {
+            this.session = session;
+        }
+
+        public IList<IRepositoryInfo> GetRepositoryInfos(IExtensionsData extension)
+        {
+            IList<IRepositoryInfo> result = null;
+            bool hasExtension = (extension != null) && (extension.Extensions != null) && (extension.Extensions.Count > 0);
+
+            // get the SPI and fetch the repository infos
+            ICmisSpi spi = session.GetSpi();
+            result = spi.GetRepositoryService().GetRepositoryInfos(extension);
+
+            // put it into the cache
+            if (!hasExtension && (result != null))
+            {
+                RepositoryInfoCache cache = session.GetRepositoryInfoCache();
+                foreach (RepositoryInfo rid in result)
+                {
+                    cache.Put(rid);
+                }
+            }
+
+            return result;
+        }
+
+        public IRepositoryInfo GetRepositoryInfo(string repositoryId, IExtensionsData extension)
+        {
+            IRepositoryInfo result = null;
+            bool hasExtension = (extension != null) && (extension.Extensions != null) && (extension.Extensions.Count > 0);
+
+            RepositoryInfoCache cache = session.GetRepositoryInfoCache();
+
+            // if extension is not set, check the cache first
+            if (!hasExtension)
+            {
+                result = cache.Get(repositoryId);
+                if (result != null)
+                {
+                    return result;
+                }
+            }
+
+            // it was not in the cache -> get the SPI and fetch the repository info
+            ICmisSpi spi = session.GetSpi();
+            result = spi.GetRepositoryService().GetRepositoryInfo(repositoryId, extension);
+
+            // put it into the cache
+            if (!hasExtension)
+            {
+                cache.Put(result);
+            }
+
+            return result;
+        }
+
+        public ITypeDefinitionList GetTypeChildren(string repositoryId, string typeId, bool? includePropertyDefinitions,
+                long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            ITypeDefinitionList result = null;
+            bool hasExtension = (extension != null) && (extension.Extensions != null) && (extension.Extensions.Count > 0);
+
+            // get the SPI and fetch the type definitions
+            ICmisSpi spi = session.GetSpi();
+            result = spi.GetRepositoryService().GetTypeChildren(repositoryId, typeId, includePropertyDefinitions, maxItems,
+                    skipCount, extension);
+
+            // put it into the cache
+            if (!hasExtension && (includePropertyDefinitions ?? false) && (result != null))
+            {
+                TypeDefinitionCache cache = session.GetTypeDefinitionCache();
+                foreach (ITypeDefinition tdd in result.List)
+                {
+                    cache.Put(repositoryId, tdd);
+                }
+            }
+
+            return result;
+        }
+
+        public IList<ITypeDefinitionContainer> GetTypeDescendants(string repositoryId, string typeId, long? depth,
+                bool? includePropertyDefinitions, IExtensionsData extension)
+        {
+            IList<ITypeDefinitionContainer> result = null;
+            bool hasExtension = (extension != null) && (extension.Extensions != null) && (extension.Extensions.Count > 0);
+
+            // get the SPI and fetch the type definitions
+            ICmisSpi spi = session.GetSpi();
+            result = spi.GetRepositoryService().GetTypeDescendants(repositoryId, typeId, depth, includePropertyDefinitions,
+                    extension);
+
+            // put it into the cache
+            if (!hasExtension && (includePropertyDefinitions ?? false) && (result != null))
+            {
+                TypeDefinitionCache cache = session.GetTypeDefinitionCache();
+                AddToTypeCache(cache, repositoryId, result);
+            }
+
+            return result;
+        }
+
+        private void AddToTypeCache(TypeDefinitionCache cache, string repositoryId, IList<ITypeDefinitionContainer> containers)
+        {
+            if (containers == null)
+            {
+                return;
+            }
+
+            foreach (ITypeDefinitionContainer container in containers)
+            {
+                cache.Put(repositoryId, container.TypeDefinition);
+                AddToTypeCache(cache, repositoryId, container.Children);
+            }
+        }
+
+        public ITypeDefinition GetTypeDefinition(string repositoryId, string typeId, IExtensionsData extension)
+        {
+            ITypeDefinition result = null;
+            bool hasExtension = (extension != null) && (extension.Extensions != null) && (extension.Extensions.Count > 0);
+
+            TypeDefinitionCache cache = session.GetTypeDefinitionCache();
+
+            // if extension is not set, check the cache first
+            if (!hasExtension)
+            {
+                result = cache.Get(repositoryId, typeId);
+                if (result != null)
+                {
+                    return result;
+                }
+            }
+
+            // it was not in the cache -> get the SPI and fetch the type definition
+            ICmisSpi spi = session.GetSpi();
+            result = spi.GetRepositoryService().GetTypeDefinition(repositoryId, typeId, extension);
+
+            // put it into the cache
+            if (!hasExtension && (result != null))
+            {
+                cache.Put(repositoryId, result);
+            }
+
+            return result;
+        }
+    }
+
+    /// <summary>
+    /// Object factory implementation.
+    /// </summary>
+    internal class BindingsObjectFactory : IBindingsObjectFactory
+    {
+    }
+
+    /// <summary>
+    /// SPI interface.
+    /// </summary>
+    internal interface ICmisSpi
+    {
+        void initialize(BindingSession session);
+
+        IRepositoryService GetRepositoryService();
+
+        INavigationService GetNavigationService();
+
+        IObjectService GetObjectService();
+
+        IVersioningService GetVersioningService();
+
+        IRelationshipService GetRelationshipService();
+
+        IDiscoveryService GetDiscoveryService();
+
+        IMultiFilingService GetMultiFilingService();
+
+        IAclService GetAclService();
+
+        IPolicyService GetPolicyService();
+
+        void ClearAllCaches();
+
+        void ClearRepositoryCache(string repositoryId);
+
+        void Close();
+    }
+}
diff --git a/DotCMIS/binding/binding-intf.cs b/DotCMIS/binding/binding-intf.cs
new file mode 100644
index 0000000..4efef7c
--- /dev/null
+++ b/DotCMIS/binding/binding-intf.cs
@@ -0,0 +1,296 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DotCMIS.Binding.Services;
+using DotCMIS.Binding.Impl;
+using DotCMIS.CMISWebServicesReference;
+using System.Net;
+
+namespace DotCMIS.Binding
+{
+    public interface ICmisBinding
+    {
+        IRepositoryService GetRepositoryService();
+
+        INavigationService GetNavigationService();
+
+        IObjectService GetObjectService();
+
+        IVersioningService GetVersioningService();
+
+        IRelationshipService GetRelationshipService();
+
+        IDiscoveryService GetDiscoveryService();
+
+        IMultiFilingService GetMultiFilingService();
+
+        IAclService GetAclService();
+
+        IPolicyService GetPolicyService();
+
+        IBindingsObjectFactory GetObjectFactory();
+
+        void ClearAllCaches();
+
+        void ClearRepositoryCache(string repositoryId);
+
+        void Close();
+    }
+
+    public interface IBindingSession
+    {
+        object GetValue(string key);
+
+        object GetValue(string key, object defValue);
+
+        int GetValue(string key, int defValue);
+    }
+
+    public abstract class AbstractAuthenticationProvider
+    {
+        public IBindingSession Session { get; set; }
+
+        public abstract void Authenticate(object connection);
+
+        public string GetUser()
+        {
+            return Session.GetValue(SessionParameter.User) as string;
+        }
+
+        public string GetPassword()
+        {
+            return Session.GetValue(SessionParameter.Password) as string;
+        }
+    }
+
+    public class StandardAuthenticationProvider : AbstractAuthenticationProvider
+    {
+        public override void Authenticate(object connection)
+        {
+            string user = GetUser();
+            string password = GetPassword();
+            if (user == null || password == null)
+            {
+                return;
+            }
+
+            if (connection is RepositoryServicePortClient)
+            {
+                ((RepositoryServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((RepositoryServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is NavigationServicePortClient)
+            {
+                ((NavigationServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((NavigationServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is ObjectServicePortClient)
+            {
+                ((ObjectServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((ObjectServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is VersioningServicePortClient)
+            {
+                ((VersioningServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((VersioningServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is DiscoveryServicePortClient)
+            {
+                ((DiscoveryServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((DiscoveryServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is RelationshipServicePortClient)
+            {
+                ((RelationshipServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((RelationshipServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is MultiFilingServicePortClient)
+            {
+                ((MultiFilingServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((MultiFilingServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is PolicyServicePortClient)
+            {
+                ((PolicyServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((PolicyServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is ACLServicePortClient)
+            {
+                ((ACLServicePortClient)connection).ClientCredentials.UserName.UserName = user;
+                ((ACLServicePortClient)connection).ClientCredentials.UserName.Password = password;
+            }
+            else if (connection is WebRequest)
+            {
+                ((WebRequest)connection).Credentials = new NetworkCredential(user, password);
+            }
+        }
+    }
+
+
+    public interface IBindingsObjectFactory
+    {
+    }
+
+    public class CmisBindingFactory
+    {
+        // Default CMIS AtomPub binding SPI implementation
+        public const string BindingSpiAtomPub = "DotCMIS.Binding.AtomPub.CmisAtomPubSpi";
+        // Default CMIS Web Services binding SPI implementation
+        public const string BindingSpiWebServices = "DotCMIS.Binding.WebServices.CmisWebServicesSpi";
+
+        public const string StandardAuthenticationProviderClass = "DotCMIS.Binding.StandardAuthenticationProvider";
+
+        private IDictionary<string, string> defaults;
+
+        private CmisBindingFactory()
+        {
+            defaults = CreateNewDefaultParameters();
+        }
+
+        public static CmisBindingFactory NewInstance()
+        {
+            return new CmisBindingFactory();
+        }
+
+        public IDictionary<string, string> GetDefaultSessionParameters()
+        {
+            return defaults;
+        }
+
+        public void SetDefaultSessionParameters(IDictionary<string, string> sessionParameters)
+        {
+            if (sessionParameters == null)
+            {
+                defaults = CreateNewDefaultParameters();
+            }
+            else
+            {
+                defaults = sessionParameters;
+            }
+        }
+
+        public ICmisBinding CreateCmisBinding(IDictionary<string, string> sessionParameters)
+        {
+            CheckSessionParameters(sessionParameters, true);
+            AddDefaultParameters(sessionParameters);
+
+            return new CmisBinding(sessionParameters);
+        }
+
+        public ICmisBinding CreateCmisAtomPubBinding(IDictionary<string, string> sessionParameters)
+        {
+            CheckSessionParameters(sessionParameters, false);
+            sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiAtomPub;
+            if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
+            {
+                sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
+            }
+
+            AddDefaultParameters(sessionParameters);
+
+            Check(sessionParameters, SessionParameter.AtomPubUrl);
+
+            return new CmisBinding(sessionParameters);
+        }
+
+        public ICmisBinding CreateCmisWebServicesBinding(IDictionary<string, string> sessionParameters)
+        {
+            CheckSessionParameters(sessionParameters, false);
+            sessionParameters[SessionParameter.BindingSpiClass] = BindingSpiWebServices;
+            if (!sessionParameters.ContainsKey(SessionParameter.AuthenticationProviderClass))
+            {
+                sessionParameters[SessionParameter.AuthenticationProviderClass] = StandardAuthenticationProviderClass;
+            }
+
+            AddDefaultParameters(sessionParameters);
+
+            Check(sessionParameters, SessionParameter.WebServicesAclService);
+            Check(sessionParameters, SessionParameter.WebServicesDiscoveryService);
+            Check(sessionParameters, SessionParameter.WebServicesMultifilingService);
+            Check(sessionParameters, SessionParameter.WebServicesNavigationService);
+            Check(sessionParameters, SessionParameter.WebServicesObjectService);
+            Check(sessionParameters, SessionParameter.WebServicesPolicyService);
+            Check(sessionParameters, SessionParameter.WebServicesRelationshipService);
+            Check(sessionParameters, SessionParameter.WebServicesRepositoryService);
+            Check(sessionParameters, SessionParameter.WebServicesVersioningService);
+
+            return new CmisBinding(sessionParameters);
+        }
+
+        // ---- internals ----
+
+        private void CheckSessionParameters(IDictionary<string, string> sessionParameters, bool mustContainSpi)
+        {
+            // don't accept null
+            if (sessionParameters == null)
+            {
+                throw new ArgumentNullException("sessionParameters");
+            }
+
+            // check binding entry
+            if (mustContainSpi)
+            {
+                string spiClass;
+
+                if (sessionParameters.TryGetValue(SessionParameter.BindingSpiClass, out spiClass))
+                {
+                    throw new ArgumentException("SPI class entry (" + SessionParameter.BindingSpiClass + ") is missing!");
+                }
+
+                if ((spiClass == null) || (spiClass.Trim().Length == 0))
+                {
+                    throw new ArgumentException("SPI class entry (" + SessionParameter.BindingSpiClass + ") is invalid!");
+                }
+            }
+        }
+
+        private void Check(IDictionary<string, string> sessionParameters, String parameter)
+        {
+            if (!sessionParameters.ContainsKey(parameter))
+            {
+                throw new ArgumentException("Parameter '" + parameter + "' is missing!");
+            }
+        }
+
+        private void AddDefaultParameters(IDictionary<string, string> sessionParameters)
+        {
+            foreach (string key in defaults.Keys)
+            {
+                if (!sessionParameters.ContainsKey(key))
+                {
+                    sessionParameters[key] = defaults[key];
+                }
+            }
+        }
+
+        private IDictionary<string, string> CreateNewDefaultParameters()
+        {
+            IDictionary<string, string> result = new Dictionary<string, string>();
+
+            result[SessionParameter.CacheSizeRepositories] = "10";
+            result[SessionParameter.CacheSizeTypes] = "100";
+            result[SessionParameter.CacheSizeLinks] = "400";
+
+            return result;
+        }
+    }
+}
diff --git a/DotCMIS/binding/converter.cs b/DotCMIS/binding/converter.cs
new file mode 100644
index 0000000..9fd836a
--- /dev/null
+++ b/DotCMIS/binding/converter.cs
@@ -0,0 +1,1576 @@
+﻿using DotCMIS.CMISWebServicesReference;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using DotCMIS.Data;
+using DotCMIS.Data.Extensions;
+using System.Collections.Generic;
+using System.Xml;
+using DotCMIS.Enums;
+using System;
+using System.Reflection;
+using System.Xml.Serialization;
+using System.IO;
+
+namespace DotCMIS.Binding
+{
+    internal class Converter
+    {
+        /// <summary>
+        /// Converts a repository info.
+        /// </summary>
+        public static IRepositoryInfo Convert(cmisRepositoryInfoType repositotyInfo)
+        {
+            if (repositotyInfo == null)
+            {
+                return null;
+            }
+
+            RepositoryInfo result = new RepositoryInfo();
+            result.Id = repositotyInfo.repositoryId;
+            result.Name = repositotyInfo.repositoryName;
+            result.Description = repositotyInfo.repositoryDescription;
+            result.VendorName = repositotyInfo.vendorName;
+            result.ProductName = repositotyInfo.productName;
+            result.ProductVersion = repositotyInfo.productVersion;
+            result.RootFolderId = repositotyInfo.rootFolderId;
+            result.Capabilities = Convert(repositotyInfo.capabilities);
+            result.AclCapabilities = Convert(repositotyInfo.aclCapability);
+            result.LatestChangeLogToken = repositotyInfo.latestChangeLogToken;
+            result.CmisVersionSupported = repositotyInfo.cmisVersionSupported;
+            result.ThinClientUri = repositotyInfo.thinClientURI;
+            result.ChangesIncomplete = (repositotyInfo.changesIncompleteSpecified ? (bool?)repositotyInfo.changesIncomplete : null);
+            result.ChangesOnType = new List<BaseTypeId?>();
+            if (repositotyInfo.changesOnType != null)
+            {
+                foreach (enumBaseObjectTypeIds baseType in repositotyInfo.changesOnType)
+                {
+                    result.ChangesOnType.Add((BaseTypeId?)CmisValue.SerializerToCmisEnum(baseType));
+                }
+            }
+            result.PrincipalIdAnonymous = repositotyInfo.principalAnonymous;
+            result.PrincipalIdAnyone = repositotyInfo.principalAnyone;
+
+            ConvertExtension(repositotyInfo, result);
+
+            return result;
+        }
+
+        /// <summary>
+        /// Converts repository capabilities.
+        /// </summary>
+        public static IRepositoryCapabilities Convert(cmisRepositoryCapabilitiesType capabilities)
+        {
+            if (capabilities == null)
+            {
+                return null;
+            }
+
+            RepositoryCapabilities result = new RepositoryCapabilities();
+            result.ContentStreamUpdatesCapability = (CapabilityContentStreamUpdates)CmisValue.SerializerToCmisEnum(capabilities.capabilityContentStreamUpdatability);
+            result.ChangesCapability = (CapabilityChanges)CmisValue.SerializerToCmisEnum(capabilities.capabilityChanges);
+            result.RenditionsCapability = (CapabilityRenditions)CmisValue.SerializerToCmisEnum(capabilities.capabilityRenditions);
+            result.IsGetDescendantsSupported = capabilities.capabilityGetDescendants;
+            result.IsGetFolderTreeSupported = capabilities.capabilityGetFolderTree;
+            result.IsMultifilingSupported = capabilities.capabilityMultifiling;
+            result.IsUnfilingSupported = capabilities.capabilityUnfiling;
+            result.IsVersionSpecificFilingSupported = capabilities.capabilityVersionSpecificFiling;
+            result.IsPwcSearchableSupported = capabilities.capabilityPWCSearchable;
+            result.IsPwcUpdatableSupported = capabilities.capabilityPWCUpdatable;
+            result.IsAllVersionsSearchableSupported = capabilities.capabilityAllVersionsSearchable;
+            result.QueryCapability = (CapabilityQuery)CmisValue.SerializerToCmisEnum(capabilities.capabilityQuery);
+            result.JoinCapability = (CapabilityJoin)CmisValue.SerializerToCmisEnum(capabilities.capabilityJoin);
+            result.AclCapability = (CapabilityAcl)CmisValue.SerializerToCmisEnum(capabilities.capabilityACL);
+
+            ConvertExtension(capabilities, result);
+
+            return result;
+        }
+
+        /// <summary>
+        /// Converts ACL capabilities.
+        /// </summary>
+        public static IAclCapabilities Convert(cmisACLCapabilityType capabilities)
+        {
+            if (capabilities == null)
+            {
+                return null;
+            }
+
+            AclCapabilities result = new AclCapabilities();
+            result.SupportedPermissions = (SupportedPermissions)CmisValue.SerializerToCmisEnum(capabilities.supportedPermissions);
+            result.AclPropagation = (AclPropagation)CmisValue.SerializerToCmisEnum(capabilities.propagation);
+            result.Permissions = new List<IPermissionDefinition>();
+            if (capabilities.permissions != null)
+            {
+                foreach (cmisPermissionDefinition permission in capabilities.permissions)
+                {
+                    PermissionDefinition permDef = new PermissionDefinition();
+                    permDef.Id = permission.permission;
+                    permDef.Description = permission.description;
+                    result.Permissions.Add(permDef);
+
+                    ConvertExtension(permission, permDef);
+                }
+            }
+            result.PermissionMapping = new Dictionary<string, IPermissionMapping>();
+            if (capabilities.mapping != null)
+            {
+                foreach (cmisPermissionMapping mapping in capabilities.mapping)
+                {
+                    PermissionMapping permMap = new PermissionMapping();
+                    permMap.Key = GetXmlEnumAttributeValue(mapping.key);
+                    permMap.Permissions = new List<string>();
+                    if (mapping.permission != null)
+                    {
+                        foreach (string s in mapping.permission)
+                        {
+                            permMap.Permissions.Add(s);
+                        }
+                    }
+
+                    result.PermissionMapping[permMap.Key] = permMap;
+
+                    ConvertExtension(mapping, permMap);
+                }
+            }
+
+            ConvertExtension(capabilities, result);
+
+            return result;
+        }
+
+        public static ITypeDefinition Convert(cmisTypeDefinitionType typeDef)
+        {
+            if (typeDef == null)
+            {
+                return null;
+            }
+
+            TypeDefinition result = null;
+            if (typeDef is cmisTypeDocumentDefinitionType)
+            {
+                DocumentTypeDefinition docType = new DocumentTypeDefinition();
+                cmisTypeDocumentDefinitionType docTypeDef = (cmisTypeDocumentDefinitionType)typeDef;
+
+                docType.IsVersionable = docTypeDef.versionable;
+                docType.ContentStreamAllowed = (ContentStreamAllowed)CmisValue.SerializerToCmisEnum(docTypeDef.contentStreamAllowed);
+
+                result = docType;
+            }
+            else if (typeDef is cmisTypeFolderDefinitionType)
+            {
+                result = new FolderTypeDefinition();
+            }
+            else if (typeDef is cmisTypePolicyDefinitionType)
+            {
+                result = new PolicyTypeDefinition();
+            }
+            else if (typeDef is cmisTypeRelationshipDefinitionType)
+            {
+                RelationshipTypeDefinition relType = new RelationshipTypeDefinition();
+                cmisTypeRelationshipDefinitionType relTypeDef = (cmisTypeRelationshipDefinitionType)typeDef;
+
+                if (relTypeDef.allowedSourceTypes != null)
+                {
+                    relType.AllowedSourceTypeIds = new List<string>();
+                    foreach (string id in relTypeDef.allowedSourceTypes)
+                    {
+                        relType.AllowedSourceTypeIds.Add(id);
+                    }
+                }
+
+                if (relTypeDef.allowedTargetTypes != null)
+                {
+                    relType.AllowedTargetTypeIds = new List<string>();
+                    foreach (string id in relTypeDef.allowedTargetTypes)
+                    {
+                        relType.AllowedTargetTypeIds.Add(id);
+                    }
+                }
+
+                result = relType;
+            }
+
+            result.Id = typeDef.id;
+            result.LocalName = typeDef.localName;
+            result.LocalNamespace = typeDef.localNamespace;
+            result.DisplayName = typeDef.displayName;
+            result.QueryName = typeDef.queryName;
+            result.Description = typeDef.description;
+            result.BaseTypeId = (BaseTypeId?)CmisValue.SerializerToCmisEnum(typeDef.baseId);
+            result.ParentTypeId = typeDef.parentId;
+            result.IsCreatable = typeDef.creatable;
+            result.IsFileable = typeDef.fileable;
+            result.IsQueryable = typeDef.queryable;
+            result.IsFulltextIndexed = typeDef.fulltextIndexed;
+            result.IsIncludedInSupertypeQuery = typeDef.includedInSupertypeQuery;
+            result.IsControllablePolicy = typeDef.controllablePolicy;
+            result.IsControllableAcl = typeDef.controllableACL;
+
+            if (typeDef.Items != null)
+            {
+                foreach (cmisPropertyDefinitionType propertyDefinition in typeDef.Items)
+                {
+                    result.AddPropertyDefinition(Convert(propertyDefinition));
+                }
+            }
+
+            ConvertExtension(typeDef, result);
+
+            return result;
+        }
+
+        public static IPropertyDefinition Convert(cmisPropertyDefinitionType propDef)
+        {
+            if (propDef == null) { return null; }
+
+            PropertyDefinition result = null;
+            if (propDef is cmisPropertyBooleanDefinitionType)
+            {
+                PropertyBooleanDefinition pd = new PropertyBooleanDefinition();
+                cmisPropertyBooleanDefinitionType cpd = (cmisPropertyBooleanDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<bool>();
+                    foreach (bool value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<bool>>();
+                    foreach (cmisChoiceBoolean c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyDateTimeDefinitionType)
+            {
+                PropertyDateTimeDefinition pd = new PropertyDateTimeDefinition();
+                cmisPropertyDateTimeDefinitionType cpd = (cmisPropertyDateTimeDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<DateTime>();
+                    foreach (DateTime value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<DateTime>>();
+                    foreach (cmisChoiceDateTime c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                if (cpd.resolutionSpecified)
+                {
+                    pd.DateTimeResolution = (DateTimeResolution)CmisValue.SerializerToCmisEnum(cpd.resolution);
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyDecimalDefinitionType)
+            {
+                PropertyDecimalDefinition pd = new PropertyDecimalDefinition();
+                cmisPropertyDecimalDefinitionType cpd = (cmisPropertyDecimalDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<decimal>();
+                    foreach (decimal value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<decimal>>();
+                    foreach (cmisChoiceDecimal c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                if (cpd.maxValueSpecified)
+                {
+                    pd.MaxValue = cpd.maxValue;
+                }
+                if (cpd.minValueSpecified)
+                {
+                    pd.MinValue = cpd.minValue;
+                }
+                if (cpd.precisionSpecified)
+                {
+                    pd.Precision = (DecimalPrecision)CmisValue.SerializerToCmisEnum(cpd.precision);
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyHtmlDefinitionType)
+            {
+                PropertyHtmlDefinition pd = new PropertyHtmlDefinition();
+                cmisPropertyHtmlDefinitionType cpd = (cmisPropertyHtmlDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<string>();
+                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<string>>();
+                    foreach (cmisChoiceHtml c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyIdDefinitionType)
+            {
+                PropertyIdDefinition pd = new PropertyIdDefinition();
+                cmisPropertyIdDefinitionType cpd = (cmisPropertyIdDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<string>();
+                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<string>>();
+                    foreach (cmisChoiceId c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyIntegerDefinitionType)
+            {
+                PropertyIntegerDefinition pd = new PropertyIntegerDefinition();
+                cmisPropertyIntegerDefinitionType cpd = (cmisPropertyIntegerDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<long>();
+                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(Int64.Parse(value)); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<long>>();
+                    foreach (cmisChoiceInteger c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                if (cpd.maxValue != null)
+                {
+                    pd.MaxValue = Int64.Parse(cpd.maxValue);
+                }
+                if (cpd.minValue != null)
+                {
+                    pd.MinValue = Int64.Parse(cpd.minValue);
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyStringDefinitionType)
+            {
+                PropertyStringDefinition pd = new PropertyStringDefinition();
+                cmisPropertyStringDefinitionType cpd = (cmisPropertyStringDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<string>();
+                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<string>>();
+                    foreach (cmisChoiceString c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                if (cpd.maxLength != null)
+                {
+                    pd.MaxLength = Int64.Parse(cpd.maxLength);
+                }
+
+                result = pd;
+            }
+            else if (propDef is cmisPropertyUriDefinitionType)
+            {
+                PropertyUriDefinition pd = new PropertyUriDefinition();
+                cmisPropertyUriDefinitionType cpd = (cmisPropertyUriDefinitionType)propDef;
+
+                if (cpd.defaultValue != null && cpd.defaultValue.value != null)
+                {
+                    pd.DefaultValue = new List<string>();
+                    foreach (string value in cpd.defaultValue.value) { pd.DefaultValue.Add(value); }
+                }
+                if (cpd.choice != null)
+                {
+                    pd.Choices = new List<IChoice<string>>();
+                    foreach (cmisChoiceUri c in cpd.choice) { pd.Choices.Add(ConvertChoice(c)); }
+                }
+
+                result = pd;
+            }
+
+            result.Id = propDef.id;
+            result.LocalName = propDef.localName;
+            result.LocalNamespace = propDef.localNamespace;
+            result.DisplayName = propDef.displayName;
+            result.QueryName = propDef.queryName;
+            result.Description = propDef.description;
+            result.PropertyType = (PropertyType?)CmisValue.SerializerToCmisEnum(propDef.propertyType);
+            result.Cardinality = (Cardinality?)CmisValue.SerializerToCmisEnum(propDef.cardinality);
+            result.Updatability = (Updatability?)CmisValue.SerializerToCmisEnum(propDef.updatability);
+            result.IsInherited = (propDef.inheritedSpecified ? (bool?)propDef.inherited : null);
+            result.IsRequired = propDef.required;
+            result.IsQueryable = propDef.queryable;
+            result.IsOrderable = propDef.orderable;
+            result.IsOpenChoice = (propDef.openChoiceSpecified ? (bool?)propDef.openChoice : null);
+
+            ConvertExtension(propDef, result);
+
+            return result;
+        }
+
+        private static IChoice<bool> ConvertChoice(cmisChoiceBoolean choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<bool> result = new Choice<bool>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<bool>();
+                foreach (bool v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<bool>>();
+                foreach (cmisChoiceBoolean sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<DateTime> ConvertChoice(cmisChoiceDateTime choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<DateTime> result = new Choice<DateTime>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<DateTime>();
+                foreach (DateTime v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<DateTime>>();
+                foreach (cmisChoiceDateTime sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<decimal> ConvertChoice(cmisChoiceDecimal choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<decimal> result = new Choice<decimal>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<decimal>();
+                foreach (decimal v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<decimal>>();
+                foreach (cmisChoiceDecimal sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<string> ConvertChoice(cmisChoiceHtml choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<string> result = new Choice<string>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<string>();
+                foreach (string v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<string>>();
+                foreach (cmisChoiceHtml sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<string> ConvertChoice(cmisChoiceId choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<string> result = new Choice<string>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<string>();
+                foreach (string v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<string>>();
+                foreach (cmisChoiceId sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<long> ConvertChoice(cmisChoiceInteger choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<long> result = new Choice<long>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<long>();
+                foreach (string v in choice.value) { result.Value.Add(Int64.Parse(v)); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<long>>();
+                foreach (cmisChoiceInteger sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<string> ConvertChoice(cmisChoiceString choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<string> result = new Choice<string>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<string>();
+                foreach (string v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<string>>();
+                foreach (cmisChoiceString sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+        private static IChoice<string> ConvertChoice(cmisChoiceUri choice)
+        {
+            if (choice == null) { return null; }
+
+            Choice<string> result = new Choice<string>();
+            result.DisplayName = choice.displayName;
+            if (choice.value != null)
+            {
+                result.Value = new List<string>();
+                foreach (string v in choice.value) { result.Value.Add(v); }
+            }
+            if (choice.choice != null)
+            {
+                result.Choices = new List<IChoice<string>>();
+                foreach (cmisChoiceUri sc in choice.choice) { result.Choices.Add(ConvertChoice(sc)); }
+            }
+
+            return result;
+        }
+
+
+        /// <summary>
+        /// Converts a type defintion list.
+        /// </summary> 
+        public static ITypeDefinitionList Convert(cmisTypeDefinitionListType typeDefList)
+        {
+            if (typeDefList == null) { return null; }
+
+            TypeDefinitionList result = new TypeDefinitionList();
+
+            if (typeDefList.types != null)
+            {
+                result.List = new List<ITypeDefinition>();
+                foreach (cmisTypeDefinitionType type in typeDefList.types)
+                {
+                    result.List.Add(Convert(type));
+                }
+            }
+
+            result.HasMoreItems = typeDefList.hasMoreItems;
+            result.NumItems = Int64.Parse(typeDefList.numItems);
+
+            ConvertExtension(typeDefList, result);
+
+            return result;
+        }
+
+        /// <summary>
+        /// Converts a type defintion container.
+        /// </summary> 
+        public static ITypeDefinitionContainer Convert(cmisTypeContainer typeDefCont)
+        {
+            if (typeDefCont == null) { return null; }
+
+            TypeDefinitionContainer result = new TypeDefinitionContainer();
+            result.TypeDefinition = Convert(typeDefCont.type);
+            if (typeDefCont.children != null)
+            {
+                result.Children = new List<ITypeDefinitionContainer>();
+                foreach (cmisTypeContainer container in typeDefCont.children)
+                {
+                    result.Children.Add(Convert(container));
+                }
+            }
+
+            ConvertExtension(typeDefCont, result);
+
+            return result;
+        }
+
+        public static IObjectData Convert(cmisObjectType cmisObject)
+        {
+            if (cmisObject == null) { return null; }
+
+            ObjectData result = new ObjectData();
+            result.Properties = Convert(cmisObject.properties);
+            result.AllowableActions = Convert(cmisObject.allowableActions);
+            if (cmisObject.relationship != null)
+            {
+                result.Relationships = new List<IObjectData>();
+                foreach (cmisObjectType co in cmisObject.relationship)
+                {
+                    result.Relationships.Add(Convert(co));
+                }
+            }
+            result.ChangeEventInfo = Convert(cmisObject.changeEventInfo);
+            result.IsExactAcl = cmisObject.exactACLSpecified ? (bool?)cmisObject.exactACL : null;
+            result.Acl = Convert(cmisObject.acl, result.IsExactAcl);
+            result.PolicyIds = Convert(cmisObject.policyIds);
+            if (cmisObject.rendition != null)
+            {
+                result.Renditions = new List<IRenditionData>();
+                foreach (cmisRenditionType rendition in cmisObject.rendition)
+                {
+                    result.Renditions.Add(Convert(rendition));
+                }
+            }
+
+            ConvertExtension(cmisObject, result);
+
+            return result;
+        }
+
+        public static IProperties Convert(cmisPropertiesType properties)
+        {
+            if (properties == null) { return null; }
+
+            Properties result = new Properties();
+            if (properties.Items != null)
+            {
+                foreach (cmisProperty property in properties.Items)
+                {
+                    result.AddProperty(Convert(property));
+                }
+            }
+
+            ConvertExtension(properties, result);
+
+            return result;
+        }
+        public static IPropertyData Convert(cmisProperty property)
+        {
+            if (property == null) { return null; }
+
+            PropertyData result = null;
+            if (property is cmisPropertyString)
+            {
+                result = new PropertyString();
+                if (((cmisPropertyString)property).value != null)
+                {
+                    ((PropertyString)result).Values = new List<string>();
+                    foreach (string value in ((cmisPropertyString)property).value)
+                    {
+                        ((PropertyString)result).Values.Add(value);
+                    }
+                }
+            }
+            else if (property is cmisPropertyId)
+            {
+                result = new PropertyId();
+                if (((cmisPropertyId)property).value != null)
+                {
+                    ((PropertyId)result).Values = new List<string>();
+                    foreach (string value in ((cmisPropertyId)property).value)
+                    {
+                        ((PropertyId)result).Values.Add(value);
+                    }
+                }
+            }
+            else if (property is cmisPropertyInteger)
+            {
+                result = new PropertyInteger();
+                if (((cmisPropertyInteger)property).value != null)
+                {
+                    ((PropertyInteger)result).Values = new List<long>();
+                    foreach (string value in ((cmisPropertyInteger)property).value)
+                    {
+                        ((PropertyInteger)result).Values.Add(Int64.Parse(value));
+                    }
+                }
+            }
+            else if (property is cmisPropertyBoolean)
+            {
+                result = new PropertyBoolean();
+                if (((cmisPropertyBoolean)property).value != null)
+                {
+                    ((PropertyBoolean)result).Values = new List<bool>();
+                    foreach (bool value in ((cmisPropertyBoolean)property).value)
+                    {
+                        ((PropertyBoolean)result).Values.Add(value);
+                    }
+                }
+            }
+            else if (property is cmisPropertyDateTime)
+            {
+                result = new PropertyDateTime();
+                if (((cmisPropertyDateTime)property).value != null)
+                {
+                    ((PropertyDateTime)result).Values = new List<DateTime>();
+                    foreach (DateTime value in ((cmisPropertyDateTime)property).value)
+                    {
+                        ((PropertyDateTime)result).Values.Add(value);
+                    }
+                }
+            }
+            else if (property is cmisPropertyDecimal)
+            {
+                result = new PropertyDecimal();
+                if (((cmisPropertyDecimal)property).value != null)
+                {
+                    ((PropertyDecimal)result).Values = new List<decimal>();
+                    foreach (decimal value in ((cmisPropertyDecimal)property).value)
+                    {
+                        ((PropertyDecimal)result).Values.Add(value);
+                    }
+                }
+            }
+            else if (property is cmisPropertyHtml)
+            {
+                result = new PropertyHtml();
+                if (((cmisPropertyHtml)property).value != null)
+                {
+                    ((PropertyHtml)result).Values = new List<string>();
+                    foreach (string value in ((cmisPropertyHtml)property).value)
+                    {
+                        ((PropertyHtml)result).Values.Add(value);
+                    }
+                }
+            }
+            else if (property is cmisPropertyUri)
+            {
+                result = new PropertyUri();
+                if (((cmisPropertyUri)property).value != null)
+                {
+                    ((PropertyUri)result).Values = new List<string>();
+                    foreach (string value in ((cmisPropertyUri)property).value)
+                    {
+                        ((PropertyUri)result).Values.Add(value);
+                    }
+                }
+            }
+
+            result.Id = property.propertyDefinitionId;
+            result.LocalName = property.localName;
+            result.DisplayName = property.displayName;
+            result.QueryName = property.queryName;
+
+            ConvertExtension(property, result);
+
+            return result;
+        }
+
+
+        public static cmisPropertiesType Convert(IProperties properties)
+        {
+            if (properties == null) { return null; }
+
+            cmisPropertiesType result = new cmisPropertiesType();
+            if (properties.PropertyList != null)
+            {
+                result.Items = new cmisProperty[properties.PropertyList.Count];
+                for (int i = 0; i < properties.PropertyList.Count; i++)
+                {
+                    result.Items[i] = Convert(properties.PropertyList[i]);
+                }
+            }
+
+            ConvertExtension(properties, result);
+
+            return result;
+        }
+
+        public static cmisProperty Convert(IPropertyData property)
+        {
+            if (property == null) { return null; }
+
+            cmisProperty result = null;
+
+            if (property is IPropertyString)
+            {
+                result = new cmisPropertyString();
+                IList<string> propValues = ((IPropertyString)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyString)result).value = new string[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyString)result).value[i] = propValues[i];
+                    }
+                }
+            }
+            else if (property is IPropertyId)
+            {
+                result = new cmisPropertyId();
+                IList<string> propValues = ((IPropertyId)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyId)result).value = new string[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyId)result).value[i] = propValues[i];
+                    }
+                }
+            }
+            else if (property is IPropertyInteger)
+            {
+                result = new cmisPropertyInteger();
+                IList<long> propValues = ((IPropertyInteger)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyInteger)result).value = new string[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyInteger)result).value[i] = propValues[i].ToString();
+                    }
+                }
+            }
+            else if (property is IPropertyBoolean)
+            {
+                result = new cmisPropertyInteger();
+                IList<bool> propValues = ((IPropertyBoolean)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyBoolean)result).value = new bool[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyBoolean)result).value[i] = propValues[i];
+                    }
+                }
+            }
+            else if (property is IPropertyDateTime)
+            {
+                result = new cmisPropertyDateTime();
+                IList<DateTime> propValues = ((IPropertyDateTime)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyDateTime)result).value = new DateTime[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyDateTime)result).value[i] = propValues[i];
+                    }
+                }
+            }
+            else if (property is IPropertyDecimal)
+            {
+                result = new cmisPropertyDecimal();
+                IList<decimal> propValues = ((IPropertyDecimal)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyDecimal)result).value = new decimal[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyDecimal)result).value[i] = propValues[i];
+                    }
+                }
+            }
+            else if (property is IPropertyHtml)
+            {
+                result = new cmisPropertyHtml();
+                IList<string> propValues = ((IPropertyHtml)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyHtml)result).value = new string[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyHtml)result).value[i] = propValues[i];
+                    }
+                }
+            }
+            else if (property is IPropertyUri)
+            {
+                result = new cmisPropertyUri();
+                IList<string> propValues = ((IPropertyUri)property).Values;
+                if (propValues != null)
+                {
+                    ((cmisPropertyUri)result).value = new string[propValues.Count];
+                    for (int i = 0; i < propValues.Count; i++)
+                    {
+                        ((cmisPropertyUri)result).value[i] = propValues[i];
+                    }
+                }
+            }
+
+            result.propertyDefinitionId = property.Id;
+            result.localName = property.LocalName;
+            result.displayName = property.DisplayName;
+            result.queryName = property.QueryName;
+
+            ConvertExtension(property, result);
+
+            return result;
+        }
+
+        public static IAllowableActions Convert(cmisAllowableActionsType allowableActions)
+        {
+            if (allowableActions == null) { return null; }
+
+            AllowableActions result = new AllowableActions();
+            result.Actions = new HashSet<string>();
+
+            if (allowableActions.canDeleteObject && allowableActions.canDeleteObjectSpecified)
+            { result.Actions.Add(Actions.CanDeleteObject); }
+
+            if (allowableActions.canUpdateProperties && allowableActions.canUpdatePropertiesSpecified)
+            { result.Actions.Add(Actions.CanUpdateProperties); }
+
+            if (allowableActions.canGetFolderTree && allowableActions.canGetFolderTreeSpecified)
+            { result.Actions.Add(Actions.CanGetFolderTree); }
+
+            if (allowableActions.canGetProperties && allowableActions.canGetPropertiesSpecified)
+            { result.Actions.Add(Actions.CanGetProperties); }
+
+            if (allowableActions.canGetObjectRelationships && allowableActions.canGetObjectRelationshipsSpecified)
+            { result.Actions.Add(Actions.CanGetObjectRelationships); }
+
+            if (allowableActions.canGetObjectParents && allowableActions.canGetObjectParentsSpecified)
+            { result.Actions.Add(Actions.CanGetObjectParents); }
+
+            if (allowableActions.canGetFolderParent && allowableActions.canGetFolderParentSpecified)
+            { result.Actions.Add(Actions.CanGetFolderParent); }
+
+            if (allowableActions.canGetDescendants && allowableActions.canGetDescendantsSpecified)
+            { result.Actions.Add(Actions.CanGetDescendants); }
+
+            if (allowableActions.canMoveObject && allowableActions.canMoveObjectSpecified)
+            { result.Actions.Add(Actions.CanMoveObject); }
+
+            if (allowableActions.canDeleteContentStream && allowableActions.canDeleteContentStreamSpecified)
+            { result.Actions.Add(Actions.CanDeleteContentStream); }
+
+            if (allowableActions.canCheckOut && allowableActions.canCheckOutSpecified)
+            { result.Actions.Add(Actions.CanCheckOut); }
+
+            if (allowableActions.canCancelCheckOut && allowableActions.canCancelCheckOutSpecified)
+            { result.Actions.Add(Actions.CanCancelCheckOut); }
+
+            if (allowableActions.canCheckIn && allowableActions.canCheckInSpecified)
+            { result.Actions.Add(Actions.CanCheckIn); }
+
+            if (allowableActions.canSetContentStream && allowableActions.canSetContentStreamSpecified)
+            { result.Actions.Add(Actions.CanSetContentStream); }
+
+            if (allowableActions.canGetAllVersions && allowableActions.canGetAllVersionsSpecified)
+            { result.Actions.Add(Actions.CanGetAllVersions); }
+
+            if (allowableActions.canAddObjectToFolder && allowableActions.canAddObjectToFolderSpecified)
+            { result.Actions.Add(Actions.CanAddObjectToFolder); }
+
+            if (allowableActions.canRemoveObjectFromFolder && allowableActions.canRemoveObjectFromFolderSpecified)
+            { result.Actions.Add(Actions.CanRemoveObjectFromFolder); }
+
+            if (allowableActions.canGetContentStream && allowableActions.canGetContentStreamSpecified)
+            { result.Actions.Add(Actions.CanGetContentStream); }
+
+            if (allowableActions.canApplyPolicy && allowableActions.canApplyPolicySpecified)
+            { result.Actions.Add(Actions.CanApplyPolicy); }
+
+            if (allowableActions.canGetAppliedPolicies && allowableActions.canGetAppliedPoliciesSpecified)
+            { result.Actions.Add(Actions.CanGetAppliedPolicies); }
+
+            if (allowableActions.canRemovePolicy && allowableActions.canRemovePolicySpecified)
+            { result.Actions.Add(Actions.CanRemovePolicy); }
+
+            if (allowableActions.canGetChildren && allowableActions.canGetChildrenSpecified)
+            { result.Actions.Add(Actions.CanGetChildren); }
+
+            if (allowableActions.canCreateDocument && allowableActions.canCreateDocumentSpecified)
+            { result.Actions.Add(Actions.CanCreateDocument); }
+
+            if (allowableActions.canCreateFolder && allowableActions.canCreateFolderSpecified)
+            { result.Actions.Add(Actions.CanCreateFolder); }
+
+            if (allowableActions.canCreateRelationship && allowableActions.canCreateRelationshipSpecified)
+            { result.Actions.Add(Actions.CanCreateRelationship); }
+
+            if (allowableActions.canDeleteTree && allowableActions.canDeleteTreeSpecified)
+            { result.Actions.Add(Actions.CanDeleteTree); }
+
+            if (allowableActions.canGetRenditions && allowableActions.canGetRenditionsSpecified)
+            { result.Actions.Add(Actions.CanGetRenditions); }
+
+            if (allowableActions.canGetACL && allowableActions.canGetACLSpecified)
+            { result.Actions.Add(Actions.CanGetAcl); }
+
+            if (allowableActions.canApplyACL && allowableActions.canApplyACLSpecified)
+            { result.Actions.Add(Actions.CanApplyAcl); }
+
+            ConvertExtension(allowableActions, result);
+
+            return result;
+        }
+
+        public static IAcl Convert(cmisAccessControlListType acl, bool? isExact)
+        {
+            if (acl == null) { return null; }
+
+            Acl result = new Acl();
+            if (acl.permission != null)
+            {
+                result.Aces = new List<IAce>();
+                foreach (cmisAccessControlEntryType ace in acl.permission)
+                {
+                    result.Aces.Add(Convert(ace));
+                }
+            }
+            result.IsExact = isExact;
+
+            ConvertExtension(acl, result);
+
+            return result;
+        }
+
+
+        public static IAcl Convert(cmisACLType acl)
+        {
+            if (acl == null) { return null; }
+
+            Acl result = new Acl();
+            if (acl.ACL != null && acl.ACL.permission != null)
+            {
+                result.Aces = new List<IAce>();
+                foreach (cmisAccessControlEntryType ace in acl.ACL.permission)
+                {
+                    result.Aces.Add(Convert(ace));
+                }
+            }
+            result.IsExact = (acl.exactSpecified ? (bool?)acl.exactSpecified : null);
+
+            ConvertExtension(acl, result);
+
+            return result;
+        }
+
+
+        public static IAce Convert(cmisAccessControlEntryType ace)
+        {
+            if (ace == null) { return null; }
+
+            Ace result = new Ace();
+            if (ace.principal != null)
+            {
+                Principal principal = new Principal();
+                principal.Id = ace.principal.principalId;
+                result.Principal = principal;
+
+                ConvertExtension(ace.principal, principal);
+            }
+            if (ace.permission != null)
+            {
+                result.Permissions = new List<string>();
+                foreach (string permission in ace.permission)
+                {
+                    result.Permissions.Add(permission);
+                }
+            }
+            result.IsDirect = ace.direct;
+
+            ConvertExtension(ace, result);
+
+            return result;
+        }
+
+        public static cmisAccessControlListType Convert(IAcl acl)
+        {
+            if (acl == null) { return null; }
+
+            cmisAccessControlListType result = new cmisAccessControlListType();
+            if (acl.Aces != null)
+            {
+                result.permission = new cmisAccessControlEntryType[acl.Aces.Count];
+                for (int i = 0; i < acl.Aces.Count; i++)
+                {
+                    result.permission[i] = Convert(acl.Aces[i]);
+                }
+            }
+
+            ConvertExtension(acl, result);
+
+            return result;
+        }
+
+        public static cmisAccessControlEntryType Convert(IAce ace)
+        {
+            if (ace == null) { return null; }
+
+            cmisAccessControlEntryType result = new cmisAccessControlEntryType();
+            if (ace.Principal != null)
+            {
+                result.principal = new cmisAccessControlPrincipalType();
+                result.principal.principalId = ace.Principal.Id;
+
+                ConvertExtension(ace.Principal, result.principal);
+            }
+            if (ace.Permissions != null)
+            {
+                result.permission = new string[ace.Permissions.Count];
+                for (int i = 0; i < ace.Permissions.Count; i++)
+                {
+                    result.permission[i] = ace.Permissions[i];
+                }
+            }
+            result.direct = ace.IsDirect;
+
+            ConvertExtension(ace, result);
+
+            return result;
+        }
+
+
+        public static IPolicyIdList Convert(cmisListOfIdsType policyIdList)
+        {
+            if (policyIdList == null) { return null; }
+
+            PolicyIdList result = new PolicyIdList();
+            if (policyIdList.id != null)
+            {
+                result.PolicyIds = new List<string>();
+                foreach (string id in policyIdList.id)
+                {
+                    result.PolicyIds.Add(id);
+                }
+            }
+
+            ConvertExtension(policyIdList, result);
+
+            return result;
+        }
+
+        public static cmisListOfIdsType ConvertPolicies(IList<string> policyIds)
+        {
+            if (policyIds == null) { return null; }
+
+            cmisListOfIdsType result = new cmisListOfIdsType();
+            result.id = new string[policyIds.Count];
+            for (int i = 0; i < policyIds.Count; i++)
+            {
+                result.id[i] = policyIds[i];
+            }
+
+            return result;
+        }
+
+
+        public static IRenditionData Convert(cmisRenditionType rendition)
+        {
+            if (rendition == null) { return null; }
+
+            RenditionData result = new RenditionData();
+            result.StreamId = rendition.streamId;
+            result.MimeType = rendition.mimetype;
+            result.Length = Int64.Parse(rendition.length);
+            result.Kind = rendition.kind;
+            result.Title = rendition.title;
+            result.Height = Int64.Parse(rendition.height);
+            result.Width = Int64.Parse(rendition.width);
+            result.RenditionDocumentId = rendition.renditionDocumentId;
+
+            ConvertExtension(rendition, result);
+
+            return result;
+        }
+
+        public static IChangeEventInfo Convert(cmisChangeEventType changeEvent)
+        {
+            if (changeEvent == null) { return null; }
+
+            ChangeEventInfo result = new ChangeEventInfo();
+            result.ChangeType = (ChangeType)CmisValue.SerializerToCmisEnum(changeEvent.changeType);
+            result.ChangeTime = changeEvent.changeTime;
+
+            ConvertExtension(changeEvent, result);
+
+            return result;
+        }
+
+        public static IObjectInFolderList Convert(cmisObjectInFolderListType list)
+        {
+            if (list == null) { return null; }
+
+            ObjectInFolderList result = new ObjectInFolderList();
+            if (list.objects != null)
+            {
+                result.Objects = new List<IObjectInFolderData>();
+                foreach (cmisObjectInFolderType fo in list.objects)
+                {
+                    result.Objects.Add(Convert(fo));
+                }
+            }
+            result.HasMoreItems = list.hasMoreItems;
+            if (list.numItems != null)
+            {
+                result.NumItems = Int64.Parse(list.numItems);
+            }
+
+            ConvertExtension(list, result);
+
+            return result;
+        }
+
+
+        public static IObjectInFolderData Convert(cmisObjectInFolderType objectInFolder)
+        {
+            if (objectInFolder == null) { return null; }
+
+            ObjectInFolderData result = new ObjectInFolderData();
+            result.Object = Convert(objectInFolder.@object);
+            result.PathSegment = objectInFolder.pathSegment;
+
+            ConvertExtension(objectInFolder, result);
+
+            return result;
+        }
+
+        public static IObjectInFolderContainer Convert(cmisObjectInFolderContainerType container)
+        {
+            if (container == null) { return null; }
+
+            ObjectInFolderContainer result = new ObjectInFolderContainer();
+            result.Object = Convert(container.objectInFolder);
+            if (container.children != null)
+            {
+                result.Children = new List<IObjectInFolderContainer>();
+                foreach (cmisObjectInFolderContainerType child in container.children)
+                {
+                    result.Children.Add(Convert(child));
+                }
+            }
+
+            ConvertExtension(container, result);
+
+            return result;
+        }
+
+        public static IObjectParentData Convert(cmisObjectParentsType parent)
+        {
+            if (parent == null) { return null; }
+
+            ObjectParentData result = new ObjectParentData();
+            result.Object = Convert(parent.@object);
+            result.RelativePathSegment = parent.relativePathSegment;
+
+            ConvertExtension(parent, result);
+
+            return result;
+        }
+
+        public static IObjectList Convert(cmisObjectListType list)
+        {
+            if (list == null) { return null; }
+
+            ObjectList result = new ObjectList();
+            if (list.objects != null)
+            {
+                result.Objects = new List<IObjectData>();
+                foreach (cmisObjectType obj in list.objects)
+                {
+                    result.Objects.Add(Convert(obj));
+                }
+            }
+
+            result.HasMoreItems = list.hasMoreItems;
+            result.NumItems = Int64.Parse(list.numItems);
+
+            ConvertExtension(list, result);
+
+            return result;
+        }
+
+        public static IContentStream Convert(cmisContentStreamType contentStream)
+        {
+            if (contentStream == null) { return null; }
+
+            ContentStream result = new ContentStream();
+            if (contentStream.length != null)
+            {
+                result.Length = Int64.Parse(contentStream.length);
+            }
+            result.MimeType = contentStream.mimeType;
+            result.FileName = contentStream.filename;
+            // Todo: enable real streaming
+            result.Stream = new MemoryStream(contentStream.stream);
+
+            ConvertExtension(contentStream, result);
+
+            return result;
+        }
+
+        public static cmisContentStreamType Convert(IContentStream contentStream)
+        {
+            if (contentStream == null) { return null; }
+
+            cmisContentStreamType result = new cmisContentStreamType();
+            result.length = contentStream.Length.ToString();
+            result.mimeType = contentStream.MimeType;
+            result.filename = contentStream.FileName;
+            if (contentStream.Stream != null)
+            {
+                if (contentStream.Stream is MemoryStream)
+                {
+                    result.stream = ((MemoryStream)contentStream.Stream).ToArray();
+                }
+                else
+                {
+                    MemoryStream memStream = new MemoryStream();
+                    byte[] buffer = new byte[4096];
+                    int bytes;
+                    while ((bytes = contentStream.Stream.Read(buffer, 0, buffer.Length)) > 0)
+                    {
+                        memStream.Write(buffer, 0, bytes);
+                    }
+                    result.stream = memStream.ToArray();
+                }
+            }
+
+            return result;
+        }
+
+        public static IFailedToDeleteData Convert(deleteTreeResponseFailedToDelete failedToDelete)
+        {
+            if (failedToDelete == null) { return null; }
+
+            FailedToDeleteData result = new FailedToDeleteData();
+            if (failedToDelete.objectIds != null)
+            {
+                result.Ids = new List<string>();
+                foreach (string id in failedToDelete.objectIds)
+                {
+                    result.Ids.Add(id);
+                }
+            }
+
+            ConvertExtension(failedToDelete, result);
+
+            return result;
+        }
+
+        public static T[] ConvertList<T>(IList<T> list)
+        {
+            if (list == null) { return null; }
+
+            T[] result = new T[list.Count];
+            for (int i = 0; i < list.Count; i++)
+            {
+                result[i] = list[i];
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// Converts an extension.
+        /// </summary> 
+        public static void ConvertExtension(object source, IExtensionsData target)
+        {
+            if (source == null || target == null) { return; }
+
+            Type type = source.GetType();
+            PropertyInfo propInfo = type.GetProperty("Any");
+            if (propInfo == null)
+            {
+                return;
+            }
+
+            XmlElement[] elements = (XmlElement[])propInfo.GetValue(source, null);
+            if (elements == null)
+            {
+                return;
+            }
+
+            target.Extensions = new List<ICmisExtensionElement>();
+            foreach (XmlElement xmlElement in elements)
+            {
+                ICmisExtensionElement element = CreateCmisExtensionElement(xmlElement);
+                if (element != null)
+                {
+                    target.Extensions.Add(element);
+                }
+            }
+        }
+
+        private static ICmisExtensionElement CreateCmisExtensionElement(XmlNode xmlElement)
+        {
+            CmisExtensionElement result = new CmisExtensionElement();
+            result.Name = xmlElement.Name;
+            result.Namespace = xmlElement.NamespaceURI;
+
+            if (xmlElement.Attributes != null && xmlElement.Attributes.Count > 0)
+            {
+                result.Attributes = new Dictionary<string, string>();
+                foreach (XmlAttribute attr in xmlElement.Attributes)
+                {
+                    result.Attributes[attr.Name] = attr.Value;
+                }
+            }
+
+            if (xmlElement.HasChildNodes)
+            {
+                result.Children = new List<ICmisExtensionElement>();
+                foreach (XmlNode node in xmlElement.ChildNodes)
+                {
+                    ICmisExtensionElement element = CreateCmisExtensionElement(node);
+                    if (element != null)
+                    {
+                        result.Children.Add(element);
+                    }
+                }
+            }
+            else
+            {
+                result.Value = xmlElement.Value;
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// Converts an extension.
+        /// </summary>
+        public static cmisExtensionType ConvertExtension(IExtensionsData extension)
+        {
+            if (extension == null || extension.Extensions == null) { return null; }
+
+            XmlDocument doc = new XmlDocument();
+
+            List<XmlElement> elements = new List<XmlElement>();
+            foreach (ICmisExtensionElement element in extension.Extensions)
+            {
+                if (element == null) { continue; }
+                elements.Add(CreateXmlElement(doc, element));
+            }
+
+            cmisExtensionType result = new cmisExtensionType();
+            result.Any = elements.ToArray();
+
+            return result;
+        }
+
+        public static void ConvertExtension(IExtensionsData source, object target)
+        {
+            if (source == null || source.Extensions == null || target == null)
+            {
+                return;
+            }
+
+            Type type = target.GetType();
+            PropertyInfo propInfo = type.GetProperty("Any");
+            if (propInfo == null)
+            {
+                return;
+            }
+
+            XmlDocument doc = new XmlDocument();
+
+            List<XmlElement> elements = new List<XmlElement>();
+            foreach (ICmisExtensionElement element in source.Extensions)
+            {
+                if (element == null) { continue; }
+                elements.Add(CreateXmlElement(doc, element));
+            }
+
+            propInfo.SetValue(target, elements.ToArray(), null);
+        }
+
+        private static XmlElement CreateXmlElement(XmlDocument doc, ICmisExtensionElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+
+            XmlElement result = doc.CreateElement(element.Name, element.Namespace);
+
+            if (element.Attributes != null)
+            {
+                foreach (string key in element.Attributes.Keys)
+                {
+                    XmlAttribute attr = doc.CreateAttribute(key);
+                    attr.Value = element.Attributes[key];
+                    result.Attributes.Append(attr);
+                }
+            }
+
+            if (element.Value != null)
+            {
+                result.Value = element.Value;
+            }
+            else if (element.Children != null)
+            {
+                List<XmlElement> children = new List<XmlElement>();
+                foreach (ICmisExtensionElement child in element.Children)
+                {
+                    XmlElement xml = CreateXmlElement(doc, child);
+                    if (xml != null)
+                    {
+                        result.AppendChild(xml);
+                    }
+                }
+            }
+
+            return result;
+        }
+
+        public static string GetXmlEnumAttributeValue(Enum xsdEnum)
+        {
+            FieldInfo fieldInfo = xsdEnum.GetType().GetField(xsdEnum.ToString());
+            XmlEnumAttribute[] xmlAttr = fieldInfo.GetCustomAttributes(typeof(XmlEnumAttribute), false) as XmlEnumAttribute[];
+
+            if (xmlAttr.Length == 0)
+            {
+                return null;
+            }
+
+            return xmlAttr[0].Name;
+        }
+    }
+}
diff --git a/DotCMIS/binding/http.cs b/DotCMIS/binding/http.cs
new file mode 100644
index 0000000..a3864a7
--- /dev/null
+++ b/DotCMIS/binding/http.cs
@@ -0,0 +1,259 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using DotCMIS.Binding.Impl;
+using DotCMIS.Enums;
+using DotCMIS.Exceptions;
+using System.Web;
+using System.Text;
+
+namespace DotCMIS.Binding
+{
+    internal static class HttpUtils
+    {
+        public delegate void Output(Stream stream);
+
+        public static Response InvokeGET(UrlBuilder url, BindingSession session)
+        {
+            return Invoke(url, "GET", null, null, session, null, null);
+        }
+
+        public static Response InvokeGET(UrlBuilder url, BindingSession session, int? offset, int? length)
+        {
+            return Invoke(url, "GET", null, null, session, offset, length);
+        }
+
+        public static Response InvokePOST(UrlBuilder url, String contentType, Output writer, BindingSession session)
+        {
+            return Invoke(url, "POST", contentType, writer, session, null, null);
+        }
+
+        public static Response InvokePUT(UrlBuilder url, String contentType, Output writer, BindingSession session)
+        {
+            return Invoke(url, "PUT", contentType, writer, session, null, null);
+        }
+
+        public static Response InvokeDELETE(UrlBuilder url, BindingSession session)
+        {
+            return Invoke(url, "DELETE", null, null, session, null, null);
+        }
+
+        private static Response Invoke(UrlBuilder url, String method, String contentType, Output writer, BindingSession session,
+                int? offset, int? length)
+        {
+            try
+            {
+                // log before connect
+                Trace.WriteLine(method + " " + url);
+
+                // create connection           
+                HttpWebRequest conn = (HttpWebRequest)WebRequest.Create(url.Url);
+                conn.Method = method;
+
+                // set content type
+                if (contentType != null)
+                {
+                    conn.ContentType = contentType;
+                }
+
+                // authenticate
+                AbstractAuthenticationProvider authProvider = session.GetAuthenticationProvider();
+                if (authProvider != null)
+                {
+                    conn.PreAuthenticate = true;
+                    authProvider.Authenticate(conn);
+                }
+
+                // range
+                if (offset != null && length != null)
+                {
+                    conn.AddRange(offset ?? 0, offset + length - 1 ?? 0);
+                }
+                else if (offset != null)
+                {
+                    conn.AddRange(offset ?? 0);
+                }
+
+                // send data
+                if (writer != null)
+                {
+                    conn.SendChunked = true;
+                    conn.AllowWriteStreamBuffering = false;
+                    Stream requestStream = conn.GetRequestStream();
+                    writer(requestStream);
+                    requestStream.Close();
+                }
+
+                // connect
+                try
+                {
+                    HttpWebResponse response = (HttpWebResponse)conn.GetResponse();
+                    return new Response(response);
+                }
+                catch (WebException we)
+                {
+                    return new Response(we);
+                }
+            }
+            catch (Exception e)
+            {
+                throw new CmisConnectionException("Cannot access " + url + ": " + e.Message, e);
+            }
+        }
+
+        internal class Response
+        {
+            private WebResponse response;
+
+            public HttpStatusCode StatusCode { get; private set; }
+            public string Message { get; private set; }
+            public Stream Stream { get; private set; }
+            public string ErrorContent { get; private set; }
+            public string ContentType { get; private set; }
+            public long? ContentLength { get; private set; }
+
+            public Response(HttpWebResponse httpResponse)
+            {
+                this.response = httpResponse;
+                StatusCode = httpResponse.StatusCode;
+                Message = httpResponse.StatusDescription;
+                ContentType = httpResponse.ContentType;
+                ContentLength = httpResponse.ContentLength == -1 ? null : (long?)httpResponse.ContentLength;
+
+                if (httpResponse.StatusCode == HttpStatusCode.OK ||
+                    httpResponse.StatusCode == HttpStatusCode.Created ||
+                    httpResponse.StatusCode == HttpStatusCode.NonAuthoritativeInformation ||
+                    httpResponse.StatusCode == HttpStatusCode.PartialContent)
+                {
+                    Stream = new BufferedStream(httpResponse.GetResponseStream(), 64 * 1024);
+                }
+                else
+                {
+                    try { httpResponse.Close(); }
+                    catch (Exception) { }
+                }
+            }
+
+            public Response(WebException exception)
+            {
+                response = exception.Response;
+
+                if (response is HttpWebResponse)
+                {
+                    HttpWebResponse httpResponse = (HttpWebResponse)response;
+                    StatusCode = httpResponse.StatusCode;
+                    Message = httpResponse.StatusDescription;
+                    ContentType = httpResponse.ContentType;
+
+                    if (ContentType != null && ContentType.ToLower().StartsWith("text/"))
+                    {
+                        StringBuilder sb = new StringBuilder();
+
+                        using (StreamReader sr = new StreamReader(httpResponse.GetResponseStream()))
+                        {
+                            string s;
+                            while ((s = sr.ReadLine()) != null)
+                            {
+                                sb.Append(s);
+                                sb.Append('\n');
+                            }
+                        }
+
+                        ErrorContent = sb.ToString();
+                    }
+                }
+                else
+                {
+                    StatusCode = HttpStatusCode.InternalServerError;
+                    Message = exception.Status.ToString();
+                }
+
+                try { response.Close(); }
+                catch (Exception) { }
+            }
+        }
+    }
+
+    internal class UrlBuilder
+    {
+        private UriBuilder uri;
+
+        public Uri Url
+        {
+            get { return uri.Uri; }
+        }
+
+        public UrlBuilder(string url)
+        {
+            if (url == null)
+            {
+                throw new ArgumentNullException("url");
+            }
+
+            uri = new UriBuilder(url);
+        }
+
+        public UrlBuilder AddParameter(string name, object value)
+        {
+            if ((name == null) || (value == null))
+            {
+                return this;
+            }
+
+            string valueStr = HttpUtility.UrlEncode(NormalizeParameter(value));
+
+            if (uri.Query != null && uri.Query.Length > 1)
+            {
+                uri.Query = uri.Query.Substring(1) + "&" + name + "=" + valueStr;
+            }
+            else
+            {
+                uri.Query = name + "=" + valueStr;
+            }
+
+            return this;
+        }
+
+        public static string NormalizeParameter(object value)
+        {
+            if (value == null)
+            {
+                return null;
+            }
+            else if (value is Enum)
+            {
+                return ((Enum)value).GetCmisValue();
+            }
+            else if (value is bool)
+            {
+                return (bool)value ? "true" : "false";
+            }
+
+            return value.ToString();
+        }
+
+        public override string ToString()
+        {
+            return Url.ToString();
+        }
+    }
+}
diff --git a/DotCMIS/binding/services.cs b/DotCMIS/binding/services.cs
new file mode 100644
index 0000000..47c67ce
--- /dev/null
+++ b/DotCMIS/binding/services.cs
@@ -0,0 +1,180 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using DotCMIS.Data;
+using DotCMIS.Data.Extensions;
+using DotCMIS.Enums;
+
+namespace DotCMIS.Binding.Services
+{
+    public interface IRepositoryService
+    {
+        IList<IRepositoryInfo> GetRepositoryInfos(IExtensionsData extension);
+
+        IRepositoryInfo GetRepositoryInfo(string repositoryId, IExtensionsData extension);
+
+        ITypeDefinitionList GetTypeChildren(string repositoryId, string typeId, bool? includePropertyDefinitions,
+            long? maxItems, long? skipCount, IExtensionsData extension);
+
+        IList<ITypeDefinitionContainer> GetTypeDescendants(string repositoryId, string typeId, long? depth,
+            bool? includePropertyDefinitions, IExtensionsData extension);
+
+        ITypeDefinition GetTypeDefinition(string repositoryId, string typeId, IExtensionsData extension);
+    }
+
+    public interface INavigationService
+    {
+        IObjectInFolderList GetChildren(string repositoryId, string folderId, string filter, string orderBy,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, long? maxItems, long? skipCount, IExtensionsData extension);
+
+        IList<IObjectInFolderContainer> GetDescendants(string repositoryId, string folderId, long? depth, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, IExtensionsData extension);
+
+        IList<IObjectInFolderContainer> GetFolderTree(string repositoryId, string folderId, long? depth, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, IExtensionsData extension);
+
+        IList<IObjectParentData> GetObjectParents(string repositoryId, string objectId, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includeRelativePathSegment, IExtensionsData extension);
+
+        IObjectData GetFolderParent(string repositoryId, string folderId, string filter, ExtensionsData extension);
+
+        IObjectList GetCheckedOutDocs(string repositoryId, string folderId, string filter, string orderBy,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension);
+    }
+
+    public interface IObjectService
+    {
+        string CreateDocument(string repositoryId, IProperties properties, string folderId, IContentStream contentStream,
+            VersioningState? versioningState, IList<string> policies, IAcl addAces, IAcl removeAces, IExtensionsData extension);
+
+        string CreateDocumentFromSource(string repositoryId, string sourceId, IProperties properties, string folderId,
+            VersioningState? versioningState, IList<string> policies, IAcl addAces, IAcl removeAces, IExtensionsData extension);
+
+        string CreateFolder(string repositoryId, IProperties properties, string folderId, IList<string> policies,
+            IAcl addAces, IAcl removeAces, IExtensionsData extension);
+
+        string CreateRelationship(string repositoryId, IProperties properties, IList<string> policies, IAcl addAces,
+            IAcl removeAces, IExtensionsData extension);
+
+        string CreatePolicy(string repositoryId, IProperties properties, string folderId, IList<string> policies,
+            IAcl addAces, IAcl removeAces, IExtensionsData extension);
+
+        IAllowableActions GetAllowableActions(string repositoryId, string objectId, IExtensionsData extension);
+
+        IProperties GetProperties(string repositoryId, string objectId, string filter, IExtensionsData extension);
+
+        IList<IRenditionData> GetRenditions(string repositoryId, string objectId, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension);
+
+        IObjectData GetObject(string repositoryId, string objectId, string filter, bool? includeAllowableActions,
+            IncludeRelationships? includeRelationships, string renditionFilter, bool? includePolicyIds,
+            bool? includeAcl, IExtensionsData extension);
+
+        IObjectData GetObjectByPath(string repositoryId, string path, string filter, bool? includeAllowableActions,
+            IncludeRelationships? includeRelationships, string renditionFilter, bool? includePolicyIds, bool? includeAcl,
+            IExtensionsData extension);
+
+        IContentStream GetContentStream(string repositoryId, string objectId, string streamId, long? offset, long? length,
+            IExtensionsData extension);
+
+        void UpdateProperties(string repositoryId, ref string objectId, ref string changeToken, IProperties properties,
+            IExtensionsData extension);
+
+        void MoveObject(string repositoryId, ref string objectId, string targetFolderId, string sourceFolderId,
+            IExtensionsData extension);
+
+        void DeleteObject(string repositoryId, string objectId, bool? allVersions, IExtensionsData extension);
+
+        IFailedToDeleteData DeleteTree(string repositoryId, string folderId, bool? allVersions, UnfileObject? unfileObjects,
+            bool? continueOnFailure, ExtensionsData extension);
+
+        void SetContentStream(string repositoryId, ref string objectId, bool? overwriteFlag, ref string changeToken,
+            IContentStream contentStream, IExtensionsData extension);
+
+        void DeleteContentStream(string repositoryId, ref string objectId, ref string changeToken, IExtensionsData extension);
+    }
+
+    public interface IVersioningService
+    {
+        void CheckOut(string repositoryId, ref string objectId, IExtensionsData extension, out bool? contentCopied);
+
+        void CancelCheckOut(string repositoryId, string objectId, IExtensionsData extension);
+
+        void CheckIn(string repositoryId, ref string objectId, bool? major, IProperties properties,
+            IContentStream contentStream, string checkinComment, List<string> policies, IAcl addAces, IAcl removeAces,
+            IExtensionsData extension);
+
+        IObjectData GetObjectOfLatestVersion(string repositoryId, string objectId, string versionSeriesId, bool major,
+            string filter, bool? includeAllowableActions, IncludeRelationships? includeRelationships,
+            string renditionFilter, bool? includePolicyIds, bool? includeAcl, IExtensionsData extension);
+
+        IProperties GetPropertiesOfLatestVersion(string repositoryId, string objectId, string versionSeriesId, bool major,
+            string filter, IExtensionsData extension);
+
+        IList<IObjectData> GetAllVersions(string repositoryId, string objectId, string versionSeriesId, string filter,
+            bool? includeAllowableActions, IExtensionsData extension);
+    }
+
+    public interface IRelationshipService
+    {
+        IObjectList GetObjectRelationships(string repositoryId, string objectId, bool? includeSubRelationshipTypes,
+            RelationshipDirection? relationshipDirection, string typeId, string filter, bool? includeAllowableActions,
+            long? maxItems, long? skipCount, IExtensionsData extension);
+    }
+
+    public interface IDiscoveryService
+    {
+        IObjectList Query(string repositoryId, string statement, bool? searchAllVersions,
+           bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+           long? maxItems, long? skipCount, IExtensionsData extension);
+
+        IObjectList GetContentChanges(string repositoryId, ref string changeLogToken, bool? includeProperties,
+           string filter, bool? includePolicyIds, bool? includeAcl, long? maxItems, IExtensionsData extension);
+    }
+
+    public interface IMultiFilingService
+    {
+        void AddObjectToFolder(string repositoryId, string objectId, string folderId, bool? allVersions, IExtensionsData extension);
+
+        void RemoveObjectFromFolder(string repositoryId, string objectId, string folderId, IExtensionsData extension);
+    }
+
+    public interface IAclService
+    {
+        IAcl GetAcl(string repositoryId, string objectId, bool? onlyBasicPermissions, IExtensionsData extension);
+
+        IAcl ApplyAcl(string repositoryId, string objectId, IAcl addAces, IAcl removeAces, AclPropagation? aclPropagation,
+            IExtensionsData extension);
+    }
+
+    public interface IPolicyService
+    {
+        void ApplyPolicy(string repositoryId, string policyId, string objectId, IExtensionsData extension);
+
+        void RemovePolicy(string repositoryId, string policyId, string objectId, IExtensionsData extension);
+
+        IList<IObjectData> GetAppliedPolicies(string repositoryId, string objectId, string filter, IExtensionsData extension);
+    }
+}
diff --git a/DotCMIS/binding/webservices/webservices.cs b/DotCMIS/binding/webservices/webservices.cs
new file mode 100644
index 0000000..cc02b52
--- /dev/null
+++ b/DotCMIS/binding/webservices/webservices.cs
@@ -0,0 +1,1480 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+using DotCMIS.Binding.Impl;
+using DotCMIS.Binding.Services;
+using DotCMIS.CMISWebServicesReference;
+using DotCMIS.Data;
+using DotCMIS.Data.Extensions;
+using DotCMIS.Exceptions;
+using DotCMIS.Enums;
+
+namespace DotCMIS.Binding.WebServices
+{
+    /// <summary>
+    /// Web Services binding SPI.
+    /// </summary>
+    internal class CmisWebServicesSpi : ICmisSpi
+    {
+        private RepositoryService repositoryService;
+        private NavigationService navigationService;
+        private ObjectService objectService;
+        private VersioningService versioningService;
+        private DiscoveryService discoveryService;
+        private MultiFilingService multiFilingService;
+        private RelationshipService relationshipService;
+        private PolicyService policyService;
+        private AclService aclService;
+
+        public void initialize(BindingSession session)
+        {
+            PortProvider provider = new PortProvider(session);
+
+            repositoryService = new RepositoryService(session, provider);
+            navigationService = new NavigationService(session, provider);
+            objectService = new ObjectService(session, provider);
+            versioningService = new VersioningService(session, provider);
+            discoveryService = new DiscoveryService(session, provider);
+            multiFilingService = new MultiFilingService(session, provider);
+            relationshipService = new RelationshipService(session, provider);
+            policyService = new PolicyService(session, provider);
+            aclService = new AclService(session, provider);
+        }
+
+        public IRepositoryService GetRepositoryService()
+        {
+            return repositoryService;
+        }
+
+        public INavigationService GetNavigationService()
+        {
+            return navigationService;
+        }
+
+        public IObjectService GetObjectService()
+        {
+            return objectService;
+        }
+
+        public IVersioningService GetVersioningService()
+        {
+            return versioningService;
+        }
+
+        public IRelationshipService GetRelationshipService()
+        {
+            return relationshipService;
+        }
+
+        public IDiscoveryService GetDiscoveryService()
+        {
+            return discoveryService;
+        }
+
+        public IMultiFilingService GetMultiFilingService()
+        {
+            return multiFilingService;
+        }
+
+        public IAclService GetAclService()
+        {
+            return aclService;
+        }
+
+        public IPolicyService GetPolicyService()
+        {
+            return policyService;
+        }
+
+        public void ClearAllCaches()
+        {
+            // nothing to do
+        }
+
+        public void ClearRepositoryCache(string repositoryId)
+        {
+            // nothing to do
+        }
+
+        public void Close()
+        {
+            // nothing to do
+        }
+    }
+
+    internal class PortProvider
+    {
+        [ThreadStatic]
+        private static IDictionary<int, IDictionary<string, object>> Services;
+
+        private BindingSession session;
+
+        public PortProvider(BindingSession session)
+        {
+            this.session = session;
+        }
+
+        private static IDictionary<string, object> GetServiceDictionary(BindingSession session)
+        {
+            if (Services == null)
+            {
+                Services = new Dictionary<int, IDictionary<string, object>>();
+            }
+
+            IDictionary<string, object> serviceDict;
+            if (Services.TryGetValue(session.GetHashCode(), out serviceDict))
+            {
+                return serviceDict;
+            }
+
+            serviceDict = new Dictionary<string, object>();
+            Services[session.GetHashCode()] = serviceDict;
+
+            return serviceDict;
+        }
+
+        public RepositoryServicePortClient GetRepositoryServicePort()
+        {
+            return (RepositoryServicePortClient)GetPortObject(SessionParameter.WebServicesRepositoryService);
+        }
+
+        public NavigationServicePortClient GetNavigationService()
+        {
+            return (NavigationServicePortClient)GetPortObject(SessionParameter.WebServicesNavigationService);
+        }
+
+        public ObjectServicePortClient GetObjectService()
+        {
+            return (ObjectServicePortClient)GetPortObject(SessionParameter.WebServicesObjectService);
+        }
+
+        public VersioningServicePortClient GetVersioningService()
+        {
+            return (VersioningServicePortClient)GetPortObject(SessionParameter.WebServicesVersioningService);
+        }
+
+        public DiscoveryServicePortClient GetDiscoveryService()
+        {
+            return (DiscoveryServicePortClient)GetPortObject(SessionParameter.WebServicesDiscoveryService);
+        }
+
+        public MultiFilingServicePortClient GetMultiFilingService()
+        {
+            return (MultiFilingServicePortClient)GetPortObject(SessionParameter.WebServicesMultifilingService);
+        }
+
+        public RelationshipServicePortClient GetRelationshipService()
+        {
+            return (RelationshipServicePortClient)GetPortObject(SessionParameter.WebServicesRelationshipService);
+        }
+
+        public PolicyServicePortClient GetPolicyService()
+        {
+            return (PolicyServicePortClient)GetPortObject(SessionParameter.WebServicesPolicyService);
+        }
+
+        public ACLServicePortClient GetAclService()
+        {
+            return (ACLServicePortClient)GetPortObject(SessionParameter.WebServicesAclService);
+        }
+
+        private object GetPortObject(string serviceKey)
+        {
+            IDictionary<string, object> servicesDict = GetServiceDictionary(session);
+
+            object portObject;
+            if (!servicesDict.TryGetValue(serviceKey, out portObject))
+            {
+                portObject = InitServiceObject(serviceKey);
+                servicesDict[serviceKey] = portObject;
+            }
+
+            return portObject;
+        }
+
+        private object InitServiceObject(string serviceKey)
+        {
+            object portObject = null;
+
+            BasicHttpBinding binding = new BasicHttpBinding();
+            binding.MessageEncoding = WSMessageEncoding.Mtom;
+            binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
+            binding.TransferMode = TransferMode.Streamed;
+
+            long messageSize = session.GetValue(SessionParameter.MessageSize, 4 * 1024 * 1024);
+            binding.MaxReceivedMessageSize = messageSize;
+            binding.MaxBufferSize = (messageSize > Int32.MaxValue ? Int32.MaxValue : (int)messageSize);
+
+            if (serviceKey == SessionParameter.WebServicesRepositoryService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesRepositoryService) as string;
+                portObject = new RepositoryServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesNavigationService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesNavigationService) as string;
+                portObject = new NavigationServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesObjectService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesObjectService) as string;
+                portObject = new ObjectServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesVersioningService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesVersioningService) as string;
+                portObject = new VersioningServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesDiscoveryService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesDiscoveryService) as string;
+                portObject = new DiscoveryServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesRelationshipService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesRelationshipService) as string;
+                portObject = new RelationshipServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesMultifilingService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesMultifilingService) as string;
+                portObject = new MultiFilingServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesPolicyService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesPolicyService) as string;
+                portObject = new PolicyServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+            else if (serviceKey == SessionParameter.WebServicesAclService)
+            {
+                string wsdlUrl = session.GetValue(SessionParameter.WebServicesAclService) as string;
+                portObject = new ACLServicePortClient(binding, new EndpointAddress(wsdlUrl));
+            }
+
+            AbstractAuthenticationProvider authenticationProvider = session.GetAuthenticationProvider();
+            if (authenticationProvider != null)
+            {
+                authenticationProvider.Authenticate(portObject);
+            }
+
+            return portObject;
+        }
+    }
+
+    /// <summary>
+    /// Common service methods.
+    /// </summary>
+    internal abstract class AbstractWebServicesService
+    {
+        protected BindingSession Session { get; set; }
+
+        protected PortProvider Provider { get; set; }
+
+        protected CmisBaseException ConvertException(FaultException<cmisFaultType> fault)
+        {
+            if ((fault == null) || (fault.Detail == null))
+            {
+                return new CmisRuntimeException("CmisException has no fault!");
+            }
+
+            String msg = fault.Detail.message;
+            long? code = null;
+
+            try
+            {
+                code = Int64.Parse(fault.Detail.code);
+            }
+            catch (Exception)
+            {
+                // ignore
+            }
+
+            switch (fault.Detail.type)
+            {
+                case enumServiceException.constraint:
+                    return new CmisConstraintException(msg, code);
+                case enumServiceException.contentAlreadyExists:
+                    return new CmisContentAlreadyExistsException(msg, code);
+                case enumServiceException.filterNotValid:
+                    return new CmisFilterNotValidException(msg, code);
+                case enumServiceException.invalidArgument:
+                    return new CmisInvalidArgumentException(msg, code);
+                case enumServiceException.nameConstraintViolation:
+                    return new CmisNameConstraintViolationException(msg, code);
+                case enumServiceException.notSupported:
+                    return new CmisNotSupportedException(msg, code);
+                case enumServiceException.objectNotFound:
+                    return new CmisObjectNotFoundException(msg, code);
+                case enumServiceException.permissionDenied:
+                    return new CmisPermissionDeniedException(msg, code);
+                case enumServiceException.runtime:
+                    return new CmisRuntimeException(msg, code);
+                case enumServiceException.storage:
+                    return new CmisStorageException(msg, code);
+                case enumServiceException.streamNotSupported:
+                    return new CmisStreamNotSupportedException(msg, code);
+                case enumServiceException.updateConflict:
+                    return new CmisUpdateConflictException(msg, code);
+                case enumServiceException.versioning:
+                    return new CmisVersioningException(msg, code);
+            }
+
+            return new CmisRuntimeException("Unknown exception[" + fault.Detail.type + "]: " + msg);
+        }
+    }
+
+    internal class RepositoryService : AbstractWebServicesService, IRepositoryService
+    {
+        public RepositoryService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public IList<IRepositoryInfo> GetRepositoryInfos(IExtensionsData extension)
+        {
+            RepositoryServicePortClient port = Provider.GetRepositoryServicePort();
+
+            try
+            {
+                cmisRepositoryEntryType[] entries = port.getRepositories(Converter.ConvertExtension(extension));
+
+                if (entries == null)
+                {
+                    return null;
+                }
+
+                IList<IRepositoryInfo> result = new List<IRepositoryInfo>();
+                foreach (cmisRepositoryEntryType entry in entries)
+                {
+                    cmisRepositoryInfoType info = port.getRepositoryInfo(entry.repositoryId, null);
+                    result.Add(Converter.Convert(info));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IRepositoryInfo GetRepositoryInfo(string repositoryId, IExtensionsData extension)
+        {
+            RepositoryServicePortClient port = Provider.GetRepositoryServicePort();
+
+            try
+            {
+                return Converter.Convert(port.getRepositoryInfo(repositoryId, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public ITypeDefinitionList GetTypeChildren(string repositoryId, string typeId, bool? includePropertyDefinitions,
+                long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            RepositoryServicePortClient port = Provider.GetRepositoryServicePort();
+
+            try
+            {
+                return Converter.Convert(port.getTypeChildren(repositoryId, typeId, includePropertyDefinitions,
+                    maxItems.ToString(), skipCount.ToString(), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<ITypeDefinitionContainer> GetTypeDescendants(string repositoryId, string typeId, long? depth,
+                bool? includePropertyDefinitions, IExtensionsData extension)
+        {
+            RepositoryServicePortClient port = Provider.GetRepositoryServicePort();
+
+            try
+            {
+                cmisTypeContainer[] descendants = port.getTypeDescendants(
+                    repositoryId, typeId, depth.ToString(), includePropertyDefinitions, Converter.ConvertExtension(extension));
+
+                if (descendants == null)
+                {
+                    return null;
+                }
+
+                List<ITypeDefinitionContainer> result = new List<ITypeDefinitionContainer>();
+                foreach (cmisTypeContainer container in descendants)
+                {
+                    result.Add(Converter.Convert(container));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public ITypeDefinition GetTypeDefinition(string repositoryId, string typeId, IExtensionsData extension)
+        {
+            RepositoryServicePortClient port = Provider.GetRepositoryServicePort();
+
+            try
+            {
+                return Converter.Convert(port.getTypeDefinition(repositoryId, typeId, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class NavigationService : AbstractWebServicesService, INavigationService
+    {
+        public NavigationService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public IObjectInFolderList GetChildren(string repositoryId, string folderId, string filter, string orderBy,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            NavigationServicePortClient port = Provider.GetNavigationService();
+
+            try
+            {
+                return Converter.Convert(port.getChildren(repositoryId, folderId, filter, orderBy, includeAllowableActions,
+                    (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships), renditionFilter,
+                    includePathSegment, maxItems.ToString(), skipCount.ToString(), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<IObjectInFolderContainer> GetDescendants(string repositoryId, string folderId, long? depth, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, IExtensionsData extension)
+        {
+            NavigationServicePortClient port = Provider.GetNavigationService();
+
+            try
+            {
+                cmisObjectInFolderContainerType[] descendants = port.getDescendants(repositoryId, folderId, filter, depth.ToString(),
+                    includeAllowableActions, (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships),
+                    renditionFilter, includePathSegment, Converter.ConvertExtension(extension));
+
+                if (descendants == null)
+                {
+                    return null;
+                }
+
+                List<IObjectInFolderContainer> result = new List<IObjectInFolderContainer>();
+                foreach (cmisObjectInFolderContainerType container in descendants)
+                {
+                    result.Add(Converter.Convert(container));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<IObjectInFolderContainer> GetFolderTree(string repositoryId, string folderId, long? depth, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includePathSegment, IExtensionsData extension)
+        {
+            NavigationServicePortClient port = Provider.GetNavigationService();
+
+            try
+            {
+                cmisObjectInFolderContainerType[] descendants = port.getFolderTree(repositoryId, folderId, filter, depth.ToString(),
+                    includeAllowableActions, (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships),
+                    renditionFilter, includePathSegment, Converter.ConvertExtension(extension));
+
+                if (descendants == null)
+                {
+                    return null;
+                }
+
+                List<IObjectInFolderContainer> result = new List<IObjectInFolderContainer>();
+                foreach (cmisObjectInFolderContainerType container in descendants)
+                {
+                    result.Add(Converter.Convert(container));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<IObjectParentData> GetObjectParents(string repositoryId, string objectId, string filter,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            bool? includeRelativePathSegment, IExtensionsData extension)
+        {
+            NavigationServicePortClient port = Provider.GetNavigationService();
+
+            try
+            {
+                cmisObjectParentsType[] parents = port.getObjectParents(repositoryId, objectId, filter,
+                    includeAllowableActions, (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships),
+                    renditionFilter, includeRelativePathSegment, Converter.ConvertExtension(extension));
+
+                if (parents == null)
+                {
+                    return null;
+                }
+
+                List<IObjectParentData> result = new List<IObjectParentData>();
+                foreach (cmisObjectParentsType parent in parents)
+                {
+                    result.Add(Converter.Convert(parent));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IObjectData GetFolderParent(string repositoryId, string folderId, string filter, ExtensionsData extension)
+        {
+            NavigationServicePortClient port = Provider.GetNavigationService();
+
+            try
+            {
+                return Converter.Convert(port.getFolderParent(repositoryId, folderId, filter, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IObjectList GetCheckedOutDocs(string repositoryId, string folderId, string filter, string orderBy,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            NavigationServicePortClient port = Provider.GetNavigationService();
+
+            try
+            {
+                return Converter.Convert(port.getCheckedOutDocs(repositoryId, folderId, filter, orderBy, includeAllowableActions,
+                    (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships), renditionFilter,
+                    maxItems.ToString(), skipCount.ToString(), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class ObjectService : AbstractWebServicesService, IObjectService
+    {
+        public ObjectService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public string CreateDocument(string repositoryId, IProperties properties, string folderId, IContentStream contentStream,
+            VersioningState? versioningState, IList<string> policies, IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                string objectId = port.createDocument(repositoryId, Converter.Convert(properties), folderId, Converter.Convert(contentStream),
+                    (enumVersioningState?)CmisValue.CmisToSerializerEnum(versioningState), Converter.ConvertList(policies),
+                    Converter.Convert(addAces), Converter.Convert(removeAces), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+
+                return objectId;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public string CreateDocumentFromSource(string repositoryId, string sourceId, IProperties properties, string folderId,
+            VersioningState? versioningState, IList<string> policies, IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                string objectId = port.createDocumentFromSource(repositoryId, sourceId, Converter.Convert(properties), folderId,
+                    (enumVersioningState?)CmisValue.CmisToSerializerEnum(versioningState), Converter.ConvertList(policies),
+                    Converter.Convert(addAces), Converter.Convert(removeAces), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+
+                return objectId;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public string CreateFolder(string repositoryId, IProperties properties, string folderId, IList<string> policies,
+            IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                string objectId = port.createFolder(repositoryId, Converter.Convert(properties), folderId,
+                    Converter.ConvertList(policies), Converter.Convert(addAces), Converter.Convert(removeAces), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+
+                return objectId;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public string CreateRelationship(string repositoryId, IProperties properties, IList<string> policies, IAcl addAces,
+            IAcl removeAces, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                string objectId = port.createRelationship(repositoryId, Converter.Convert(properties), Converter.ConvertList(policies),
+                    Converter.Convert(addAces), Converter.Convert(removeAces), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+
+                return objectId;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+
+        }
+
+        public string CreatePolicy(string repositoryId, IProperties properties, string folderId, IList<string> policies,
+            IAcl addAces, IAcl removeAces, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                string objectId = port.createPolicy(repositoryId, Converter.Convert(properties), folderId,
+                    Converter.ConvertList(policies), Converter.Convert(addAces), Converter.Convert(removeAces), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+
+                return objectId;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IAllowableActions GetAllowableActions(string repositoryId, string objectId, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                return Converter.Convert(port.getAllowableActions(repositoryId, objectId, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IProperties GetProperties(string repositoryId, string objectId, string filter, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                return Converter.Convert(port.getProperties(repositoryId, objectId, filter, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<IRenditionData> GetRenditions(string repositoryId, string objectId, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisRenditionType[] renditions = port.getRenditions(repositoryId, objectId, renditionFilter,
+                    maxItems.ToString(), skipCount.ToString(), Converter.ConvertExtension(extension));
+
+                if (renditions == null)
+                {
+                    return null;
+                }
+
+                IList<IRenditionData> result = new List<IRenditionData>();
+                foreach (cmisRenditionType rendition in renditions)
+                {
+                    result.Add(Converter.Convert(rendition));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IObjectData GetObject(string repositoryId, string objectId, string filter, bool? includeAllowableActions,
+            IncludeRelationships? includeRelationships, string renditionFilter, bool? includePolicyIds,
+            bool? includeAcl, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                return Converter.Convert(port.getObject(repositoryId, objectId, filter, includeAllowableActions,
+                    (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships), renditionFilter,
+                    includePolicyIds, includeAcl, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IObjectData GetObjectByPath(string repositoryId, string path, string filter, bool? includeAllowableActions,
+            IncludeRelationships? includeRelationships, string renditionFilter, bool? includePolicyIds, bool? includeAcl,
+            IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                return Converter.Convert(port.getObjectByPath(repositoryId, path, filter, includeAllowableActions,
+                    (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships), renditionFilter,
+                    includePolicyIds, includeAcl, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IContentStream GetContentStream(string repositoryId, string objectId, string streamId, long? offset, long? length,
+            IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                return Converter.Convert(port.getContentStream(
+                    repositoryId, objectId, streamId, offset.ToString(), length.ToString(), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void UpdateProperties(string repositoryId, ref string objectId, ref string changeToken, IProperties properties,
+            IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.updateProperties(repositoryId, ref objectId, ref changeToken, Converter.Convert(properties), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void MoveObject(string repositoryId, ref string objectId, string targetFolderId, string sourceFolderId,
+            IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.moveObject(repositoryId, ref objectId, targetFolderId, sourceFolderId, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void DeleteObject(string repositoryId, string objectId, bool? allVersions, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.deleteObject(repositoryId, objectId, allVersions, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IFailedToDeleteData DeleteTree(string repositoryId, string folderId, bool? allVersions, UnfileObject? unfileObjects,
+            bool? continueOnFailure, ExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                return Converter.Convert(port.deleteTree(repositoryId, folderId, allVersions,
+                    (enumUnfileObject?)CmisValue.CmisToSerializerEnum(unfileObjects), continueOnFailure,
+                    Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void SetContentStream(string repositoryId, ref string objectId, bool? overwriteFlag, ref string changeToken,
+            IContentStream contentStream, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.setContentStream(repositoryId, ref objectId, overwriteFlag, ref changeToken,
+                    Converter.Convert(contentStream), ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void DeleteContentStream(string repositoryId, ref string objectId, ref string changeToken, IExtensionsData extension)
+        {
+            ObjectServicePortClient port = Provider.GetObjectService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.deleteContentStream(repositoryId, ref objectId, ref changeToken, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class VersioningService : AbstractWebServicesService, IVersioningService
+    {
+        public VersioningService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public void CheckOut(string repositoryId, ref string objectId, IExtensionsData extension, out bool? contentCopied)
+        {
+            VersioningServicePortClient port = Provider.GetVersioningService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                contentCopied = port.checkOut(repositoryId, ref objectId, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void CancelCheckOut(string repositoryId, string objectId, IExtensionsData extension)
+        {
+            VersioningServicePortClient port = Provider.GetVersioningService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.cancelCheckOut(repositoryId, objectId, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void CheckIn(string repositoryId, ref string objectId, bool? major, IProperties properties,
+            IContentStream contentStream, string checkinComment, List<string> policies, IAcl addAces, IAcl removeAces,
+            IExtensionsData extension)
+        {
+            VersioningServicePortClient port = Provider.GetVersioningService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.checkIn(repositoryId, ref objectId, major, Converter.Convert(properties), Converter.Convert(contentStream),
+                    checkinComment, Converter.ConvertList(policies), Converter.Convert(addAces), Converter.Convert(removeAces),
+                    ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IObjectData GetObjectOfLatestVersion(string repositoryId, string objectId, string versionSeriesId, bool major,
+            string filter, bool? includeAllowableActions, IncludeRelationships? includeRelationships,
+            string renditionFilter, bool? includePolicyIds, bool? includeAcl, IExtensionsData extension)
+        {
+            VersioningServicePortClient port = Provider.GetVersioningService();
+
+            try
+            {
+                return Converter.Convert(port.getObjectOfLatestVersion(repositoryId, versionSeriesId, major, filter,
+                    includeAllowableActions, (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships),
+                    renditionFilter, includePolicyIds, includeAcl, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IProperties GetPropertiesOfLatestVersion(string repositoryId, string objectId, string versionSeriesId, bool major,
+            string filter, IExtensionsData extension)
+        {
+            VersioningServicePortClient port = Provider.GetVersioningService();
+
+            try
+            {
+                return Converter.Convert(port.getPropertiesOfLatestVersion(repositoryId, versionSeriesId, major, filter,
+                    Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<IObjectData> GetAllVersions(string repositoryId, string objectId, string versionSeriesId, string filter,
+            bool? includeAllowableActions, IExtensionsData extension)
+        {
+            VersioningServicePortClient port = Provider.GetVersioningService();
+
+            try
+            {
+                cmisObjectType[] versions = port.getAllVersions(repositoryId, versionSeriesId, filter, includeAllowableActions,
+                    Converter.ConvertExtension(extension));
+
+                if (versions == null)
+                {
+                    return null;
+                }
+
+                IList<IObjectData> result = new List<IObjectData>();
+                foreach (cmisObjectType version in versions)
+                {
+                    result.Add(Converter.Convert(version));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class RelationshipService : AbstractWebServicesService, IRelationshipService
+    {
+        public RelationshipService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public IObjectList GetObjectRelationships(string repositoryId, string objectId, bool? includeSubRelationshipTypes,
+            RelationshipDirection? relationshipDirection, string typeId, string filter, bool? includeAllowableActions,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            RelationshipServicePortClient port = Provider.GetRelationshipService();
+
+            try
+            {
+                return Converter.Convert(port.getObjectRelationships(repositoryId, objectId,
+                    includeSubRelationshipTypes == null ? true : (bool)includeSubRelationshipTypes,
+                    (enumRelationshipDirection?)CmisValue.CmisToSerializerEnum(relationshipDirection), typeId, filter, includeAllowableActions,
+                    maxItems.ToString(), skipCount.ToString(), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class DiscoveryService : AbstractWebServicesService, IDiscoveryService
+    {
+        public DiscoveryService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public IObjectList Query(string repositoryId, string statement, bool? searchAllVersions,
+            bool? includeAllowableActions, IncludeRelationships? includeRelationships, string renditionFilter,
+            long? maxItems, long? skipCount, IExtensionsData extension)
+        {
+            DiscoveryServicePortClient port = Provider.GetDiscoveryService();
+
+            try
+            {
+                return Converter.Convert(port.query(repositoryId, statement, searchAllVersions, includeAllowableActions,
+                    (enumIncludeRelationships?)CmisValue.CmisToSerializerEnum(includeRelationships), renditionFilter,
+                    maxItems.ToString(), skipCount.ToString(), Converter.ConvertExtension(extension), null));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IObjectList GetContentChanges(string repositoryId, ref string changeLogToken, bool? includeProperties,
+           string filter, bool? includePolicyIds, bool? includeAcl, long? maxItems, IExtensionsData extension)
+        {
+            DiscoveryServicePortClient port = Provider.GetDiscoveryService();
+
+            try
+            {
+                return Converter.Convert(port.getContentChanges(repositoryId, ref changeLogToken, includeProperties, filter,
+                    includePolicyIds, includeAcl, maxItems.ToString(), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class MultiFilingService : AbstractWebServicesService, IMultiFilingService
+    {
+        public MultiFilingService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public void AddObjectToFolder(string repositoryId, string objectId, string folderId, bool? allVersions, IExtensionsData extension)
+        {
+            MultiFilingServicePortClient port = Provider.GetMultiFilingService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.addObjectToFolder(repositoryId, objectId, folderId, allVersions == null ? true : (bool)allVersions, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void RemoveObjectFromFolder(string repositoryId, string objectId, string folderId, IExtensionsData extension)
+        {
+            MultiFilingServicePortClient port = Provider.GetMultiFilingService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.removeObjectFromFolder(repositoryId, objectId, folderId, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class AclService : AbstractWebServicesService, IAclService
+    {
+        public AclService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public IAcl GetAcl(string repositoryId, string objectId, bool? onlyBasicPermissions, IExtensionsData extension)
+        {
+            ACLServicePortClient port = Provider.GetAclService();
+
+            try
+            {
+                return Converter.Convert(port.getACL(repositoryId, objectId, onlyBasicPermissions, Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IAcl ApplyAcl(string repositoryId, string objectId, IAcl addAces, IAcl removeAces, AclPropagation? aclPropagation,
+            IExtensionsData extension)
+        {
+            ACLServicePortClient port = Provider.GetAclService();
+
+            try
+            {
+                return Converter.Convert(port.applyACL(repositoryId, objectId, Converter.Convert(addAces), Converter.Convert(removeAces),
+                    (enumACLPropagation?)CmisValue.CmisToSerializerEnum(aclPropagation), Converter.ConvertExtension(extension)));
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+
+    internal class PolicyService : AbstractWebServicesService, IPolicyService
+    {
+        public PolicyService(BindingSession session, PortProvider provider)
+        {
+            Session = session;
+            Provider = provider;
+        }
+
+        public void ApplyPolicy(string repositoryId, string policyId, string objectId, IExtensionsData extension)
+        {
+            PolicyServicePortClient port = Provider.GetPolicyService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.applyPolicy(repositoryId, policyId, objectId, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public void RemovePolicy(string repositoryId, string policyId, string objectId, IExtensionsData extension)
+        {
+            PolicyServicePortClient port = Provider.GetPolicyService();
+
+            try
+            {
+                cmisExtensionType cmisExtension = Converter.ConvertExtension(extension);
+
+                port.removePolicy(repositoryId, policyId, objectId, ref cmisExtension);
+
+                Converter.ConvertExtension(cmisExtension, extension);
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+
+        public IList<IObjectData> GetAppliedPolicies(string repositoryId, string objectId, string filter, IExtensionsData extension)
+        {
+            PolicyServicePortClient port = Provider.GetPolicyService();
+
+            try
+            {
+                cmisObjectType[] policies = port.getAppliedPolicies(repositoryId, objectId, filter, Converter.ConvertExtension(extension));
+
+                if (policies == null)
+                {
+                    return null;
+                }
+
+                List<IObjectData> result = new List<IObjectData>();
+                foreach (cmisObjectType policy in policies)
+                {
+                    result.Add(Converter.Convert(policy));
+                }
+
+                return result;
+            }
+            catch (FaultException<cmisFaultType> fe)
+            {
+                throw ConvertException(fe);
+            }
+            catch (Exception e)
+            {
+                throw new CmisRuntimeException("Error: " + e.Message, e);
+            }
+        }
+    }
+}
diff --git a/DotCMIS/client/client-impl.cs b/DotCMIS/client/client-impl.cs
new file mode 100644
index 0000000..739c9a2
--- /dev/null
+++ b/DotCMIS/client/client-impl.cs
@@ -0,0 +1,9 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace DotCMIS.Client
+{
+ 
+}
diff --git a/DotCMIS/client/client-intf.cs b/DotCMIS/client/client-intf.cs
new file mode 100644
index 0000000..0d2b913
--- /dev/null
+++ b/DotCMIS/client/client-intf.cs
@@ -0,0 +1,245 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using DotCMIS.Data;
+using DotCMIS.Enums;
+using DotCMIS.Data.Extensions;
+
+namespace DotCMIS.Client
+{
+    public interface IOperationContext { }
+
+    public interface ITree<T>
+    {
+        T Item { get; }
+        IList<ITree<T>> GetChildren();
+    }
+
+    public interface IObjectType : ITypeDefinition
+    {
+        bool IsBaseType { get; }
+        IObjectType BaseType { get; }
+        IObjectType ParentType { get; }
+        IItemIterable<IObjectType> GetChildren();
+        IList<ITree<IObjectType>> GetDescendants(int depth);
+    }
+
+    public interface IItemIterable<T>
+    {
+        IItemIterable<T> SkipTo(long position);
+        IItemIterable<T> GetPage();
+        IItemIterable<T> GetPage(int maxNumItems);
+        long PageNumItems { get; }
+        bool HasMoreItems { get; }
+        long TotalNumItems { get; }
+    }
+
+    public interface IObjectId
+    {
+        string Id { get; }
+    }
+
+    public interface IRendition : IRenditionData
+    {
+        IDocument GetRenditionDocument();
+        IDocument GetRenditionDocument(IOperationContext context);
+        IContentStream GetContentStream();
+    }
+
+    public interface IProperty : IPropertyData
+    {
+        bool IsMultiValued { get; }
+        PropertyType PropertyType { get; }
+        PropertyDefinition PropertyDefinition { get; }
+        V getValue<V>();
+        string GetValueAsString();
+        string getValuesAsString();
+    }
+
+    public interface ICmisObjectProperties
+    {
+        IList<IProperty> Properties { get; }
+        IProperty GetProperty(string id);
+        T getPropertyValue<T>(string id);
+
+        // convenience accessors
+        string Name { get; }
+        string CreatedBy { get; }
+        DateTime CreationDate { get; }
+        string LastModifiedBy { get; }
+        DateTime LastModificationDate { get; }
+        BaseTypeId BaseTypeId { get; }
+        IObjectType BaseType { get; }
+        IObjectType Type { get; }
+        string ChangeToken { get; }
+    }
+
+    public enum ExtensionLevel
+    {
+
+        Object, Properties, AllowableActions, Acl, Policies, ChangeEvent
+    }
+
+    public interface ICmisObject : IObjectId, ICmisObjectProperties
+    {
+        // object
+        IAllowableActions getAllowableActions();
+        IList<IRelationship> getRelationships();
+        IAcl getAcl();
+
+        // object service
+        void delete(bool allVersions);
+        ICmisObject updateProperties(IDictionary<string, object> properties);
+        IObjectId updateProperties(IDictionary<string, object> properties, bool refresh);
+
+        // renditions
+        IList<IRendition> getRenditions();
+
+        // policy service
+        void applyPolicy(IObjectId policyId);
+        void removePolicy(IObjectId policyIds);
+        IList<IPolicy> getPolicies();
+
+        // ACL service
+        IAcl applyAcl(IList<Ace> addAces, IList<Ace> removeAces, AclPropagation? aclPropagation);
+        IAcl addAcl(IList<Ace> addAces, AclPropagation? aclPropagation);
+        IAcl removeAcl(IList<Ace> removeAces, AclPropagation? aclPropagation);
+
+        // extensions
+        IList<ICmisExtensionElement> getExtensions(ExtensionLevel level);
+
+        long getRefreshTimestamp();
+        void refresh();
+        void refreshIfOld(long durationInMillis);
+    }
+
+    public interface IFileableCmisObject : ICmisObject
+    {
+        // object service
+        IFileableCmisObject move(IObjectId sourceFolderId, IObjectId targetFolderId);
+
+        // navigation service
+        IList<IFolder> GetParents();
+        IList<string> GetPaths();
+
+        // multifiling service
+        void addToFolder(IObjectId folderId, bool allVersions);
+        void removeFromFolder(IObjectId folderId);
+    }
+
+    public interface IDocumentProperties
+    {
+        bool? IsImmutable { get; }
+        bool? IsLatestVersion { get; }
+        bool? IsMajorVersion { get; }
+        bool? IsLatestMajorVersion { get; }
+        string VersionLabel { get; }
+        string VersionSeriesId { get; }
+        bool? VersionSeriesCheckedOut { get; }
+        string VersionSeriesCheckedOutBy { get; }
+        string VersionSeriesCheckedOutId { get; }
+        string CheckinComment { get; }
+        long ContentStreamLength { get; }
+        string ContentStreamMimeType { get; }
+        string ContentStreamFileName { get; }
+        string ContentStreamId { get; }
+    }
+
+    public interface IDocument : IFileableCmisObject, IDocumentProperties
+    {
+        void DeleteAllVersions();
+        IContentStream GetContentStream();
+        IContentStream GetContentStream(string streamId);
+        IDocument SetContentStream(IContentStream contentStream, bool overwrite);
+        IObjectId SetContentStream(IContentStream contentStream, bool overwrite, bool refresh);
+        IDocument DeleteContentStream();
+        IObjectId DeleteContentStream(bool refresh);
+        IObjectId CheckOut();
+        void CancelCheckOut();
+        IObjectId CheckIn(bool major, IDictionary<string, object> properties, IContentStream contentStream, string checkinComment,
+                IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces);
+        IObjectId checkIn(bool major, IDictionary<string, object> properties, IContentStream contentStream, string checkinComment);
+        IDocument GetObjectOfLatestVersion(bool major);
+        IDocument GetObjectOfLatestVersion(bool major, IOperationContext context);
+        IList<IDocument> GetAllVersions();
+        IList<IDocument> GetAllVersions(IOperationContext context);
+        IDocument Copy(IObjectId targetFolderId);
+        IDocument Copy(IObjectId targetFolderId, IDictionary<string, object> properties, VersioningState? versioningState,
+                IList<IPolicy> policies, IList<IAce> addACEs, IList<IAce> removeACEs, IOperationContext context);
+    }
+
+    public interface IFolderProperties
+    {
+        IList<IObjectType> AllowedChildObjectTypes { get; }
+    }
+
+    public interface IFolder : IFileableCmisObject, IFolderProperties
+    {
+        IDocument createDocument(IDictionary<string, object> properties, IContentStream contentStream, VersioningState? versioningState,
+                IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces, IOperationContext context);
+        IDocument createDocument(IDictionary<string, object> properties, IContentStream contentStream, VersioningState? versioningState);
+        IDocument createDocumentFromSource(IObjectId source, IDictionary<string, object> properties, VersioningState? versioningState,
+                IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces, IOperationContext context);
+        IDocument createDocumentFromSource(IObjectId source, IDictionary<string, object> properties, VersioningState? versioningState);
+        IFolder createFolder(IDictionary<string, object> properties, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces,
+                IOperationContext context);
+        IFolder createFolder(IDictionary<string, object> properties);
+        IPolicy createPolicy(IDictionary<string, object> properties, List<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces,
+                IOperationContext context);
+        IPolicy createPolicy(IDictionary<string, object> properties);
+        IList<string> deleteTree(bool allversions, UnfileObject? unfile, bool continueOnFailure);
+        IList<ITree<IFileableCmisObject>> GetFolderTree(int depth);
+        IList<ITree<IFileableCmisObject>> GetFolderTree(int depth, IOperationContext context);
+        IList<ITree<IFileableCmisObject>> GetDescendants(int depth);
+        IList<ITree<IFileableCmisObject>> GetDescendants(int depth, IOperationContext context);
+        IItemIterable<ICmisObject> GetChildren();
+        IItemIterable<ICmisObject> GetChildren(IOperationContext context);
+        bool IsRootFolder { get; }
+        IFolder FolderParent { get; }
+        string Path { get; }
+        IItemIterable<IDocument> GetCheckedOutDocs();
+        IItemIterable<IDocument> GetCheckedOutDocs(IOperationContext context);
+    }
+
+    public interface IPolicyProperties
+    {
+        string PolicyText { get; }
+    }
+
+    public interface IPolicy : IFileableCmisObject, IPolicyProperties
+    {
+    }
+
+    public interface IRelationshipProperties
+    {
+        IObjectId SourceId { get; }
+        IObjectId TargetId { get; }
+    }
+
+    public interface IRelationship : ICmisObject, IRelationshipProperties
+    {
+        ICmisObject GetSource();
+        ICmisObject GetSource(IOperationContext context);
+        ICmisObject GetTarget();
+        ICmisObject GetTarget(IOperationContext context);
+    }
+}
diff --git a/DotCMIS/const.cs b/DotCMIS/const.cs
new file mode 100644
index 0000000..b586e9b
--- /dev/null
+++ b/DotCMIS/const.cs
@@ -0,0 +1,357 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace DotCMIS
+{
+    public static class SessionParameter
+    {
+        // ---- general parameter ----
+        public const string User = "org.apache.chemistry.dotcmis.user";
+        public const string Password = "org.apache.chemistry.dotcmis.password";
+
+        // ---- provider parameter ----
+        // Predefined binding types
+        public const string BindingType = "org.apache.chemistry.dotcmis.binding.spi.type";
+
+        // Class name of the binding class.
+        public const string BindingSpiClass = "org.apache.chemistry.dotcmis.binding.spi.classname";
+
+        // URL of the AtomPub service document.
+        public const string AtomPubUrl = "org.apache.chemistry.dotcmis.binding.atompub.url";
+
+        // WSDL URLs for Web Services.
+        public const string WebServicesRepositoryService = "org.apache.chemistry.dotcmis.binding.webservices.RepositoryService";
+        public const string WebServicesNavigationService = "org.apache.chemistry.dotcmis.binding.webservices.NavigationService";
+        public const string WebServicesObjectService = "org.apache.chemistry.dotcmis.binding.webservices.ObjectService";
+        public const string WebServicesVersioningService = "org.apache.chemistry.dotcmis.binding.webservices.VersioningService";
+        public const string WebServicesDiscoveryService = "org.apache.chemistry.dotcmis.binding.webservices.DiscoveryService";
+        public const string WebServicesRelationshipService = "org.apache.chemistry.dotcmis.binding.webservices.RelationshipService";
+        public const string WebServicesMultifilingService = "org.apache.chemistry.dotcmis.binding.webservices.MultiFilingService";
+        public const string WebServicesPolicyService = "org.apache.chemistry.dotcmis.binding.webservices.PolicyService";
+        public const string WebServicesAclService = "org.apache.chemistry.dotcmis.binding.webservices.ACLService";
+
+        // authentication provider
+        public const string AuthenticationProviderClass = "org.apache.chemistry.dotcmis.binding.auth.classname";
+
+        // binding caches
+        public const string CacheSizeRepositories = "org.apache.chemistry.dotcmis.binding.cache.repositories.size";
+        public const string CacheSizeTypes = "org.apache.chemistry.dotcmis.binding.cache.types.size";
+        public const string CacheSizeLinks = "org.apache.chemistry.dotcmis.binding.cache.links.size";
+
+        // message size
+        public const string MessageSize = "org.apache.chemistry.dotcmis.binding.message.size";
+    }
+
+    public static class BindingType
+    {
+        public const string AtomPub = "atompub";
+        public const string WebServices = "webservices";
+    }
+
+    public static class PropertyIds
+    {
+        // ---- base ----
+        public const string Name = "cmis:name";
+        public const string ObjectId = "cmis:objectId";
+        public const string ObjectTypeId = "cmis:objectTypeId";
+        public const string BaseTypeId = "cmis:baseTypeId";
+        public const string CreatedBy = "cmis:createdBy";
+        public const string CreationDate = "cmis:creationDate";
+        public const string LastModifiedBy = "cmis:lastModifiedBy";
+        public const string LastModificationDate = "cmis:lastModificationDate";
+        public const string ChangeToken = "cmis:changeToken";
+
+        // ---- document ----
+        public const string IsImmutable = "cmis:isImmutable";
+        public const string IsLatestVersion = "cmis:isLatestVersion";
+        public const string IsMajorVersion = "cmis:isMajorVersion";
+        public const string isLatestMajorVersion = "cmis:isLatestMajorVersion";
+        public const string VersionLabel = "cmis:versionLabel";
+        public const string VersionSeriesId = "cmis:versionSeriesId";
+        public const string IsVersionSeriesCheckedOut = "cmis:isVersionSeriesCheckedOut";
+        public const string VersionSeriesCheckedOutBy = "cmis:versionSeriesCheckedOutBy";
+        public const string VersionSeriesCheckedOutId = "cmis:versionSeriesCheckedOutId";
+        public const string CheckinComment = "cmis:checkinComment";
+        public const string ContentStreamLength = "cmis:contentStreamLength";
+        public const string ContentStreamMimeType = "cmis:contentStreamMimeType";
+        public const string ContentStreamFileName = "cmis:contentStreamFileName";
+        public const string ContentStreamId = "cmis:contentStreamId";
+
+        // ---- folder ----
+        public const string ParentId = "cmis:parentId";
+        public const string AllowedChildObjectTypeIds = "cmis:allowedChildObjectTypeIds";
+        public const string Path = "cmis:path";
+
+        // ---- relationship ----
+        public const string SourceId = "cmis:sourceId";
+        public const string TargetId = "cmis:targetId";
+
+        // ---- policy ----
+        public const string PolicyText = "cmis:policyText";
+    }
+
+    public static class BasicPermissions
+    {
+        public const string Read = "cmis:read";
+        public const string Write = "cmis:write";
+        public const string All = "cmis:all";
+    }
+
+    public static class PermissionMappingKeys
+    {
+        public const string CanGetDescendentsFolder = "canGetDescendents.Folder";
+        public const string CanGetChildrenFolder = "canGetChildren.Folder";
+        public const string CanGetParentsFolder = "canGetParents.Folder";
+        public const string CanGetFolderParentObject = "canGetFolderParent.Object";
+        public const string CanCreateDocumentFolder = "canCreateDocument.Folder";
+        public const string CanCreateFolderFolder = "canCreateFolder.Folder";
+        public const string CanCreateRelationshipSource = "canCreateRelationship.Source";
+        public const string CanCreateRelationshipTarget = "canCreateRelationship.Target";
+        public const string CanGetPropertiesObject = "canGetProperties.Object";
+        public const string CanViewContentObject = "canViewContent.Object";
+        public const string CanUpdatePropertiesObject = "canUpdateProperties.Object";
+        public const string CanMoveObject = "canMove.Object";
+        public const string CanMoveTarget = "canMove.Target";
+        public const string CanMoveSource = "canMove.Source";
+        public const string CanDeleteObject = "canDelete.Object";
+        public const string CanDeleteTreeFolder = "canDeleteTree.Folder";
+        public const string CanSetContentDocument = "canSetContent.Document";
+        public const string CanDeleteContentDocument = "canDeleteContent.Document";
+        public const string CanAddToFolderObject = "canAddToFolder.Object";
+        public const string CanAddToFolderFolder = "canAddToFolder.Folder";
+        public const string CanRemoveFromFolderObject = "canRemoveFromFolder.Object";
+        public const string CanRemoveFromFolderFolder = "canRemoveFromFolder.Folder";
+        public const string CanCheckoutDocument = "canCheckout.Document";
+        public const string CanCancelCheckoutDocument = "canCancelCheckout.Document";
+        public const string CanCheckinDocument = "canCheckin.Document";
+        public const string CanGetAllVersionsVersionSeries = "canGetAllVersions.VersionSeries";
+        public const string CanGetObjectRelationshipSObject = "canGetObjectRelationships.Object";
+        public const string CanAddPolicyObject = "canAddPolicy.Object";
+        public const string CanAddPolicyPolicy = "canAddPolicy.Policy";
+        public const string CanRemovePolicyObject = "canRemovePolicy.Object";
+        public const string CanRemovePolicyPolicy = "canRemovePolicy.Policy";
+        public const string CanGetAppliesPoliciesObject = "canGetAppliedPolicies.Object";
+        public const string CanGetAclObject = "canGetAcl.Object";
+        public const string CanApplyAclObject = "canApplyAcl.Object";
+    }
+
+    public static class Actions
+    {
+        public const string CanDeleteObject = "canDeleteObject";
+        public const string CanUpdateProperties = "canUpdateProperties";
+        public const string CanGetProperties = "canGetProperties";
+        public const string CanGetObjectRelationships = "canGetObjectRelationships";
+        public const string CanGetObjectParents = "canGetObjectParents";
+        public const string CanGetFolderParent = "canGetFolderParent";
+        public const string CanGetFolderTree = "canGetFolderTree";
+        public const string CanGetDescendants = "canGetDescendants";
+        public const string CanMoveObject = "canMoveObject";
+        public const string CanDeleteContentStream = "canDeleteContentStream";
+        public const string CanCheckOut = "canCheckOut";
+        public const string CanCancelCheckOut = "canCancelCheckOut";
+        public const string CanCheckIn = "canCheckIn";
+        public const string CanSetContentStream = "canSetContentStream";
+        public const string CanGetAllVersions = "canGetAllVersions";
+        public const string CanAddObjectToFolder = "canAddObjectToFolder";
+        public const string CanRemoveObjectFromFolder = "canRemoveObjectFromFolder";
+        public const string CanGetContentStream = "canGetContentStream";
+        public const string CanApplyPolicy = "canApplyPolicy";
+        public const string CanGetAppliedPolicies = "canGetAppliedPolicies";
+        public const string CanRemovePolicy = "canRemovePolicy";
+        public const string CanGetChildren = "canGetChildren";
+        public const string CanCreateDocument = "canCreateDocument";
+        public const string CanCreateFolder = "canCreateFolder";
+        public const string CanCreateRelationship = "canCreateRelationship";
+        public const string CanDeleteTree = "canDeleteTree";
+        public const string CanGetRenditions = "canGetRenditions";
+        public const string CanGetAcl = "canGetACL";
+        public const string CanApplyAcl = "canApplyACL";
+    }
+
+    internal static class AtomPubConstants
+    {
+        // namespaces
+        public const string NamespaceCMIS = "http://docs.oasis-open.org/ns/cmis/core/200908/";
+        public const string NamespaceAtom = "http://www.w3.org/2005/Atom";
+        public const string NamespaceAPP = "http://www.w3.org/2007/app";
+        public const string NamespaceRestAtom = "http://docs.oasis-open.org/ns/cmis/restatom/200908/";
+        public const string NamespaceXSI = "http://www.w3.org/2001/XMLSchema-instance";
+
+        // media types
+        public const string MediatypeService = "application/atomsvc+xml";
+        public const string MediatypeFeed = "application/atom+xml;type=feed";
+        public const string MediatypeEntry = "application/atom+xml;type=entry";
+        public const string MediatypeChildren = MediatypeFeed;
+        public const string MediatypeDescendants = "application/cmistree+xml";
+        public const string MediatypeQuery = "application/cmisquery+xml";
+        public const string MediatypeAllowableAction = "application/cmisallowableactions+xml";
+        public const string MediatypeACL = "application/cmisacl+xml";
+        public const string MediatypeCMISAtom = "application/cmisatom+xml";
+        public const string MediatypeOctetStream = "application/octet-stream";
+
+        // collections
+        public const string CollectionRoot = "root";
+        public const string CollectionTypes = "types";
+        public const string CollectionQuery = "query";
+        public const string CollectionCheckedout = "checkedout";
+        public const string CollectionUnfiled = "unfiled";
+
+        // URI templates
+        public const string TemplateObjectById = "objectbyid";
+        public const string TemplateObjectByPath = "objectbypath";
+        public const string TemplateTypeById = "typebyid";
+        public const string TemplateQuery = "query";
+
+        // Link rel
+        public const string RelSelf = "self";
+        public const string RelEnclosure = "enclosure";
+        public const string RelService = "service";
+        public const string RelDescribedBy = "describedby";
+        public const string RelAlternate = "alternate";
+        public const string RelDown = "down";
+        public const string RelUp = "up";
+        public const string RelFirst = "first";
+        public const string RelLast = "last";
+        public const string RelPrev = "previous";
+        public const string RelNext = "next";
+        public const string RelVia = "via";
+        public const string RelEdit = "edit";
+        public const string RelEditMedia = "edit-media";
+        public const string RelVersionHistory = "version-history";
+        public const string RelCurrentVersion = "current-version";
+        public const string RelWorkingCopy = "working-copy";
+        public const string RelFolderTree = "http://docs.oasis-open.org/ns/cmis/link/200908/foldertree";
+        public const string RelAllowableActions = "http://docs.oasis-open.org/ns/cmis/link/200908/allowableactions";
+        public const string RelACL = "http://docs.oasis-open.org/ns/cmis/link/200908/acl";
+        public const string RelSource = "http://docs.oasis-open.org/ns/cmis/link/200908/source";
+        public const string RelTarget = "http://docs.oasis-open.org/ns/cmis/link/200908/target";
+        public const string RelRelationships = "http://docs.oasis-open.org/ns/cmis/link/200908/relationships";
+        public const string RelPolicies = "http://docs.oasis-open.org/ns/cmis/link/200908/policies";
+
+        public const string RepRelTypeDesc = "http://docs.oasis-open.org/ns/cmis/link/200908/typedescendants";
+        public const string RepRelFolderTree = "http://docs.oasis-open.org/ns/cmis/link/200908/foldertree";
+        public const string RepRelRootDesc = "http://docs.oasis-open.org/ns/cmis/link/200908/rootdescendants";
+        public const string RepRelChanges = "http://docs.oasis-open.org/ns/cmis/link/200908/changes";
+
+        // parameter
+        public const string ParamACL = "includeACL";
+        public const string ParamAllowableActions = "includeAllowableActions";
+        public const string ParamAllVersions = "allVersions";
+        public const string ParamChangeLogToken = "changeLogToken";
+        public const string ParamChangeToken = "changeToken";
+        public const string ParamCheckinComment = "checkinComment";
+        public const string ParamCheckIn = "checkin";
+        public const string ParamChildTypes = "childTypes";
+        public const string ParamContinueOnFailure = "continueOnFailure";
+        public const string ParamDepth = "depth";
+        public const string ParamFilter = "filter";
+        public const string ParamFolderId = "folderId";
+        public const string ParamId = "id";
+        public const string ParamMajor = "major";
+        public const string ParamMaxItems = "maxItems";
+        public const string ParamObjectId = "objectId";
+        public const string ParamOnlyBasicPermissions = "onlyBasicPermissions";
+        public const string ParamOrderBy = "orderBy";
+        public const string ParamOverwriteFlag = "overwriteFlag";
+        public const string ParamPath = "path";
+        public const string ParamPathSegment = "includePathSegment";
+        public const string ParamPolicyId = "policyId";
+        public const string ParamPolicyIds = "includePolicyIds";
+        public const string ParamProperties = "includeProperties";
+        public const string ParamPropertyDefinitions = "includePropertyDefinitions";
+        public const string ParamRelationships = "includeRelationships";
+        public const string ParamRelationshipDirection = "relationshipDirection";
+        public const string ParamRelativePathSegment = "includeRelativePathSegment";
+        public const string ParamRemoveFrom = "removeFrom";
+        public const string ParamRenditionFilter = "renditionFilter";
+        public const string ParamRepositoryId = "repositoryId";
+        public const string ParamReturnVersion = "returnVersion";
+        public const string ParamSkipCount = "skipCount";
+        public const string ParamSourceFolderId = "sourceFolderId";
+        public const string ParamStreamId = "streamId";
+        public const string ParamSubRelationshipTypes = "includeSubRelationshipTypes";
+        public const string ParamTypeId = "typeId";
+        public const string ParamUnfildeObjects = "unfileObjects";
+        public const string ParamVersioningState = "versioningState";
+        public const string ParamQ = "q";
+        public const string ParamSearchAllVersions = "searchAllVersions";
+        public const string ParamACLPropagation = "ACLPropagation";
+
+        // rendition filter
+        public const string RenditionNone = "cmis:none";
+
+        // service doc
+        public const string TagService = "service";
+        public const string TagWorkspace = "workspace";
+        public const string TagRepositoryInfo = "repositoryInfo";
+        public const string TagCollection = "collection";
+        public const string TagCollectionType = "collectionType";
+        public const string TagUriTemplate = "uritemplate";
+        public const string TagTemplateTemplate = "template";
+        public const string TagTemplateType = "type";
+        public const string TagLink = "link";
+
+        // atom
+        public const string TagAtomId = "id";
+        public const string TagAtomTitle = "title";
+        public const string TagAtomUpdated = "updated";
+
+        // feed
+        public const string TagFeed = "feed";
+
+        // entry
+        public const string TagEntry = "entry";
+        public const string TagObject = "object";
+        public const string TagNumItems = "numItems";
+        public const string TagPathSegment = "pathSegment";
+        public const string TagRelativePathSegment = "relativePathSegment";
+        public const string TagType = "type";
+        public const string TagChildren = "children";
+        public const string TagContent = "content";
+        public const string TagContentMediatype = "mediatype";
+        public const string TagContentBase64 = "base64";
+
+        // allowable actions
+        public const string TagAllowableActions = "allowableActions";
+
+        // ACL
+        public const string TagACL = "acl";
+
+        // query
+        public const string TagQuery = "query";
+        public const string TagStatement = "statement";
+        public const string TagSearchAllVersions = "searchAllVersions";
+        public const string TagIncludeAllowableActions = "includeAllowableActions";
+        public const string TagRenditionFilter = "renditionFilter";
+        public const string TagIncludeRelationships = "includeRelationships";
+        public const string TagMaxItems = "maxItems";
+        public const string TagSkipCount = "skipCount";
+
+        // links
+        public const string LinkRel = "rel";
+        public const string LinkHref = "href";
+        public const string LinkType = "type";
+        public const string ContentSrc = "src";
+        public const string LinkRelContent = "@@content@@";
+    }
+}
diff --git a/DotCMIS/data/data-impl.cs b/DotCMIS/data/data-impl.cs
new file mode 100644
index 0000000..b929921
--- /dev/null
+++ b/DotCMIS/data/data-impl.cs
@@ -0,0 +1,539 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using DotCMIS.Data.Extensions;
+using DotCMIS.Enums;
+
+namespace DotCMIS.Data
+{
+    public class RepositoryInfo : ExtensionsData, IRepositoryInfo
+    {
+        public string Id { get; set; }
+        public string Name { get; set; }
+        public string Description { get; set; }
+        public string VendorName { get; set; }
+        public string ProductName { get; set; }
+        public string ProductVersion { get; set; }
+        public string RootFolderId { get; set; }
+        public IRepositoryCapabilities Capabilities { get; set; }
+        public IAclCapabilities AclCapabilities { get; set; }
+        public string LatestChangeLogToken { get; set; }
+        public string CmisVersionSupported { get; set; }
+        public string ThinClientUri { get; set; }
+        public bool? ChangesIncomplete { get; set; }
+        public IList<BaseTypeId?> ChangesOnType { get; set; }
+        public string PrincipalIdAnonymous { get; set; }
+        public string PrincipalIdAnyone { get; set; }
+    }
+
+    public class RepositoryCapabilities : ExtensionsData, IRepositoryCapabilities
+    {
+        public CapabilityContentStreamUpdates? ContentStreamUpdatesCapability { get; set; }
+        public CapabilityChanges? ChangesCapability { get; set; }
+        public CapabilityRenditions? RenditionsCapability { get; set; }
+        public bool? IsGetDescendantsSupported { get; set; }
+        public bool? IsGetFolderTreeSupported { get; set; }
+        public bool? IsMultifilingSupported { get; set; }
+        public bool? IsUnfilingSupported { get; set; }
+        public bool? IsVersionSpecificFilingSupported { get; set; }
+        public bool? IsPwcSearchableSupported { get; set; }
+        public bool? IsPwcUpdatableSupported { get; set; }
+        public bool? IsAllVersionsSearchableSupported { get; set; }
+        public CapabilityQuery? QueryCapability { get; set; }
+        public CapabilityJoin? JoinCapability { get; set; }
+        public CapabilityAcl? AclCapability { get; set; }
+    }
+
+    public class AclCapabilities : ExtensionsData, IAclCapabilities
+    {
+        public SupportedPermissions? SupportedPermissions { get; set; }
+        public AclPropagation? AclPropagation { get; set; }
+        public IList<IPermissionDefinition> Permissions { get; set; }
+        public IDictionary<string, IPermissionMapping> PermissionMapping { get; set; }
+    }
+
+    public class PermissionDefinition : ExtensionsData, IPermissionDefinition
+    {
+        public string Id { get; set; }
+        public string Description { get; set; }
+    }
+
+    public class PermissionMapping : ExtensionsData, IPermissionMapping
+    {
+        public string Key { get; set; }
+        public IList<string> Permissions { get; set; }
+    }
+
+    public abstract class TypeDefinition : ExtensionsData, ITypeDefinition
+    {
+        private List<IPropertyDefinition> propertyDefintionList = new List<IPropertyDefinition>();
+        private Dictionary<string, IPropertyDefinition> propertyDefintionDict = new Dictionary<string, IPropertyDefinition>();
+
+        public string Id { get; set; }
+        public string LocalName { get; set; }
+        public string LocalNamespace { get; set; }
+        public string DisplayName { get; set; }
+        public string QueryName { get; set; }
+        public string Description { get; set; }
+        public BaseTypeId? BaseTypeId { get; set; }
+        public string ParentTypeId { get; set; }
+        public bool? IsCreatable { get; set; }
+        public bool? IsFileable { get; set; }
+        public bool? IsQueryable { get; set; }
+        public bool? IsFulltextIndexed { get; set; }
+        public bool? IsIncludedInSupertypeQuery { get; set; }
+        public bool? IsControllablePolicy { get; set; }
+        public bool? IsControllableAcl { get; set; }
+        public IPropertyDefinition this[string propertyId]
+        {
+            get
+            {
+                IPropertyDefinition propertyDefinition = null;
+                propertyDefintionDict.TryGetValue(propertyId, out propertyDefinition);
+                return propertyDefinition;
+            }
+        }
+        public IList<IPropertyDefinition> PropertyDefintions
+        {
+            get
+            {
+                return propertyDefintionList;
+            }
+        }
+
+        public void AddPropertyDefinition(IPropertyDefinition propertyDefinition)
+        {
+            if (propertyDefinition == null || propertyDefinition.Id == null)
+            {
+                return;
+            }
+
+            propertyDefintionList.Add(propertyDefinition);
+            propertyDefintionDict[propertyDefinition.Id] = propertyDefinition;
+        }
+    }
+
+    public class DocumentTypeDefinition : TypeDefinition, IDocumentTypeDefinition
+    {
+        public bool? IsVersionable { get; set; }
+        public ContentStreamAllowed? ContentStreamAllowed { get; set; }
+    }
+
+    public class FolderTypeDefinition : TypeDefinition, IFolderTypeDefinition
+    {
+    }
+
+    public class PolicyTypeDefinition : TypeDefinition, IPolicyTypeDefinition
+    {
+    }
+
+    public class RelationshipTypeDefinition : TypeDefinition, IRelationshipTypeDefinition
+    {
+        public IList<string> AllowedSourceTypeIds { get; set; }
+        public IList<string> AllowedTargetTypeIds { get; set; }
+    }
+
+    public class TypeDefinitionList : ExtensionsData, ITypeDefinitionList
+    {
+        public IList<ITypeDefinition> List { get; set; }
+        public bool? HasMoreItems { get; set; }
+        public long? NumItems { get; set; }
+    }
+
+    public class TypeDefinitionContainer : ExtensionsData, ITypeDefinitionContainer
+    {
+        public ITypeDefinition TypeDefinition { get; set; }
+        public IList<ITypeDefinitionContainer> Children { get; set; }
+    }
+
+    public abstract class PropertyDefinition : ExtensionsData, IPropertyDefinition
+    {
+        public string Id { get; set; }
+        public string LocalName { get; set; }
+        public string LocalNamespace { get; set; }
+        public string DisplayName { get; set; }
+        public string QueryName { get; set; }
+        public string Description { get; set; }
+        public PropertyType? PropertyType { get; set; }
+        public Cardinality? Cardinality { get; set; }
+        public Updatability? Updatability { get; set; }
+        public bool? IsInherited { get; set; }
+        public bool? IsRequired { get; set; }
+        public bool? IsQueryable { get; set; }
+        public bool? IsOrderable { get; set; }
+        public bool? IsOpenChoice { get; set; }
+    }
+
+    public class Choice<T> : IChoice<T>
+    {
+        public string DisplayName { get; set; }
+        public IList<T> Value { get; set; }
+        public IList<IChoice<T>> Choices { get; set; }
+    }
+
+    public class PropertyBooleanDefinition : PropertyDefinition, IPropertyBooleanDefinition
+    {
+        public IList<bool> DefaultValue { get; set; }
+        public IList<IChoice<bool>> Choices { get; set; }
+    }
+
+    public class PropertyDateTimeDefinition : PropertyDefinition, IPropertyDateTimeDefinition
+    {
+        public IList<DateTime> DefaultValue { get; set; }
+        public IList<IChoice<DateTime>> Choices { get; set; }
+        public DateTimeResolution? DateTimeResolution { get; set; }
+    }
+
+    public class PropertyDecimalDefinition : PropertyDefinition, IPropertyDecimalDefinition
+    {
+        public IList<decimal> DefaultValue { get; set; }
+        public IList<IChoice<decimal>> Choices { get; set; }
+        public decimal? MinValue { get; set; }
+        public decimal? MaxValue { get; set; }
+        public DecimalPrecision? Precision { get; set; }
+    }
+
+    public class PropertyHtmlDefinition : PropertyDefinition, IPropertyHtmlDefinition
+    {
+        public IList<string> DefaultValue { get; set; }
+        public IList<IChoice<string>> Choices { get; set; }
+    }
+
+    public class PropertyIdDefinition : PropertyDefinition, IPropertyIdDefinition
+    {
+        public IList<string> DefaultValue { get; set; }
+        public IList<IChoice<string>> Choices { get; set; }
+    }
+
+    public class PropertyIntegerDefinition : PropertyDefinition, IPropertyIntegerDefinition
+    {
+        public IList<long> DefaultValue { get; set; }
+        public IList<IChoice<long>> Choices { get; set; }
+        public long? MinValue { get; set; }
+        public long? MaxValue { get; set; }
+    }
+
+    public class PropertyStringDefinition : PropertyDefinition, IPropertyStringDefinition
+    {
+        public IList<string> DefaultValue { get; set; }
+        public IList<IChoice<string>> Choices { get; set; }
+        public long? MaxLength { get; set; }
+    }
+
+    public class PropertyUriDefinition : PropertyDefinition, IPropertyUriDefinition
+    {
+        public IList<string> DefaultValue { get; set; }
+        public IList<IChoice<string>> Choices { get; set; }
+    }
+
+    public class ObjectData : ExtensionsData, IObjectData
+    {
+        public string Id
+        {
+            get
+            {
+                return GetFirstValue(PropertyIds.ObjectId) as string;
+            }
+        }
+        public BaseTypeId? BaseTypeId
+        {
+            get
+            {
+                string baseTypeId = GetFirstValue(PropertyIds.BaseTypeId) as string;
+                if (baseTypeId == null)
+                {
+                    return null;
+                }
+
+                return baseTypeId.GetCmisEnum<BaseTypeId>();
+            }
+        }
+        public IProperties Properties { get; set; }
+        public IAllowableActions AllowableActions { get; set; }
+        public IList<IObjectData> Relationships { get; set; }
+        public IChangeEventInfo ChangeEventInfo { get; set; }
+        public IAcl Acl { get; set; }
+        public bool? IsExactAcl { get; set; }
+        public IPolicyIdList PolicyIds { get; set; }
+        public IList<IRenditionData> Renditions { get; set; }
+
+        private object GetFirstValue(string id)
+        {
+            if (Properties == null) { return null; }
+
+            IPropertyData property = Properties[id];
+            if (property == null)
+            {
+                return null;
+            }
+
+            return property.FirstObject;
+        }
+    }
+
+    public class ObjectList : ExtensionsData, IObjectList
+    {
+        public IList<IObjectData> Objects { get; set; }
+        public bool? HasMoreItems { get; set; }
+        public long? NumItems { get; set; }
+    }
+
+    public class ObjectInFolderData : ExtensionsData, IObjectInFolderData
+    {
+        public IObjectData Object { get; set; }
+        public string PathSegment { get; set; }
+    }
+
+    public class ObjectInFolderList : ExtensionsData, IObjectInFolderList
+    {
+        public IList<IObjectInFolderData> Objects { get; set; }
+        public bool? HasMoreItems { get; set; }
+        public long? NumItems { get; set; }
+    }
+
+    public class ObjectInFolderContainer : ExtensionsData, IObjectInFolderContainer
+    {
+        public IObjectInFolderData Object { get; set; }
+        public IList<IObjectInFolderContainer> Children { get; set; }
+    }
+
+    public class ObjectParentData : ExtensionsData, IObjectParentData
+    {
+        public IObjectData Object { get; set; }
+        public string RelativePathSegment { get; set; }
+    }
+
+    public class Properties : ExtensionsData, IProperties
+    {
+        private List<IPropertyData> propertyList = new List<IPropertyData>();
+        private Dictionary<string, IPropertyData> propertyDict = new Dictionary<string, IPropertyData>();
+
+        public IPropertyData this[string propertyId]
+        {
+            get
+            {
+                IPropertyData property = null;
+                propertyDict.TryGetValue(propertyId, out property);
+                return property;
+            }
+        }
+
+        public IList<IPropertyData> PropertyList
+        {
+            get
+            {
+                return propertyList;
+            }
+        }
+
+        public void AddProperty(IPropertyData property)
+        {
+            if (property == null)
+            {
+                return;
+            }
+
+            propertyList.Add(property);
+
+            if (property.Id != null)
+            {
+                propertyDict[property.Id] = property;
+            }
+        }
+
+        public override string ToString()
+        {
+            StringBuilder sb = new StringBuilder();
+            foreach (IPropertyData prop in propertyList)
+            {
+                if (sb.Length == 0) { sb.Append("["); }
+                else { sb.Append(", "); }
+                sb.Append(prop.ToString());
+            }
+            sb.Append("]");
+
+            return sb.ToString();
+        }
+    }
+
+    public abstract class PropertyData : ExtensionsData, IPropertyData
+    {
+        public string Id { get; set; }
+        public string LocalName { get; set; }
+        public string DisplayName { get; set; }
+        public string QueryName { get; set; }
+
+        public object FirstObject
+        {
+            get
+            {
+                if (this is PropertyBoolean)
+                {
+                    return ((PropertyBoolean)this).FirstValue;
+                }
+                else if (this is PropertyDateTime)
+                {
+                    return ((PropertyDateTime)this).FirstValue;
+                }
+                else if (this is PropertyDecimal)
+                {
+                    return ((PropertyDecimal)this).FirstValue;
+                }
+                else if (this is PropertyHtml)
+                {
+                    return ((PropertyHtml)this).FirstValue;
+                }
+                else if (this is PropertyId)
+                {
+                    return ((PropertyId)this).FirstValue;
+                }
+                else if (this is PropertyInteger)
+                {
+                    return ((PropertyInteger)this).FirstValue;
+                }
+                else if (this is PropertyString)
+                {
+                    return ((PropertyString)this).FirstValue;
+                }
+                else if (this is PropertyUri)
+                {
+                    return ((PropertyUri)this).FirstValue;
+                }
+
+                return null;
+            }
+        }
+
+        public override string ToString()
+        {
+            return Id + ": " + FirstObject;
+        }
+    }
+
+    public class PropertyBoolean : PropertyData, IPropertyBoolean
+    {
+        public IList<bool> Values { get; set; }
+        public bool? FirstValue { get { return Values == null || Values.Count < 1 ? null : (bool?)Values[0]; } }
+    }
+
+    public class PropertyDateTime : PropertyData, IPropertyDateTime
+    {
+        public IList<DateTime> Values { get; set; }
+        public DateTime? FirstValue { get { return Values == null || Values.Count < 1 ? null : (DateTime?)Values[0]; } }
+    }
+
+    public class PropertyDecimal : PropertyData, IPropertyDecimal
+    {
+        public IList<decimal> Values { get; set; }
+        public decimal? FirstValue { get { return Values == null || Values.Count < 1 ? null : (decimal?)Values[0]; } }
+    }
+
+    public class PropertyHtml : PropertyData, IPropertyHtml
+    {
+        public IList<string> Values { get; set; }
+        public string FirstValue { get { return Values == null || Values.Count < 1 ? null : Values[0]; } }
+    }
+
+    public class PropertyId : PropertyData, IPropertyId
+    {
+        public IList<string> Values { get; set; }
+        public string FirstValue { get { return Values == null || Values.Count < 1 ? null : Values[0]; } }
+    }
+
+    public class PropertyInteger : PropertyData, IPropertyInteger
+    {
+        public IList<long> Values { get; set; }
+        public long? FirstValue { get { return Values == null || Values.Count < 1 ? null : (long?)Values[0]; } }
+    }
+
+    public class PropertyString : PropertyData, IPropertyString
+    {
+        public IList<string> Values { get; set; }
+        public string FirstValue { get { return Values == null || Values.Count < 1 ? null : Values[0]; } }
+    }
+
+    public class PropertyUri : PropertyData, IPropertyUri
+    {
+        public IList<string> Values { get; set; }
+        public string FirstValue { get { return Values == null || Values.Count < 1 ? null : Values[0]; } }
+    }
+
+    public class Principal : ExtensionsData, IPrincipal
+    {
+        public string Id { get; set; }
+    }
+
+    public class Ace : ExtensionsData, IAce
+    {
+        public IPrincipal Principal { get; set; }
+        public string PrincipalId { get { return Principal == null ? null : Principal.Id; } }
+        public IList<string> Permissions { get; set; }
+        public bool IsDirect { get; set; }
+    }
+
+    public class Acl : ExtensionsData, IAcl
+    {
+        public IList<IAce> Aces { get; set; }
+        public bool? IsExact { get; set; }
+    }
+
+    public class ContentStream : ExtensionsData, IContentStream
+    {
+        public long? Length { get; set; }
+        public string MimeType { get; set; }
+        public string FileName { get; set; }
+        public Stream Stream { get; set; }
+    }
+
+    public class AllowableActions : ExtensionsData, IAllowableActions
+    {
+        public HashSet<string> Actions { get; set; }
+    }
+
+    public class RenditionData : ExtensionsData, IRenditionData
+    {
+        public string StreamId { get; set; }
+        public string MimeType { get; set; }
+        public long? Length { get; set; }
+        public string Kind { get; set; }
+        public string Title { get; set; }
+        public long? Height { get; set; }
+        public long? Width { get; set; }
+        public string RenditionDocumentId { get; set; }
+    }
+
+    public class ChangeEventInfo : ExtensionsData, IChangeEventInfo
+    {
+        public ChangeType ChangeType { get; set; }
+        public DateTime ChangeTime { get; set; }
+    }
+
+    public class PolicyIdList : ExtensionsData, IPolicyIdList
+    {
+        public IList<string> PolicyIds { get; set; }
+    }
+
+    public class FailedToDeleteData : ExtensionsData, IFailedToDeleteData
+    {
+        public IList<string> Ids { get; set; }
+    }
+}
diff --git a/DotCMIS/data/data-intf.cs b/DotCMIS/data/data-intf.cs
new file mode 100644
index 0000000..fbbd8cd
--- /dev/null
+++ b/DotCMIS/data/data-intf.cs
@@ -0,0 +1,388 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System.Collections.Generic;
+using DotCMIS.Data.Extensions;
+using DotCMIS.Enums;
+using System.IO;
+using System;
+using System.Collections;
+
+namespace DotCMIS.Data
+{
+    public interface IRepositoryInfo : IExtensionsData
+    {
+        string Id { get; }
+        string Name { get; }
+        string Description { get; }
+        string VendorName { get; }
+        string ProductName { get; }
+        string ProductVersion { get; }
+        string RootFolderId { get; }
+        IRepositoryCapabilities Capabilities { get; }
+        IAclCapabilities AclCapabilities { get; }
+        string LatestChangeLogToken { get; }
+        string CmisVersionSupported { get; }
+        string ThinClientUri { get; }
+        bool? ChangesIncomplete { get; }
+        IList<BaseTypeId?> ChangesOnType { get; }
+        string PrincipalIdAnonymous { get; }
+        string PrincipalIdAnyone { get; }
+    }
+
+    public interface IRepositoryCapabilities : IExtensionsData
+    {
+        CapabilityContentStreamUpdates? ContentStreamUpdatesCapability { get; }
+        CapabilityChanges? ChangesCapability { get; }
+        CapabilityRenditions? RenditionsCapability { get; }
+        bool? IsGetDescendantsSupported { get; }
+        bool? IsGetFolderTreeSupported { get; }
+        bool? IsMultifilingSupported { get; }
+        bool? IsUnfilingSupported { get; }
+        bool? IsVersionSpecificFilingSupported { get; }
+        bool? IsPwcSearchableSupported { get; }
+        bool? IsPwcUpdatableSupported { get; }
+        bool? IsAllVersionsSearchableSupported { get; }
+        CapabilityQuery? QueryCapability { get; }
+        CapabilityJoin? JoinCapability { get; }
+        CapabilityAcl? AclCapability { get; }
+    }
+
+    public interface IAclCapabilities : IExtensionsData
+    {
+        SupportedPermissions? SupportedPermissions { get; }
+        AclPropagation? AclPropagation { get; }
+        IList<IPermissionDefinition> Permissions { get; }
+        IDictionary<string, IPermissionMapping> PermissionMapping { get; }
+    }
+
+    public interface IPermissionDefinition : IExtensionsData
+    {
+        string Id { get; }
+        string Description { get; }
+    }
+
+    public interface IPermissionMapping : IExtensionsData
+    {
+        string Key { get; }
+        IList<string> Permissions { get; }
+    }
+
+    public interface ITypeDefinition : IExtensionsData
+    {
+        string Id { get; }
+        string LocalName { get; }
+        string LocalNamespace { get; }
+        string DisplayName { get; }
+        string QueryName { get; }
+        string Description { get; }
+        BaseTypeId? BaseTypeId { get; }
+        string ParentTypeId { get; }
+        bool? IsCreatable { get; }
+        bool? IsFileable { get; }
+        bool? IsQueryable { get; }
+        bool? IsFulltextIndexed { get; }
+        bool? IsIncludedInSupertypeQuery { get; }
+        bool? IsControllablePolicy { get; }
+        bool? IsControllableAcl { get; }
+        IPropertyDefinition this[string propertyId] { get; }
+        IList<IPropertyDefinition> PropertyDefintions { get; }
+    }
+
+    public interface IDocumentTypeDefinition : ITypeDefinition
+    {
+        bool? IsVersionable { get; }
+        ContentStreamAllowed? ContentStreamAllowed { get; }
+    }
+
+    public interface IFolderTypeDefinition : ITypeDefinition
+    {
+    }
+
+    public interface IPolicyTypeDefinition : ITypeDefinition
+    {
+    }
+
+    public interface IRelationshipTypeDefinition : ITypeDefinition
+    {
+        IList<string> AllowedSourceTypeIds { get; }
+        IList<string> AllowedTargetTypeIds { get; }
+    }
+
+    public interface ITypeDefinitionList : IExtensionsData
+    {
+        IList<ITypeDefinition> List { get; }
+        bool? HasMoreItems { get; }
+        long? NumItems { get; }
+    }
+
+    public interface ITypeDefinitionContainer : IExtensionsData
+    {
+        ITypeDefinition TypeDefinition { get; }
+        IList<ITypeDefinitionContainer> Children { get; }
+    }
+
+    public interface IPropertyDefinition : IExtensionsData
+    {
+        string Id { get; }
+        string LocalName { get; }
+        string LocalNamespace { get; }
+        string DisplayName { get; }
+        string QueryName { get; }
+        string Description { get; }
+        PropertyType? PropertyType { get; }
+        Cardinality? Cardinality { get; }
+        Updatability? Updatability { get; }
+        bool? IsInherited { get; }
+        bool? IsRequired { get; }
+        bool? IsQueryable { get; }
+        bool? IsOrderable { get; }
+        bool? IsOpenChoice { get; }
+    }
+
+    public interface IChoice<T>
+    {
+        string DisplayName { get; }
+        IList<T> Value { get; }
+        IList<IChoice<T>> Choices { get; }
+    }
+
+    public interface IPropertyBooleanDefinition : IPropertyDefinition
+    {
+        IList<bool> DefaultValue { get; }
+        IList<IChoice<bool>> Choices { get; }
+    }
+
+    public interface IPropertyDateTimeDefinition : IPropertyDefinition
+    {
+        IList<DateTime> DefaultValue { get; }
+        IList<IChoice<DateTime>> Choices { get; }
+        DateTimeResolution? DateTimeResolution { get; }
+    }
+
+    public interface IPropertyDecimalDefinition : IPropertyDefinition
+    {
+        IList<decimal> DefaultValue { get; }
+        IList<IChoice<decimal>> Choices { get; }
+        decimal? MinValue { get; }
+        decimal? MaxValue { get; }
+        DecimalPrecision? Precision { get; }
+    }
+
+    public interface IPropertyHtmlDefinition : IPropertyDefinition
+    {
+        IList<string> DefaultValue { get; }
+        IList<IChoice<string>> Choices { get; }
+    }
+
+    public interface IPropertyIdDefinition : IPropertyDefinition
+    {
+        IList<string> DefaultValue { get; }
+        IList<IChoice<string>> Choices { get; }
+    }
+
+    public interface IPropertyIntegerDefinition : IPropertyDefinition
+    {
+        IList<long> DefaultValue { get; }
+        IList<IChoice<long>> Choices { get; }
+        long? MinValue { get; }
+        long? MaxValue { get; }
+    }
+
+    public interface IPropertyStringDefinition : IPropertyDefinition
+    {
+        IList<string> DefaultValue { get; }
+        IList<IChoice<string>> Choices { get; }
+        long? MaxLength { get; }
+    }
+
+    public interface IPropertyUriDefinition : IPropertyDefinition
+    {
+        IList<string> DefaultValue { get; }
+        IList<IChoice<string>> Choices { get; }
+    }
+
+    public interface IObjectData : IExtensionsData
+    {
+        string Id { get; }
+        BaseTypeId? BaseTypeId { get; }
+        IProperties Properties { get; }
+        IAllowableActions AllowableActions { get; }
+        IList<IObjectData> Relationships { get; }
+        IChangeEventInfo ChangeEventInfo { get; }
+        IAcl Acl { get; }
+        bool? IsExactAcl { get; }
+        IPolicyIdList PolicyIds { get; }
+        IList<IRenditionData> Renditions { get; }
+    }
+
+    public interface IObjectList : IExtensionsData
+    {
+        IList<IObjectData> Objects { get; }
+        bool? HasMoreItems { get; }
+        long? NumItems { get; }
+    }
+
+    public interface IObjectInFolderData : IExtensionsData
+    {
+        IObjectData Object { get; }
+        string PathSegment { get; }
+    }
+
+    public interface IObjectInFolderList : IExtensionsData
+    {
+        IList<IObjectInFolderData> Objects { get; }
+        bool? HasMoreItems { get; }
+        long? NumItems { get; }
+    }
+
+    public interface IObjectInFolderContainer : IExtensionsData
+    {
+        IObjectInFolderData Object { get; }
+        IList<IObjectInFolderContainer> Children { get; }
+    }
+
+    public interface IObjectParentData : IExtensionsData
+    {
+        IObjectData Object { get; }
+        string RelativePathSegment { get; }
+    }
+
+    public interface IProperties : IExtensionsData
+    {
+        IPropertyData this[string propertyId] { get; }
+        IList<IPropertyData> PropertyList { get; }
+    }
+
+    public interface IPropertyData : IExtensionsData
+    {
+        string Id { get; }
+        string LocalName { get; }
+        string DisplayName { get; }
+        string QueryName { get; }
+        object FirstObject { get; }
+    }
+
+    public interface IPropertyBoolean : IPropertyData
+    {
+        IList<bool> Values { get; }
+        bool? FirstValue { get; }
+    }
+
+    public interface IPropertyDateTime : IPropertyData
+    {
+        IList<DateTime> Values { get; }
+        DateTime? FirstValue { get; }
+    }
+
+    public interface IPropertyDecimal : IPropertyData
+    {
+        IList<decimal> Values { get; }
+        decimal? FirstValue { get; }
+    }
+
+    public interface IPropertyHtml : IPropertyData
+    {
+        IList<string> Values { get; }
+        string FirstValue { get; }
+    }
+
+    public interface IPropertyId : IPropertyData
+    {
+        IList<string> Values { get; }
+        string FirstValue { get; }
+    }
+
+    public interface IPropertyInteger : IPropertyData
+    {
+        IList<long> Values { get; }
+        long? FirstValue { get; }
+    }
+
+    public interface IPropertyString : IPropertyData
+    {
+        IList<string> Values { get; }
+        string FirstValue { get; }
+    }
+
+    public interface IPropertyUri : IPropertyData
+    {
+        IList<string> Values { get; }
+        string FirstValue { get; }
+    }
+
+    public interface IPrincipal : IExtensionsData
+    {
+        string Id { get; }
+    }
+
+    public interface IAce : IExtensionsData
+    {
+        IPrincipal Principal { get; }
+        string PrincipalId { get; }
+        IList<string> Permissions { get; }
+        bool IsDirect { get; }
+    }
+
+    public interface IAcl : IExtensionsData
+    {
+        IList<IAce> Aces { get; }
+        bool? IsExact { get; }
+    }
+
+    public interface IContentStream : IExtensionsData
+    {
+        long? Length { get; }
+        string MimeType { get; }
+        string FileName { get; }
+        Stream Stream { get; }
+    }
+
+    public interface IAllowableActions : IExtensionsData
+    {
+        HashSet<string> Actions { get; }
+    }
+
+    public interface IRenditionData : IExtensionsData
+    {
+        string StreamId { get; }
+        string MimeType { get; }
+        long? Length { get; }
+        string Kind { get; }
+        string Title { get; }
+        long? Height { get; }
+        long? Width { get; }
+        string RenditionDocumentId { get; }
+    }
+
+    public interface IChangeEventInfo : IExtensionsData
+    {
+        ChangeType ChangeType { get; }
+        DateTime ChangeTime { get; }
+    }
+
+    public interface IPolicyIdList : IExtensionsData
+    {
+        IList<string> PolicyIds { get; }
+    }
+
+    public interface IFailedToDeleteData : IExtensionsData
+    {
+        IList<string> Ids { get; }
+    }
+}
diff --git a/DotCMIS/data/extensions.cs b/DotCMIS/data/extensions.cs
new file mode 100644
index 0000000..81ecc1a
--- /dev/null
+++ b/DotCMIS/data/extensions.cs
@@ -0,0 +1,61 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace DotCMIS.Data.Extensions
+{
+    public interface ICmisExtensionElement
+    {
+        string Name { get; }
+
+        string Namespace { get; }
+
+        string Value { get; }
+
+        IDictionary<string, string> Attributes { get; }
+
+        IList<ICmisExtensionElement> Children { get; }
+    }
+
+    public class CmisExtensionElement :ICmisExtensionElement
+    {
+        public string Name { get; set; }
+
+        public string Namespace { get; set; }
+
+        public string Value { get; set; }
+
+        public IDictionary<string, string> Attributes { get; set; }
+
+        public IList<ICmisExtensionElement> Children { get; set;}
+    }
+
+    public interface IExtensionsData
+    {
+        IList<ICmisExtensionElement> Extensions { get; set; }
+    }
+
+    public class ExtensionsData : IExtensionsData
+    {
+        public IList<ICmisExtensionElement> Extensions { get; set; }
+    }
+}
diff --git a/DotCMIS/enums.cs b/DotCMIS/enums.cs
new file mode 100644
index 0000000..02b5ee3
--- /dev/null
+++ b/DotCMIS/enums.cs
@@ -0,0 +1,454 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Reflection;
+using DotCMIS.CMISWebServicesReference;
+using System.Xml.Serialization;
+
+namespace DotCMIS.Enums
+{
+    public enum BaseTypeId
+    {
+        [CmisValue("cmis:document")]
+        CmisDocument,
+
+        [CmisValue("cmis:folder")]
+        CmisFolder,
+
+        [CmisValue("cmis:relationship")]
+        CmisRelationship,
+
+        [CmisValue("cmis:policy")]
+        CmisPolicy
+    }
+
+    public enum CapabilityContentStreamUpdates
+    {
+        [CmisValue("anytime")]
+        Anyime,
+
+        [CmisValue("pwconly")]
+        PWCOnly,
+
+        [CmisValue("none")]
+        None
+    }
+
+    public enum CapabilityChanges
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("objectidsonly")]
+        ObjectIdsOnly,
+
+        [CmisValue("properties")]
+        Properties,
+
+        [CmisValue("all")]
+        All
+    }
+
+    public enum CapabilityRenditions
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("read")]
+        Read
+    }
+
+    public enum CapabilityQuery
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("metadataonly")]
+        MetadataOnly,
+
+        [CmisValue("fulltextonly")]
+        FulltextOnly,
+
+        [CmisValue("bothseparate")]
+        BothSeparate,
+
+        [CmisValue("bothcombined")]
+        BothCombined
+    }
+
+    public enum CapabilityJoin
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("inneronly")]
+        InnerOnly,
+
+        [CmisValue("innerandouter")]
+        InnerAndOuter
+    }
+
+    public enum CapabilityAcl
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("discover")]
+        Discover,
+
+        [CmisValue("manage")]
+        Manage
+    }
+
+    public enum SupportedPermissions
+    {
+        [CmisValue("basic")]
+        Basic,
+
+        [CmisValue("repository")]
+        Repository,
+
+        [CmisValue("both")]
+        Both
+    }
+
+    public enum AclPropagation
+    {
+        [CmisValue("repositorydetermined")]
+        RepositoryDetermined,
+
+        [CmisValue("objectonly")]
+        ObjectOnly,
+
+        [CmisValue("propagate")]
+        Propagate
+    }
+
+    public enum ContentStreamAllowed
+    {
+        [CmisValue("notallowed")]
+        NotAllowed,
+
+        [CmisValue("allowed")]
+        Allowed,
+
+        [CmisValue("required")]
+        Required
+    }
+
+    public enum PropertyType
+    {
+        [CmisValue("boolean")]
+        Boolean,
+
+        [CmisValue("id")]
+        Id,
+
+        [CmisValue("integer")]
+        Integer,
+
+        [CmisValue("datetime")]
+        DateTime,
+
+        [CmisValue("decimal")]
+        Decimal,
+
+        [CmisValue("html")]
+        Html,
+
+        [CmisValue("string")]
+        String,
+
+        [CmisValue("uri")]
+        Uri
+    }
+
+    public enum Cardinality
+    {
+        [CmisValue("single")]
+        Single,
+
+        [CmisValue("multi")]
+        Multi
+    }
+
+    public enum Updatability
+    {
+        [CmisValue("readonly")]
+        ReadOnly,
+
+        [CmisValue("readwrite")]
+        ReadWrite,
+
+        [CmisValue("whencheckedout")]
+        WhenCheckedOut,
+
+        [CmisValue("oncreate")]
+        OnCreate
+    }
+
+    public enum DateTimeResolution
+    {
+        [CmisValue("year")]
+        Year,
+
+        [CmisValue("date")]
+        Date,
+
+        [CmisValue("time")]
+        Time
+    }
+
+    public enum DecimalPrecision
+    {
+        [CmisValue("32")]
+        Bits32,
+
+        [CmisValue("64")]
+        Bits64
+    }
+
+    public enum IncludeRelationships
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("source")]
+        Source,
+
+        [CmisValue("target")]
+        Target,
+
+        [CmisValue("both")]
+        Both
+    }
+
+    public enum VersioningState
+    {
+        [CmisValue("none")]
+        None,
+
+        [CmisValue("major")]
+        Major,
+
+        [CmisValue("minor")]
+        Minor,
+
+        [CmisValue("checkedout")]
+        CheckedOut
+    }
+
+    public enum UnfileObject
+    {
+        [CmisValue("unfile")]
+        Unfile,
+
+        [CmisValue("deletesinglefiled")]
+        DeleteSinglefiled,
+
+        [CmisValue("delete")]
+        Delete
+    }
+
+    public enum RelationshipDirection
+    {
+        [CmisValue("source")]
+        Source,
+
+        [CmisValue("target")]
+        Target,
+
+        [CmisValue("either")]
+        Either
+    }
+
+    public enum ReturnVersion
+    {
+        [CmisValue("this")]
+        This,
+
+        [CmisValue("latest")]
+        Latest,
+
+        [CmisValue("latestmajor")]
+        LatestMajor
+    }
+
+    public enum ChangeType
+    {
+        [CmisValue("created")]
+        Created,
+
+        [CmisValue("updated")]
+        Updated,
+
+        [CmisValue("deleted")]
+        Deleted,
+
+        [CmisValue("security")]
+        Security
+    }
+
+    // --- attribute class ---
+
+    public class CmisValueAttribute : System.Attribute
+    {
+        public CmisValueAttribute(string value)
+        {
+            Value = value;
+        }
+
+        public string Value
+        {
+            get;
+            private set;
+        }
+    }
+
+    public static class CmisValue
+    {
+        private static IDictionary<Type, IDictionary<Enum, Enum>> CmisToSerializerDict = new Dictionary<Type, IDictionary<Enum, Enum>>();
+        private static IDictionary<Type, IDictionary<Enum, Enum>> SerializerToCmisDict = new Dictionary<Type, IDictionary<Enum, Enum>>();
+
+        static CmisValue()
+        {
+            MapEnums(typeof(BaseTypeId), typeof(enumBaseObjectTypeIds));
+            MapEnums(typeof(CapabilityContentStreamUpdates), typeof(enumCapabilityContentStreamUpdates));
+            MapEnums(typeof(CapabilityChanges), typeof(enumCapabilityChanges));
+            MapEnums(typeof(CapabilityRenditions), typeof(enumCapabilityRendition));
+            MapEnums(typeof(CapabilityQuery), typeof(enumCapabilityQuery));
+            MapEnums(typeof(CapabilityJoin), typeof(enumCapabilityJoin));
+            MapEnums(typeof(CapabilityAcl), typeof(enumCapabilityACL));
+            MapEnums(typeof(SupportedPermissions), typeof(enumSupportedPermissions));
+            MapEnums(typeof(AclPropagation), typeof(enumACLPropagation));
+            MapEnums(typeof(ContentStreamAllowed), typeof(enumContentStreamAllowed));
+            MapEnums(typeof(PropertyType), typeof(enumPropertyType));
+            MapEnums(typeof(Cardinality), typeof(enumCardinality));
+            MapEnums(typeof(Updatability), typeof(enumUpdatability));
+            MapEnums(typeof(DateTimeResolution), typeof(enumDateTimeResolution));
+            MapEnums(typeof(DecimalPrecision), typeof(enumDecimalPrecision));
+            MapEnums(typeof(IncludeRelationships), typeof(enumIncludeRelationships));
+            MapEnums(typeof(ChangeType), typeof(enumTypeOfChanges));
+        }
+
+        private static void MapEnums(Type cmisEnum, Type xsdEnum)
+        {
+            IDictionary<Enum, Enum> cmisDict = new Dictionary<Enum, Enum>();
+            CmisToSerializerDict[cmisEnum] = cmisDict;
+
+            IDictionary<Enum, Enum> xsdDict = new Dictionary<Enum, Enum>();
+            SerializerToCmisDict[xsdEnum] = xsdDict;
+
+            foreach (FieldInfo xsdfieldInfo in xsdEnum.GetFields())
+            {
+                Enum xsdEnumValue = null;
+
+                try
+                {
+                    xsdEnumValue = (Enum)Enum.Parse(xsdEnum, xsdfieldInfo.Name);
+                }
+                catch (Exception)
+                {
+                    continue;
+                }
+
+                XmlEnumAttribute[] xmlAttr = xsdfieldInfo.GetCustomAttributes(typeof(XmlEnumAttribute), false) as XmlEnumAttribute[];
+                string value = xmlAttr.Length == 0 ? value = xsdfieldInfo.Name : value = xmlAttr[0].Name;
+
+                foreach (FieldInfo cmisfieldInfo in cmisEnum.GetFields())
+                {
+                    CmisValueAttribute[] cmisValueAttr = cmisfieldInfo.GetCustomAttributes(typeof(CmisValueAttribute), false) as CmisValueAttribute[];
+                    if (cmisValueAttr != null && cmisValueAttr.Length > 0 && cmisValueAttr[0].Value == value)
+                    {
+                        Enum cmisEnumValue = (Enum)Enum.Parse(cmisEnum, cmisfieldInfo.Name);
+                        cmisDict[cmisEnumValue] = xsdEnumValue;
+                        xsdDict[xsdEnumValue] = cmisEnumValue;
+                        break;
+                    }
+                }
+            }
+        }
+
+        public static Enum CmisToSerializerEnum(Enum source)
+        {
+            if (source == null) { return null; }
+
+            Enum result = null;
+
+            IDictionary<Enum, Enum> dict;
+            if (CmisToSerializerDict.TryGetValue(source.GetType(), out dict))
+            {
+                dict.TryGetValue(source, out result);
+            }
+
+            if (result == null)
+            {
+                Console.WriteLine("*** " + source);
+            }
+
+            return result;
+        }
+
+        public static Enum SerializerToCmisEnum(Enum source)
+        {
+            if (source == null) { return null; }
+
+            Enum result = null;
+
+            IDictionary<Enum, Enum> dict;
+            if (SerializerToCmisDict.TryGetValue(source.GetType(), out dict))
+            {
+                dict.TryGetValue(source, out result);
+            }
+
+            if (result == null)
+            {
+                Console.WriteLine("*** " + source);
+            }
+
+            return result;
+        }
+
+        public static string GetCmisValue(this Enum value)
+        {
+            FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
+            CmisValueAttribute[] cmisValueAttr = fieldInfo.GetCustomAttributes(typeof(CmisValueAttribute), false) as CmisValueAttribute[];
+
+            return cmisValueAttr.Length > 0 ? cmisValueAttr[0].Value : null;
+        }
+
+        public static T GetCmisEnum<T>(this string value)
+        {
+            Type type = typeof(T);
+            foreach (FieldInfo fieldInfo in type.GetFields())
+            {
+                CmisValueAttribute[] cmisValueAttr = fieldInfo.GetCustomAttributes(typeof(CmisValueAttribute), false) as CmisValueAttribute[];
+                if (cmisValueAttr != null && cmisValueAttr.Length > 0 && cmisValueAttr[0].Value == value)
+                {
+                    return (T)Enum.Parse(type, fieldInfo.Name);
+                }
+            }
+
+            return default(T);
+        }
+    }
+}
diff --git a/DotCMIS/exceptions.cs b/DotCMIS/exceptions.cs
new file mode 100644
index 0000000..cc89732
--- /dev/null
+++ b/DotCMIS/exceptions.cs
@@ -0,0 +1,310 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace DotCMIS.Exceptions
+{
+    [Serializable]
+    public class CmisBaseException : ApplicationException
+    {
+        public CmisBaseException() { Code = null; }
+        public CmisBaseException(string message) : base(message) { Code = null; }
+        public CmisBaseException(string message, Exception inner) : base(message, inner) { Code = null; }
+        protected CmisBaseException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+
+        public CmisBaseException(string message, long? code)
+            : this(message)
+        {
+            Code = code;
+        }
+
+        public CmisBaseException(string message, string errorContent)
+            : this(message)
+        {
+            ErrorContent = errorContent;
+        }
+
+        public CmisBaseException(string message, string errorContent, Exception inner)
+            : this(message, inner)
+        {
+            ErrorContent = errorContent;
+        }
+
+        public long? Code { get; protected set; }
+        public string ErrorContent { get; protected set; }
+    }
+
+    [Serializable]
+    public class CmisConnectionException : CmisBaseException
+    {
+        public CmisConnectionException() : base() { }
+        public CmisConnectionException(string message) : base(message) { }
+        public CmisConnectionException(string message, Exception inner) : base(message, inner) { }
+        protected CmisConnectionException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisConnectionException(string message, long? code)
+            : base(message) { }
+        public CmisConnectionException(string message, string errorContent)
+            : base(message) { }
+        public CmisConnectionException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisConstraintException : CmisBaseException
+    {
+        public CmisConstraintException() : base() { }
+        public CmisConstraintException(string message) : base(message) { }
+        public CmisConstraintException(string message, Exception inner) : base(message, inner) { }
+        protected CmisConstraintException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisConstraintException(string message, long? code)
+            : base(message) { }
+        public CmisConstraintException(string message, string errorContent)
+            : base(message) { }
+        public CmisConstraintException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisContentAlreadyExistsException : CmisBaseException
+    {
+        public CmisContentAlreadyExistsException() : base() { }
+        public CmisContentAlreadyExistsException(string message) : base(message) { }
+        public CmisContentAlreadyExistsException(string message, Exception inner) : base(message, inner) { }
+        protected CmisContentAlreadyExistsException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisContentAlreadyExistsException(string message, long? code)
+            : base(message) { }
+        public CmisContentAlreadyExistsException(string message, string errorContent)
+            : base(message) { }
+        public CmisContentAlreadyExistsException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisFilterNotValidException : CmisBaseException
+    {
+        public CmisFilterNotValidException() : base() { }
+        public CmisFilterNotValidException(string message) : base(message) { }
+        public CmisFilterNotValidException(string message, Exception inner) : base(message, inner) { }
+        protected CmisFilterNotValidException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisFilterNotValidException(string message, long? code)
+            : base(message) { }
+        public CmisFilterNotValidException(string message, string errorContent)
+            : base(message) { }
+        public CmisFilterNotValidException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisInvalidArgumentException : CmisBaseException
+    {
+        public CmisInvalidArgumentException() : base() { }
+        public CmisInvalidArgumentException(string message) : base(message) { }
+        public CmisInvalidArgumentException(string message, Exception inner) : base(message, inner) { }
+        protected CmisInvalidArgumentException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisInvalidArgumentException(string message, long? code)
+            : base(message) { }
+        public CmisInvalidArgumentException(string message, string errorContent)
+            : base(message) { }
+        public CmisInvalidArgumentException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisNameConstraintViolationException : CmisBaseException
+    {
+        public CmisNameConstraintViolationException() : base() { }
+        public CmisNameConstraintViolationException(string message) : base(message) { }
+        public CmisNameConstraintViolationException(string message, Exception inner) : base(message, inner) { }
+        protected CmisNameConstraintViolationException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisNameConstraintViolationException(string message, long? code)
+            : base(message) { }
+        public CmisNameConstraintViolationException(string message, string errorContent)
+            : base(message) { }
+        public CmisNameConstraintViolationException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisNotSupportedException : CmisBaseException
+    {
+        public CmisNotSupportedException() : base() { }
+        public CmisNotSupportedException(string message) : base(message) { }
+        public CmisNotSupportedException(string message, Exception inner) : base(message, inner) { }
+        protected CmisNotSupportedException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisNotSupportedException(string message, long? code)
+            : base(message) { }
+        public CmisNotSupportedException(string message, string errorContent)
+            : base(message) { }
+        public CmisNotSupportedException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisObjectNotFoundException : CmisBaseException
+    {
+        public CmisObjectNotFoundException() : base() { }
+        public CmisObjectNotFoundException(string message) : base(message) { }
+        public CmisObjectNotFoundException(string message, Exception inner) : base(message, inner) { }
+        protected CmisObjectNotFoundException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisObjectNotFoundException(string message, long? code)
+            : base(message) { }
+        public CmisObjectNotFoundException(string message, string errorContent)
+            : base(message) { }
+        public CmisObjectNotFoundException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisPermissionDeniedException : CmisBaseException
+    {
+        public CmisPermissionDeniedException() : base() { }
+        public CmisPermissionDeniedException(string message) : base(message) { }
+        public CmisPermissionDeniedException(string message, Exception inner) : base(message, inner) { }
+        protected CmisPermissionDeniedException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisPermissionDeniedException(string message, long? code)
+            : base(message) { }
+        public CmisPermissionDeniedException(string message, string errorContent)
+            : base(message) { }
+        public CmisPermissionDeniedException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisRuntimeException : CmisBaseException
+    {
+        public CmisRuntimeException() : base() { }
+        public CmisRuntimeException(string message) : base(message) { }
+        public CmisRuntimeException(string message, Exception inner) : base(message, inner) { }
+        protected CmisRuntimeException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisRuntimeException(string message, long? code)
+            : base(message) { }
+        public CmisRuntimeException(string message, string errorContent)
+            : base(message) { }
+        public CmisRuntimeException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisStorageException : CmisBaseException
+    {
+        public CmisStorageException() : base() { }
+        public CmisStorageException(string message) : base(message) { }
+        public CmisStorageException(string message, Exception inner) : base(message, inner) { }
+        protected CmisStorageException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisStorageException(string message, long? code)
+            : base(message) { }
+        public CmisStorageException(string message, string errorContent)
+            : base(message) { }
+        public CmisStorageException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisStreamNotSupportedException : CmisBaseException
+    {
+        public CmisStreamNotSupportedException() : base() { }
+        public CmisStreamNotSupportedException(string message) : base(message) { }
+        public CmisStreamNotSupportedException(string message, Exception inner) : base(message, inner) { }
+        protected CmisStreamNotSupportedException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisStreamNotSupportedException(string message, long? code)
+            : base(message) { }
+        public CmisStreamNotSupportedException(string message, string errorContent)
+            : base(message) { }
+        public CmisStreamNotSupportedException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisUpdateConflictException : CmisBaseException
+    {
+        public CmisUpdateConflictException() : base() { }
+        public CmisUpdateConflictException(string message) : base(message) { }
+        public CmisUpdateConflictException(string message, Exception inner) : base(message, inner) { }
+        protected CmisUpdateConflictException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisUpdateConflictException(string message, long? code)
+            : base(message) { }
+        public CmisUpdateConflictException(string message, string errorContent)
+            : base(message) { }
+        public CmisUpdateConflictException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+
+    [Serializable]
+    public class CmisVersioningException : CmisBaseException
+    {
+        public CmisVersioningException() : base() { }
+        public CmisVersioningException(string message) : base(message) { }
+        public CmisVersioningException(string message, Exception inner) : base(message, inner) { }
+        protected CmisVersioningException(
+          System.Runtime.Serialization.SerializationInfo info,
+          System.Runtime.Serialization.StreamingContext context)
+            : base(info, context) { }
+        public CmisVersioningException(string message, long? code)
+            : base(message) { }
+        public CmisVersioningException(string message, string errorContent)
+            : base(message) { }
+        public CmisVersioningException(string message, string errorContent, Exception inner)
+            : base(message, errorContent, inner) { }
+    }
+}
diff --git a/DotCMIS/wsdl/CMIS-Core.xsd b/DotCMIS/wsdl/CMIS-Core.xsd
new file mode 100644
index 0000000..aa427b1
--- /dev/null
+++ b/DotCMIS/wsdl/CMIS-Core.xsd
@@ -0,0 +1,1268 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+	<!--
+		Licensed under the Apache License, Version 2.0 (the "License"); you
+		may not use this file except in compliance with the License. You may
+		obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	elementFormDefault="qualified" targetNamespace="http://docs.oasis-open.org/ns/cmis/core/200908/"
+	xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml"
+	xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
+	jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1"
+	xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/" version="1.0">
+
+	<!--  enums -->
+	<xs:simpleType name="enumDecimalPrecision">
+		<xs:restriction base="xs:integer">
+			<xs:enumeration value="32" />
+			<xs:enumeration value="64" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumContentStreamAllowed">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="notallowed" />
+			<xs:enumeration value="allowed" />
+			<xs:enumeration value="required" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumCardinality">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="single" />
+			<xs:enumeration value="multi" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumUpdatability">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="readonly" />
+			<xs:enumeration value="readwrite" />
+			<xs:enumeration value="whencheckedout" />
+			<xs:enumeration value="oncreate" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumDateTimeResolution">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="year" />
+			<xs:enumeration value="date" />
+			<xs:enumeration value="time" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumPropertyType">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="boolean" />
+			<xs:enumeration value="id" />
+			<xs:enumeration value="integer" />
+			<xs:enumeration value="datetime" />
+			<xs:enumeration value="decimal" />
+			<xs:enumeration value="html" />
+			<xs:enumeration value="string" />
+			<xs:enumeration value="uri" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumBaseObjectTypeIds">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:document" />
+			<xs:enumeration value="cmis:folder" />
+			<xs:enumeration value="cmis:relationship" />
+			<xs:enumeration value="cmis:policy" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumCapabilityQuery">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="metadataonly" />
+			<xs:enumeration value="fulltextonly" />
+			<xs:enumeration value="bothseparate" />
+			<xs:enumeration value="bothcombined" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumCapabilityJoin">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="inneronly" />
+			<xs:enumeration value="innerandouter" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumCapabilityContentStreamUpdates">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="anytime" />
+			<xs:enumeration value="pwconly" />
+			<xs:enumeration value="none" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumVersioningState">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="checkedout" />
+			<xs:enumeration value="minor" />
+			<xs:enumeration value="major" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumUnfileObject">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="unfile" />
+			<xs:enumeration value="deletesinglefiled" />
+			<xs:enumeration value="delete" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumRelationshipDirection">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="source" />
+			<xs:enumeration value="target" />
+			<xs:enumeration value="either" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumIncludeRelationships">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="source" />
+			<xs:enumeration value="target" />
+			<xs:enumeration value="both" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!--  properties in CMIS -->
+	<xs:simpleType name="enumPropertiesBase">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:name" />
+			<xs:enumeration value="cmis:objectId" />
+			<xs:enumeration value="cmis:objectTypeId" />
+			<xs:enumeration value="cmis:baseTypeId" />
+			<xs:enumeration value="cmis:createdBy" />
+			<xs:enumeration value="cmis:creationDate" />
+			<xs:enumeration value="cmis:lastModifiedBy" />
+			<xs:enumeration value="cmis:lastModificationDate" />
+			<xs:enumeration value="cmis:changeToken" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumPropertiesDocument">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:isImmutable" />
+			<xs:enumeration value="cmis:isLatestVersion" />
+			<xs:enumeration value="cmis:isMajorVersion" />
+			<xs:enumeration value="cmis:isLatestMajorVersion" />
+			<xs:enumeration value="cmis:versionLabel" />
+			<xs:enumeration value="cmis:versionSeriesId" />
+			<xs:enumeration value="cmis:isVersionSeriesCheckedOut" />
+			<xs:enumeration value="cmis:versionSeriesCheckedOutBy" />
+			<xs:enumeration value="cmis:versionSeriesCheckedOutId" />
+			<xs:enumeration value="cmis:checkinComment" />
+			<xs:enumeration value="cmis:contentStreamLength" />
+			<xs:enumeration value="cmis:contentStreamMimeType" />
+			<xs:enumeration value="cmis:contentStreamFileName" />
+			<xs:enumeration value="cmis:contentStreamId" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumPropertiesFolder">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:parentId" />
+			<xs:enumeration value="cmis:allowedChildObjectTypeIds" />
+			<xs:enumeration value="cmis:path" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumPropertiesRelationship">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:sourceId" />
+			<xs:enumeration value="cmis:targetId" />
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="enumPropertiesPolicy">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:policyText" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:attributeGroup name="cmisUndefinedAttribute">
+		<xs:anyAttribute namespace="##other" processContents="lax" />
+	</xs:attributeGroup>
+
+	<!--  main cmis object -->
+	<xs:complexType name="cmisObjectType">
+		<xs:sequence>
+			<xs:element name="properties" type="cmis:cmisPropertiesType"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="allowableActions" type="cmis:cmisAllowableActionsType"
+				minOccurs="0" maxOccurs="1" />
+
+			<xs:element name="relationship" type="cmis:cmisObjectType"
+				minOccurs="0" maxOccurs="unbounded" />
+
+			<!--  if change log -->
+			<xs:element name="changeEventInfo" type="cmis:cmisChangeEventType"
+				minOccurs="0" maxOccurs="1" />
+
+			<!--  ACL -->
+			<xs:element name="acl" type="cmis:cmisAccessControlListType"
+				minOccurs="0" maxOccurs="1" />
+
+			<xs:element name="exactACL" type="xs:boolean" minOccurs="0"
+				maxOccurs="1" />
+
+			<!-- Applied Policy IDs -->
+			<xs:element name="policyIds" type="cmis:cmisListOfIdsType"
+				minOccurs="0" maxOccurs="1" />
+
+			<!--  Rendition -->
+			<xs:element name="rendition" type="cmis:cmisRenditionType"
+				minOccurs="0" maxOccurs="unbounded" />
+
+			<!--  extensions -->
+			<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"
+				namespace="##other" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+
+	<!-- property bag -->
+	<xs:attribute name="key" type="xs:string" />
+	<xs:attribute name="index" type="xs:integer" />
+
+	<xs:complexType name="cmisPropertiesType">
+		<xs:sequence>
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:appinfo>
+						<jaxb:property name="property" />
+					</xs:appinfo>
+				</xs:annotation>
+				<xs:element name="propertyBoolean" type="cmis:cmisPropertyBoolean"
+					nillable="true" />
+				<xs:element name="propertyId" type="cmis:cmisPropertyId"
+					nillable="true" />
+				<xs:element name="propertyInteger" type="cmis:cmisPropertyInteger"
+					nillable="true" />
+				<xs:element name="propertyDateTime" type="cmis:cmisPropertyDateTime"
+					nillable="true" />
+				<xs:element name="propertyDecimal" type="cmis:cmisPropertyDecimal"
+					nillable="true" />
+				<xs:element name="propertyHtml" type="cmis:cmisPropertyHtml"
+					nillable="true" />
+				<xs:element name="propertyString" type="cmis:cmisPropertyString"
+					nillable="true" />
+				<xs:element name="propertyUri" type="cmis:cmisPropertyUri"
+					nillable="true" />
+			</xs:choice>
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+
+	<!-- start the prop definitions -->
+	<xs:complexType name="cmisProperty">
+		<xs:attribute name="propertyDefinitionId" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					This is the property definition id for this
+					property instance. This is
+					not required to be set when used as a
+					default value. This is
+					required to be set when used for query result
+					set or returning
+					properties on an object.
+		</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="localName" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					This is the localname as defined by the property
+					definition
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="displayName" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					This is the displayname as defined by the property
+					definition
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="queryName" use="optional">
+			<xs:annotation>
+				<xs:documentation>
+					This is the queryName. This must be specified if
+					this is the result of a query. If aliases are used, the alias is to
+					be specified here instead of the queryName.
+				</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyBoolean">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:boolean" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyId">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:string" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyInteger">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:integer" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyDateTime">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:dateTime" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyDecimal">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:decimal" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyHtml">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:string" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+
+
+	<xs:complexType name="cmisPropertyString">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:string" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyUri">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisProperty">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:anyURI" />
+					<xs:any processContents="lax" namespace="##other" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+
+
+	<!-- cmis choice -->
+	<xs:complexType name="cmisChoice">
+		<xs:attribute name="displayName" use="required" />
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceBoolean">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:boolean" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceBoolean" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceId">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:string" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceId" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceInteger">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:integer" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceInteger" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceDateTime">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:dateTime" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceDateTime" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceDecimal">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:decimal" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceDecimal" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceHtml">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:string" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceHtml" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+
+	<xs:complexType name="cmisChoiceString">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:string" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceString" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisChoiceUri">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisChoice">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="value"
+						type="xs:anyURI" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceUri" />
+				</xs:sequence>
+
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+
+
+	<!--  allowable actions -->
+	<xs:complexType name="cmisAllowableActionsType">
+		<xs:sequence>
+			<xs:element name="canDeleteObject" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canUpdateProperties" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetFolderTree" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetProperties" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetObjectRelationships" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetObjectParents" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetFolderParent" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetDescendants" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canMoveObject" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canDeleteContentStream" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canCheckOut" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canCancelCheckOut" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canCheckIn" type="xs:boolean" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="canSetContentStream" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetAllVersions" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canAddObjectToFolder" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canRemoveObjectFromFolder" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetContentStream" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canApplyPolicy" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetAppliedPolicies" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canRemovePolicy" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canGetChildren" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canCreateDocument" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canCreateFolder" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canCreateRelationship" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="canDeleteTree" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+
+			<!-- renditions -->
+			<xs:element name="canGetRenditions" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+
+			<!-- ACL -->
+			<xs:element name="canGetACL" type="xs:boolean" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="canApplyACL" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+
+	<xs:complexType name="cmisListOfIdsType">
+		<xs:sequence>
+			<xs:element name="id" type="xs:string" minOccurs="1"
+				maxOccurs="unbounded" />
+
+			<!--  extension -->
+			<xs:any processContents="lax" namespace="##other" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+
+	<!-- Property Attributes -->
+	<xs:complexType name="cmisPropertyDefinitionType">
+		<xs:sequence>
+			<xs:element name="id" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="localName" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="localNamespace" type="xs:anyURI"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="displayName" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="queryName" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="description" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="propertyType" type="cmis:enumPropertyType"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="cardinality" type="cmis:enumCardinality"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="updatability" type="cmis:enumUpdatability"
+				minOccurs="1" maxOccurs="1" />
+
+			<!-- flags -->
+			<xs:element name="inherited" type="xs:boolean" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="required" type="xs:boolean" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="queryable" type="xs:boolean" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="orderable" type="xs:boolean" minOccurs="1"
+				maxOccurs="1" />
+
+			<xs:element name="openChoice" type="xs:boolean" minOccurs="0"
+				maxOccurs="1" />
+
+			<!--  extension -->
+			<xs:any processContents="lax" namespace="##other" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+	<!--  type specific definitions -->
+	<xs:complexType name="cmisPropertyBooleanDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyBoolean" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceBoolean" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyIdDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyId" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceId" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyIntegerDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyInteger" />
+					<xs:element name="maxValue" type="xs:integer" minOccurs="0"
+						maxOccurs="1" />
+					<xs:element name="minValue" type="xs:integer" minOccurs="0"
+						maxOccurs="1" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceInteger" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyDateTimeDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyDateTime" />
+					<xs:element minOccurs="0" maxOccurs="1" name="resolution"
+						type="cmis:enumDateTimeResolution" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceDateTime" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyDecimalDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyDecimal" />
+					<xs:element name="maxValue" type="xs:decimal" minOccurs="0"
+						maxOccurs="1" />
+					<xs:element name="minValue" type="xs:decimal" minOccurs="0"
+						maxOccurs="1" />
+					<xs:element name="precision" type="cmis:enumDecimalPrecision"
+						minOccurs="0" maxOccurs="1" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceDecimal" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyHtmlDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyHtml" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceHtml" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyStringDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyString" />
+					<xs:element name="maxLength" type="xs:integer"
+						minOccurs="0" maxOccurs="1" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceString" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisPropertyUriDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisPropertyDefinitionType">
+				<xs:sequence>
+					<xs:element minOccurs="0" maxOccurs="1" name="defaultValue"
+						type="cmis:cmisPropertyUri" />
+					<xs:element minOccurs="0" maxOccurs="unbounded" name="choice"
+						type="cmis:cmisChoiceUri" />
+
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+
+
+	<!-- type definition -->
+	<xs:complexType name="cmisTypeDefinitionType">
+		<xs:sequence>
+			<!--  primary identifying attribute -->
+			<xs:element name="id" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="localName" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="localNamespace" type="xs:anyURI"
+				minOccurs="1" maxOccurs="1" nillable="true" />
+			<xs:element name="displayName" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="queryName" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="description" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+
+			<!--  base type -->
+			<xs:element name="baseId" type="cmis:enumBaseObjectTypeIds"
+				minOccurs="1" maxOccurs="1" />
+
+			<!-- parent -->
+			<xs:element name="parentId" type="xs:string" minOccurs="0"
+				maxOccurs="1">
+				<xs:annotation>
+					<xs:documentation>
+						This is the id for the parent type definition. If
+						this is a base type,
+						this is not present.
+			</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+
+			<!-- flags -->
+			<xs:element name="creatable" type="xs:boolean" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="fileable" type="xs:boolean" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="queryable" type="xs:boolean" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="fulltextIndexed" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="includedInSupertypeQuery" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" default="true" />
+
+			<!-- controllable -->
+			<xs:element name="controllablePolicy" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="controllableACL" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+
+			<!-- property definitions -->
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:appinfo>
+						<jaxb:property name="propertyDefinition" />
+					</xs:appinfo>
+				</xs:annotation>
+				<xs:element name="propertyBooleanDefinition" type="cmis:cmisPropertyBooleanDefinitionType" />
+				<xs:element name="propertyDateTimeDefinition"
+					type="cmis:cmisPropertyDateTimeDefinitionType" />
+				<xs:element name="propertyDecimalDefinition" type="cmis:cmisPropertyDecimalDefinitionType" />
+				<xs:element name="propertyIdDefinition" type="cmis:cmisPropertyIdDefinitionType" />
+				<xs:element name="propertyIntegerDefinition" type="cmis:cmisPropertyIntegerDefinitionType" />
+				<xs:element name="propertyHtmlDefinition" type="cmis:cmisPropertyHtmlDefinitionType" />
+				<xs:element name="propertyStringDefinition" type="cmis:cmisPropertyStringDefinitionType" />
+				<xs:element name="propertyUriDefinition" type="cmis:cmisPropertyUriDefinitionType" />
+			</xs:choice>
+
+			<!-- extension -->
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+
+	<!-- type specific typedefs -->
+	<xs:complexType name="cmisTypeDocumentDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisTypeDefinitionType">
+				<xs:sequence>
+					<xs:element name="versionable" type="xs:boolean"
+						minOccurs="1" maxOccurs="1" />
+					<xs:element name="contentStreamAllowed" type="cmis:enumContentStreamAllowed"
+						minOccurs="1" maxOccurs="1" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisTypeFolderDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisTypeDefinitionType">
+				<xs:sequence>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisTypeRelationshipDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisTypeDefinitionType">
+				<xs:sequence>
+					<xs:element name="allowedSourceTypes" type="xs:string"
+						minOccurs="0" maxOccurs="unbounded" />
+					<xs:element name="allowedTargetTypes" type="xs:string"
+						minOccurs="0" maxOccurs="unbounded" />
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<xs:complexType name="cmisTypePolicyDefinitionType">
+		<xs:complexContent>
+			<xs:extension base="cmis:cmisTypeDefinitionType">
+				<xs:sequence>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+
+	<!--  query -->
+	<xs:complexType name="cmisQueryType">
+		<xs:sequence>
+			<xs:element name="statement" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="searchAllVersions" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+
+			<xs:element name="includeAllowableActions" type="xs:boolean"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="renditionFilter" type="xs:string"
+				minOccurs="0" maxOccurs="1" />
+
+			<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+				maxOccurs="1" />
+			<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+				maxOccurs="1" />
+
+			<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other"
+				processContents="lax" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+
+
+	<!--  repository info -->
+	<xs:complexType name="cmisRepositoryInfoType">
+		<xs:sequence minOccurs="1">
+			<xs:element name="repositoryId" type="xs:string"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="repositoryName" type="xs:string"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="repositoryDescription" type="xs:string"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="vendorName" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="productName" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="productVersion" type="xs:string"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="rootFolderId" type="xs:string" />
+			<xs:element name="latestChangeLogToken" type="xs:string"
+				minOccurs="0" />
+			<xs:element name="capabilities" type="cmis:cmisRepositoryCapabilitiesType"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="aclCapability" type="cmis:cmisACLCapabilityType"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="cmisVersionSupported" type="xs:string"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="thinClientURI" type="xs:anyURI"
+				minOccurs="0" maxOccurs="1" />
+			<xs:element name="changesIncomplete" type="xs:boolean"
+				maxOccurs="1" minOccurs="0" />
+			<xs:element name="changesOnType" type="cmis:enumBaseObjectTypeIds"
+				minOccurs="0" maxOccurs="unbounded" />
+
+			<xs:element name="principalAnonymous" type="xs:string"
+				minOccurs="0" maxOccurs="1">
+				<xs:annotation>
+					<xs:documentation>
+						If set, this field holds the principal who is
+						used for anonymous
+						access. This principal can then be passed to the
+						ACL services to
+						specify what permissions anonymous users should
+						have
+					</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+
+			<xs:element name="principalAnyone" type="xs:string"
+				minOccurs="0" maxOccurs="1">
+				<xs:annotation>
+					<xs:documentation>
+						If set, this field holds the principal who is
+						used for everyone's access. This principal can then be passed to
+						the
+						ACL services to
+						specify what permissions everyone should
+						have
+					</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+	<xs:complexType name="cmisRepositoryCapabilitiesType">
+		<xs:sequence>
+			<xs:element name="capabilityACL" type="cmis:enumCapabilityACL"
+				maxOccurs="1" minOccurs="1" />
+			<xs:element name="capabilityAllVersionsSearchable" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityChanges" type="cmis:enumCapabilityChanges" />
+
+			<xs:element name="capabilityContentStreamUpdatability"
+				type="cmis:enumCapabilityContentStreamUpdates" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="capabilityGetDescendants" type="xs:boolean"
+				maxOccurs="1" minOccurs="1" />
+			<xs:element name="capabilityGetFolderTree" type="xs:boolean"
+				maxOccurs="1" minOccurs="1" />
+
+			<xs:element name="capabilityMultifiling" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityPWCSearchable" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityPWCUpdatable" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityQuery" type="cmis:enumCapabilityQuery"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityRenditions" type="cmis:enumCapabilityRendition"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityUnfiling" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityVersionSpecificFiling" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="capabilityJoin" type="cmis:enumCapabilityJoin"
+				minOccurs="1" maxOccurs="1" />
+
+			<!-- extension -->
+			<xs:any namespace="##other" processContents="skip" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+	<!-- Unified Search -->
+	<xs:simpleType name="enumTypeOfChanges">
+		<xs:restriction base="xs:string">
+			<!-- content with a new ID has been created -->
+			<xs:enumeration value="created" />
+			<!-- content with an existing ID has been modified -->
+			<xs:enumeration value="updated" />
+			<!-- content with an existing ID has been deleted -->
+			<xs:enumeration value="deleted" />
+			<!-- content with an existing ID has had its security policy changed-->
+			<xs:enumeration value="security" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumCapabilityChanges">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="objectidsonly" />
+			<xs:enumeration value="properties" />
+			<xs:enumeration value="all" />
+		</xs:restriction>
+	</xs:simpleType>
+
+
+
+	<xs:complexType name="cmisChangeEventType">
+		<xs:sequence>
+			<xs:element name="changeType" type="cmis:enumTypeOfChanges" />
+			<xs:element name="changeTime" type="xs:dateTime" />
+
+			<!--  extension -->
+			<xs:any processContents="lax" namespace="##other" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+	</xs:complexType>
+
+	<!-- ACL -->
+	<xs:simpleType name="enumACLPropagation">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="repositorydetermined" />
+			<xs:enumeration value="objectonly" />
+			<xs:enumeration value="propagate" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumCapabilityACL">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="discover" />
+			<xs:enumeration value="manage" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumBasicPermissions">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:read" />
+			<xs:enumeration value="cmis:write" />
+			<xs:enumeration value="cmis:all" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:complexType name="cmisPermissionDefinition">
+		<xs:sequence>
+			<xs:element name="permission" type="xs:string" />
+			<xs:element name="description" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:any namespace="##other" minOccurs="0" processContents="lax"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+	</xs:complexType>
+
+	<xs:complexType name="cmisPermissionMapping">
+		<xs:sequence>
+			<xs:element name="key" type="cmis:enumAllowableActionsKey"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="permission" type="xs:string" minOccurs="1"
+				maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>
+						Multiple entries are OR'ed together. Any
+						permission that specified is
+						sufficient to provide rights required
+						in key
+					</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+	</xs:complexType>
+
+
+	<xs:simpleType name="enumAllowableActionsKey">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="canGetDescendents.Folder" />
+			<xs:enumeration value="canGetChildren.Folder" />
+			<xs:enumeration value="canGetParents.Folder" />
+			<xs:enumeration value="canGetFolderParent.Object" />
+			<xs:enumeration value="canCreateDocument.Folder" />
+			<xs:enumeration value="canCreateFolder.Folder" />
+			<xs:enumeration value="canCreateRelationship.Source" />
+			<xs:enumeration value="canCreateRelationship.Target" />
+			<xs:enumeration value="canGetProperties.Object" />
+			<xs:enumeration value="canViewContent.Object" />
+			<xs:enumeration value="canUpdateProperties.Object" />
+			<xs:enumeration value="canMove.Object" />
+			<xs:enumeration value="canMove.Target" />
+			<xs:enumeration value="canMove.Source" />
+			<xs:enumeration value="canDelete.Object" />
+			<xs:enumeration value="canDeleteTree.Folder" />
+			<xs:enumeration value="canSetContent.Document" />
+			<xs:enumeration value="canDeleteContent.Document" />
+			<xs:enumeration value="canAddToFolder.Object" />
+			<xs:enumeration value="canAddToFolder.Folder" />
+			<xs:enumeration value="canRemoveFromFolder.Object" />
+			<xs:enumeration value="canRemoveFromFolder.Folder" />
+			<xs:enumeration value="canCheckout.Document" />
+			<xs:enumeration value="canCancelCheckout.Document" />
+			<xs:enumeration value="canCheckin.Document" />
+			<xs:enumeration value="canGetAllVersions.VersionSeries" />
+			<xs:enumeration value="canGetObjectRelationships.Object" />
+			<xs:enumeration value="canAddPolicy.Object" />
+			<xs:enumeration value="canAddPolicy.Policy" />
+			<xs:enumeration value="canRemovePolicy.Object" />
+			<xs:enumeration value="canRemovePolicy.Policy" />
+			<xs:enumeration value="canGetAppliedPolicies.Object" />
+			<xs:enumeration value="canGetACL.Object" />
+			<xs:enumeration value="canApplyACL.Object" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumUsers">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:user">
+				<xs:annotation>
+					<xs:documentation>
+						This user can be used on setting ACLs to specify
+						the permission this
+						user context should have.
+			</xs:documentation>
+				</xs:annotation>
+			</xs:enumeration>
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- ACL on objects -->
+	<xs:complexType name="cmisAccessControlPrincipalType">
+		<xs:sequence>
+			<xs:element name="principalId" type="xs:string" />
+
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+	</xs:complexType>
+
+	<xs:complexType name="cmisAccessControlEntryType">
+		<xs:sequence>
+			<xs:element name="principal" type="cmis:cmisAccessControlPrincipalType" />
+			<xs:element name="permission" type="xs:string" minOccurs="1"
+				maxOccurs="unbounded" />
+			<xs:element name="direct" type="xs:boolean" />
+
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+	</xs:complexType>
+
+	<xs:complexType name="cmisAccessControlListType">
+		<xs:sequence>
+			<xs:element name="permission" type="cmis:cmisAccessControlEntryType"
+				minOccurs="1" maxOccurs="unbounded" />
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+	</xs:complexType>
+
+
+	<xs:complexType name="cmisACLCapabilityType">
+		<xs:sequence>
+			<xs:element name="supportedPermissions" type="cmis:enumSupportedPermissions" />
+			<xs:element name="propagation" type="cmis:enumACLPropagation" />
+			<xs:element name="permissions" type="cmis:cmisPermissionDefinition"
+				minOccurs="1" maxOccurs="unbounded" />
+			<xs:element name="mapping" type="cmis:cmisPermissionMapping"
+				minOccurs="0" maxOccurs="unbounded" />
+		</xs:sequence>
+	</xs:complexType>
+
+	<xs:simpleType name="enumSupportedPermissions">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="basic" />
+			<xs:enumeration value="repository" />
+			<xs:enumeration value="both" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- renditions -->
+	<xs:simpleType name="enumCapabilityRendition">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="none" />
+			<xs:enumeration value="read" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:simpleType name="enumRenditionKind">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="cmis:thumbnail" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<xs:complexType name="cmisRenditionType">
+		<xs:sequence>
+			<xs:element name="streamId" type="xs:string" />
+			<xs:element name="mimetype" type="xs:string" />
+			<xs:element name="length" type="xs:integer" />
+			<xs:element name="kind" type="xs:string" />
+			<xs:element name="title" type="xs:string" minOccurs="0" />
+			<xs:element name="height" type="xs:integer" minOccurs="0" />
+			<xs:element name="width" type="xs:integer" minOccurs="0" />
+			<xs:element name="renditionDocumentId" type="xs:string"
+				minOccurs="0" />
+
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+	</xs:complexType>
+
+
+	<!-- elements -->
+	<xs:element name="allowableActions" type="cmis:cmisAllowableActionsType">
+		<xs:annotation>
+			<xs:documentation>
+				This is the root tag for a CMIS AllowableActions
+				Document Type
+			</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+
+	<xs:element name="query" type="cmis:cmisQueryType">
+		<xs:annotation>
+			<xs:documentation>
+				This is the root tag for a CMIS Query Document Type
+			</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+	<xs:element name="acl" type="cmis:cmisAccessControlListType">
+		<xs:annotation>
+			<xs:documentation>
+				This is the root tag for a CMIS ACL Document Type
+			</xs:documentation>
+		</xs:annotation>
+	</xs:element>
+</xs:schema>
+	<!-- EOF -->
\ No newline at end of file
diff --git a/DotCMIS/wsdl/CMIS-Messaging.xsd b/DotCMIS/wsdl/CMIS-Messaging.xsd
new file mode 100644
index 0000000..a6ad787
--- /dev/null
+++ b/DotCMIS/wsdl/CMIS-Messaging.xsd
@@ -0,0 +1,2072 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+	<!--
+		Licensed under the Apache License, Version 2.0 (the "License"); you
+		may not use this file except in compliance with the License. You may
+		obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
+	xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
+	xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
+	xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="1.0"
+	xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
+	jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.1"
+	elementFormDefault="qualified">
+
+	<xs:import schemaLocation="CMIS-Core.xsd"
+		namespace="http://docs.oasis-open.org/ns/cmis/core/200908/" />
+
+	<!-- exceptions -->
+	<xs:complexType name="cmisFaultType">
+		<xs:sequence>
+			<xs:element name="type" type="cmism:enumServiceException" />
+			<xs:element name="code" type="xs:integer" />
+			<xs:element name="message" type="xs:string" />
+			<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" />
+		</xs:sequence>
+	</xs:complexType>
+
+	<xs:element name="cmisFault" type="cmism:cmisFaultType" />
+	<xs:simpleType name="enumServiceException">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="constraint" />
+			<xs:enumeration value="nameConstraintViolation" />
+			<xs:enumeration value="contentAlreadyExists" />
+			<xs:enumeration value="filterNotValid" />
+			<xs:enumeration value="invalidArgument" />
+			<xs:enumeration value="notSupported" />
+			<xs:enumeration value="objectNotFound" />
+			<xs:enumeration value="permissionDenied" />
+			<xs:enumeration value="runtime" />
+			<xs:enumeration value="storage" />
+			<xs:enumeration value="streamNotSupported" />
+			<xs:enumeration value="updateConflict" />
+			<xs:enumeration value="versioning" />
+		</xs:restriction>
+	</xs:simpleType>
+
+	<!-- extension -->
+	<xs:complexType name="cmisExtensionType">
+		<xs:sequence>
+			<xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" />
+		</xs:sequence>
+	</xs:complexType>
+	
+	<!-- types for WS -->
+	<xs:complexType name="cmisTypeContainer">
+		<xs:sequence>
+			<xs:element name="type" type="cmis:cmisTypeDefinitionType" 
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="children" type="cmism:cmisTypeContainer"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+	<xs:complexType name="cmisTypeDefinitionListType">
+		<xs:sequence>
+			<xs:element name="types" type="cmis:cmisTypeDefinitionType"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:element name="hasMoreItems" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="numItems" type="xs:integer" minOccurs="0"
+				maxOccurs="1" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+	
+	<xs:complexType name="cmisObjectInFolderContainerType">
+		<xs:sequence>
+			<xs:element name="objectInFolder" type="cmism:cmisObjectInFolderType"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="children" type="cmism:cmisObjectInFolderContainerType"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />	
+	</xs:complexType>
+
+	<xs:complexType name="cmisObjectListType">
+		<xs:sequence>
+			<xs:element name="objects" type="cmis:cmisObjectType"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:element name="hasMoreItems" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="numItems" type="xs:integer" minOccurs="0"
+				maxOccurs="1" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />		
+	</xs:complexType>
+	
+	<xs:complexType name="cmisObjectInFolderType">
+		<xs:sequence>
+			<xs:element name="object" type="cmis:cmisObjectType" 
+				minOccurs="1" maxOccurs="1"/>
+			<xs:element name="pathSegment" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />		
+	</xs:complexType>
+
+	<xs:complexType name="cmisObjectParentsType">
+		<xs:sequence>
+			<xs:element name="object" type="cmis:cmisObjectType" 
+				minOccurs="1" maxOccurs="1"/>
+			<xs:element name="relativePathSegment" type="xs:string" minOccurs="0"
+				maxOccurs="1" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" /> 
+	</xs:complexType>
+	
+	<xs:complexType name="cmisObjectInFolderListType">
+		<xs:sequence>
+			<xs:element name="objects" type="cmism:cmisObjectInFolderType"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:element name="hasMoreItems" type="xs:boolean"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="numItems" type="xs:integer" minOccurs="0"
+				maxOccurs="1" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+	
+	<xs:complexType name="cmisRepositoryEntryType">
+		<xs:sequence>
+			<xs:element name="repositoryId" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:element name="repositoryName" type="xs:string" minOccurs="1"
+				maxOccurs="1" />
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+				processContents="lax" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+	<xs:complexType name="cmisContentStreamType">
+		<xs:sequence>
+			<xs:element name="length" type="xs:integer" minOccurs="0" />
+			<xs:element name="mimeType" type="xs:string" minOccurs="0" />
+			<xs:element name="filename" type="xs:string" minOccurs="0" />
+			<xs:element name="stream" type="xs:base64Binary"
+				xmime:expectedContentTypes="application/octet-stream" xmlns:xmime="http://www.w3.org/2005/05/xmlmime" />
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+
+	<xs:complexType name="cmisACLType">
+		<xs:sequence>
+			<xs:element name="ACL" type="cmis:cmisAccessControlListType"
+				minOccurs="1" maxOccurs="1" />
+			<xs:element name="exact" type="xs:boolean" 
+				minOccurs="0" maxOccurs="1"/>
+			<xs:any namespace="##other" processContents="lax" minOccurs="0"
+				maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+	</xs:complexType>
+	
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!-- [Repository Services] -->
+	
+	<!-- getRepositories Operation -->
+	<xs:element name="getRepositories">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getRepositoriesResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositories" type="cmism:cmisRepositoryEntryType"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+
+	<!-- getRepositoryInfo Operation -->
+	<xs:element name="getRepositoryInfo">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getRepositoryInfoResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryInfo" type="cmis:cmisRepositoryInfoType" 
+					minOccurs="1" maxOccurs="1"/>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getTypeChildren Operation -->
+	<xs:element name="getTypeChildren">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="typeId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includePropertyDefinitions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getTypeChildrenResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="types" type="cmism:cmisTypeDefinitionListType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getTypeDescendants Operation -->
+	<xs:element name="getTypeDescendants">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="typeId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="depth" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includePropertyDefinitions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getTypeDescendantsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="types" type="cmism:cmisTypeContainer"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getTypeDefinition Operation -->
+	<xs:element name="getTypeDefinition">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="typeId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getTypeDefinitionResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="type" type="cmis:cmisTypeDefinitionType"
+					minOccurs="0" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!-- [Navigation Services] -->
+	
+	<!-- getDescendants Operation -->
+	<xs:element name="getDescendants">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="depth" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includePathSegment" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getDescendantsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectInFolderContainerType"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getDescendants Operation -->
+	<xs:element name="getFolderTree">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="depth" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+					
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includePathSegment" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getFolderTreeResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectInFolderContainerType"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getChildren Operation -->
+	<xs:element name="getChildren">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="orderBy" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includePathSegment" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getChildrenResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectInFolderListType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getFolderParent Operation -->
+	<xs:element name="getFolderParent">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getFolderParentResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="object" type="cmis:cmisObjectType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getObjectParents Operation-->
+	<xs:element name="getObjectParents">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelativePathSegment" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getObjectParentsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="parents" type="cmism:cmisObjectParentsType"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getRenditions Operation -->
+	<xs:element name="getRenditions">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getRenditionsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="renditions" type="cmis:cmisRenditionType"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getCheckedoutDocs Operation -->
+	<xs:element name="getCheckedOutDocs">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="orderBy" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getCheckedOutDocsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectListType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!-- [Object Services] -->
+	
+	<!-- createDocument Operation -->
+	<xs:element name="createDocument">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="contentStream" type="cmism:cmisContentStreamType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="versioningState" type="cmis:enumVersioningState"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="policies" type="xs:string"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="createDocumentResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- createDocumentFromSource Operation -->
+	<xs:element name="createDocumentFromSource">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="sourceId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />					
+				<xs:element name="folderId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="versioningState" type="cmis:enumVersioningState"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="policies" type="xs:string"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+					
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="createDocumentFromSourceResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- createFolder Operation -->
+	<xs:element name="createFolder">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="policies" type="xs:string"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="createFolderResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- createRelationship Operation -->
+	<xs:element name="createRelationship">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+
+				<xs:element name="policies" type="xs:string"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="createRelationshipResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- createPolicy Operation -->
+	<xs:element name="createPolicy">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="policies" type="xs:string"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="createPolicyResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- getAllowableActions Operation -->
+	<xs:element name="getAllowableActions">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getAllowableActionsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="allowableActions" type="cmis:cmisAllowableActionsType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getProperties Operation -->
+	<xs:element name="getProperties">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getPropertiesResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getObject Operation -->
+	<xs:element name="getObject">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="filter" type="xs:string" 
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includePolicyIds" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeACL" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getObjectResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="object" type="cmis:cmisObjectType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getObjectByPath Operation -->
+	<xs:element name="getObjectByPath">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="path" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="filter" type="xs:string" 
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includePolicyIds" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeACL" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+					
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getObjectByPathResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="object" type="cmis:cmisObjectType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getContentStream Operation -->
+	<xs:element name="getContentStream">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="streamId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="offset" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="length" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+					
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getContentStreamResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="contentStream" type="cmism:cmisContentStreamType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- updateProperties Operation -->
+	<xs:element name="updateProperties">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<!--
+					if objectId is present in the properties the value must match this
+					objectId
+				-->
+				<xs:element name="changeToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+					
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="updatePropertiesResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="changeToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- moveObject Operation -->
+	<xs:element name="moveObject">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="targetFolderId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="sourceFolderId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="moveObjectResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- deleteObject Operation -->
+	<xs:element name="deleteObject">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="allVersions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="deleteObjectResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- deleteTree Operation -->
+	<xs:element name="deleteTree">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="allVersions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="unfileObjects" type="cmis:enumUnfileObject"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="continueOnFailure" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="deleteTreeResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="failedToDelete">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="objectIds" type="xs:string"
+								minOccurs="0" maxOccurs="unbounded" />
+							<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded"
+								processContents="lax" />
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- setContentStream Operation -->
+	<xs:element name="setContentStream">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="overwriteFlag" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="changeToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="contentStream" type="cmism:cmisContentStreamType"
+					minOccurs="1" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="setContentStreamResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="changeToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- deleteContentStream Operation -->
+	<xs:element name="deleteContentStream">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="changeToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="deleteContentStreamResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="changeToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" />
+				
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!--[Multi-filing Services]-->
+
+	<!-- addObjectToFolder Operation -->
+	<xs:element name="addObjectToFolder">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="allVersions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="addObjectToFolderResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- removeObjectFromFolder Operation -->
+	<xs:element name="removeObjectFromFolder">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="folderId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="removeObjectFromFolderResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!-- [Discovery Services] -->
+	
+	<!-- query Operation -->
+	<xs:element name="query">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="statement" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="searchAllVersions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+			<xs:attributeGroup ref="cmis:cmisUndefinedAttribute" />
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="queryResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectListType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getContentChanges operation -->
+	<xs:element name="getContentChanges">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="changeLogToken" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeProperties" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includePolicyIds" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeACL" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getContentChangesResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectListType"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="changeLogToken" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!-- [Versioning Services] -->
+
+	<!-- checkOut Operation -->
+	<xs:element name="checkOut">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="checkOutResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="contentCopied" type="xs:boolean"
+					minOccurs="1" maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- cancelCheckOut Operation -->
+	<xs:element name="cancelCheckOut">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="cancelCheckOutResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- checkIn Operation -->
+	<xs:element name="checkIn">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="major" type="xs:boolean" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="contentStream" type="cmism:cmisContentStreamType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="checkinComment" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="policies" type="xs:string"
+					minOccurs="0" maxOccurs="unbounded" nillable="true" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="checkInResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getPropertiesOfLatestVersion -->
+	<xs:element name="getPropertiesOfLatestVersion">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="major" type="xs:boolean" minOccurs="0"
+					maxOccurs="1" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getPropertiesOfLatestVersionResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="properties" type="cmis:cmisPropertiesType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getObjectOfLatestVersion Operation -->
+	<xs:element name="getObjectOfLatestVersion">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="major" type="xs:boolean" minOccurs="0"
+					maxOccurs="1" />
+				<xs:element name="filter" type="xs:string" 
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeRelationships" type="cmis:enumIncludeRelationships"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="renditionFilter" type="xs:string"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includePolicyIds" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="includeACL" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getObjectOfLatestVersionResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="object" type="cmis:cmisObjectType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getAllVersions Operation -->
+	<xs:element name="getAllVersions">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getAllVersionsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmis:cmisObjectType"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!--[Relationship Services]-->
+
+	<!-- getRelationships Operation -->
+	<xs:element name="getObjectRelationships">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="includeSubRelationshipTypes" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" />
+				<xs:element name="relationshipDirection" type="cmis:enumRelationshipDirection"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+				<xs:element name="typeId" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="includeAllowableActions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="maxItems" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+				<xs:element name="skipCount" type="xs:integer" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getObjectRelationshipsResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmism:cmisObjectListType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+	<!--[Policy Services]-->
+
+	<!-- applyPolicy Operation -->
+	<xs:element name="applyPolicy">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="policyId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="applyPolicyResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- removePolicy Operation -->
+	<xs:element name="removePolicy">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="policyId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="removePolicyResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getAppliedPolicies Operation -->
+	<xs:element name="getAppliedPolicies">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="filter" type="xs:string" minOccurs="0"
+					maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getAppliedPoliciesResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="objects" type="cmis:cmisObjectType"
+					minOccurs="0" maxOccurs="unbounded" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+	<!-- getACL Operation -->
+	<xs:element name="getACL">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="onlyBasicPermissions" type="xs:boolean"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+						</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="getACLResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="ACL" type="cmism:cmisACLType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>	
+	</xs:element>
+	
+	<!-- applyACL Operation -->
+	<xs:element name="applyACL">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="repositoryId" type="xs:string"
+					minOccurs="1" maxOccurs="1" />
+				<xs:element name="objectId" type="xs:string" minOccurs="1"
+					maxOccurs="1" />
+				<xs:element name="addACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" />
+				<xs:element name="removeACEs" type="cmis:cmisAccessControlListType"
+					minOccurs="0" maxOccurs="1" />
+				<xs:element name="ACLPropagation" type="cmis:enumACLPropagation"
+					minOccurs="0" maxOccurs="1" nillable="true" />
+
+				<xs:element name="extension" type="cmism:cmisExtensionType"
+					minOccurs="0" maxOccurs="1" nillable="true">
+					<xs:annotation>
+						<xs:documentation>
+							This is an extension element to hold any
+							repository or
+							vendor-specific extensions
+					</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+	<xs:element name="applyACLResponse">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="ACL" type="cmism:cmisACLType"
+					minOccurs="1" maxOccurs="1" />
+			</xs:sequence>
+		</xs:complexType>
+	</xs:element>
+
+</xs:schema>
\ No newline at end of file
diff --git a/DotCMIS/wsdl/CMISWS-Service.wsdl b/DotCMIS/wsdl/CMISWS-Service.wsdl
new file mode 100644
index 0000000..b749511
--- /dev/null
+++ b/DotCMIS/wsdl/CMISWS-Service.wsdl
@@ -0,0 +1,1173 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+	<!--
+		Licensed under the Apache License, Version 2.0 (the "License"); you
+		may not use this file except in compliance with the License. You may
+		obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+
+<definitions xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/"
+	xmlns:cmism="http://docs.oasis-open.org/ns/cmis/messaging/200908/"
+	xmlns:cmisw="http://docs.oasis-open.org/ns/cmis/ws/200908/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/"
+	xmlns:ns="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://docs.oasis-open.org/ns/cmis/ws/200908/"
+	xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" name="CMISWebServices">
+	<types>
+		<xsd:schema elementFormDefault="qualified"
+			targetNamespace="http://docs.oasis-open.org/ns/cmis/ws/200908/">
+			<xsd:import schemaLocation="CMIS-Core.xsd"
+				namespace="http://docs.oasis-open.org/ns/cmis/core/200908/" />
+			<xsd:import schemaLocation="CMIS-Messaging.xsd"
+				namespace="http://docs.oasis-open.org/ns/cmis/messaging/200908/" />
+		</xsd:schema>
+	</types>
+
+	<message name="cmisException">
+		<part name="fault" element="cmism:cmisFault" />
+	</message>
+
+	<message name="getACLRequest">
+		<part name="parameters" element="cmism:getACL" />
+	</message>
+	<message name="getACLResponse">
+		<part name="parameters" element="cmism:getACLResponse" />
+	</message>
+
+	<message name="applyACLRequest">
+		<part name="parameters" element="cmism:applyACL" />
+	</message>
+	<message name="applyACLResponse">
+		<part name="parameters" element="cmism:applyACLResponse" />
+	</message>
+
+	<message name="queryRequest">
+		<part name="parameters" element="cmism:query" />
+	</message>
+	<message name="queryResponse">
+		<part name="parameters" element="cmism:queryResponse" />
+	</message>
+	<message name="getContentChangesRequest">
+		<part name="parameters" element="cmism:getContentChanges" />
+	</message>
+	<message name="getContentChangesResponse">
+		<part name="parameters" element="cmism:getContentChangesResponse" />
+	</message>
+
+	<message name="addObjectToFolderRequest">
+		<part name="parameters" element="cmism:addObjectToFolder" />
+	</message>
+	<message name="addObjectToFolderResponse">
+		<part name="parameters" element="cmism:addObjectToFolderResponse" />
+	</message>
+	<message name="removeObjectFromFolderRequest">
+		<part name="parameters" element="cmism:removeObjectFromFolder" />
+	</message>
+	<message name="removeObjectFromFolderResponse">
+		<part name="parameters" element="cmism:removeObjectFromFolderResponse" />
+	</message>
+
+	<message name="getDescendantsRequest">
+		<part name="parameters" element="cmism:getDescendants" />
+	</message>
+	<message name="getDescendantsResponse">
+		<part name="parameters" element="cmism:getDescendantsResponse" />
+	</message>
+	<message name="getChildrenRequest">
+		<part name="parameters" element="cmism:getChildren" />
+	</message>
+	<message name="getChildrenResponse">
+		<part name="parameters" element="cmism:getChildrenResponse" />
+	</message>
+	<message name="getFolderParentRequest">
+		<part name="parameters" element="cmism:getFolderParent" />
+	</message>
+	<message name="getFolderParentResponse">
+		<part name="parameters" element="cmism:getFolderParentResponse" />
+	</message>
+	<message name="getObjectParentsRequest">
+		<part name="parameters" element="cmism:getObjectParents" />
+	</message>
+	<message name="getObjectParentsResponse">
+		<part name="parameters" element="cmism:getObjectParentsResponse" />
+	</message>
+	<message name="getRenditionsRequest">
+		<part name="parameters" element="cmism:getRenditions" />
+	</message>
+	<message name="getRenditionsResponse">
+		<part name="parameters" element="cmism:getRenditionsResponse" />
+	</message>
+	<message name="getCheckedOutDocsRequest">
+		<part name="parameters" element="cmism:getCheckedOutDocs" />
+	</message>
+	<message name="getCheckedOutDocsResponse">
+		<part name="parameters" element="cmism:getCheckedOutDocsResponse" />
+	</message>
+
+	<message name="createDocumentRequest">
+		<part name="parameters" element="cmism:createDocument" />
+	</message>
+	<message name="createDocumentResponse">
+		<part name="parameters" element="cmism:createDocumentResponse" />
+	</message>
+	<message name="createDocumentFromSourceRequest">
+		<part name="parameters" element="cmism:createDocumentFromSource" />
+	</message>
+	<message name="createDocumentFromSourceResponse">
+		<part name="parameters" element="cmism:createDocumentFromSourceResponse" />
+	</message>
+	<message name="createFolderRequest">
+		<part name="parameters" element="cmism:createFolder" />
+	</message>
+	<message name="createFolderResponse">
+		<part name="parameters" element="cmism:createFolderResponse" />
+	</message>
+	<message name="createRelationshipRequest">
+		<part name="parameters" element="cmism:createRelationship" />
+	</message>
+	<message name="createRelationshipResponse">
+		<part name="parameters" element="cmism:createRelationshipResponse" />
+	</message>
+	<message name="createPolicyRequest">
+		<part name="parameters" element="cmism:createPolicy" />
+	</message>
+	<message name="createPolicyResponse">
+		<part name="parameters" element="cmism:createPolicyResponse" />
+	</message>
+	<message name="getAllowableActionsRequest">
+		<part name="parameters" element="cmism:getAllowableActions" />
+	</message>
+	<message name="getAllowableActionsResponse">
+		<part name="parameters" element="cmism:getAllowableActionsResponse" />
+	</message>
+	<message name="getObjectRequest">
+		<part name="parameters" element="cmism:getObject" />
+	</message>
+	<message name="getObjectResponse">
+		<part name="parameters" element="cmism:getObjectResponse" />
+	</message>
+	<message name="getPropertiesRequest">
+		<part name="parameters" element="cmism:getProperties" />
+	</message>
+	<message name="getPropertiesResponse">
+		<part name="parameters" element="cmism:getPropertiesResponse" />
+	</message>
+
+	<message name="getObjectByPathRequest">
+		<part name="parameters" element="cmism:getObjectByPath" />
+	</message>
+	<message name="getObjectByPathResponse">
+		<part name="parameters" element="cmism:getObjectByPathResponse" />
+	</message>
+
+	<message name="getContentStreamRequest">
+		<part name="parameters" element="cmism:getContentStream" />
+	</message>
+	<message name="getContentStreamResponse">
+		<part name="parameters" element="cmism:getContentStreamResponse" />
+	</message>
+	<message name="updatePropertiesRequest">
+		<part name="parameters" element="cmism:updateProperties" />
+	</message>
+	<message name="updatePropertiesResponse">
+		<part name="parameters" element="cmism:updatePropertiesResponse" />
+	</message>
+	<message name="moveObjectRequest">
+		<part name="parameters" element="cmism:moveObject" />
+	</message>
+	<message name="moveObjectResponse">
+		<part name="parameters" element="cmism:moveObjectResponse" />
+	</message>
+	<message name="deleteObjectRequest">
+		<part name="parameters" element="cmism:deleteObject" />
+	</message>
+	<message name="deleteObjectResponse">
+		<part name="parameters" element="cmism:deleteObjectResponse" />
+	</message>
+	<message name="deleteTreeRequest">
+		<part name="parameters" element="cmism:deleteTree" />
+	</message>
+	<message name="deleteTreeResponse">
+		<part name="parameters" element="cmism:deleteTreeResponse" />
+	</message>
+	<message name="setContentStreamRequest">
+		<part name="parameters" element="cmism:setContentStream" />
+	</message>
+	<message name="setContentStreamResponse">
+		<part name="parameters" element="cmism:setContentStreamResponse" />
+	</message>
+	<message name="deleteContentStreamRequest">
+		<part name="parameters" element="cmism:deleteContentStream" />
+	</message>
+	<message name="deleteContentStreamResponse">
+		<part name="parameters" element="cmism:deleteContentStreamResponse" />
+	</message>
+
+	<message name="applyPolicyRequest">
+		<part name="parameters" element="cmism:applyPolicy" />
+	</message>
+	<message name="applyPolicyResponse">
+		<part name="parameters" element="cmism:applyPolicyResponse" />
+	</message>
+	<message name="removePolicyRequest">
+		<part name="parameters" element="cmism:removePolicy" />
+	</message>
+	<message name="removePolicyResponse">
+		<part name="parameters" element="cmism:removePolicyResponse" />
+	</message>
+	<message name="getAppliedPoliciesRequest">
+		<part name="parameters" element="cmism:getAppliedPolicies" />
+	</message>
+	<message name="getAppliedPoliciesResponse">
+		<part name="parameters" element="cmism:getAppliedPoliciesResponse" />
+	</message>
+
+	<message name="getObjectRelationshipsRequest">
+		<part name="parameters" element="cmism:getObjectRelationships" />
+	</message>
+	<message name="getObjectRelationshipsResponse">
+		<part name="parameters" element="cmism:getObjectRelationshipsResponse" />
+	</message>
+
+	<message name="getRepositoriesRequest">
+		<part name="parameters" element="cmism:getRepositories" />
+	</message>
+	<message name="getRepositoriesResponse">
+		<part name="parameters" element="cmism:getRepositoriesResponse" />
+	</message>
+	<message name="getRepositoryInfoRequest">
+		<part name="parameters" element="cmism:getRepositoryInfo" />
+	</message>
+	<message name="getRepositoryInfoResponse">
+		<part name="parameters" element="cmism:getRepositoryInfoResponse" />
+	</message>
+	<message name="getTypeChildrenRequest">
+		<part name="parameters" element="cmism:getTypeChildren" />
+	</message>
+	<message name="getTypeChildrenResponse">
+		<part name="parameters" element="cmism:getTypeChildrenResponse" />
+	</message>
+	<message name="getTypeDescendantsRequest">
+		<part name="parameters" element="cmism:getTypeDescendants" />
+	</message>
+	<message name="getTypeDescendantsResponse">
+		<part name="parameters" element="cmism:getTypeDescendantsResponse" />
+	</message>
+	<message name="getTypeDefinitionRequest">
+		<part name="parameters" element="cmism:getTypeDefinition" />
+	</message>
+	<message name="getTypeDefinitionResponse">
+		<part name="parameters" element="cmism:getTypeDefinitionResponse" />
+	</message>
+
+	<message name="checkOutRequest">
+		<part name="parameters" element="cmism:checkOut" />
+	</message>
+	<message name="checkOutResponse">
+		<part name="parameters" element="cmism:checkOutResponse" />
+	</message>
+	<message name="cancelCheckOutRequest">
+		<part name="parameters" element="cmism:cancelCheckOut" />
+	</message>
+	<message name="cancelCheckOutResponse">
+		<part name="parameters" element="cmism:cancelCheckOutResponse" />
+	</message>
+	<message name="checkInRequest">
+		<part name="parameters" element="cmism:checkIn" />
+	</message>
+	<message name="checkInResponse">
+		<part name="parameters" element="cmism:checkInResponse" />
+	</message>
+	<message name="getObjectOfLatestVersionRequest">
+		<part name="parameters" element="cmism:getObjectOfLatestVersion" />
+	</message>
+	<message name="getObjectOfLatestVersionResponse">
+		<part name="parameters" element="cmism:getObjectOfLatestVersionResponse" />
+	</message>	
+	<message name="getPropertiesOfLatestVersionRequest">
+		<part name="parameters" element="cmism:getPropertiesOfLatestVersion" />
+	</message>
+	<message name="getPropertiesOfLatestVersionResponse">
+		<part name="parameters" element="cmism:getPropertiesOfLatestVersionResponse" />
+	</message>
+	<message name="getAllVersionsRequest">
+		<part name="parameters" element="cmism:getAllVersions" />
+	</message>
+	<message name="getAllVersionsResponse">
+		<part name="parameters" element="cmism:getAllVersionsResponse" />
+	</message>
+
+	<message name="getFolderTreeRequest">
+		<part name="parameters" element="cmism:getFolderTree" />
+	</message>
+	<message name="getFolderTreeResponse">
+		<part name="parameters" element="cmism:getFolderTreeResponse" />
+	</message>
+
+	<portType name="DiscoveryServicePort">
+		<operation name="query">
+			<input message="cmisw:queryRequest" />
+			<output message="cmisw:queryResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getContentChanges">
+			<input message="cmisw:getContentChangesRequest" />
+			<output message="cmisw:getContentChangesResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+
+	<portType name="MultiFilingServicePort">
+		<operation name="addObjectToFolder">
+			<input message="cmisw:addObjectToFolderRequest" />
+			<output message="cmisw:addObjectToFolderResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="removeObjectFromFolder">
+			<input message="cmisw:removeObjectFromFolderRequest" />
+			<output message="cmisw:removeObjectFromFolderResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+	<portType name="NavigationServicePort">
+		<operation name="getDescendants">
+			<input message="cmisw:getDescendantsRequest" />
+			<output message="cmisw:getDescendantsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getChildren">
+			<input message="cmisw:getChildrenRequest" />
+			<output message="cmisw:getChildrenResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getFolderParent">
+			<input message="cmisw:getFolderParentRequest" />
+			<output message="cmisw:getFolderParentResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getFolderTree">
+			<input message="cmisw:getFolderTreeRequest" />
+			<output message="cmisw:getFolderTreeResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getObjectParents">
+			<input message="cmisw:getObjectParentsRequest" />
+			<output message="cmisw:getObjectParentsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getCheckedOutDocs">
+			<input message="cmisw:getCheckedOutDocsRequest" />
+			<output message="cmisw:getCheckedOutDocsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+	<portType name="ObjectServicePort">
+		<operation name="createDocument">
+			<input message="cmisw:createDocumentRequest" />
+			<output message="cmisw:createDocumentResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="createDocumentFromSource">
+			<input message="cmisw:createDocumentFromSourceRequest" />
+			<output message="cmisw:createDocumentFromSourceResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="createFolder">
+			<input message="cmisw:createFolderRequest" />
+			<output message="cmisw:createFolderResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="createRelationship">
+			<input message="cmisw:createRelationshipRequest" />
+			<output message="cmisw:createRelationshipResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="createPolicy">
+			<input message="cmisw:createPolicyRequest" />
+			<output message="cmisw:createPolicyResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getAllowableActions">
+			<input message="cmisw:getAllowableActionsRequest" />
+			<output message="cmisw:getAllowableActionsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getObject">
+			<input message="cmisw:getObjectRequest" />
+			<output message="cmisw:getObjectResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getProperties">
+			<input message="cmisw:getPropertiesRequest" />
+			<output message="cmisw:getPropertiesResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getRenditions">
+			<input message="cmisw:getRenditionsRequest" />
+			<output message="cmisw:getRenditionsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getObjectByPath">
+			<input message="cmisw:getObjectByPathRequest" />
+			<output message="cmisw:getObjectByPathResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getContentStream">
+			<input message="cmisw:getContentStreamRequest" />
+			<output message="cmisw:getContentStreamResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="updateProperties">
+			<input message="cmisw:updatePropertiesRequest" />
+			<output message="cmisw:updatePropertiesResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="moveObject">
+			<input message="cmisw:moveObjectRequest" />
+			<output message="cmisw:moveObjectResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="deleteObject">
+			<input message="cmisw:deleteObjectRequest" />
+			<output message="cmisw:deleteObjectResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="deleteTree">
+			<input message="cmisw:deleteTreeRequest" />
+			<output message="cmisw:deleteTreeResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="setContentStream">
+			<input message="cmisw:setContentStreamRequest" />
+			<output message="cmisw:setContentStreamResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="deleteContentStream">
+			<input message="cmisw:deleteContentStreamRequest" />
+			<output message="cmisw:deleteContentStreamResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+	<portType name="PolicyServicePort">
+		<operation name="applyPolicy">
+			<input message="cmisw:applyPolicyRequest" />
+			<output message="cmisw:applyPolicyResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="removePolicy">
+			<input message="cmisw:removePolicyRequest" />
+			<output message="cmisw:removePolicyResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getAppliedPolicies">
+			<input message="cmisw:getAppliedPoliciesRequest" />
+			<output message="cmisw:getAppliedPoliciesResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+
+	<portType name="RelationshipServicePort">
+		<operation name="getObjectRelationships">
+			<input message="cmisw:getObjectRelationshipsRequest" />
+			<output message="cmisw:getObjectRelationshipsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+	<portType name="RepositoryServicePort">
+		<operation name="getRepositories">
+			<input message="cmisw:getRepositoriesRequest" />
+			<output message="cmisw:getRepositoriesResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getRepositoryInfo">
+			<input message="cmisw:getRepositoryInfoRequest" />
+			<output message="cmisw:getRepositoryInfoResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getTypeChildren">
+			<input message="cmisw:getTypeChildrenRequest" />
+			<output message="cmisw:getTypeChildrenResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getTypeDescendants">
+			<input message="cmisw:getTypeDescendantsRequest" />
+			<output message="cmisw:getTypeDescendantsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getTypeDefinition">
+			<input message="cmisw:getTypeDefinitionRequest" />
+			<output message="cmisw:getTypeDefinitionResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+	<portType name="VersioningServicePort">
+		<operation name="checkOut">
+			<input message="cmisw:checkOutRequest" />
+			<output message="cmisw:checkOutResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="cancelCheckOut">
+			<input message="cmisw:cancelCheckOutRequest" />
+			<output message="cmisw:cancelCheckOutResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="checkIn">
+			<input message="cmisw:checkInRequest" />
+			<output message="cmisw:checkInResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getObjectOfLatestVersion">
+			<input message="cmisw:getObjectOfLatestVersionRequest" />
+			<output message="cmisw:getObjectOfLatestVersionResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getPropertiesOfLatestVersion">
+			<input message="cmisw:getPropertiesOfLatestVersionRequest" />
+			<output message="cmisw:getPropertiesOfLatestVersionResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="getAllVersions">
+			<input message="cmisw:getAllVersionsRequest" />
+			<output message="cmisw:getAllVersionsResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+	<portType name="ACLServicePort">
+		<operation name="getACL">
+			<input message="cmisw:getACLRequest" />
+			<output message="cmisw:getACLResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+		<operation name="applyACL">
+			<input message="cmisw:applyACLRequest" />
+			<output message="cmisw:applyACLResponse" />
+			<fault message="cmisw:cmisException" name="cmisException" />
+		</operation>
+	</portType>
+
+
+	<binding name="DiscoveryServicePortBinding" type="cmisw:DiscoveryServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="query">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getContentChanges">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="MultiFilingServicePortBinding" type="cmisw:MultiFilingServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="addObjectToFolder">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="removeObjectFromFolder">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="NavigationServicePortBinding" type="cmisw:NavigationServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="getDescendants">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getChildren">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getFolderParent">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getFolderTree">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getObjectParents">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getCheckedOutDocs">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="ObjectServicePortBinding" type="cmisw:ObjectServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="createDocument">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="createDocumentFromSource">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="createFolder">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="createRelationship">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="createPolicy">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getAllowableActions">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getObject">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getProperties">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getRenditions">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getObjectByPath">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getContentStream">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="updateProperties">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="moveObject">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="deleteObject">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="deleteTree">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="setContentStream">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="deleteContentStream">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="PolicyServicePortBinding" type="cmisw:PolicyServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="applyPolicy">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="removePolicy">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getAppliedPolicies">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="RelationshipServicePortBinding" type="cmisw:RelationshipServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="getObjectRelationships">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="RepositoryServicePortBinding" type="cmisw:RepositoryServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="getRepositories">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getRepositoryInfo">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getTypeChildren">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getTypeDescendants">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getTypeDefinition">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="VersioningServicePortBinding" type="cmisw:VersioningServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="checkOut">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="cancelCheckOut">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="checkIn">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getObjectOfLatestVersion">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getPropertiesOfLatestVersion">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="getAllVersions">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+	<binding name="ACLServicePortBinding" type="cmisw:ACLServicePort">
+		<soap:binding style="document"
+			transport="http://schemas.xmlsoap.org/soap/http" />
+		<operation name="getACL">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+		<operation name="applyACL">
+			<soap:operation soapAction="" />
+			<input>
+				<soap:body use="literal" />
+			</input>
+			<output>
+				<soap:body use="literal" />
+			</output>
+			<fault name="cmisException">
+				<soap:fault name="cmisException" use="literal" />
+			</fault>
+		</operation>
+	</binding>
+
+
+	<service name="DiscoveryService">
+		<port name="DiscoveryServicePort" binding="cmisw:DiscoveryServicePortBinding">
+			<soap:address
+				location="http://cmis/services/DiscoveryService.DiscoveryServicePort" />
+		</port>
+	</service>
+	<service name="MultiFilingService">
+		<port name="MultiFilingServicePort" binding="cmisw:MultiFilingServicePortBinding">
+			<soap:address
+				location="http://cmis/services/MultiFilingService.MultiFilingServicePort" />
+		</port>
+	</service>
+	<service name="NavigationService">
+		<port name="NavigationServicePort" binding="cmisw:NavigationServicePortBinding">
+			<soap:address
+				location="http://cmis/services/NavigationService.NavigationServicePort" />
+		</port>
+	</service>
+	<service name="ObjectService">
+		<port name="ObjectServicePort" binding="cmisw:ObjectServicePortBinding">
+			<soap:address location="http://cmis/services/ObjectService.ObjectServicePort" />
+		</port>
+	</service>
+	<service name="PolicyService">
+		<port name="PolicyServicePort" binding="cmisw:PolicyServicePortBinding">
+			<soap:address location="http://cmis/services/PolicyService.PolicyServicePort" />
+		</port>
+	</service>
+	<service name="RelationshipService">
+		<port name="RelationshipServicePort" binding="cmisw:RelationshipServicePortBinding">
+			<soap:address
+				location="http://cmis/services/RelationshipService.RelationshipServicePort" />
+		</port>
+	</service>
+	<service name="RepositoryService">
+		<port name="RepositoryServicePort" binding="cmisw:RepositoryServicePortBinding">
+			<soap:address
+				location="http://cmis/services/RepositoryService.RepositoryServicePort" />
+		</port>
+	</service>
+	<service name="VersioningService">
+		<port name="VersioningServicePort" binding="cmisw:VersioningServicePortBinding">
+			<soap:address
+				location="http://cmis/services/VersioningService.VersioningServicePort" />
+		</port>
+	</service>
+	<service name="ACLService">
+		<port name="ACLServicePort" binding="cmisw:ACLServicePortBinding">
+			<soap:address location="http://cmis/services/ACLService.ACLServicePort" />
+		</port>
+	</service>
+
+</definitions>
\ No newline at end of file
diff --git a/DotCMIS/wsdl/xml.xsd b/DotCMIS/wsdl/xml.xsd
new file mode 100644
index 0000000..052806b
--- /dev/null
+++ b/DotCMIS/wsdl/xml.xsd
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+    with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless
+    required by applicable law or agreed to in writing, software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+    specific language governing permissions and limitations under the License.
+-->
+<xsd:schema 
+targetNamespace="http://www.w3.org/XML/1998/namespace" 
+xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+xml:lang="en">
+ <xsd:attribute name="lang">
+  <xsd:simpleType>
+   <xsd:union memberTypes="xsd:language">
+    <xsd:simpleType>    
+     <xsd:restriction base="xsd:string">
+      <xsd:enumeration value=""/>
+     </xsd:restriction>
+    </xsd:simpleType>
+   </xsd:union>
+  </xsd:simpleType>
+ </xsd:attribute>
+
+ <xsd:attribute name="space">
+  <xsd:simpleType>
+   <xsd:restriction base="xsd:NCName">
+    <xsd:enumeration value="default"/>
+    <xsd:enumeration value="preserve"/>
+   </xsd:restriction>
+  </xsd:simpleType>
+ </xsd:attribute>
+
+ <xsd:attribute name="base" type="xsd:anyURI">
+  <xsd:annotation>
+   <xsd:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xsd:documentation>
+  </xsd:annotation>
+ </xsd:attribute>
+ 
+ <xsd:attribute name="id" type="xsd:ID">
+  <xsd:annotation>
+   <xsd:documentation>See http://www.w3.org/TR/xml-id/ for
+                     information about this attribute.</xsd:documentation>
+  </xsd:annotation>
+ </xsd:attribute>
+
+ <xsd:attributeGroup name="specialAttrs">
+  <xsd:attribute ref="xml:base"/>
+  <xsd:attribute ref="xml:lang"/>
+  <xsd:attribute ref="xml:space"/>
+  <xsd:attribute ref="xml:id"/>
+ </xsd:attributeGroup>
+
+</xsd:schema>
\ No newline at end of file
diff --git a/DotCMISUnitTest/CRUDTest.cs b/DotCMISUnitTest/CRUDTest.cs
new file mode 100644
index 0000000..aadc941
--- /dev/null
+++ b/DotCMISUnitTest/CRUDTest.cs
@@ -0,0 +1,75 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using DotCMIS.Data;
+using DotCMIS.Enums;
+using NUnit.Framework;
+
+namespace DotCMISUnitTest
+{
+    [TestFixture]
+    public class CRUDTest : TestFramework
+    {
+        [Test]
+        public void TestRepositoryInfo()
+        {
+            Assert.NotNull(RepositoryInfo.Id);
+            Assert.NotNull(RepositoryInfo.Name);
+            Assert.NotNull(RepositoryInfo.RootFolderId);
+        }
+
+        [Test]
+        public void TestRootFolder()
+        {
+            IObjectData rootFolder = GetFullObject(RepositoryInfo.RootFolderId);
+            Assert.AreEqual(BaseTypeId.CmisFolder, rootFolder.BaseTypeId);
+
+            IObjectData rootFolder2 = Binding.GetObjectService().GetObjectByPath(RepositoryInfo.Id, "/", null, true, IncludeRelationships.Both, null, true, true, null);
+            Assert.AreEqual(BaseTypeId.CmisFolder, rootFolder2.BaseTypeId);
+
+            Assert.AreEqual(rootFolder.Id, rootFolder2.Id);
+        }
+
+        [Test]
+        public void TestCreateDocument()
+        {
+               string content1 = "my content";
+
+            IObjectData doc = CreateDocument(RepositoryInfo.RootFolderId, "dottest", content1);
+
+            string content2 = GetTextContent(doc.Id);
+            Assert.AreEqual(content1, content2);
+
+            DeleteObject(doc.Id);
+        }
+
+        [Test]
+        public void TestCreateFolder()
+        {
+            IObjectData folder0 = CreateFolder(RepositoryInfo.RootFolderId, "folder0");
+            IObjectData folder1 = CreateFolder(folder0.Id, "folder1");
+            IObjectData folder2 = CreateFolder(folder1.Id, "folder2");
+            IObjectData folder3 = CreateFolder(folder2.Id, "folder3");
+
+            DeleteObject(folder3.Id);
+            DeleteObject(folder2.Id);
+            DeleteObject(folder1.Id);
+            DeleteObject(folder0.Id);
+        }
+    }
+}
diff --git a/DotCMISUnitTest/DotCMISUnitTest.csproj b/DotCMISUnitTest/DotCMISUnitTest.csproj
new file mode 100644
index 0000000..10d10cc
--- /dev/null
+++ b/DotCMISUnitTest/DotCMISUnitTest.csproj
@@ -0,0 +1,65 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B4343D5F-BA78-4925-99C5-A0FFD80F862C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DotCMISUnitTest</RootNamespace>
+    <AssemblyName>DotCMISUnitTest</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.5.9.10348, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\Program Files (x86)\NUnit 2.5.9\bin\net-2.0\framework\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="CRUDTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestFramework.cs" />
+    <Compile Include="TypeTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\DotCMIS\DotCMIS.csproj">
+      <Project>{529EF90F-A34C-4426-A4F9-65113AC23841}</Project>
+      <Name>DotCMIS</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/DotCMISUnitTest/DotCMISUnitTest.csproj.user b/DotCMISUnitTest/DotCMISUnitTest.csproj.user
new file mode 100644
index 0000000..c7b83a2
--- /dev/null
+++ b/DotCMISUnitTest/DotCMISUnitTest.csproj.user
@@ -0,0 +1,9 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <StartAction>Program</StartAction>
+    <StartProgram>C:\Program Files (x86)\NUnit 2.5.9\bin\net-2.0\nunit-console.exe</StartProgram>
+    <StartArguments>C:\projects\opencmis\DotCMIS\DotCMISUnitTest\bin\Debug\DotCMISUnitTest.dll</StartArguments>
+    <StartWorkingDirectory>C:\projects\opencmis\DotCMIS\DotCMISUnitTest\bin\Debug</StartWorkingDirectory>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/DotCMISUnitTest/Properties/AssemblyInfo.cs b/DotCMISUnitTest/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0750e0b
--- /dev/null
+++ b/DotCMISUnitTest/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("DotCMIS Unit Tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Apache Software Foundation")]
+[assembly: AssemblyProduct("DotCMISUnitTest")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c4626bba-8086-4ad5-8116-2768c623ed6c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("0.1.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/DotCMISUnitTest/TestFramework.cs b/DotCMISUnitTest/TestFramework.cs
new file mode 100644
index 0000000..e13293b
--- /dev/null
+++ b/DotCMISUnitTest/TestFramework.cs
@@ -0,0 +1,315 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System.Collections.Generic;
+using System.Net;
+using DotCMIS;
+using DotCMIS.Binding;
+using NUnit.Framework;
+using DotCMIS.Data;
+using DotCMIS.Enums;
+using DotCMIS.Exceptions;
+using System.Text;
+using System.IO;
+
+namespace DotCMISUnitTest
+{
+    public class TestFramework
+    {
+        private IRepositoryInfo repositoryInfo;
+
+        public ICmisBinding Binding { get; set; }
+        public IRepositoryInfo RepositoryInfo
+        {
+            get
+            {
+                if (repositoryInfo == null)
+                {
+                    repositoryInfo = Binding.GetRepositoryService().GetRepositoryInfos(null)[0];
+                    Assert.NotNull(repositoryInfo);
+                }
+
+                return repositoryInfo;
+            }
+        }
+
+        public string DefaultDocumentType { get; set; }
+        public string DefaultFolderType { get; set; }
+
+        [SetUp]
+        public void Init()
+        {
+            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
+
+            DefaultDocumentType = "cmis:document";
+            DefaultFolderType = "cmis:folder";
+
+            Binding = ConnectAtomPub();
+        }
+
+        public ICmisBinding ConnectAtomPub()
+        {
+            Dictionary<string, string> parametersAtom = new Dictionary<string, string>();
+
+            string baseUrlAtom = "http://localhost:8080/alfresco/opencmis-atom";
+
+            parametersAtom[SessionParameter.AtomPubUrl] = baseUrlAtom;
+            parametersAtom[SessionParameter.User] = "admin";
+            parametersAtom[SessionParameter.Password] = "admin";
+
+            CmisBindingFactory factory = CmisBindingFactory.NewInstance();
+            ICmisBinding binding = factory.CreateCmisAtomPubBinding(parametersAtom);
+
+            Assert.NotNull(binding);
+
+            return binding;
+        }
+
+        public ICmisBinding ConnectWebServices()
+        {
+            Dictionary<string, string> parametersWS = new Dictionary<string, string>();
+
+            string baseUrlWS = "https://localhost:8443/alfresco/opencmis-ws";
+
+            parametersWS[SessionParameter.WebServicesRepositoryService] = baseUrlWS + "/RepositoryService?wsdl";
+            parametersWS[SessionParameter.WebServicesAclService] = baseUrlWS + "/AclService?wsdl";
+            parametersWS[SessionParameter.WebServicesDiscoveryService] = baseUrlWS + "/DiscoveryService?wsdl";
+            parametersWS[SessionParameter.WebServicesMultifilingService] = baseUrlWS + "/MultifilingService?wsdl";
+            parametersWS[SessionParameter.WebServicesNavigationService] = baseUrlWS + "/NavigationService?wsdl";
+            parametersWS[SessionParameter.WebServicesObjectService] = baseUrlWS + "/ObjectService?wsdl";
+            parametersWS[SessionParameter.WebServicesPolicyService] = baseUrlWS + "/PolicyService?wsdl";
+            parametersWS[SessionParameter.WebServicesRelationshipService] = baseUrlWS + "/RelationshipService?wsdl";
+            parametersWS[SessionParameter.WebServicesVersioningService] = baseUrlWS + "/VersioningService?wsdl";
+            parametersWS[SessionParameter.User] = "admin";
+            parametersWS[SessionParameter.Password] = "admin";
+
+            CmisBindingFactory factory = CmisBindingFactory.NewInstance();
+            ICmisBinding binding = factory.CreateCmisWebServicesBinding(parametersWS);
+
+            Assert.NotNull(binding);
+
+            return binding;
+        }
+
+        public IObjectData GetFullObject(string objectId)
+        {
+            IObjectData result = Binding.GetObjectService().GetObject(RepositoryInfo.Id, objectId, "*", true, IncludeRelationships.Both, "*", true, true, null);
+
+            Assert.NotNull(result);
+            Assert.NotNull(result.Id);
+            Assert.NotNull(result.BaseTypeId);
+            Assert.NotNull(result.Properties);
+
+            return result;
+        }
+
+        public IObjectData CreateDocument(string folderId, string name, string content)
+        {
+            Properties properties = new Properties();
+
+            PropertyId objectTypeIdProperty = new PropertyId();
+            objectTypeIdProperty.Id = PropertyIds.ObjectTypeId;
+            objectTypeIdProperty.Values = new List<string>();
+            objectTypeIdProperty.Values.Add(DefaultDocumentType);
+            properties.AddProperty(objectTypeIdProperty);
+
+            PropertyString nameProperty = new PropertyString();
+            nameProperty.Id = PropertyIds.Name;
+            nameProperty.Values = new List<string>();
+            nameProperty.Values.Add(name);
+            properties.AddProperty(nameProperty);
+
+            ContentStream contentStream = null;
+            if (content != null)
+            {
+                byte[] bytes = Encoding.UTF8.GetBytes(content);
+
+                contentStream = new ContentStream();
+                contentStream.FileName = name;
+                contentStream.MimeType = "text/plain";
+                contentStream.Stream = new MemoryStream(bytes);
+                contentStream.Length = bytes.Length;
+            }
+
+            string newDocId = Binding.GetObjectService().CreateDocument(RepositoryInfo.Id, properties, folderId, contentStream, null, null, null, null, null);
+
+            Assert.NotNull(newDocId);
+
+            IObjectData doc = GetFullObject(newDocId);
+
+            Assert.NotNull(doc);
+            Assert.NotNull(doc.Id);
+            Assert.AreEqual(BaseTypeId.CmisDocument, doc.BaseTypeId);
+            Assert.NotNull(doc.Properties);
+            Assert.True(doc.Properties[PropertyIds.ObjectTypeId] is PropertyId);
+            Assert.AreEqual(DefaultDocumentType, ((PropertyId)doc.Properties[PropertyIds.ObjectTypeId]).FirstValue);
+            Assert.True(doc.Properties[PropertyIds.Name] is PropertyString);
+            Assert.AreEqual(name, ((PropertyString)doc.Properties[PropertyIds.Name]).FirstValue);
+
+            if (folderId != null)
+            {
+                CheckObjectInFolder(newDocId, folderId);
+            }
+
+            return doc;
+        }
+
+        public IObjectData CreateFolder(string folderId, string name)
+        {
+            Properties properties = new Properties();
+
+            PropertyId objectTypeIdProperty = new PropertyId();
+            objectTypeIdProperty.Id = PropertyIds.ObjectTypeId;
+            objectTypeIdProperty.Values = new List<string>();
+            objectTypeIdProperty.Values.Add(DefaultFolderType);
+            properties.AddProperty(objectTypeIdProperty);
+
+            PropertyString nameProperty = new PropertyString();
+            nameProperty.Id = PropertyIds.Name;
+            nameProperty.Values = new List<string>();
+            nameProperty.Values.Add(name);
+            properties.AddProperty(nameProperty);
+
+            string newFolderId = Binding.GetObjectService().CreateFolder(RepositoryInfo.Id, properties, folderId, null, null, null, null);
+
+            Assert.NotNull(newFolderId);
+
+            IObjectData folder = GetFullObject(newFolderId);
+
+            Assert.NotNull(folder);
+            Assert.NotNull(folder.Id);
+            Assert.AreEqual(BaseTypeId.CmisFolder, folder.BaseTypeId);
+            Assert.NotNull(folder.Properties);
+            Assert.True(folder.Properties[PropertyIds.ObjectTypeId] is PropertyId);
+            Assert.AreEqual(DefaultFolderType, ((PropertyId)folder.Properties[PropertyIds.ObjectTypeId]).FirstValue);
+            Assert.True(folder.Properties[PropertyIds.Name] is PropertyString);
+            Assert.AreEqual(name, ((PropertyString)folder.Properties[PropertyIds.Name]).FirstValue);
+
+            if (folderId != null)
+            {
+                CheckObjectInFolder(newFolderId, folderId);
+            }
+
+            return folder;
+        }
+
+        public void CheckObjectInFolder(string objectId, string folderId)
+        {
+            // check parents
+            IList<IObjectParentData> parents = Binding.GetNavigationService().GetObjectParents(RepositoryInfo.Id, objectId, null, null, null, null, null, null);
+
+            Assert.NotNull(parents);
+            Assert.True(parents.Count > 0);
+
+            bool found = false;
+            foreach (IObjectParentData parent in parents)
+            {
+                Assert.NotNull(parent);
+                Assert.NotNull(parent.Object);
+                Assert.NotNull(parent.Object.Id);
+                if (parent.Object.Id == folderId)
+                {
+                    found = true;
+                }
+            }
+            Assert.True(found);
+
+            // check children
+            found = false;
+            IObjectInFolderList children = Binding.GetNavigationService().GetChildren(RepositoryInfo.Id, folderId, null, null, null, null, null, null, null, null, null);
+
+            Assert.NotNull(children);
+            if (children.NumItems != null)
+            {
+                Assert.True(children.NumItems > 0);
+            }
+
+            foreach (ObjectInFolderData obj in children.Objects)
+            {
+                Assert.NotNull(obj);
+                Assert.NotNull(obj.Object);
+                Assert.NotNull(obj.Object.Id);
+                if (obj.Object.Id == objectId)
+                {
+                    found = true;
+                }
+            }
+            Assert.True(found);
+
+            // check descendants
+            if (RepositoryInfo.Capabilities == null ||
+                RepositoryInfo.Capabilities.IsGetDescendantsSupported == null ||
+                !(bool)RepositoryInfo.Capabilities.IsGetDescendantsSupported)
+            {
+                return;
+            }
+
+            found = false;
+            IList<IObjectInFolderContainer> descendants = Binding.GetNavigationService().GetDescendants(RepositoryInfo.Id, folderId, 1, null, null, null, null, null, null);
+
+            Assert.NotNull(descendants);
+
+            foreach (IObjectInFolderContainer obj in descendants)
+            {
+                Assert.NotNull(obj);
+                Assert.NotNull(obj.Object);
+                Assert.NotNull(obj.Object.Object);
+                Assert.NotNull(obj.Object.Object.Id);
+                if (obj.Object.Object.Id == objectId)
+                {
+                    found = true;
+                }
+            }
+            Assert.True(found);
+        }
+
+        public void DeleteObject(string objectId)
+        {
+            Binding.GetObjectService().DeleteObject(RepositoryInfo.Id, objectId, true, null);
+
+            try
+            {
+                Binding.GetObjectService().GetObject(RepositoryInfo.Id, objectId, null, null, null, null, null, null, null);
+                Assert.Fail("CmisObjectNotFoundException excepted!");
+            }
+            catch (CmisObjectNotFoundException)
+            {
+            }
+        }
+
+        public string GetTextContent(string objectId)
+        {
+            IContentStream contentStream = Binding.GetObjectService().GetContentStream(RepositoryInfo.Id, objectId, null, null, null, null);
+
+            Assert.NotNull(contentStream);
+            Assert.NotNull(contentStream.Stream);
+
+            MemoryStream memStream = new MemoryStream();
+            byte[] buffer = new byte[4096];
+            int b;
+            while ((b = contentStream.Stream.Read(buffer, 0, buffer.Length)) > 0)
+            {
+                memStream.Write(buffer, 0, b);
+            }
+
+            string result = Encoding.UTF8.GetString(memStream.GetBuffer(), 0, (int)memStream.Length);
+
+            return result;
+        }
+    }
+}
diff --git a/DotCMISUnitTest/TypeTest.cs b/DotCMISUnitTest/TypeTest.cs
new file mode 100644
index 0000000..93f1b92
--- /dev/null
+++ b/DotCMISUnitTest/TypeTest.cs
@@ -0,0 +1,113 @@
+﻿/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+using DotCMIS.Data;
+using DotCMIS.Enums;
+using DotCMIS.Exceptions;
+
+namespace DotCMISUnitTest
+{
+    [TestFixture]
+    public class TypeTest : TestFramework
+    {
+        [Test]
+        public void TestBaseTypes()
+        {
+            ITypeDefinition type;
+
+            // cmis:document
+            type = Binding.GetRepositoryService().GetTypeDefinition(RepositoryInfo.Id, "cmis:document", null);
+
+            Assert.NotNull(type);
+            Assert.AreEqual(BaseTypeId.CmisDocument, type.BaseTypeId);
+            Assert.AreEqual("cmis:document", type.Id);
+
+            // cmis:folder
+            type = Binding.GetRepositoryService().GetTypeDefinition(RepositoryInfo.Id, "cmis:folder", null);
+
+            Assert.NotNull(type);
+            Assert.AreEqual(BaseTypeId.CmisFolder, type.BaseTypeId);
+            Assert.AreEqual("cmis:folder", type.Id);
+
+            // cmis:relationship
+            try
+            {
+                type = Binding.GetRepositoryService().GetTypeDefinition(RepositoryInfo.Id, "cmis:relationship", null);
+
+                Assert.NotNull(type);
+                Assert.AreEqual(BaseTypeId.CmisRelationship, type.BaseTypeId);
+                Assert.AreEqual("cmis:relationship", type.Id);
+            }
+            catch (CmisObjectNotFoundException)
+            {
+                // not supported by the repository
+            }
+
+            // cmis:policy
+            try
+            {
+                type = Binding.GetRepositoryService().GetTypeDefinition(RepositoryInfo.Id, "cmis:policy", null);
+
+                Assert.NotNull(type);
+                Assert.AreEqual(BaseTypeId.CmisPolicy, type.BaseTypeId);
+                Assert.AreEqual("cmis:policy", type.Id);
+            }
+            catch (CmisObjectNotFoundException)
+            {
+                // not supported by the repository
+            }
+        }
+
+        [Test]
+        public void TestTypeChildren()
+        {
+            ITypeDefinitionList typeList = Binding.GetRepositoryService().GetTypeChildren(RepositoryInfo.Id, null, null, null, null, null);
+
+            Assert.NotNull(typeList);
+            Assert.NotNull(typeList.List);
+            Assert.NotNull(typeList.NumItems);
+            Assert.True(typeList.NumItems >= 2);
+            Assert.True(typeList.NumItems <= 4);
+
+            bool foundDocument = false;
+            bool foundFolder = false;
+            foreach (ITypeDefinition type in typeList.List)
+            {
+                Assert.NotNull(type);
+                Assert.NotNull(type.Id);
+
+                if (type.Id == "cmis:document")
+                {
+                    foundDocument = true;
+                }
+                if (type.Id == "cmis:folder")
+                {
+                    foundFolder = true;
+                }
+            }
+
+            Assert.True(foundDocument);
+            Assert.True(foundFolder);
+        }
+    }
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..fac871a
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,2 @@
+DotCMIS
+Copyright 2009-2011 The Apache Software Foundation
\ No newline at end of file
