diff --git a/DotCMIS.suo b/DotCMIS.suo
index 81c2f10..daccb95 100644
--- a/DotCMIS.suo
+++ b/DotCMIS.suo
Binary files differ
diff --git a/DotCMIS/DotCMIS.csproj b/DotCMIS/DotCMIS.csproj
index 6a25571..539c138 100644
--- a/DotCMIS/DotCMIS.csproj
+++ b/DotCMIS/DotCMIS.csproj
@@ -21,6 +21,7 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Debug\DotCMIS.XML</DocumentationFile>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
@@ -29,6 +30,7 @@
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\DotCMIS.XML</DocumentationFile>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
diff --git a/DotCMIS/binding/atompub/atompub-linkcache.cs b/DotCMIS/binding/atompub/atompub-linkcache.cs
index 815cc78..6296b8c 100644
--- a/DotCMIS/binding/atompub/atompub-linkcache.cs
+++ b/DotCMIS/binding/atompub/atompub-linkcache.cs
@@ -31,11 +31,11 @@
         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;
+        private IBindingCache linkCache;
+        private IBindingCache typeLinkCache;
+        private IBindingCache collectionLinkCache;
+        private IBindingCache templateCache;
+        private IBindingCache repositoryLinkCache;
 
         public LinkCache(BindingSession session)
         {
diff --git a/DotCMIS/binding/atompub/atompub-writer.cs b/DotCMIS/binding/atompub/atompub-writer.cs
index 9774371..d881301 100644
--- a/DotCMIS/binding/atompub/atompub-writer.cs
+++ b/DotCMIS/binding/atompub/atompub-writer.cs
@@ -83,7 +83,10 @@
 
         public void Write(Stream outStream)
         {
-            using (XmlWriter writer = XmlWriter.Create(outStream))
+            XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
+            xmlWriterSettings.Encoding = new UTF8Encoding(false);
+
+            using (XmlWriter writer = XmlWriter.Create(outStream, xmlWriterSettings))
             {
                 // start doc
                 writer.WriteStartDocument();
@@ -213,16 +216,17 @@
 
         public void Write(Stream outStream)
         {
-            using (XmlWriter writer = XmlWriter.Create(outStream))
+            XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
+            xmlWriterSettings.Encoding = new UTF8Encoding(false);
+
+            using (XmlWriter writer = XmlWriter.Create(outStream, xmlWriterSettings))
             {
                 // 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);
diff --git a/DotCMIS/binding/atompub/atompub.cs b/DotCMIS/binding/atompub/atompub.cs
index 5d0c2b0..02e5132 100644
--- a/DotCMIS/binding/atompub/atompub.cs
+++ b/DotCMIS/binding/atompub/atompub.cs
@@ -25,8 +25,9 @@
 using DotCMIS.CMISWebServicesReference;
 using DotCMIS.Data;
 using DotCMIS.Data.Extensions;
-using DotCMIS.Exceptions;
+using DotCMIS.Data.Impl;
 using DotCMIS.Enums;
+using DotCMIS.Exceptions;
 
 namespace DotCMIS.Binding.AtomPub
 {
diff --git a/DotCMIS/binding/binding-caches.cs b/DotCMIS/binding/binding-caches.cs
index c115fc0..42ef619 100644
--- a/DotCMIS/binding/binding-caches.cs
+++ b/DotCMIS/binding/binding-caches.cs
@@ -29,7 +29,7 @@
 {
     // --- base cache implementation ---
 
-    internal interface ICache
+    internal interface IBindingCache
     {
         void Initialize(string[] cacheLevelConfig);
 
@@ -46,7 +46,7 @@
         void Unlock();
     }
 
-    internal interface ICacheLevel
+    internal interface IBindingCacheLevel
     {
         void Initialize(IDictionary<string, string> cacheLevelConfig);
 
@@ -55,11 +55,11 @@
         void Remove(string key);
     }
 
-    internal class Cache : ICache
+    internal class Cache : IBindingCache
     {
         private IList<Type> cacheLevels;
         private IList<IDictionary<string, string>> cacheLevelParameters;
-        private ICacheLevel root;
+        private IBindingCacheLevel root;
         private string name;
         private object cacheLock = new object();
  
@@ -125,7 +125,7 @@
             Lock();
             try
             {
-                ICacheLevel cacheLevel = root;
+                IBindingCacheLevel cacheLevel = root;
 
                 // follow the branch
                 for (int i = 0; i < keys.Length - 1; i++)
@@ -140,7 +140,7 @@
                     }
 
                     // next level
-                    cacheLevel = (ICacheLevel)level;
+                    cacheLevel = (IBindingCacheLevel)level;
                 }
 
                 cacheLevel[keys[keys.Length - 1]] = value;
@@ -167,7 +167,7 @@
             Lock();
             try
             {
-                ICacheLevel cacheLevel = root;
+                IBindingCacheLevel cacheLevel = root;
 
                 // follow the branch
                 for (int i = 0; i < keys.Length - 1; i++)
@@ -178,7 +178,7 @@
                     if (level == null) { return null; }
 
                     // next level
-                    cacheLevel = (ICacheLevel)level;
+                    cacheLevel = (IBindingCacheLevel)level;
                 }
 
                 // get the value
@@ -199,7 +199,7 @@
             Lock();
             try
             {
-                ICacheLevel cacheLevel = root;
+                IBindingCacheLevel cacheLevel = root;
 
                 // follow the branch
                 for (int i = 0; i < keys.Length - 1; i++)
@@ -210,7 +210,7 @@
                     if (level == null) { return; }
 
                     // next level
-                    cacheLevel = (ICacheLevel)level;
+                    cacheLevel = (IBindingCacheLevel)level;
                 }
 
                 cacheLevel.Remove(keys[keys.Length - 1]);
@@ -230,7 +230,7 @@
             Lock();
             try
             {
-                ICacheLevel cacheLevel = root;
+                IBindingCacheLevel cacheLevel = root;
 
                 // follow the branch
                 for (int i = 0; i < keys.Length - 1; i++)
@@ -241,7 +241,7 @@
                     if (level == null) { return i; }
 
                     // next level
-                    cacheLevel = (ICacheLevel)level;
+                    cacheLevel = (IBindingCacheLevel)level;
                 }
 
                 return keys.Length;
@@ -277,7 +277,7 @@
                 throw new ArgumentException("Class '" + typeName + "' not found!", e);
             }
 
-            if (!typeof(ICacheLevel).IsAssignableFrom(levelType))
+            if (!typeof(IBindingCacheLevel).IsAssignableFrom(levelType))
             {
                 throw new ArgumentException("Class '" + typeName + "' does not implement the ICacheLevel interface!");
             }
@@ -309,7 +309,7 @@
             }
         }
 
-        private ICacheLevel CreateCacheLevel(int level)
+        private IBindingCacheLevel CreateCacheLevel(int level)
         {
             if ((level < 0) || (level >= cacheLevels.Count))
             {
@@ -318,10 +318,10 @@
 
             // get the class and create an instance
             Type levelType = cacheLevels[level];
-            ICacheLevel cacheLevel = null;
+            IBindingCacheLevel cacheLevel = null;
             try
             {
-                cacheLevel = (ICacheLevel)Activator.CreateInstance(levelType);
+                cacheLevel = (IBindingCacheLevel)Activator.CreateInstance(levelType);
             }
             catch (Exception e)
             {
@@ -350,7 +350,7 @@
         }
     }
 
-    internal abstract class AbstractDictionaryCacheLevel : ICacheLevel
+    internal abstract class AbstractDictionaryCacheLevel : IBindingCacheLevel
     {
         protected static string NullKey = "";
 
@@ -567,7 +567,7 @@
     {
         private const int CacheSizeRepositories = 10;
 
-        private ICache cache;
+        private IBindingCache cache;
 
         public RepositoryInfoCache(BindingSession session)
         {
@@ -611,7 +611,7 @@
         private const int CacheSizeRepositories = 10;
         private const int CacheSizeTypes = 100;
 
-        private ICache cache;
+        private IBindingCache cache;
 
         public TypeDefinitionCache(BindingSession session)
         {
diff --git a/DotCMIS/binding/binding-impl.cs b/DotCMIS/binding/binding-impl.cs
index 8194088..907fa35 100644
--- a/DotCMIS/binding/binding-impl.cs
+++ b/DotCMIS/binding/binding-impl.cs
@@ -18,14 +18,11 @@
  */
 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.Binding.Services;
 using DotCMIS.Data;
 using DotCMIS.Data.Extensions;
+using DotCMIS.Exceptions;
 
 namespace DotCMIS.Binding.Impl
 {
@@ -424,7 +421,7 @@
             if (!hasExtension && (result != null))
             {
                 RepositoryInfoCache cache = session.GetRepositoryInfoCache();
-                foreach (RepositoryInfo rid in result)
+                foreach (IRepositoryInfo rid in result)
                 {
                     cache.Put(rid);
                 }
diff --git a/DotCMIS/binding/converter.cs b/DotCMIS/binding/converter.cs
index e1b7dbe..a39ff6b 100644
--- a/DotCMIS/binding/converter.cs
+++ b/DotCMIS/binding/converter.cs
@@ -1,5 +1,4 @@
-﻿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
@@ -17,15 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+using System.Xml.Serialization;
+using DotCMIS.CMISWebServicesReference;
 using DotCMIS.Data;
 using DotCMIS.Data.Extensions;
-using System.Collections.Generic;
-using System.Xml;
+using DotCMIS.Data.Impl;
 using DotCMIS.Enums;
-using System;
-using System.Reflection;
-using System.Xml.Serialization;
-using System.IO;
 
 namespace DotCMIS.Binding
 {
diff --git a/DotCMIS/binding/http.cs b/DotCMIS/binding/http.cs
index b787788..aabd311 100644
--- a/DotCMIS/binding/http.cs
+++ b/DotCMIS/binding/http.cs
@@ -20,13 +20,12 @@
 using System.Diagnostics;
 using System.IO;
 using System.Net;
-using DotCMIS.Binding.Impl;
+using System.Text;
+using System.Web;
 using DotCMIS.Enums;
 using DotCMIS.Exceptions;
-using System.Web;
-using System.Text;
 
-namespace DotCMIS.Binding
+namespace DotCMIS.Binding.Impl
 {
     internal static class HttpUtils
     {
diff --git a/DotCMIS/client/client-caches.cs b/DotCMIS/client/client-caches.cs
index 448881d..7c103ba 100644
--- a/DotCMIS/client/client-caches.cs
+++ b/DotCMIS/client/client-caches.cs
@@ -21,7 +21,7 @@
 using System.Linq;
 using System.Text;
 
-namespace DotCMIS.Client
+namespace DotCMIS.Client.Impl.Cache
 {
     /// <summary>
     /// Client cache interface.
@@ -42,7 +42,7 @@
     /// <summary>
     /// Cache implementation that doesn't cache.
     /// </summary>
-    internal class NoCache : ICache
+    public class NoCache : ICache
     {
         public void Initialize(ISession session, IDictionary<string, string> parameters) { }
         public bool ContainsId(string objectId, string cacheKey) { return false; }
diff --git a/DotCMIS/client/client-impl.cs b/DotCMIS/client/client-impl.cs
index 347b7fc..d4a980d 100644
--- a/DotCMIS/client/client-impl.cs
+++ b/DotCMIS/client/client-impl.cs
@@ -18,17 +18,16 @@
  */
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using DotCMIS.Binding;
-using DotCMIS.Data;
-using DotCMIS.Exceptions;
 using System.Threading;
-using DotCMIS.Enums;
-using DotCMIS.Data.Extensions;
+using DotCMIS.Binding;
 using DotCMIS.Binding.Services;
+using DotCMIS.Client.Impl.Cache;
+using DotCMIS.Data;
+using DotCMIS.Data.Impl;
+using DotCMIS.Enums;
+using DotCMIS.Exceptions;
 
-namespace DotCMIS.Client
+namespace DotCMIS.Client.Impl
 {
     /// <summary>
     /// Session factory implementation.
@@ -550,7 +549,36 @@
         }
 
         public IItemEnumerable<IQueryResult> Query(string statement, bool searchAllVersions, IOperationContext context)
-        { throw new CmisNotSupportedException("Client not implemented!"); }
+        {
+            IDiscoveryService service = Binding.GetDiscoveryService();
+            IOperationContext ctxt = new OperationContext(context);
+
+            PageFetcher<IQueryResult>.FetchPage fetchPageDelegate = delegate(long maxNumItems, long skipCount)
+            {
+                // fetch the data
+                IObjectList resultList = service.Query(RepositoryId, statement, searchAllVersions, ctxt.IncludeAllowableActions,
+                    ctxt.IncludeRelationships, ctxt.RenditionFilterString, maxNumItems, skipCount, null);
+
+                // convert query results
+                IList<IQueryResult> page = new List<IQueryResult>();
+                if (resultList.Objects != null)
+                {
+                    foreach (IObjectData objectData in resultList.Objects)
+                    {
+                        if (objectData == null)
+                        {
+                            continue;
+                        }
+
+                        page.Add(ObjectFactory.ConvertQueryResult(objectData));
+                    }
+                }
+
+                return new PageFetcher<IQueryResult>.Page<IQueryResult>(page, resultList.NumItems, resultList.HasMoreItems);
+            };
+
+            return new CollectionEnumerable<IQueryResult>(new PageFetcher<IQueryResult>(DefaultContext.MaxItemsPerPage, fetchPageDelegate));
+        }
 
         public IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems)
         {
@@ -600,12 +628,12 @@
             IObjectType type = null;
             if (source is ICmisObject)
             {
-                type = ((ICmisObject)source).Type;
+                type = ((ICmisObject)source).ObjectType;
             }
             else
             {
                 ICmisObject sourceObj = GetObject(source);
-                type = sourceObj.Type;
+                type = sourceObj.ObjectType;
             }
 
             if (type.BaseTypeId != BaseTypeId.CmisDocument)
diff --git a/DotCMIS/client/client-intf.cs b/DotCMIS/client/client-intf.cs
index 61d2639..79f6ee9 100644
--- a/DotCMIS/client/client-intf.cs
+++ b/DotCMIS/client/client-intf.cs
@@ -37,6 +37,9 @@
         ISession CreateSession();
     }
 
+    /// <summary>
+    /// Session interface.
+    /// </summary>
     public interface ISession
     {
         void Clear();
@@ -252,7 +255,7 @@
         DateTime? LastModificationDate { get; }
         BaseTypeId BaseTypeId { get; }
         IObjectType BaseType { get; }
-        IObjectType Type { get; }
+        IObjectType ObjectType { get; }
         string ChangeToken { get; }
     }
 
@@ -408,13 +411,31 @@
 
     public interface IQueryResult
     {
+        IPropertyData this[string queryName] { get; }
+        IList<IPropertyData> Properties { get; }
+        IPropertyData GetPropertyById(string propertyId);
+        object GetPropertyValueByQueryName(string queryName);
+        object GetPropertyValueById(string propertyId);
+        IList<object> GetPropertyMultivalueByQueryName(string queryName);
+        IList<object> GetPropertyMultivalueById(string propertyId);
+        IAllowableActions AllowableActions { get; }
+        IList<IRelationship> Relationships { get; }
+        IList<IRendition> Renditions { get; }
     }
 
-    public interface IChangeEvent
+    public interface IChangeEvent : IChangeEventInfo
     {
+        string ObjectId { get; }
+        IDictionary<string, IList<object>> Properties { get; }
+        IList<string> PolicyIds { get; }
+        IAcl Acl { get; }
     }
 
     public interface IChangeEvents
     {
+        string LatestChangeLogToken { get; }
+        IList<IChangeEvent> ChangeEvents { get; }
+        bool HasMoreItems { get; }
+        long getTotalNumItems { get; }
     }
 }
diff --git a/DotCMIS/client/client-objectfactory.cs b/DotCMIS/client/client-objectfactory.cs
index 833130e..7bcb22e 100644
--- a/DotCMIS/client/client-objectfactory.cs
+++ b/DotCMIS/client/client-objectfactory.cs
@@ -17,16 +17,15 @@
  * under the License.
  */
 using System;
+using System.Collections;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using DotCMIS.Data;
 using System.IO;
+using DotCMIS.Data;
+using DotCMIS.Data.Impl;
 using DotCMIS.Enums;
 using DotCMIS.Exceptions;
-using System.Collections;
 
-namespace DotCMIS.Client
+namespace DotCMIS.Client.Impl
 {
     public class ObjectFactory : IObjectFactory
     {
@@ -305,7 +304,7 @@
                 throw new ArgumentException("Properties must be set!");
             }
 
-            return new List<IPropertyData>(properties.PropertyList);
+            return properties.PropertyList;
         }
 
         // objects
@@ -333,7 +332,15 @@
             }
         }
 
-        public IQueryResult ConvertQueryResult(IObjectData objectData) { return null; }
+        public IQueryResult ConvertQueryResult(IObjectData objectData) {
+            if (objectData == null)
+            {
+                throw new ArgumentException("Object data is null!");
+            }
+
+            return new QueryResult(session, objectData);
+        }
+
         public IChangeEvent ConvertChangeEvent(IObjectData objectData) { return null; }
         public IChangeEvents ConvertChangeEvents(String changeLogToken, IObjectList objectList) { return null; }
     }
diff --git a/DotCMIS/client/client-objects.cs b/DotCMIS/client/client-objects.cs
index e5462f8..8ef2900 100644
--- a/DotCMIS/client/client-objects.cs
+++ b/DotCMIS/client/client-objects.cs
@@ -18,18 +18,17 @@
  */
 using System;
 using System.Collections.Generic;
-using System.Linq;
 using System.Text;
 using System.Threading;
 using DotCMIS.Binding;
-using DotCMIS.Client;
+using DotCMIS.Binding.Services;
 using DotCMIS.Data;
 using DotCMIS.Data.Extensions;
+using DotCMIS.Data.Impl;
 using DotCMIS.Enums;
 using DotCMIS.Exceptions;
-using DotCMIS.Binding.Services;
 
-namespace DotCMIS.Client
+namespace DotCMIS.Client.Impl
 {
     /// <summary>
     /// CMIS object base class.
@@ -41,7 +40,7 @@
         protected ICmisBinding Binding { get { return Session.Binding; } }
 
         private IObjectType objectType;
-        protected IObjectType ObjectType
+        public IObjectType ObjectType
         {
             get
             {
@@ -81,7 +80,6 @@
         private IList<IRelationship> relationships;
         private IDictionary<ExtensionLevel, IList<ICmisExtensionElement>> extensions;
 
-
         private object objectLock = new object();
 
         protected void Initialize(ISession session, IObjectType objectType, IObjectData objectData, IOperationContext context)
@@ -304,8 +302,6 @@
 
         public string ChangeToken { get { return GetPropertyValue(PropertyIds.ChangeToken) as string; } }
 
-        public IObjectType Type { get { return ObjectType; } }
-
         public IList<IProperty> Properties
         {
             get
@@ -1657,4 +1653,155 @@
             return session.Binding.GetObjectService().GetContentStream(session.RepositoryInfo.Id, objectId, StreamId, null, null, null);
         }
     }
+
+    public class QueryResult : IQueryResult
+    {
+        private IDictionary<string, IPropertyData> propertiesById;
+        private IDictionary<string, IPropertyData> propertiesByQueryName;
+
+        public QueryResult(ISession session, IObjectData objectData)
+        {
+            if (objectData != null)
+            {
+                IObjectFactory of = session.ObjectFactory;
+
+                // handle properties
+                if (objectData.Properties != null)
+                {
+                    Properties = new List<IPropertyData>();
+                    propertiesById = new Dictionary<string, IPropertyData>();
+                    propertiesByQueryName = new Dictionary<string, IPropertyData>();
+
+                    IList<IPropertyData> queryProperties = of.ConvertQueryProperties(objectData.Properties);
+
+                    foreach (IPropertyData property in queryProperties)
+                    {
+                        Properties.Add(property);
+                        if (property.Id != null)
+                        {
+                            propertiesById[property.Id] = property;
+                        }
+                        if (property.QueryName != null)
+                        {
+                            propertiesByQueryName[property.QueryName] = property;
+                        }
+                    }
+                }
+
+                // handle allowable actions
+                AllowableActions = objectData.AllowableActions;
+
+                // handle relationships
+                if (objectData.Relationships != null)
+                {
+                    Relationships = new List<IRelationship>();
+                    foreach (IObjectData rod in objectData.Relationships)
+                    {
+                        IRelationship relationship = of.ConvertObject(rod, session.DefaultContext) as IRelationship;
+                        if (relationship != null)
+                        {
+                            Relationships.Add(relationship);
+                        }
+                    }
+                }
+
+                // handle renditions
+                if (objectData.Renditions != null)
+                {
+                    Renditions = new List<IRendition>();
+                    foreach (IRenditionData rd in objectData.Renditions)
+                    {
+                        Renditions.Add(of.ConvertRendition(null, rd));
+                    }
+                }
+            }
+        }
+
+        public IPropertyData this[string queryName]
+        {
+            get
+            {
+                if (queryName == null)
+                {
+                    return null;
+                }
+
+                IPropertyData result;
+                if (propertiesByQueryName.TryGetValue(queryName, out result))
+                {
+                    return result;
+                }
+
+                return null;
+            }
+        }
+
+        public IList<IPropertyData> Properties { get; protected set; }
+
+        public IPropertyData GetPropertyById(string propertyId)
+        {
+            if (propertyId == null)
+            {
+                return null;
+            }
+
+            IPropertyData result;
+            if (propertiesById.TryGetValue(propertyId, out result))
+            {
+                return result;
+            }
+
+            return null;
+        }
+
+        public object GetPropertyValueByQueryName(string queryName)
+        {
+            IPropertyData property = this[queryName];
+            if (property == null)
+            {
+                return null;
+            }
+
+            return property.FirstValue;
+        }
+
+        public object GetPropertyValueById(string propertyId)
+        {
+            IPropertyData property = GetPropertyById(propertyId);
+            if (property == null)
+            {
+                return null;
+            }
+
+            return property.FirstValue;
+        }
+
+        public IList<object> GetPropertyMultivalueByQueryName(string queryName)
+        {
+            IPropertyData property = this[queryName];
+            if (property == null)
+            {
+                return null;
+            }
+
+            return property.Values;
+        }
+
+        public IList<object> GetPropertyMultivalueById(string propertyId)
+        {
+            IPropertyData property = GetPropertyById(propertyId);
+            if (property == null)
+            {
+                return null;
+            }
+
+            return property.Values;
+        }
+
+        public IAllowableActions AllowableActions { get; protected set; }
+
+        public IList<IRelationship> Relationships { get; protected set; }
+
+        public IList<IRendition> Renditions { get; protected set; }
+    }
 }
\ No newline at end of file
diff --git a/DotCMIS/client/client-types.cs b/DotCMIS/client/client-types.cs
index e6b333f..39cae18 100644
--- a/DotCMIS/client/client-types.cs
+++ b/DotCMIS/client/client-types.cs
@@ -22,8 +22,9 @@
 using System.Text;
 using DotCMIS.Enums;
 using DotCMIS.Data;
+using DotCMIS.Data.Impl;
 
-namespace DotCMIS.Client
+namespace DotCMIS.Client.Impl
 {
     /// <summary>
     /// Helper for all type implementations.
diff --git a/DotCMIS/client/client-utils.cs b/DotCMIS/client/client-utils.cs
index bff191e..ed14b20 100644
--- a/DotCMIS/client/client-utils.cs
+++ b/DotCMIS/client/client-utils.cs
@@ -23,7 +23,7 @@
 using DotCMIS.Enums;
 using System.Collections;
 
-namespace DotCMIS.Client
+namespace DotCMIS.Client.Impl
 {
     /// <summary>
     /// Operation context implementation.
diff --git a/DotCMIS/data/data-impl.cs b/DotCMIS/data/data-impl.cs
index 26945d3..69c5285 100644
--- a/DotCMIS/data/data-impl.cs
+++ b/DotCMIS/data/data-impl.cs
@@ -23,7 +23,7 @@
 using DotCMIS.Data.Extensions;
 using DotCMIS.Enums;
 
-namespace DotCMIS.Data
+namespace DotCMIS.Data.Impl
 {
     public class RepositoryInfo : ExtensionsData, IRepositoryInfo
     {
diff --git a/DotCMISUnitTest/EnumeratorTest.cs b/DotCMISUnitTest/EnumeratorTest.cs
index bd6a750..f30aacb 100644
--- a/DotCMISUnitTest/EnumeratorTest.cs
+++ b/DotCMISUnitTest/EnumeratorTest.cs
@@ -18,6 +18,7 @@
  */
 using System.Collections.Generic;
 using DotCMIS.Client;
+using DotCMIS.Client.Impl;
 using NUnit.Framework;
 
 namespace DotCMISUnitTest
diff --git a/DotCMISUnitTest/SmokeTest.cs b/DotCMISUnitTest/SmokeTest.cs
index fa7b19f..49822f4 100644
--- a/DotCMISUnitTest/SmokeTest.cs
+++ b/DotCMISUnitTest/SmokeTest.cs
@@ -16,14 +16,13 @@
  * 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.Client;
-using DotCMIS.Enums;
 using DotCMIS;
+using DotCMIS.Client;
+using DotCMIS.Client.Impl;
+using DotCMIS.Enums;
+using NUnit.Framework;
+using System;
 
 namespace DotCMISUnitTest
 {
@@ -128,7 +127,7 @@
         }
 
         [Test]
-        public void SmokeRootFolder()
+        public void SmokeTestRootFolder()
         {
             ICmisObject rootFolderObject = Session.GetRootFolder();
 
@@ -144,6 +143,30 @@
             Assert.NotNull(rootFolder.AllowableActions);
             Assert.True(rootFolder.AllowableActions.Actions.Contains(Actions.CanGetProperties));
             Assert.False(rootFolder.AllowableActions.Actions.Contains(Actions.CanGetFolderParent));
+
+            IItemEnumerable<ICmisObject> children = rootFolder.GetChildren();
+            Assert.NotNull(children);
+            foreach (ICmisObject child in children)
+            {
+                Assert.NotNull(child);
+                Assert.NotNull(child.Id);
+                Assert.NotNull(child.Name);
+                Console.WriteLine(child.Name + " (" + child.Id + ")");
+            }
+        }
+
+        [Test]
+        public void SmokeTestQuery()
+        {
+            IItemEnumerable<IQueryResult> qr = Session.Query("SELECT * FROM cmis:document", false);
+            Assert.NotNull(qr);
+
+            foreach (IQueryResult hit in qr)
+            {
+                Assert.NotNull(hit);
+                Assert.NotNull(hit["cmis:objectId"]);
+                Console.WriteLine(hit.GetPropertyValueById(PropertyIds.Name) + " (" + hit.GetPropertyValueById(PropertyIds.ObjectId) + ")");
+            }
         }
     }
 }
diff --git a/DotCMISUnitTest/TestFramework.cs b/DotCMISUnitTest/TestFramework.cs
index bf1289e..2095095 100644
--- a/DotCMISUnitTest/TestFramework.cs
+++ b/DotCMISUnitTest/TestFramework.cs
@@ -22,11 +22,13 @@
 using System.Text;
 using DotCMIS;
 using DotCMIS.Binding;
+using DotCMIS.Client;
+using DotCMIS.Client.Impl;
 using DotCMIS.Data;
+using DotCMIS.Data.Impl;
 using DotCMIS.Enums;
 using DotCMIS.Exceptions;
 using NUnit.Framework;
-using DotCMIS.Client;
 
 namespace DotCMISUnitTest
 {
