diff --git a/CoreIntegrationTests/CoreIntegrationTests.csproj b/CoreIntegrationTests/CoreIntegrationTests.csproj
index 69f6379..b89f770 100644
--- a/CoreIntegrationTests/CoreIntegrationTests.csproj
+++ b/CoreIntegrationTests/CoreIntegrationTests.csproj
@@ -7,8 +7,8 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.2" />
     <PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="2.1.2" />
-    <PackageReference Include="MongoDB.Driver" Version="2.9.3" />
-    <PackageReference Include="MongoDbGenericRepository" Version="1.4.5" />
+    <PackageReference Include="MongoDB.Driver" Version="2.12.0" />
+    <PackageReference Include="MongoDbGenericRepository" Version="1.4.6" />
     <PackageReference Include="xunit" Version="2.4.1" />
     <PackageReference Include="xunit.runner.console" Version="2.4.1">
       <PrivateAssets>all</PrivateAssets>
diff --git a/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs b/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs
index ddd8ff9..fba2045 100644
--- a/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs
+++ b/CoreIntegrationTests/Infrastructure/MongoDbTKeyDocumentTestBase.Main.cs
@@ -796,7 +796,7 @@ public async Task GetMinValueAsync()
 
         #region Index Management
 
-        static SemaphoreSlim textIndexSemaphore = new SemaphoreSlim(1, 1);
+        static readonly SemaphoreSlim textIndexSemaphore = new SemaphoreSlim(1, 1);
 
         [Fact]
         public async Task CreateTextIndexNoOptionAsync()
diff --git a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs
index d30bc5c..86ec936 100644
--- a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs
+++ b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update.cs
@@ -6,6 +6,9 @@
 
 namespace MongoDbGenericRepository
 {
+    /// <summary>
+    /// The IBaseMongoRepository_Update interface exposing update functionality for documents with Guid Ids.
+    /// </summary>
     public interface IBaseMongoRepository_Update : IBaseMongoRepository_Update<Guid>
     {
         /// <summary>
diff --git a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs
index 8ed2e1e..9e9223b 100644
--- a/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs
+++ b/MongoDbGenericRepository/Abstractions/IBaseMongoRepository_Update_ClientSession.cs
@@ -7,6 +7,9 @@
 
 namespace MongoDbGenericRepository.DataAccess.Update
 {
+    /// <summary>
+    /// The IBaseMongoRepository_Update_ClientSession interface exposing update functionality with a IClientSessionHandle.
+    /// </summary>
     public interface IBaseMongoRepository_Update_ClientSession
     {
         /// <summary>
@@ -14,10 +17,14 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
+        /// <typeparam name="TField">The type of the field to update.</typeparam>
         /// <param name="session">The client session.</param>
-        /// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
+        /// <param name="filter">The filter for the update.</param>
+        /// <param name="field">The field to update.</param>
+        /// <param name="value">The value of the field.</param>
+        /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -27,10 +34,14 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
+        /// <typeparam name="TField">The type of the field to update.</typeparam>
         /// <param name="session">The client session.</param>
-        /// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
+        /// <param name="filter">The filter for the update.</param>
+        /// <param name="field">The field to update.</param>
+        /// <param name="value">The value of the field.</param>
+        /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -40,11 +51,13 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
+        /// <typeparam name="TField">The type of the field to update.</typeparam>
         /// <param name="session">The client session.</param>
         /// <param name="documentToModify">The document to modify.</param>
-        /// <param name="update">The update definition.</param>
+        /// <param name="field">The field to update.</param>
+        /// <param name="value">The value of the field.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -55,10 +68,9 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="session">The client session.</param>
-        /// <param name="documentToModify">The document to modify.</param>
-        /// <param name="update">The update definition.</param>
+        /// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -68,13 +80,11 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
-        /// <typeparam name="TField">The type of the field to update.</typeparam>
-        /// <param name="session">The client session.</param> 
+        /// <param name="session">The client session.</param>
         /// <param name="documentToModify">The document to modify.</param>
-        /// <param name="field">The field to update.</param>
-        /// <param name="value">The value of the field.</param>
+        /// <param name="update">The update definition.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -86,11 +96,12 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <typeparam name="TField">The type of the field to update.</typeparam>
         /// <param name="session">The client session.</param>
-        /// <param name="documentToModify">The document to modify.</param>
+        /// <param name="filter">The filter for the update.</param>
         /// <param name="field">The field to update.</param>
         /// <param name="value">The value of the field.</param>
+        /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -118,13 +129,12 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <typeparam name="TField">The type of the field to update.</typeparam>
-        /// <param name="session">The client session.</param>
-        /// <param name="filter">The filter for the update.</param>
+        /// <param name="session">The client session.</param> 
+        /// <param name="documentToModify">The document to modify.</param>
         /// <param name="field">The field to update.</param>
         /// <param name="value">The value of the field.</param>
-        /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -134,14 +144,10 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
-        /// <typeparam name="TField">The type of the field to update.</typeparam>
         /// <param name="session">The client session.</param>
-        /// <param name="filter">The filter for the update.</param>
-        /// <param name="field">The field to update.</param>
-        /// <param name="value">The value of the field.</param>
-        /// <param name="partitionKey">The optional partition key.</param>
+        /// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
@@ -151,14 +157,11 @@ public interface IBaseMongoRepository_Update_ClientSession
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
-        /// <typeparam name="TField">The type of the field to update.</typeparam>
         /// <param name="session">The client session.</param>
-        /// <param name="filter">The filter for the update.</param>
-        /// <param name="field">The field to update.</param>
-        /// <param name="value">The value of the field.</param>
-        /// <param name="partitionKey">The optional partition key.</param>
+        /// <param name="documentToModify">The document to modify.</param>
+        /// <param name="update">The update definition.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
diff --git a/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs b/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs
index 1c4866d..304607f 100644
--- a/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs
+++ b/MongoDbGenericRepository/Abstractions/IBaseReadOnlyRepository.cs
@@ -4,6 +4,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository
@@ -32,7 +33,8 @@ public interface IBaseReadOnlyRepository
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="id">The Id of the document you want to get.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -54,7 +56,8 @@ TDocument GetById<TDocument, TKey>(TKey id, string partitionKey = null)
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -88,7 +91,8 @@ IFindFluent<TDocument, TDocument> GetCursor<TDocument, TKey>(Expression<Func<TDo
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -110,7 +114,8 @@ bool Any<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string parti
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -132,7 +137,8 @@ List<TDocument> GetAll<TDocument, TKey>(Expression<Func<TDocument, bool>> filter
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partitionKey</param>
-        Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -157,9 +163,13 @@ long Count<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string par
         /// <typeparam name="TDocument">The document type.</typeparam>
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="orderByDescending">A property selector to order by descending.</param>
+        /// <param name="maxValueSelector">A property selector to order by descending.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TDocument> GetByMaxAsync<TDocument, TKey>(
+            Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, object>> maxValueSelector,
+            string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -181,9 +191,13 @@ TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Ex
         /// <typeparam name="TDocument">The document type.</typeparam>
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="orderByAscending">A property selector to order by ascending.</param>
+        /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, object>> minValueSelector,
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -193,9 +207,9 @@ Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>>
         /// <typeparam name="TDocument">The document type.</typeparam>
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="orderByAscending">A property selector to order by ascending.</param>
+        /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
+        TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -206,9 +220,14 @@ TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Ex
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="orderByAscending">A property selector to order by ascending.</param>
+        /// <param name="maxValueSelector">A property selector for the maximum value you are looking for.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> orderByAscending, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(
+            Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, TValue>> maxValueSelector,
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -219,9 +238,9 @@ Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="orderByDescending">A property selector to order by ascending.</param>
+        /// <param name="maxValueSelector">A property selector to order by ascending.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> orderByDescending, string partitionKey = null)
+        TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -234,7 +253,12 @@ TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> fi
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="minValueSelector">A property selector to order by ascending.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(
+            Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, TValue>> minValueSelector,
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -263,9 +287,11 @@ TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> fi
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="selector">The field you want to sum.</param>
         /// <param name="partitionKey">The partition key of your document, if any.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         Task<int> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter,
                                                        Expression<Func<TDocument, int>> selector,
-                                                       string partitionKey = null)
+                                                       string partitionKey = null,
+                                                       CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -321,10 +347,15 @@ decimal SumBy<TDocument, TKey>(Expression<Func<TDocument, bool>> filter,
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <typeparam name="TProjection">The type representing the model you want to project to.</typeparam>
-        /// <param name="filter"></param>
+        /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="projection">The projection expression.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, TProjection>> projection,
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
             where TProjection : class;
@@ -349,13 +380,18 @@ TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<Func<TDocument,
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <typeparam name="TProjection">The type representing the model you want to project to.</typeparam>
-        /// <param name="filter"></param>
+        /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="projection">The projection expression.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
-                                        where TDocument : IDocument<TKey>
-                                        where TKey : IEquatable<TKey>
-                                        where TProjection : class;
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, TProjection>> projection,
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
+            where TDocument : IDocument<TKey>
+            where TKey : IEquatable<TKey>
+            where TProjection : class;
 
         /// <summary>
         /// Asynchronously returns a list of projected documents matching the filter condition.
@@ -450,12 +486,14 @@ Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>(
         /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
         /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
         /// <param name="partitionKey">An optional partition key.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>(
             Expression<Func<TDocument, bool>> filter,
             SortDefinition<TDocument> sortDefinition,
             int skipNumber = 0,
             int takeNumber = 50,
-            string partitionKey = null)
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
diff --git a/MongoDbGenericRepository/BaseMongoRepository.Create.cs b/MongoDbGenericRepository/BaseMongoRepository.Create.cs
index d2b319e..70d20e5 100644
--- a/MongoDbGenericRepository/BaseMongoRepository.Create.cs
+++ b/MongoDbGenericRepository/BaseMongoRepository.Create.cs
@@ -2,10 +2,15 @@
 using MongoDbGenericRepository.Models;
 using System;
 using System.Collections.Generic;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository
 {
+    /// <summary>
+    /// The IBaseMongoRepository_Create interface to expose document creation functionality 
+    /// with document having an Id of type Guid.
+    /// </summary>
     public interface IBaseMongoRepository_Create : IBaseMongoRepository_Create<Guid>
     {
         /// <summary>
@@ -15,7 +20,8 @@ public interface IBaseMongoRepository_Create : IBaseMongoRepository_Create<Guid>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="document">The document you want to add.</param>
-        Task AddOneAsync<TDocument, TKey>(TDocument document)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task AddOneAsync<TDocument, TKey>(TDocument document, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -37,7 +43,8 @@ void AddOne<TDocument, TKey>(TDocument document)
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="documents">The documents you want to add.</param>
-        Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>;
 
@@ -61,6 +68,10 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Create
     {
         private readonly object _initLock = new object();
         private MongoDbCreator _mongoDbCreator;
+
+        /// <summary>
+        /// The MongoDbCreator field.
+        /// </summary>
         protected virtual MongoDbCreator MongoDbCreator
         {
             get
@@ -87,11 +98,12 @@ protected virtual MongoDbCreator MongoDbCreator
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="document">The document you want to add.</param>
-        public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            await MongoDbCreator.AddOneAsync<TDocument, TKey>(document);
+            await MongoDbCreator.AddOneAsync<TDocument, TKey>(document, cancellationToken);
         }
 
         /// <summary>
@@ -100,10 +112,11 @@ public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document)
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <param name="document">The document you want to add.</param>
-        public virtual async Task AddOneAsync<TDocument>(TDocument document) 
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddOneAsync<TDocument>(TDocument document, CancellationToken cancellationToken = default) 
             where TDocument : IDocument<Guid>
         {
-            await MongoDbCreator.AddOneAsync<TDocument, Guid>(document);
+            await MongoDbCreator.AddOneAsync<TDocument, Guid>(document, cancellationToken);
         }
 
         /// <summary>
@@ -138,11 +151,12 @@ public virtual void AddOne<TDocument>(TDocument document) where TDocument : IDoc
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="documents">The documents you want to add.</param>
-        public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents);
+            await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents, cancellationToken);
         }
 
         /// <summary>
@@ -151,10 +165,11 @@ public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> d
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <param name="documents">The documents you want to add.</param>
-        public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) 
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) 
             where TDocument : IDocument<Guid>
         {
-            await MongoDbCreator.AddManyAsync<TDocument, Guid>(documents);
+            await MongoDbCreator.AddManyAsync<TDocument, Guid>(documents, cancellationToken);
         }
 
         /// <summary>
diff --git a/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs b/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs
index 86d3b9b..aa661b0 100644
--- a/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs
+++ b/MongoDbGenericRepository/BaseMongoRepository.Update.ClientSession.cs
@@ -18,7 +18,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="session">The client session.</param>
         /// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual async Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -34,7 +34,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="session">The client session.</param>
         /// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument modifiedDocument, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -51,7 +51,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="documentToModify">The document to modify.</param>
         /// <param name="update">The update definition.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual async Task<bool> UpdateOneAsync<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -68,7 +68,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="documentToModify">The document to modify.</param>
         /// <param name="update">The update definition.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual bool UpdateOne<TDocument, TKey>(IClientSessionHandle session, TDocument documentToModify, UpdateDefinition<TDocument> update, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -87,7 +87,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="field">The field to update.</param>
         /// <param name="value">The value of the field.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -106,7 +106,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="field">The field to update.</param>
         /// <param name="value">The value of the field.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -126,7 +126,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="value">The value of the field.</param>
         /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -146,7 +146,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="value">The value of the field.</param>
         /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -166,7 +166,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="value">The value of the field.</param>
         /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -186,7 +186,7 @@ public abstract partial class BaseMongoRepository : IBaseMongoRepository_Update_
         /// <param name="value">The value of the field.</param>
         /// <param name="partitionKey">The optional partition key.</param>
         /// <param name="cancellationToken">The optional cancellation token.</param>
-        /// <returns></returns>
+        /// <returns>A boolean value indicating success.</returns>
         public virtual bool UpdateOne<TDocument, TKey, TField>(IClientSessionHandle session, Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null, CancellationToken cancellationToken = default(CancellationToken))
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
diff --git a/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs b/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs
index f7a4949..eded8d5 100644
--- a/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs
+++ b/MongoDbGenericRepository/DataAccess/Base/DataAccessBase.cs
@@ -7,10 +7,20 @@
 
 namespace MongoDbGenericRepository.DataAccess.Base
 {
+    /// <summary>
+    /// A base class for accessing the Database and its Collections.
+    /// </summary>
     public class DataAccessBase
     {
+        /// <summary>
+        /// The MongoDbContext
+        /// </summary>
         protected IMongoDbContext MongoDbContext;
 
+        /// <summary>
+        /// The constructor of the DataAccessBase class
+        /// </summary>
+        /// <param name="mongoDbContext"></param>
         public DataAccessBase(IMongoDbContext mongoDbContext)
         {
             MongoDbContext = mongoDbContext;
@@ -18,6 +28,14 @@ public DataAccessBase(IMongoDbContext mongoDbContext)
 
         #region Utility Methods
 
+        /// <summary>
+        /// Gets a IMongoQueryable for a potentially partitioned document type and a filter.
+        /// </summary>
+        /// <typeparam name="TDocument">The document type.</typeparam>
+        /// <typeparam name="TKey">The type of the primary key.</typeparam>
+        /// <param name="filter">The filter definition.</param>
+        /// <param name="partitionKey">The collection partition key.</param>
+        /// <returns></returns>
         public virtual IMongoQueryable<TDocument> GetQuery<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
@@ -108,7 +126,6 @@ protected virtual CreateIndexOptions MapIndexOptions(IndexCreationOptions indexC
                 LanguageOverride = indexCreationOptions.LanguageOverride,
                 ExpireAfter = indexCreationOptions.ExpireAfter,
                 DefaultLanguage = indexCreationOptions.DefaultLanguage,
-                BucketSize = indexCreationOptions.BucketSize,
                 Bits = indexCreationOptions.Bits,
                 Background = indexCreationOptions.Background,
                 Version = indexCreationOptions.Version
diff --git a/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs b/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs
index bc490c7..7847030 100644
--- a/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs
+++ b/MongoDbGenericRepository/DataAccess/Create/MongoDbCreator.cs
@@ -6,12 +6,20 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository.DataAccess.Create
 {
+    /// <summary>
+    /// A class to insert MongoDb document.
+    /// </summary>
     public class MongoDbCreator : DataAccessBase
     {
+        /// <summary>
+        /// The construct of the MongoDbCreator class.
+        /// </summary>
+        /// <param name="mongoDbContext">A <see cref="IMongoDbContext"/> instance.</param>
         public MongoDbCreator(IMongoDbContext mongoDbContext) : base(mongoDbContext)
         {
         }
@@ -25,12 +33,13 @@ public MongoDbCreator(IMongoDbContext mongoDbContext) : base(mongoDbContext)
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="document">The document you want to add.</param>
-        public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
             FormatDocument<TDocument, TKey>(document);
-            await HandlePartitioned<TDocument, TKey>(document).InsertOneAsync(document);
+            await HandlePartitioned<TDocument, TKey>(document).InsertOneAsync(document, null, cancellationToken);
         }
 
         /// <summary>
@@ -55,7 +64,8 @@ public virtual void AddOne<TDocument, TKey>(TDocument document)
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="documents">The documents you want to add.</param>
-        public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
@@ -72,12 +82,12 @@ public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> d
             {
                 foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
                 {
-                    await HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).InsertManyAsync(group.ToList());
+                    await HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).InsertManyAsync(group.ToList(), null, cancellationToken);
                 }
             }
             else
             {
-                await GetCollection<TDocument, TKey>().InsertManyAsync(documents.ToList());
+                await GetCollection<TDocument, TKey>().InsertManyAsync(documents.ToList(), null, cancellationToken);
             }
         }
 
diff --git a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs
index b07dc0f..832b4ae 100644
--- a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs
+++ b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Main.cs
@@ -6,12 +6,20 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository.DataAccess.Read
 {
+    /// <summary>
+    /// A class to read MongoDb document.
+    /// </summary>
     public partial class MongoDbReader : DataAccessBase
     {
+        /// <summary>
+        /// The construct of the MongoDbReader class.
+        /// </summary>
+        /// <param name="mongoDbContext">A <see cref="IMongoDbContext"/> instance.</param>
         public MongoDbReader(IMongoDbContext mongoDbContext) : base(mongoDbContext)
         {
         }
@@ -25,12 +33,13 @@ public MongoDbReader(IMongoDbContext mongoDbContext) : base(mongoDbContext)
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="id">The Id of the document you want to get.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
             var filter = Builders<TDocument>.Filter.Eq("Id", id);
-            return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync();
+            return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -55,11 +64,12 @@ public virtual TDocument GetById<TDocument, TKey>(TKey id, string partitionKey =
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync();
+            return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -97,11 +107,12 @@ public virtual IFindFluent<TDocument, TDocument> GetCursor<TDocument, TKey>(Expr
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            var count = await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter);
+            var count = await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter, cancellationToken: cancellationToken);
             return (count > 0);
         }
 
@@ -127,11 +138,12 @@ public virtual bool Any<TDocument, TKey>(Expression<Func<TDocument, bool>> filte
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).ToListAsync();
+            return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).ToListAsync(cancellationToken);
         }
 
         /// <summary>
@@ -155,11 +167,12 @@ public virtual List<TDocument> GetAll<TDocument, TKey>(Expression<Func<TDocument
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partitionKey</param>
-        public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter);
+            return await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -188,14 +201,15 @@ public virtual long Count<TDocument, TKey>(Expression<Func<TDocument, bool>> fil
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="maxValueSelector">A property selector to order by descending.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
             return await GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
                                                                      .SortByDescending(maxValueSelector)
                                                                      .Limit(1)
-                                                                     .FirstOrDefaultAsync();
+                                                                     .FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -224,14 +238,15 @@ public virtual TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bo
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="minValueSelector">A property selector to order by ascending.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
             return await GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
                                                                      .SortBy(minValueSelector)
                                                                      .Limit(1)
-                                                                     .FirstOrDefaultAsync();
+                                                                     .FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -257,16 +272,18 @@ public virtual TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bo
         /// </summary>
         /// <typeparam name="TDocument">The document type.</typeparam>
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
+        /// <typeparam name="TValue">The type of the field for which you want the maximum value.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="orderByAscending">A property selector to order by ascending.</param>
+        /// <param name="maxValueSelector">A property selector to order by ascending.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
             return await GetMaxMongoQuery<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey)
                                 .Project(maxValueSelector)
-                                .FirstOrDefaultAsync();
+                                .FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -296,11 +313,12 @@ public virtual TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocu
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="minValueSelector">A property selector to order by ascending.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await GetMinMongoQuery<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey).Project(minValueSelector).FirstOrDefaultAsync();
+            return await GetMinMongoQuery<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey).Project(minValueSelector).FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -332,13 +350,15 @@ public virtual TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocu
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="selector">The field you want to sum.</param>
         /// <param name="partitionKey">The partition key of your document, if any.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         public virtual async Task<int> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter,
                                                        Expression<Func<TDocument, int>> selector,
-                                                       string partitionKey = null)
+                                                       string partitionKey = null,
+                                                       CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector);
+            return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector, cancellationToken);
         }
 
         /// <summary>
@@ -366,13 +386,14 @@ public virtual int SumBy<TDocument, TKey>(Expression<Func<TDocument, bool>> filt
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="selector">The field you want to sum.</param>
         /// <param name="partitionKey">The partition key of your document, if any.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         public virtual async Task<decimal> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter,
                                                        Expression<Func<TDocument, decimal>> selector,
-                                                       string partitionKey = null)
+                                                       string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector);
+            return await GetQuery<TDocument, TKey>(filter, partitionKey).SumAsync(selector, cancellationToken);
         }
 
         /// <summary>
@@ -451,6 +472,36 @@ public virtual List<TProjection> GroupBy<TDocument, TGroupKey, TProjection, TKey
                              .ToList();
         }
 
+        /// <summary>
+        /// Groups filtered a collection of documents given a grouping criteria, 
+        /// and returns a dictionary of listed document groups with keys having the different values of the grouping criteria.
+        /// </summary>
+        /// <typeparam name="TDocument">The type representing a Document.</typeparam>
+        /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
+        /// <typeparam name="TGroupKey">The type of the grouping criteria.</typeparam>
+        /// <typeparam name="TProjection">The type of the projected group.</typeparam>
+        /// <param name="filter">A LINQ expression filter.</param>
+        /// <param name="selector">The grouping criteria.</param>
+        /// <param name="projection">The projected group result.</param>
+        /// <param name="partitionKey">The partition key of your document, if any.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<List<TProjection>> GroupByAsync<TDocument, TGroupKey, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter,
+            Expression<Func<TDocument, TGroupKey>> selector,
+            Expression<Func<IGrouping<TGroupKey, TDocument>, TProjection>> projection,
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
+                where TDocument : IDocument<TKey>
+                where TKey : IEquatable<TKey>
+                where TProjection : class, new()
+        {
+            var collection = HandlePartitioned<TDocument, TKey>(partitionKey);
+            return await collection.Aggregate()
+                             .Match(Builders<TDocument>.Filter.Where(filter))
+                             .Group(selector, projection)
+                             .ToListAsync(cancellationToken);
+        }
+
         /// <summary>
         /// Asynchronously returns a paginated list of the documents matching the filter condition.
         /// </summary>
@@ -462,13 +513,15 @@ public virtual List<TProjection> GroupBy<TDocument, TGroupKey, TProjection, TKey
         /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
         /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
         /// <param name="partitionKey">An optional partition key.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>(
             Expression<Func<TDocument, bool>> filter,
             Expression<Func<TDocument, object>> sortSelector,
             bool ascending = true,
             int skipNumber = 0,
             int takeNumber = 50,
-            string partitionKey = null)
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
@@ -481,7 +534,7 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK
                                     .Sort(sorting)
                                     .Skip(skipNumber)
                                     .Limit(takeNumber)
-                                    .ToListAsync();
+                                    .ToListAsync(cancellationToken);
         }
 
         /// <summary>
@@ -494,12 +547,14 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK
         /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
         /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
         /// <param name="partitionKey">An optional partition key.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>(
             Expression<Func<TDocument, bool>> filter,
             SortDefinition<TDocument> sortDefinition,
             int skipNumber = 0,
             int takeNumber = 50,
-            string partitionKey = null)
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
@@ -508,7 +563,7 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK
                                     .Sort(sortDefinition)
                                     .Skip(skipNumber)
                                     .Limit(takeNumber)
-                                    .ToListAsync();
+                                    .ToListAsync(cancellationToken);
         }
     }
 }
diff --git a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs
index 3499a66..378e86e 100644
--- a/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs
+++ b/MongoDbGenericRepository/DataAccess/Read/MongoDbReader.Project.cs
@@ -5,6 +5,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository.DataAccess.Read
@@ -20,14 +21,19 @@ public partial class MongoDbReader
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="projection">The projection expression.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, TProjection>> projection, 
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
             where TProjection : class
         {
             return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter)
                                                                          .Project(projection)
-                                                                         .FirstOrDefaultAsync();
+                                                                         .FirstOrDefaultAsync(cancellationToken);
         }
 
         /// <summary>
@@ -58,14 +64,19 @@ public virtual TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<F
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="projection">The projection expression.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, TProjection>> projection, 
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
             where TProjection : class
         {
             return await HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter)
                                                                    .Project(projection)
-                                                                   .ToListAsync();
+                                                                   .ToListAsync(cancellationToken);
         }
 
         /// <summary>
diff --git a/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs b/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs
index c445c2f..98131fd 100644
--- a/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs
+++ b/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Create.cs
@@ -2,6 +2,7 @@
 using MongoDbGenericRepository.Models;
 using System;
 using System.Collections.Generic;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository
@@ -18,7 +19,8 @@ public interface IBaseMongoRepository_Create<TKey> where TKey : IEquatable<TKey>
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <param name="document">The document you want to add.</param>
-        Task AddOneAsync<TDocument>(TDocument document) where TDocument : IDocument<TKey>;
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task AddOneAsync<TDocument>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey>;
 
         /// <summary>
         /// Adds a document to the collection.
@@ -34,7 +36,8 @@ public interface IBaseMongoRepository_Create<TKey> where TKey : IEquatable<TKey>
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <param name="documents">The documents you want to add.</param>
-        Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument<TKey>;
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey>;
 
         /// <summary>
         /// Adds a list of documents to the collection.
@@ -81,9 +84,10 @@ protected virtual MongoDbCreator MongoDbCreator
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <param name="document">The document you want to add.</param>
-        public virtual async Task AddOneAsync<TDocument>(TDocument document) where TDocument : IDocument<TKey>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddOneAsync<TDocument>(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey>
         {
-            await MongoDbCreator.AddOneAsync<TDocument, TKey>(document);
+            await MongoDbCreator.AddOneAsync<TDocument, TKey>(document, cancellationToken);
         }
 
         /// <summary>
@@ -103,9 +107,10 @@ public virtual void AddOne<TDocument>(TDocument document) where TDocument : IDoc
         /// </summary>
         /// <typeparam name="TDocument">The type representing a Document.</typeparam>
         /// <param name="documents">The documents you want to add.</param>
-        public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument<TKey>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents, CancellationToken cancellationToken = default) where TDocument : IDocument<TKey>
         {
-            await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents);
+            await MongoDbCreator.AddManyAsync<TDocument, TKey>(documents, cancellationToken);
         }
 
         /// <summary>
diff --git a/MongoDbGenericRepository/Models/IndexCreationOptions.cs b/MongoDbGenericRepository/Models/IndexCreationOptions.cs
index a117b2a..ad2d60c 100644
--- a/MongoDbGenericRepository/Models/IndexCreationOptions.cs
+++ b/MongoDbGenericRepository/Models/IndexCreationOptions.cs
@@ -52,10 +52,6 @@ public class IndexCreationOptions
         /// </summary>  
         public string DefaultLanguage { get; set; }
         /// <summary>
-        /// Gets or sets the size of a geohash bucket.
-        /// </summary>   
-        public double? BucketSize { get; set; }
-        /// <summary>
         /// Gets or sets the precision, in bits, used with geohash indexes.
         /// </summary>   
         public int? Bits { get; set; }
diff --git a/MongoDbGenericRepository/MongoDbGenericRepository.csproj b/MongoDbGenericRepository/MongoDbGenericRepository.csproj
index f569520..c22899f 100644
--- a/MongoDbGenericRepository/MongoDbGenericRepository.csproj
+++ b/MongoDbGenericRepository/MongoDbGenericRepository.csproj
@@ -2,8 +2,9 @@
 
   <PropertyGroup>
     <TargetFrameworks>net452;netstandard2.0;netstandard1.5;</TargetFrameworks>
+	<GenerateDocumentationFile>true</GenerateDocumentationFile>
     <PackageId>MongoDbGenericRepository</PackageId>
-    <PackageVersion>1.4.5</PackageVersion>
+    <PackageVersion>1.4.6</PackageVersion>
     <Authors>Alexandre Spieser</Authors>
     <PackageTitle>MongoDb Generic Repository</PackageTitle>
     <Description>A generic repository implementation using the MongoDB C# Sharp 2.0 driver.</Description>
@@ -11,28 +12,20 @@
     <PackageProjectUrl>http://www.opensource.org/licenses/mit-license.php</PackageProjectUrl>
     <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
     <PackageReleaseNotes>Release notes are at https://github.com/alexandre-spieser/mongodb-generic-repository/releases </PackageReleaseNotes>
-    <Copyright>Copyright 2020 (c) Alexandre Spieser. All rights reserved.</Copyright>
+    <Copyright>Copyright 2021 (c) Alexandre Spieser. All rights reserved.</Copyright>
     <PackageTags>MongoDb Repository Generic NoSql</PackageTags>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>1.4.5</Version>
+    <Version>1.4.6</Version>
     <RepositoryUrl>https://github.com/alexandre-spieser/mongodb-generic-repository</RepositoryUrl>
     <RepositoryType>Git</RepositoryType>
   </PropertyGroup>
 
-  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net45|AnyCPU'">
-    <DocumentationFile>bin\Release\net45\MongoDbGenericRepository.xml</DocumentationFile>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net452|AnyCPU'">
-    <DocumentationFile></DocumentationFile>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net452|AnyCPU'">
-    <DocumentationFile>D:\development\mongodb-generic-repository\MongoDbGenericRepository\MongoDbGenericRepository.xml</DocumentationFile>
-  </PropertyGroup>
+	<PropertyGroup>
+		<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
+	</PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="MongoDB.Driver" Version="2.9.3" />
+    <PackageReference Include="MongoDB.Driver" Version="2.12.0" />
   </ItemGroup>
 
 </Project>
diff --git a/MongoDbGenericRepository/ReadOnlyMongoRepository.cs b/MongoDbGenericRepository/ReadOnlyMongoRepository.cs
index e9ed276..9c9e33e 100644
--- a/MongoDbGenericRepository/ReadOnlyMongoRepository.cs
+++ b/MongoDbGenericRepository/ReadOnlyMongoRepository.cs
@@ -5,6 +5,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq.Expressions;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace MongoDbGenericRepository
@@ -49,11 +50,12 @@ protected ReadOnlyMongoRepository(IMongoDatabase mongoDatabase) : base(mongoData
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="id">The Id of the document you want to get.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetByIdAsync<TDocument, TKey>(TKey id, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetByIdAsync<TDocument, TKey>(id, partitionKey);
+            return await MongoDbReader.GetByIdAsync<TDocument, TKey>(id, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -77,11 +79,12 @@ public virtual TDocument GetById<TDocument, TKey>(TKey id, string partitionKey =
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetOneAsync<TDocument, TKey>(filter, partitionKey);
+            return await MongoDbReader.GetOneAsync<TDocument, TKey>(filter, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -119,11 +122,12 @@ public virtual IFindFluent<TDocument, TDocument> GetCursor<TDocument, TKey>(Expr
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<bool> AnyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.AnyAsync<TDocument, TKey>(filter, partitionKey);
+            return await MongoDbReader.AnyAsync<TDocument, TKey>(filter, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -147,11 +151,12 @@ public virtual bool Any<TDocument, TKey>(Expression<Func<TDocument, bool>> filte
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<List<TDocument>> GetAllAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetAllAsync<TDocument, TKey>(filter, partitionKey);
+            return await MongoDbReader.GetAllAsync<TDocument, TKey>(filter, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -175,11 +180,12 @@ public virtual List<TDocument> GetAll<TDocument, TKey>(Expression<Func<TDocument
         /// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="partitionKey">An optional partitionKey</param>
-        public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<long> CountAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.CountAsync<TDocument, TKey>(filter, partitionKey);
+            return await MongoDbReader.CountAsync<TDocument, TKey>(filter, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -204,11 +210,15 @@ public virtual long Count<TDocument, TKey>(Expression<Func<TDocument, bool>> fil
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="maxValueSelector">A property selector to order by descending.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetByMaxAsync<TDocument, TKey>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, object>> maxValueSelector, 
+            string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetByMaxAsync<TDocument, TKey>(filter, maxValueSelector, partitionKey);
+            return await MongoDbReader.GetByMaxAsync<TDocument, TKey>(filter, maxValueSelector, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -232,13 +242,17 @@ public virtual TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bo
         /// <typeparam name="TDocument">The document type.</typeparam>
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="minValueSelector">A property selector to order by ascending.</param>
+        /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, object>> minValueSelector, 
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetByMinAsync<TDocument, TKey>(filter, minValueSelector, partitionKey);
+            return await MongoDbReader.GetByMinAsync<TDocument, TKey>(filter, minValueSelector, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -247,7 +261,7 @@ public async virtual Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<F
         /// <typeparam name="TDocument">The document type.</typeparam>
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="minValueSelector">A property selector to order by ascending.</param>
+        /// <param name="minValueSelector">A property selector for the minimum value you are looking for.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
         public virtual TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
             where TDocument : IDocument<TKey>
@@ -263,13 +277,18 @@ public virtual TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bo
         /// <typeparam name="TKey">The type of the primary key.</typeparam>
         /// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
         /// <param name="filter">A LINQ expression filter.</param>
-        /// <param name="maxValueSelector">A property selector to select the max value.</param>
+        /// <param name="maxValueSelector">A property selector for the maximum value you are looking for.</param>
         /// <param name="partitionKey">An optional partitionKey.</param>
-        public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public async virtual Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, TValue>> maxValueSelector, 
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetMaxValueAsync<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey);
+            return await MongoDbReader.GetMaxValueAsync<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -297,11 +316,16 @@ public virtual TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocu
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="minValueSelector">A property selector to order by ascending.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, TValue>> minValueSelector, 
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.GetMinValueAsync<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey);
+            return await MongoDbReader.GetMinValueAsync<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -332,13 +356,15 @@ public virtual TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocu
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="selector">The field you want to sum.</param>
         /// <param name="partitionKey">The partition key of your document, if any.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         public virtual async Task<int> SumByAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter,
                                                        Expression<Func<TDocument, int>> selector,
-                                                       string partitionKey = null)
+                                                       string partitionKey = null,
+                                                       CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
-            return await MongoDbReader.SumByAsync<TDocument, TKey>(filter, selector, partitionKey);
+            return await MongoDbReader.SumByAsync<TDocument, TKey>(filter, selector, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -405,12 +431,17 @@ public virtual decimal SumBy<TDocument, TKey>(Expression<Func<TDocument, bool>>
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="projection">The projection expression.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, TProjection>> projection, 
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
             where TProjection : class
         {
-            return await MongoDbReader.ProjectOneAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey);
+            return await MongoDbReader.ProjectOneAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -439,12 +470,16 @@ public virtual TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<F
         /// <param name="filter">A LINQ expression filter.</param>
         /// <param name="projection">The projection expression.</param>
         /// <param name="partitionKey">An optional partition key.</param>
-        public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
+        public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(
+            Expression<Func<TDocument, bool>> filter, 
+            Expression<Func<TDocument, TProjection>> projection, 
+            string partitionKey = null, CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
             where TProjection : class
         {
-            return await MongoDbReader.ProjectManyAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey);
+            return await MongoDbReader.ProjectManyAsync<TDocument, TProjection, TKey>(filter, projection, partitionKey, cancellationToken);
         }
 
         /// <summary>
@@ -562,12 +597,14 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK
         /// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
         /// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
         /// <param name="partitionKey">An optional partition key.</param>
+        /// <param name="cancellationToken">An optional cancellation Token.</param>
         public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TKey>(
             Expression<Func<TDocument, bool>> filter,
             SortDefinition<TDocument> sortDefinition,
             int skipNumber = 0,
             int takeNumber = 50,
-            string partitionKey = null)
+            string partitionKey = null,
+            CancellationToken cancellationToken = default)
             where TDocument : IDocument<TKey>
             where TKey : IEquatable<TKey>
         {
@@ -576,7 +613,7 @@ public virtual async Task<List<TDocument>> GetSortedPaginatedAsync<TDocument, TK
                                     .Sort(sortDefinition)
                                     .Skip(skipNumber)
                                     .Limit(takeNumber)
-                                    .ToListAsync();
+                                    .ToListAsync(cancellationToken);
         }
 
         #endregion Pagination