diff --git a/DotCMIS/client/client-impl.cs b/DotCMIS/client/client-impl.cs
index 341ab89..347b7fc 100644
--- a/DotCMIS/client/client-impl.cs
+++ b/DotCMIS/client/client-impl.cs
@@ -152,6 +152,13 @@
     /// </summary>
     public class Session : ISession
     {
+        private static HashSet<Updatability> CreateUpdatability = new HashSet<Updatability>();
+        static Session()
+        {
+            CreateUpdatability.Add(Updatability.OnCreate);
+            CreateUpdatability.Add(Updatability.ReadWrite);
+        }
+
         protected static IOperationContext FallbackContext = new OperationContext(null, false, true, false, IncludeRelationshipsFlag.None, null, true, null, true, 100);
 
         protected IDictionary<string, string> parameters;
@@ -409,10 +416,43 @@
         }
 
         public IItemEnumerable<IDocument> GetCheckedOutDocs()
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return GetCheckedOutDocs(DefaultContext);
+        }
 
         public IItemEnumerable<IDocument> GetCheckedOutDocs(IOperationContext context)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            INavigationService service = Binding.GetNavigationService();
+            IOperationContext ctxt = new OperationContext(context);
+
+            PageFetcher<IDocument>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)
+            {
+                // get all checked out documents
+                IObjectList checkedOutDocs = service.GetCheckedOutDocs(RepositoryId, null, ctxt.FilterString, ctxt.OrderBy,
+                    ctxt.IncludeAllowableActions, ctxt.IncludeRelationships, ctxt.RenditionFilterString, maxNumItems, skipCount, null);
+
+                // convert objects
+                IList<IDocument> page = new List<IDocument>();
+                if (checkedOutDocs.Objects != null)
+                {
+                    foreach (IObjectData objectData in checkedOutDocs.Objects)
+                    {
+                        IDocument doc = ObjectFactory.ConvertObject(objectData, ctxt) as IDocument;
+                        if (doc == null)
+                        {
+                            // should not happen...
+                            continue;
+                        }
+
+                        page.Add(doc);
+                    }
+                }
+
+                return new PageFetcher<IDocument>.Page<IDocument>(page, checkedOutDocs.NumItems, checkedOutDocs.HasMoreItems);
+            };
+
+            return new CollectionEnumerable<IDocument>(new PageFetcher<IDocument>(DefaultContext.MaxItemsPerPage, fetchPageDelegate));
+        }
 
         public ICmisObject GetObject(IObjectId objectId)
         {
@@ -505,13 +545,17 @@
         // discovery
 
         public IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return Query(statement, searchAllVersions, DefaultContext);
+        }
 
         public IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions, IOperationContext context)
         { throw new CmisNotSupportedException("Client not implemented!"); }
 
         public IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return GetContentChanges(changeLogToken, includeProperties, maxNumItems, DefaultContext);
+        }
 
         public IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems,
                 IOperationContext context)
@@ -520,59 +564,255 @@
         // create
 
         public IObjectId CreateDocument(IDictionary<string, object> properties, IObjectId folderId, IContentStream contentStream,
-                VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+            VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces)
+        {
+            if (folderId != null && folderId.Id == null)
+            {
+                throw new ArgumentException("Folder Id must be set!");
+            }
+            if (properties == null || properties.Count == 0)
+            {
+                throw new ArgumentException("Properties must not be empty!");
+            }
+
+            string newId = Binding.GetObjectService().CreateDocument(RepositoryId, ObjectFactory.ConvertProperties(properties, null, CreateUpdatability),
+                (folderId == null ? null : folderId.Id), contentStream, versioningState, ObjectFactory.ConvertPolicies(policies),
+                ObjectFactory.ConvertAces(addAces), ObjectFactory.ConvertAces(removeAces), null);
+
+            return newId == null ? null : CreateObjectId(newId);
+        }
 
         public IObjectId CreateDocument(IDictionary<string, object> properties, IObjectId folderId, IContentStream contentStream,
-                VersioningState? versioningState)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+            VersioningState? versioningState)
+        {
+            return CreateDocument(properties, folderId, contentStream, versioningState, null, null, null);
+        }
 
         public IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, object> properties, IObjectId folderId,
-                VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+            VersioningState? versioningState, IList<IPolicy> policies, IList<IAce> addAces, IList<IAce> removeAces)
+        {
+            if (source == null || source.Id == null)
+            {
+                throw new ArgumentException("Source must be set!");
+            }
+
+            // get the type of the source document
+            IObjectType type = null;
+            if (source is ICmisObject)
+            {
+                type = ((ICmisObject)source).Type;
+            }
+            else
+            {
+                ICmisObject sourceObj = GetObject(source);
+                type = sourceObj.Type;
+            }
+
+            if (type.BaseTypeId != BaseTypeId.CmisDocument)
+            {
+                throw new ArgumentException("Source object must be a document!");
+            }
+
+            string newId = Binding.GetObjectService().CreateDocumentFromSource(RepositoryId, source.Id,
+                ObjectFactory.ConvertProperties(properties, type, CreateUpdatability), (folderId == null ? null : folderId.Id),
+                versioningState, ObjectFactory.ConvertPolicies(policies), ObjectFactory.ConvertAces(addAces),
+                ObjectFactory.ConvertAces(removeAces), null);
+
+            return newId == null ? null : CreateObjectId(newId);
+        }
 
         public IObjectId CreateDocumentFromSource(IObjectId source, IDictionary<string, object> properties, IObjectId folderId,
                 VersioningState? versioningState)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return CreateDocumentFromSource(source, properties, folderId, versioningState, null, null, null);
+        }
 
-        public IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,
-                IList<IAce> removeAces)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        public IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies,
+            IList<IAce> addAces, IList<IAce> removeAces)
+        {
+            if (folderId == null || folderId.Id == null)
+            {
+                throw new ArgumentException("Folder Id must be set!");
+            }
+            if (properties == null || properties.Count == 0)
+            {
+                throw new ArgumentException("Properties must not be empty!");
+            }
+
+            string newId = Binding.GetObjectService().CreateFolder(RepositoryId, ObjectFactory.ConvertProperties(properties, null, CreateUpdatability),
+                (folderId == null ? null : folderId.Id), ObjectFactory.ConvertPolicies(policies), ObjectFactory.ConvertAces(addAces),
+                ObjectFactory.ConvertAces(removeAces), null);
+
+            return newId == null ? null : CreateObjectId(newId);
+        }
 
         public IObjectId CreateFolder(IDictionary<string, object> properties, IObjectId folderId)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return CreateFolder(properties, folderId, null, null, null);
+        }
 
-        public IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies, IList<IAce> addAces,
-                IList<IAce> removeAces)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        public IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId, IList<IPolicy> policies,
+            IList<IAce> addAces, IList<IAce> removeAces)
+        {
+            if (folderId == null || folderId.Id == null)
+            {
+                throw new ArgumentException("Folder Id must be set!");
+            }
+            if (properties == null || properties.Count == 0)
+            {
+                throw new ArgumentException("Properties must not be empty!");
+            }
+
+            string newId = Binding.GetObjectService().CreatePolicy(RepositoryId, ObjectFactory.ConvertProperties(properties, null, CreateUpdatability),
+                (folderId == null ? null : folderId.Id), ObjectFactory.ConvertPolicies(policies), ObjectFactory.ConvertAces(addAces),
+                ObjectFactory.ConvertAces(removeAces), null);
+
+            return newId == null ? null : CreateObjectId(newId);
+        }
 
         public IObjectId CreatePolicy(IDictionary<string, object> properties, IObjectId folderId)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return CreatePolicy(properties, folderId, null, null, null);
+        }
 
         public IObjectId CreateRelationship(IDictionary<string, object> properties, IList<IPolicy> policies, IList<IAce> addAces,
                 IList<IAce> removeAces)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            if (properties == null || properties.Count == 0)
+            {
+                throw new ArgumentException("Properties must not be empty!");
+            }
+
+            string newId = Binding.GetObjectService().CreateRelationship(RepositoryId, ObjectFactory.ConvertProperties(properties, null, CreateUpdatability),
+                ObjectFactory.ConvertPolicies(policies), ObjectFactory.ConvertAces(addAces), ObjectFactory.ConvertAces(removeAces), null);
+
+            return newId == null ? null : CreateObjectId(newId);
+        }
 
         public IObjectId CreateRelationship(IDictionary<string, object> properties)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            return CreateRelationship(properties, null, null, null);
+        }
 
         public IItemEnumerable<IRelationship> GetRelationships(IObjectId objectId, bool includeSubRelationshipTypes,
                 RelationshipDirection? relationshipDirection, IObjectType type, IOperationContext context)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            if (objectId == null || objectId.Id == null)
+            {
+                throw new ArgumentException("Invalid object id!");
+            }
+
+            string id = objectId.Id;
+            string typeId = (type == null ? null : type.Id);
+            IRelationshipService service = Binding.GetRelationshipService();
+            IOperationContext ctxt = new OperationContext(context);
+
+            PageFetcher<IRelationship>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)
+            {
+                // fetch the relationships
+                IObjectList relList = service.GetObjectRelationships(RepositoryId, id, includeSubRelationshipTypes, relationshipDirection,
+                    typeId, ctxt.FilterString, ctxt.IncludeAllowableActions, maxNumItems, skipCount, null);
+
+                // convert relationship objects
+                IList<IRelationship> page = new List<IRelationship>();
+                if (relList.Objects != null)
+                {
+                    foreach (IObjectData rod in relList.Objects)
+                    {
+                        IRelationship relationship = GetObject(CreateObjectId(rod.Id), ctxt) as IRelationship;
+                        if (relationship == null)
+                        {
+                            throw new CmisRuntimeException("Repository returned an object that is not a relationship!");
+                        }
+
+                        page.Add(relationship);
+                    }
+                }
+
+                return new PageFetcher<IRelationship>.Page<IRelationship>(page, relList.NumItems, relList.HasMoreItems);
+            };
+
+            return new CollectionEnumerable<IRelationship>(new PageFetcher<IRelationship>(DefaultContext.MaxItemsPerPage, fetchPageDelegate));
+        }
 
         // permissions
 
         public IAcl GetAcl(IObjectId objectId, bool onlyBasicPermissions)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            if (objectId == null || objectId.Id == null)
+            {
+                throw new ArgumentException("Invalid object id!");
+            }
+
+            return Binding.GetAclService().GetAcl(RepositoryId, objectId.Id, onlyBasicPermissions, null);
+        }
 
         public IAcl ApplyAcl(IObjectId objectId, IList<IAce> addAces, IList<IAce> removeAces, AclPropagation? aclPropagation)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            if (objectId == null || objectId.Id == null)
+            {
+                throw new ArgumentException("Invalid object id!");
+            }
 
-        public void ApplyPolicy(IObjectId objectId, IObjectId policyIds)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+            return Binding.GetAclService().ApplyAcl(RepositoryId, objectId.Id, ObjectFactory.ConvertAces(addAces),
+                ObjectFactory.ConvertAces(removeAces), aclPropagation, null);
+        }
 
-        public void RemovePolicy(IObjectId objectId, IObjectId policyIds)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        public void ApplyPolicy(IObjectId objectId, params IObjectId[] policyIds)
+        {
+            if (objectId == null || objectId.Id == null)
+            {
+                throw new ArgumentException("Invalid object id!");
+            }
+            if (policyIds == null || (policyIds.Length == 0))
+            {
+                throw new ArgumentException("No Policies provided!");
+            }
+
+            string[] ids = new string[policyIds.Length];
+            for (int i = 0; i < policyIds.Length; i++)
+            {
+                if (policyIds[i] == null || policyIds[i].Id == null)
+                {
+                    throw new ArgumentException("A Policy Id is not set!");
+                }
+
+                ids[i] = policyIds[i].Id;
+            }
+
+            foreach (string id in ids)
+            {
+                Binding.GetPolicyService().ApplyPolicy(RepositoryId, id, objectId.Id, null);
+            }
+        }
+
+        public void RemovePolicy(IObjectId objectId, params IObjectId[] policyIds)
+        {
+            if (objectId == null || objectId.Id == null)
+            {
+                throw new ArgumentException("Invalid object id!");
+            }
+            if (policyIds == null || (policyIds.Length == 0))
+            {
+                throw new ArgumentException("No Policies provided!");
+            }
+
+            string[] ids = new string[policyIds.Length];
+            for (int i = 0; i < policyIds.Length; i++)
+            {
+                if (policyIds[i] == null || policyIds[i].Id == null)
+                {
+                    throw new ArgumentException("A Policy Id is not set!");
+                }
+
+                ids[i] = policyIds[i].Id;
+            }
+
+            foreach (string id in ids)
+            {
+                Binding.GetPolicyService().RemovePolicy(RepositoryId, id, objectId.Id, null);
+            }
+        }
 
         protected void Lock()
         {
diff --git a/DotCMIS/client/client-intf.cs b/DotCMIS/client/client-intf.cs
index dbe44ce..61d2639 100644
--- a/DotCMIS/client/client-intf.cs
+++ b/DotCMIS/client/client-intf.cs
@@ -109,8 +109,8 @@
 
         IAcl GetAcl(IObjectId objectId, bool onlyBasicPermissions);
         IAcl ApplyAcl(IObjectId objectId, IList<IAce> addAces, IList<IAce> removeAces, AclPropagation? aclPropagation);
-        void ApplyPolicy(IObjectId objectId, IObjectId policyIds);
-        void RemovePolicy(IObjectId objectId, IObjectId policyIds);
+        void ApplyPolicy(IObjectId objectId, params IObjectId[] policyIds);
+        void RemovePolicy(IObjectId objectId, params IObjectId[] policyIds);
     }
 
     public interface IObjectFactory
@@ -278,8 +278,8 @@
         IList<IRendition> Renditions { get; }
 
         // policy service
-        void ApplyPolicy(IObjectId policyId);
-        void RemovePolicy(IObjectId policyId);
+        void ApplyPolicy(params IObjectId[] policyId);
+        void RemovePolicy(params IObjectId[] policyId);
         IList<IPolicy> Policies { get; }
 
         // ACL service
diff --git a/DotCMIS/client/client-objects.cs b/DotCMIS/client/client-objects.cs
index 3131ce2..e5462f8 100644
--- a/DotCMIS/client/client-objects.cs
+++ b/DotCMIS/client/client-objects.cs
@@ -326,6 +326,11 @@
         {
             get
             {
+                if (propertyId == null)
+                {
+                    throw new ArgumentNullException("propertyId");
+                }
+
                 Lock();
                 try
                 {
@@ -431,7 +436,7 @@
 
         // --- policies ---
 
-        public void ApplyPolicy(IObjectId policyId)
+        public void ApplyPolicy(params IObjectId[] policyId)
         {
             Lock();
             try
@@ -446,7 +451,7 @@
             Refresh();
         }
 
-        public void RemovePolicy(IObjectId policyId)
+        public void RemovePolicy(params IObjectId[] policyId)
         {
             Lock();
             try
@@ -1559,7 +1564,7 @@
             {
                 if (PropertyDefinition.Cardinality == Cardinality.Single)
                 {
-                    return Values.Count == 0 ? null : Values[0];
+                    return Values == null || Values.Count == 0 ? null : Values[0];
                 }
                 else
                 {
@@ -1570,7 +1575,7 @@
 
         public IList<object> Values { get; protected set; }
 
-        public object FirstValue { get { return Values.Count == 0 ? null : Values[0]; } }
+        public object FirstValue { get { return Values == null || Values.Count == 0 ? null : Values[0]; } }
 
         public string ValueAsString { get { return FormatValue(FirstValue); } }
 
