diff --git a/ObjectiveCMIS/Client/CMISSession.m b/ObjectiveCMIS/Client/CMISSession.m
index c1efaf2..1957921 100644
--- a/ObjectiveCMIS/Client/CMISSession.m
+++ b/ObjectiveCMIS/Client/CMISSession.m
@@ -428,11 +428,13 @@
                                if (error) {
                                    completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
                                } else {
-                                  request = [self.binding.objectService createFolderInParentFolder:folderObjectId
+                                  CMISRequest *createRequest = [self.binding.objectService createFolderInParentFolder:folderObjectId
                                                                                properties:convertedProperties
                                                                           completionBlock:^(NSString *objectId, NSError *error) {
                                                                               completionBlock(objectId, error);
                                                                           }];
+                                   // set the underlying request object on the object returned to the original caller
+                                   request.httpRequest = createRequest.httpRequest;
                                }
                            }];
     return request;
@@ -513,12 +515,14 @@
                 completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
             }
         } else {
-            request = [self.binding.objectService createDocumentFromFilePath:filePath
+            CMISRequest *createRequest = [self.binding.objectService createDocumentFromFilePath:filePath
                                                                     mimeType:mimeType
                                                                   properties:convertedProperties
                                                                     inFolder:folderObjectId
                                                              completionBlock:completionBlock
                                                                progressBlock:progressBlock];
+            // set the underlying request object on the object returned to the original caller
+            request.httpRequest = createRequest.httpRequest;
         }
     }];
     return request;
@@ -542,13 +546,15 @@
                 completionBlock(nil, [CMISErrors cmisError:error cmisErrorCode:kCMISErrorCodeRuntime]);
             }
         } else {
-            request = [self.binding.objectService createDocumentFromInputStream:inputStream
+            CMISRequest *createRequest = [self.binding.objectService createDocumentFromInputStream:inputStream
                                                              mimeType:mimeType
                                                            properties:convertedProperties
                                                              inFolder:folderObjectId
                                                         bytesExpected:bytesExpected
                                                       completionBlock:completionBlock
                                                         progressBlock:progressBlock];
+            // set the underlying request object on the object returned to the original caller
+            request.httpRequest = createRequest.httpRequest;
         }
     }];
     return request;
diff --git a/ObjectiveCMIS/Common/CMISErrors.h b/ObjectiveCMIS/Common/CMISErrors.h
index 5bc7374..fe7801a 100644
--- a/ObjectiveCMIS/Common/CMISErrors.h
+++ b/ObjectiveCMIS/Common/CMISErrors.h
@@ -79,6 +79,7 @@
 extern NSString * const kCMISErrorDescriptionUnauthorized;
 extern NSString * const kCMISErrorDescriptionNoRootFolderFound;
 extern NSString * const kCMISErrorDescriptionRepositoryNotFound;
+extern NSString * const kCMISErrorDescriptionCancelled;
 //General errors as defined in 2.2.1.4.1 of spec
 extern NSString * const kCMISErrorDescriptionInvalidArgument;
 extern NSString * const kCMISErrorDescriptionObjectNotFound;
diff --git a/ObjectiveCMIS/Common/CMISErrors.m b/ObjectiveCMIS/Common/CMISErrors.m
index 2c618ee..f13e6d3 100644
--- a/ObjectiveCMIS/Common/CMISErrors.m
+++ b/ObjectiveCMIS/Common/CMISErrors.m
@@ -36,6 +36,7 @@
 NSString * const kCMISErrorDescriptionUnauthorized = @"Unauthorized access error";
 NSString * const kCMISErrorDescriptionNoRootFolderFound =  @"Root Folder Not Found Error";
 NSString * const kCMISErrorDescriptionRepositoryNotFound =  @"Repository Not Found Error";
+NSString * const kCMISErrorDescriptionCancelled = @"Operation Cancelled";
 
 //General errors as defined in 2.2.1.4.1 of spec
 NSString * const kCMISErrorDescriptionInvalidArgument = @"Invalid Argument Error";
@@ -100,6 +101,8 @@
             return kCMISErrorDescriptionNoRootFolderFound;
         case kCMISErrorCodeNoRepositoryFound:
             return kCMISErrorDescriptionRepositoryNotFound;
+        case kCMISErrorCodeCancelled:
+            return kCMISErrorDescriptionCancelled;
         case kCMISErrorCodeInvalidArgument:
             return kCMISErrorDescriptionInvalidArgument;
         case kCMISErrorCodeObjectNotFound:
diff --git a/ObjectiveCMISTests/ObjectiveCMISTests.m b/ObjectiveCMISTests/ObjectiveCMISTests.m
index d619d7c..684921f 100644
--- a/ObjectiveCMISTests/ObjectiveCMISTests.m
+++ b/ObjectiveCMISTests/ObjectiveCMISTests.m
@@ -394,8 +394,10 @@
 
                  self.testCompleted = YES;
              } progressBlock:^(unsigned long long bytesDownloaded, unsigned long long bytesTotal) {
+                 CMISLogDebug(@"download progress %i/%i", bytesDownloaded, bytesTotal);
                  if (bytesDownloaded > 0) { // as soon as some data was downloaded cancel the request
                      [self.request cancel];
+                     CMISLogDebug(@"download cancelled");
                      self.request = nil;
                  }
              }];
@@ -403,6 +405,59 @@
      }];
 }
 
+- (void)testCancelCreate
+{
+    [self runTest:^ {
+        // Set properties on test file
+        NSString *filePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"cmis-spec-v1.0.pdf" ofType:nil];
+        NSString *documentName = [NSString stringWithFormat:@"cmis_10_spec_%f.txt", [[NSDate date] timeIntervalSince1970]];
+        NSMutableDictionary *documentProperties = [NSMutableDictionary dictionary];
+        [documentProperties setObject:documentName forKey:kCMISPropertyName];
+        [documentProperties setObject:kCMISPropertyObjectTypeIdValueDocument forKey:kCMISPropertyObjectTypeId];
+        
+        // Upload test file
+        self.request = [self.session createDocumentFromFilePath:filePath
+                                        mimeType:@"application/pdf"
+                                      properties:documentProperties
+                                        inFolder:self.rootFolder.identifier
+                                 completionBlock: ^ (NSString *newObjectId, NSError *error) {
+                                     
+                                     XCTAssertNotNil(error, @"Failed to cancel upload");
+                                     XCTAssertTrue(error.code == kCMISErrorCodeCancelled, @"Expected error code to be 6 (kCMISErrorCodeCancelled) but it was %ld", (long)error.code);
+                                     XCTAssertNil(newObjectId, @"Did not expect to recieve a new object id");
+                                     
+                                     // ensure the object was not created on the server
+                                     NSString *path = [NSString stringWithFormat:@"/%@", documentName];
+                                     [self.session retrieveObjectByPath:path completionBlock:^(CMISObject *object, NSError *error) {
+                                         XCTAssertNotNil(error, @"Expected to get an error when attempting to retrieve cancelled upload");
+                                         XCTAssertTrue(error.code == kCMISErrorCodeObjectNotFound, @"Expected error code to be 257 (kCMISErrorCodeObjectNotFound) but it was %ld", (long)error.code);
+                                         XCTAssertNil(object, @"Did not expect the object to be created on the server");
+                                         
+                                         if (object != nil)
+                                         {
+                                             // if object was created, cleanup
+                                             [self deleteDocumentAndVerify:(CMISDocument *)object completionBlock:^{
+                                                 self.testCompleted = YES;
+                                             }];
+                                         }
+                                         else
+                                         {
+                                             self.testCompleted = YES;
+                                         }
+                                     }];
+                                 }
+                                   progressBlock: ^ (unsigned long long uploadedBytes, unsigned long long totalBytes) {
+                                       CMISLogDebug(@"upload progress %i/%i", uploadedBytes, totalBytes);
+                                       if (uploadedBytes > 0) {
+                                           // as soon as some data was uploaded cancel the request
+                                           [self.request cancel];
+                                           CMISLogDebug(@"create cancelled");
+                                           self.request = nil;
+                                       }
+                                   }];
+    }];
+}
+
 - (void)testCreateAndDeleteDocument
 {
     [self runTest:^ {
