CMIS-786: Implement read support for browser binding

git-svn-id: https://svn.apache.org/repos/asf/chemistry/objectivecmis/branches/browser-binding@1588209 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ObjectiveCMIS.xcodeproj/project.pbxproj b/ObjectiveCMIS.xcodeproj/project.pbxproj
index 0a0bdea..b33c8a0 100644
--- a/ObjectiveCMIS.xcodeproj/project.pbxproj
+++ b/ObjectiveCMIS.xcodeproj/project.pbxproj
@@ -192,8 +192,6 @@
 		82C1C63F15358733009B7B78 /* CMISAtomPubDiscoveryService.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B77 /* CMISAtomPubDiscoveryService.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		82C1C63F15358733009B7B7E /* CMISAtomCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B7D /* CMISAtomCollection.m */; };
 		82C1C63F15358733009B7B80 /* CMISAtomCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B7F /* CMISAtomCollection.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		82C1C63F15358733009B7B86 /* CMISObjectByPathUriBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B85 /* CMISObjectByPathUriBuilder.m */; };
-		82C1C63F15358733009B7B88 /* CMISObjectByPathUriBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B87 /* CMISObjectByPathUriBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		82C1C63F15358733009B7B93 /* test_file_2.txt in Resources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7B92 /* test_file_2.txt */; };
 		82C1C63F15358733009B7BA1 /* CMISTypeByIdUriBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7BA0 /* CMISTypeByIdUriBuilder.m */; };
 		82C1C63F15358733009B7BA3 /* CMISTypeByIdUriBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C63F15358733009B7BA2 /* CMISTypeByIdUriBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -217,6 +215,16 @@
 		BD5C9715162C11E3002DDC6E /* CMISHttpResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = BD5C9712162C11E3002DDC6E /* CMISHttpResponse.m */; };
 		BD70F11B17F4649B00AE2B0C /* CMISDocumentTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */; };
 		BD70F11C17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */; };
+		C97B945818FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B945618FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h */; };
+		C97B945918FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B945718FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m */; };
+		C97B947818FECA6400EDC1A6 /* CMISFolderTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */; };
+		C97B947918FECA6400EDC1A6 /* CMISFolderTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B947718FECA6400EDC1A6 /* CMISFolderTypeDefinition.m */; };
+		C97B947C18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B947A18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h */; };
+		C97B947D18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B947B18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m */; };
+		C97B948018FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B947E18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h */; };
+		C97B948118FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B947F18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m */; };
+		C97B948418FECD9600EDC1A6 /* CMISItemTypeDefinition.h in Headers */ = {isa = PBXBuildFile; fileRef = C97B948218FECD9600EDC1A6 /* CMISItemTypeDefinition.h */; };
+		C97B948518FECD9600EDC1A6 /* CMISItemTypeDefinition.m in Sources */ = {isa = PBXBuildFile; fileRef = C97B948318FECD9600EDC1A6 /* CMISItemTypeDefinition.m */; };
 		FE21296415946B94005234FE /* CMISAuthenticationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 82C1C62A153426E4009B7B3D /* CMISAuthenticationProvider.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		FE417D5715761A0C009056AA /* CMISOperationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = FE417D5315761A0C009056AA /* CMISOperationContext.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		FE417D5815761A0C009056AA /* CMISOperationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE417D5415761A0C009056AA /* CMISOperationContext.m */; };
@@ -419,8 +427,6 @@
 		82C1C63F15358733009B7B77 /* CMISAtomPubDiscoveryService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISAtomPubDiscoveryService.h; sourceTree = "<group>"; };
 		82C1C63F15358733009B7B7D /* CMISAtomCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISAtomCollection.m; sourceTree = "<group>"; };
 		82C1C63F15358733009B7B7F /* CMISAtomCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISAtomCollection.h; sourceTree = "<group>"; };
-		82C1C63F15358733009B7B85 /* CMISObjectByPathUriBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISObjectByPathUriBuilder.m; sourceTree = "<group>"; };
-		82C1C63F15358733009B7B87 /* CMISObjectByPathUriBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISObjectByPathUriBuilder.h; sourceTree = "<group>"; };
 		82C1C63F15358733009B7B92 /* test_file_2.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = test_file_2.txt; sourceTree = "<group>"; };
 		82C1C63F15358733009B7BA0 /* CMISTypeByIdUriBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISTypeByIdUriBuilder.m; sourceTree = "<group>"; };
 		82C1C63F15358733009B7BA2 /* CMISTypeByIdUriBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISTypeByIdUriBuilder.h; sourceTree = "<group>"; };
@@ -440,6 +446,16 @@
 		BD5C9712162C11E3002DDC6E /* CMISHttpResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; name = CMISHttpResponse.m; path = Utils/CMISHttpResponse.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
 		BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISDocumentTypeDefinition.h; path = Bindings/CMISDocumentTypeDefinition.h; sourceTree = "<group>"; };
 		BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISDocumentTypeDefinition.m; path = Bindings/CMISDocumentTypeDefinition.m; sourceTree = "<group>"; };
+		C97B945618FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMISObjectByPathUriBuilder.h; sourceTree = "<group>"; };
+		C97B945718FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMISObjectByPathUriBuilder.m; sourceTree = "<group>"; };
+		C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISFolderTypeDefinition.h; path = Bindings/CMISFolderTypeDefinition.h; sourceTree = "<group>"; };
+		C97B947718FECA6400EDC1A6 /* CMISFolderTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISFolderTypeDefinition.m; path = Bindings/CMISFolderTypeDefinition.m; sourceTree = "<group>"; };
+		C97B947A18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISRelationshipTypeDefinition.h; path = Bindings/CMISRelationshipTypeDefinition.h; sourceTree = "<group>"; };
+		C97B947B18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISRelationshipTypeDefinition.m; path = Bindings/CMISRelationshipTypeDefinition.m; sourceTree = "<group>"; };
+		C97B947E18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISSecondaryTypeDefinition.h; path = Bindings/CMISSecondaryTypeDefinition.h; sourceTree = "<group>"; };
+		C97B947F18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISSecondaryTypeDefinition.m; path = Bindings/CMISSecondaryTypeDefinition.m; sourceTree = "<group>"; };
+		C97B948218FECD9600EDC1A6 /* CMISItemTypeDefinition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISItemTypeDefinition.h; path = Bindings/CMISItemTypeDefinition.h; sourceTree = "<group>"; };
+		C97B948318FECD9600EDC1A6 /* CMISItemTypeDefinition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISItemTypeDefinition.m; path = Bindings/CMISItemTypeDefinition.m; sourceTree = "<group>"; };
 		FE417D5315761A0C009056AA /* CMISOperationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISOperationContext.h; path = Client/CMISOperationContext.h; sourceTree = "<group>"; };
 		FE417D5415761A0C009056AA /* CMISOperationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CMISOperationContext.m; path = Client/CMISOperationContext.m; sourceTree = "<group>"; };
 		FE417D5515761A0C009056AA /* CMISPagedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CMISPagedResult.h; path = Client/CMISPagedResult.h; sourceTree = "<group>"; };
@@ -711,6 +727,14 @@
 				FE417D6215761A34009056AA /* CMISTypeDefinition.m */,
 				BD70F11917F4649B00AE2B0C /* CMISDocumentTypeDefinition.h */,
 				BD70F11A17F4649B00AE2B0C /* CMISDocumentTypeDefinition.m */,
+				C97B947618FECA6400EDC1A6 /* CMISFolderTypeDefinition.h */,
+				C97B947718FECA6400EDC1A6 /* CMISFolderTypeDefinition.m */,
+				C97B947A18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h */,
+				C97B948218FECD9600EDC1A6 /* CMISItemTypeDefinition.h */,
+				C97B948318FECD9600EDC1A6 /* CMISItemTypeDefinition.m */,
+				C97B947E18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h */,
+				C97B947F18FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m */,
+				C97B947B18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m */,
 				8276E158155E392A00344A29 /* CMISVersioningService.h */,
 				8280730D1515405C00EF635C /* AtomPub */,
 				58B9C8C918DE335C001D5C1B /* Browser */,
@@ -767,12 +791,12 @@
 				828073161515405C00EF635C /* CMISAtomPubObjectService.m */,
 				828073171515405C00EF635C /* CMISAtomPubRepositoryService.h */,
 				828073181515405C00EF635C /* CMISAtomPubRepositoryService.m */,
-				82C1C63F15358733009B7B42 /* CMISObjectByIdUriBuilder.m */,
-				82C1C63F15358733009B7B44 /* CMISObjectByIdUriBuilder.h */,
-				82C1C63F15358733009B7B87 /* CMISObjectByPathUriBuilder.h */,
-				82C1C63F15358733009B7B85 /* CMISObjectByPathUriBuilder.m */,
 				82C1C63F15358733009B7B73 /* CMISQueryAtomEntryWriter.h */,
 				82C1C63F15358733009B7B71 /* CMISQueryAtomEntryWriter.m */,
+				82C1C63F15358733009B7B44 /* CMISObjectByIdUriBuilder.h */,
+				82C1C63F15358733009B7B42 /* CMISObjectByIdUriBuilder.m */,
+				C97B945618FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h */,
+				C97B945718FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m */,
 				82C1C63F15358733009B7BA2 /* CMISTypeByIdUriBuilder.h */,
 				82C1C63F15358733009B7BA0 /* CMISTypeByIdUriBuilder.m */,
 				8280730E1515405C00EF635C /* AtomPubParser */,
@@ -855,6 +879,7 @@
 				82C1C63E15358733009B7B3D /* CMISAtomPubConstants.h in Headers */,
 				82AD4AEB1541642A0012DDB6 /* CMISBindingFactory.h in Headers */,
 				82AD4AEF15416A150012DDB6 /* CMISAclService.h in Headers */,
+				C97B948018FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.h in Headers */,
 				82AD4AF015416A1A0012DDB6 /* CMISObjectService.h in Headers */,
 				258998DB18D73D5A0091BA96 /* CMISAce.h in Headers */,
 				58B9C8DA18DE3379001D5C1B /* CMISBrowserNavigationService.h in Headers */,
@@ -879,11 +904,12 @@
 				8276E15A155E392A00344A29 /* CMISRepositoryService.h in Headers */,
 				8276E15B155E392A00344A29 /* CMISVersioningService.h in Headers */,
 				75803D411560BD5300C738C1 /* CMISAtomLink.h in Headers */,
+				C97B947818FECA6400EDC1A6 /* CMISFolderTypeDefinition.h in Headers */,
 				75803D4F1560CFCB00C738C1 /* CMISLinkRelations.h in Headers */,
 				82C1C63F15358733009B7B74 /* CMISQueryAtomEntryWriter.h in Headers */,
 				82C1C63F15358733009B7B78 /* CMISAtomPubDiscoveryService.h in Headers */,
+				C97B945818FE828300EDC1A6 /* CMISObjectByPathUriBuilder.h in Headers */,
 				82C1C63F15358733009B7B80 /* CMISAtomCollection.h in Headers */,
-				82C1C63F15358733009B7B88 /* CMISObjectByPathUriBuilder.h in Headers */,
 				4EA61BD71564F70C00C759E4 /* CMISStringInOutParameter.h in Headers */,
 				4EA61BDA1564F70C00C759E4 /* CMISURLUtil.h in Headers */,
 				4EA61BE11564F73900C759E4 /* CMISObjectList.h in Headers */,
@@ -916,6 +942,7 @@
 				BD5C970E16282977002DDC6E /* CMISHttpDownloadRequest.h in Headers */,
 				58B9C8DE18DE3379001D5C1B /* CMISBrowserRepositoryService.h in Headers */,
 				58B9C8E018DE3379001D5C1B /* CMISBrowserVersioningService.h in Headers */,
+				C97B948418FECD9600EDC1A6 /* CMISItemTypeDefinition.h in Headers */,
 				BD5C9713162C11E3002DDC6E /* CMISHttpResponse.h in Headers */,
 				4E3E14B316AFFB190057CE22 /* CMISNetworkProvider.h in Headers */,
 				4E10ABFF16B916B500E2287E /* CMISDefaultNetworkProvider.h in Headers */,
@@ -925,6 +952,7 @@
 				278B269C177BB10B0049C229 /* CMISStandardAuthenticationProvider.h in Headers */,
 				258998E118D73D900091BA96 /* CMISPrincipal.h in Headers */,
 				278B269F177BB3000049C229 /* CMISStandardUntrustedSSLAuthenticationProvider.h in Headers */,
+				C97B947C18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.h in Headers */,
 				BD70F11B17F4649B00AE2B0C /* CMISDocumentTypeDefinition.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1068,8 +1096,10 @@
 				8280731D1515405C00EF635C /* CMISAtomEntryParser.m in Sources */,
 				8280731F1515405C00EF635C /* CMISServiceDocumentParser.m in Sources */,
 				258998E618D73E1A0091BA96 /* CMISPrincipalParser.m in Sources */,
+				C97B947D18FECB1400EDC1A6 /* CMISRelationshipTypeDefinition.m in Sources */,
 				58B9C8DB18DE3379001D5C1B /* CMISBrowserNavigationService.m in Sources */,
 				58B9C8D718DE3379001D5C1B /* CMISBrowserBaseService.m in Sources */,
+				C97B948118FECD8C00EDC1A6 /* CMISSecondaryTypeDefinition.m in Sources */,
 				828073211515405C00EF635C /* CMISAtomPubBinding.m in Sources */,
 				258998DE18D73D5A0091BA96 /* CMISAcl.m in Sources */,
 				828073231515405C00EF635C /* CMISAtomPubObjectService.m in Sources */,
@@ -1084,6 +1114,7 @@
 				82AD4AEC1541642A0012DDB6 /* CMISBindingFactory.m in Sources */,
 				58B9C8E118DE3379001D5C1B /* CMISBrowserVersioningService.m in Sources */,
 				58B9C90318E588D7001D5C1B /* CMISBrowserConstants.m in Sources */,
+				C97B945918FE828300EDC1A6 /* CMISObjectByPathUriBuilder.m in Sources */,
 				58B9C8FF18E58028001D5C1B /* CMISBrowserUtil.m in Sources */,
 				82C1C63F15358733009B7B43 /* CMISObjectByIdUriBuilder.m in Sources */,
 				82ABA0491554655A00935225 /* CMISBindingSession.m in Sources */,
@@ -1091,6 +1122,7 @@
 				75C5E2F81559172B0065550A /* CMISAllowableActionsParser.m in Sources */,
 				75C8D0871559B7EA00B63D2B /* CMISAllowableActions.m in Sources */,
 				8276E124155E34ED00344A29 /* CMISObjectId.m in Sources */,
+				C97B947918FECA6400EDC1A6 /* CMISFolderTypeDefinition.m in Sources */,
 				8276E130155E355D00344A29 /* CMISBase64Encoder.m in Sources */,
 				8276E132155E355D00344A29 /* CMISFileUtil.m in Sources */,
 				258998D418D73D160091BA96 /* CMISAceParser.m in Sources */,
@@ -1100,7 +1132,6 @@
 				82C1C63F15358733009B7B76 /* CMISAtomPubDiscoveryService.m in Sources */,
 				82C1C63F15358733009B7B7E /* CMISAtomCollection.m in Sources */,
 				58B9C8D918DE3379001D5C1B /* CMISBrowserBinding.m in Sources */,
-				82C1C63F15358733009B7B86 /* CMISObjectByPathUriBuilder.m in Sources */,
 				4EA61BD81564F70C00C759E4 /* CMISStringInOutParameter.m in Sources */,
 				258998E218D73D900091BA96 /* CMISPrincipal.m in Sources */,
 				4EA61BDB1564F70C00C759E4 /* CMISURLUtil.m in Sources */,
@@ -1125,6 +1156,7 @@
 				FE417D6815761A34009056C2 /* CMISRenditionData.m in Sources */,
 				FE417D6815761A34009056C6 /* CMISRendition.m in Sources */,
 				755E7D071586E8C3002CACB0 /* CMISAtomPubExtensionDataParserBase.m in Sources */,
+				C97B948518FECD9600EDC1A6 /* CMISItemTypeDefinition.m in Sources */,
 				258998DC18D73D5A0091BA96 /* CMISAce.m in Sources */,
 				58B9C8DD18DE3379001D5C1B /* CMISBrowserObjectService.m in Sources */,
 				BD5C96FF16281A54002DDC6E /* CMISHttpRequest.m in Sources */,
diff --git a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h
index 26484f3..f5ce991 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h
+++ b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.h
@@ -74,31 +74,6 @@
 extern NSString * const kCMISLinkRelationNext;
 extern NSString * const kCMISLinkRelationWorkingCopy;
 
-// URL parameters
-extern NSString * const kCMISParameterChangeToken;
-extern NSString * const kCMISParameterOverwriteFlag;
-extern NSString * const kCMISParameterIncludeAllowableActions;
-extern NSString * const kCMISParameterFilter;
-extern NSString * const kCMISParameterMaxItems;
-extern NSString * const kCMISParameterObjectId;
-extern NSString * const kCMISParameterOrderBy;
-extern NSString * const kCMISParameterIncludePathSegment;
-extern NSString * const kCMISParameterIncludeRelationships;
-extern NSString * const kCMISParameterRenditionFilter;
-extern NSString * const kCMISParameterSkipCount;
-extern NSString * const kCMISParameterStreamId;
-extern NSString * const kCMISParameterAllVersions;
-extern NSString * const kCMISParameterContinueOnFailure;
-extern NSString * const kCMISParameterUnfileObjects;
-extern NSString * const kCMISParameterRelativePathSegment;
-extern NSString * const kCMISParameterMajor;
-extern NSString * const kCMISParameterCheckin;
-extern NSString * const kCMISParameterCheckinComment;
-
-// Parameter Values
-extern NSString * const kCMISParameterValueTrue;
-extern NSString * const kCMISParameterValueFalse;
-
 // Namespaces
 extern NSString * const kCMISNamespaceCmis;
 extern NSString * const kCMISNamespaceCmisRestAtom;
diff --git a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m
index 4e4ce30..a4a3898 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m
+++ b/ObjectiveCMIS/Bindings/AtomPub/AtomPubParser/CMISAtomPubConstants.m
@@ -74,31 +74,6 @@
 NSString * const kCMISLinkRelationNext = @"next";
 NSString * const kCMISLinkRelationWorkingCopy = @"working-copy";
 
-// Parameters
-NSString * const kCMISParameterChangeToken = @"changeToken";
-NSString * const kCMISParameterOverwriteFlag = @"overwriteFlag";
-NSString * const kCMISParameterIncludeAllowableActions = @"includeAllowableActions";
-NSString * const kCMISParameterFilter = @"filter";
-NSString * const kCMISParameterMaxItems = @"maxItems";
-NSString * const kCMISParameterObjectId = @"objectId";
-NSString * const kCMISParameterOrderBy = @"orderBy";
-NSString * const kCMISParameterIncludePathSegment = @"includePathSegment";
-NSString * const kCMISParameterIncludeRelationships = @"includeRelationships";
-NSString * const kCMISParameterRenditionFilter = @"renditionFilter";
-NSString * const kCMISParameterSkipCount = @"skipCount";
-NSString * const kCMISParameterStreamId = @"streamId";
-NSString * const kCMISParameterAllVersions = @"allVersions";
-NSString * const kCMISParameterContinueOnFailure= @"continueOnFailure";
-NSString * const kCMISParameterUnfileObjects = @"unfileObjects";
-NSString * const kCMISParameterRelativePathSegment = @"includeRelativePathSegment";
-NSString * const kCMISParameterMajor = @"major";
-NSString * const kCMISParameterCheckin = @"checkin";
-NSString * const kCMISParameterCheckinComment = @"checkinComment";
-
-// Parameter Values
-NSString * const kCMISParameterValueTrue = @"true";
-NSString * const kCMISParameterValueFalse = @"false";
-
 // Namespaces
 NSString * const kCMISNamespaceCmis = @"http://docs.oasis-open.org/ns/cmis/core/200908/";
 NSString * const kCMISNamespaceCmisRestAtom = @"http://docs.oasis-open.org/ns/cmis/restatom/200908/";
diff --git a/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h b/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h
index 2b1e6e6..efe1aac 100644
--- a/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h
+++ b/ObjectiveCMIS/Bindings/AtomPub/CMISObjectByIdUriBuilder.h
@@ -21,15 +21,6 @@
 #import <Foundation/Foundation.h>
 #import "CMISEnums.h"
 
-
-typedef NS_ENUM(NSInteger, CMISReturnVersion)
-{
-    NOT_PROVIDED,
-    THIS,
-    LATEST,
-    LATEST_MAJOR
-};
-
 @interface CMISObjectByIdUriBuilder : NSObject
 
 @property (nonatomic, strong) NSString *objectId;
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h
index 1e409d3..4d92e07 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.h
@@ -27,4 +27,8 @@
 
 - (id)initWithBindingSession:(CMISBindingSession *)session;
 
+-(NSString *)getObjectUrlObjectId:(NSString *)objectId selector:(NSString *)selector;
+-(NSString *)getObjectUrlByPath:(NSString *)path selector:(NSString *)selector;
+-(NSString *)getRepositoryUrlWithSelector:(NSString *)selector;
+
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
index c16ff68..f037fa3 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserBaseService.m
@@ -18,6 +18,9 @@
  */
 
 #import "CMISBrowserBaseService.h"
+#import "CMISConstants.h"
+#import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
 
 @interface CMISBrowserBaseService ()
 @property (nonatomic, strong, readwrite) CMISBindingSession *bindingSession;
@@ -36,4 +39,29 @@
     return self;
 }
 
+-(NSString *)getObjectUrlObjectId:(NSString *)objectId selector:(NSString *)selector
+{
+    NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+    
+    NSString *objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterObjectId value:objectId urlString:rootUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:objectUrl];
+    return objectUrl;
+}
+
+-(NSString *)getObjectUrlByPath:(NSString *)path selector:(NSString *)selector
+{
+    NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+    
+    NSString *objectUrl = [CMISURLUtil urlStringByAppendingPath:path urlString:rootUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:objectUrl];
+    return objectUrl;
+}
+
+-(NSString *)getRepositoryUrlWithSelector:(NSString *)selector
+{
+    NSString *repoUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
+    repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:selector urlString:repoUrl];
+    return repoUrl;
+}
+
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
index cff7ffd..025baed 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.h
@@ -46,25 +46,55 @@
 extern NSString * const kCMISBrowserJSONQueryName;
 extern NSString * const kCMISBrowserJSONDescription;
 extern NSString * const kCMISBrowserJSONBaseId;
+extern NSString * const kCMISBrowserJSONParentId;
 extern NSString * const kCMISBrowserJSONCreateable;
 extern NSString * const kCMISBrowserJSONFileable;
 extern NSString * const kCMISBrowserJSONQueryable;
+extern NSString * const kCMISBrowserJSONVersionable; // document
+extern NSString * const kCMISBrowserJSONContentStreamAllowed; // document
+extern NSString * const kCMISBrowserJSONAllowedSourceTypes; // relationship
+extern NSString * const kCMISBrowserJSONAllowedTargetTypes; // relationship
 extern NSString * const kCMISBrowserJSONFullTextIndexed;
 extern NSString * const kCMISBrowserJSONIncludedInSuperTypeQuery;
 extern NSString * const kCMISBrowserJSONControllablePolicy;
 extern NSString * const kCMISBrowserJSONControllableAcl;
 extern NSString * const kCMISBrowserJSONPropertyDefinitions;
+extern NSString * const kCMISBrowserJSONTypeMutability;
 extern NSString * const kCMISBrowserJSONPropertyType;
 extern NSString * const kCMISBrowserJSONCardinality;
 extern NSString * const kCMISBrowserJSONUpdateability;
 extern NSString * const kCMISBrowserJSONInherited;
 extern NSString * const kCMISBrowserJSONRequired;
 extern NSString * const kCMISBrowserJSONOrderable;
+extern NSString * const kCMISBrowserJSONOpenChoice;
+extern NSString * const kCMISBrowserJSONChoice;
+extern NSString * const kCMISBrowserJSONDefaultValue;
+extern NSString * const kCMISBrowserJSONProperties;
 extern NSString * const kCMISBrowserJSONSuccinctProperties;
+extern NSString * const kCMISBrowserJSONPropertiesExtension;
+extern NSString * const kCMISBrowserJSONAllowableActions;
+extern NSString * const kCMISBrowserJSONRelationships;
+extern NSString * const kCMISBrowserJSONChangeEventInfo;
+extern NSString * const kCMISBrowserJSONAcl;
+extern NSString * const kCMISBrowserJSONExactAcl;
+extern NSString * const kCMISBrowserJSONPolicyIds;
+extern NSString * const kCMISBrowserJSONPolicyIdsIds;
+extern NSString * const kCMISBrowserJSONRenditions;
 extern NSString * const kCMISBrowserJSONObjects;
 extern NSString * const kCMISBrowserJSONObject;
 extern NSString * const kCMISBrowserJSONHasMoreItems;
 extern NSString * const kCMISBrowserJSONNumberItems;
+extern NSString * const kCMISBrowserJSONThinClientUri;
+extern NSString * const kCMISBrowserJSONChangesIncomplete;
+extern NSString * const kCMISBrowserJSONChangesOnType;
+extern NSString * const kCMISBrowserJSONLatestChangeLogToken;
+extern NSString * const kCMISBrowserJSONAclCapabilities;
+extern NSString * const kCMISBrowserJSONExtendedFeatures;
+extern NSString * const kCMISBrowserJSONMaxLength;
+extern NSString * const kCMISBrowserJSONMinValue;
+extern NSString * const kCMISBrowserJSONMaxValue;
+extern NSString * const kCMISBrowserJSONPrecision;
+extern NSString * const kCMISBrowserJSONResolution;
 
 // JSON enum values
 extern NSString * const kCMISBrowserJSONPropertyTypeValueString;
@@ -82,7 +112,44 @@
 extern NSString * const kCMISBrowserJSONUpdateabilityValueOnCreate;
 extern NSString * const kCMISBrowserJSONUpdateabilityValueWhenCheckedOut;
 
+//JSON selectors
+extern NSString * const kCMISBrowserJSONSSelectorLastResult;
+extern NSString * const kCMISBrowserJSONSelectorRepositoryInfo;
+extern NSString * const kCMISBrowserJSONSelectorTypeChildren;
+extern NSString * const kCMISBrowserJSONSelectorTypeDescendants;
+extern NSString * const kCMISBrowserJSONSelectorTypeDefinition;
+extern NSString * const kCMISBrowserJSONSelectorContent;
+extern NSString * const kCMISBrowserJSONSelectorObject;
+extern NSString * const kCMISBrowserJSONSelectorProperties;
+extern NSString * const kCMISBrowserJSONSelectorAllowableActions;
+extern NSString * const kCMISBrowserJSONSelectorRenditions;
+extern NSString * const kCMISBrowserJSONSelectorChildren;
+extern NSString * const kCMISBrowserJSONSelectorDescendants;
+extern NSString * const kCMISBrowserJSONSelectorParents;
+extern NSString * const kCMISBrowserJSONSelectorParent;
+extern NSString * const kCMISBrowserJSONSelectorFolderTree;
+extern NSString * const kCMISBrowserJSONSelectorQuery;
+extern NSString * const kCMISBrowserJSONSelectorVersions;
+extern NSString * const kCMISBrowserJSONSelectorRelationships;
+extern NSString * const kCMISBrowserJSONSelectorCheckedout;
+extern NSString * const kCMISBrowserJSONSelectorPolicies;
+extern NSString * const kCMISBrowserJSONSelectorAcl;
+extern NSString * const kCMISBrowserJSONSelectorContentChanges;
 
+//JSON rendition properties
+extern NSString * const kCMISBrowserJSONRenditionStreamId;
+extern NSString * const kCMISBrowserJSONRenditionMimeType;
+extern NSString * const kCMISBrowserJSONRenditionLength;
+extern NSString * const kCMISBrowserJSONRenditionKind;
+extern NSString * const kCMISBrowserJSONRenditionTitle;
+extern NSString * const kCMISBrowserJSONRenditionHeight;
+extern NSString * const kCMISBrowserJSONRenditionWidth;
+extern NSString * const kCMISBrowserJSONRenditionDocumentId;
 
++ (NSSet *)objectKeys;
++ (NSSet *)repositoryInfoKeys;
++ (NSSet *)typeKeys;
++ (NSSet *)propertyTypeKeys;
++ (NSSet *)renditionKeys;
 
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
index f752b6d..2a29811 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserConstants.m
@@ -19,6 +19,12 @@
 
 #import "CMISBrowserConstants.h"
 
+static NSSet *_objectKeys;
+static NSSet *_repositoryInfoKeys;
+static NSSet *_typeKeys;
+static NSSet *_propertyTypeKeys;
+static NSSet *_renditionKeys;
+
 @implementation CMISBrowserConstants
 
 // Session keys
@@ -46,25 +52,55 @@
 NSString * const kCMISBrowserJSONQueryName = @"queryName";
 NSString * const kCMISBrowserJSONDescription = @"description";
 NSString * const kCMISBrowserJSONBaseId = @"baseId";
+NSString * const kCMISBrowserJSONParentId = @"parentId";
 NSString * const kCMISBrowserJSONCreateable = @"creatable";
 NSString * const kCMISBrowserJSONFileable = @"fileable";
 NSString * const kCMISBrowserJSONQueryable = @"queryable";
+NSString * const kCMISBrowserJSONVersionable = @"versionable"; // document
+NSString * const kCMISBrowserJSONContentStreamAllowed = @"contentStreamAllowed"; // document
+NSString * const kCMISBrowserJSONAllowedSourceTypes = @"allowedSourceTypes"; // relationship
+NSString * const kCMISBrowserJSONAllowedTargetTypes = @"allowedTargetTypes"; // relationship
 NSString * const kCMISBrowserJSONFullTextIndexed = @"fulltextIndexed";
 NSString * const kCMISBrowserJSONIncludedInSuperTypeQuery = @"includedInSupertypeQuery";
 NSString * const kCMISBrowserJSONControllablePolicy = @"controllablePolicy";
 NSString * const kCMISBrowserJSONControllableAcl = @"controllableACL";
 NSString * const kCMISBrowserJSONPropertyDefinitions = @"propertyDefinitions";
+NSString * const kCMISBrowserJSONTypeMutability = @"typeMutability";
 NSString * const kCMISBrowserJSONPropertyType = @"propertyType";
 NSString * const kCMISBrowserJSONCardinality = @"cardinality";
 NSString * const kCMISBrowserJSONUpdateability = @"updatability";
 NSString * const kCMISBrowserJSONInherited = @"inherited";
 NSString * const kCMISBrowserJSONRequired = @"required";
 NSString * const kCMISBrowserJSONOrderable = @"orderable";
+NSString * const kCMISBrowserJSONOpenChoice = @"openChoice";
+NSString * const kCMISBrowserJSONChoice = @"choice";
+NSString * const kCMISBrowserJSONDefaultValue = @"defaultValue";
+NSString * const kCMISBrowserJSONProperties = @"properties";
 NSString * const kCMISBrowserJSONSuccinctProperties = @"succinctProperties";
+NSString * const kCMISBrowserJSONPropertiesExtension = @"propertiesExtension";
+NSString * const kCMISBrowserJSONAllowableActions = @"allowableActions";
+NSString * const kCMISBrowserJSONRelationships = @"relationships";
+NSString * const kCMISBrowserJSONChangeEventInfo = @"changeEventInfo";
+NSString * const kCMISBrowserJSONAcl = @"acl";
+NSString * const kCMISBrowserJSONExactAcl = @"exactACL";
+NSString * const kCMISBrowserJSONPolicyIds = @"policyIds";
+NSString * const kCMISBrowserJSONPolicyIdsIds = @"ids";
+NSString * const kCMISBrowserJSONRenditions = @"renditions";
 NSString * const kCMISBrowserJSONObjects = @"objects";
 NSString * const kCMISBrowserJSONObject = @"object";
 NSString * const kCMISBrowserJSONHasMoreItems = @"hasMoreItems";
 NSString * const kCMISBrowserJSONNumberItems = @"numItems";
+NSString * const kCMISBrowserJSONThinClientUri = @"thinClientURI";
+NSString * const kCMISBrowserJSONChangesIncomplete = @"changesIncomplete";
+NSString * const kCMISBrowserJSONChangesOnType = @"changesOnType";
+NSString * const kCMISBrowserJSONLatestChangeLogToken = @"latestChangeLogToken";
+NSString * const kCMISBrowserJSONAclCapabilities = @"aclCapabilities";
+NSString * const kCMISBrowserJSONExtendedFeatures = @"extendedFeatures";
+NSString * const kCMISBrowserJSONMaxLength = @"maxLength";
+NSString * const kCMISBrowserJSONMinValue = @"minValue";
+NSString * const kCMISBrowserJSONMaxValue = @"maxValue";
+NSString * const kCMISBrowserJSONPrecision = @"precision";
+NSString * const kCMISBrowserJSONResolution = @"resolution";
 
 // JSON enum values
 NSString * const kCMISBrowserJSONPropertyTypeValueString = @"string";
@@ -84,4 +120,161 @@
 NSString * const kCMISBrowserJSONUpdateabilityValueOnCreate = @"oncreate";
 NSString * const kCMISBrowserJSONUpdateabilityValueWhenCheckedOut = @"whencheckedout";
 
+//JSON selectors
+NSString * const kCMISBrowserJSONSSelectorLastResult = @"lastResult";
+NSString * const kCMISBrowserJSONSelectorRepositoryInfo = @"repositoryInfo";
+NSString * const kCMISBrowserJSONSelectorTypeChildren = @"typeChildren";
+NSString * const kCMISBrowserJSONSelectorTypeDescendants = @"typeDescendants";
+NSString * const kCMISBrowserJSONSelectorTypeDefinition = @"typeDefinition";
+NSString * const kCMISBrowserJSONSelectorContent = @"content";
+NSString * const kCMISBrowserJSONSelectorObject = @"object";
+NSString * const kCMISBrowserJSONSelectorProperties = @"properties";
+NSString * const kCMISBrowserJSONSelectorAllowableActions = @"allowableActions";
+NSString * const kCMISBrowserJSONSelectorRenditions = @"renditions";
+NSString * const kCMISBrowserJSONSelectorChildren = @"children";
+NSString * const kCMISBrowserJSONSelectorDescendants = @"descendants";
+NSString * const kCMISBrowserJSONSelectorParents = @"parents";
+NSString * const kCMISBrowserJSONSelectorParent = @"parent";
+NSString * const kCMISBrowserJSONSelectorFolderTree = @"folder";
+NSString * const kCMISBrowserJSONSelectorQuery = @"query";
+NSString * const kCMISBrowserJSONSelectorVersions = @"versions";
+NSString * const kCMISBrowserJSONSelectorRelationships = @"relationships";
+NSString * const kCMISBrowserJSONSelectorCheckedout = @"checkedout";
+NSString * const kCMISBrowserJSONSelectorPolicies = @"policies";
+NSString * const kCMISBrowserJSONSelectorAcl = @"acl";
+NSString * const kCMISBrowserJSONSelectorContentChanges = @"contentChanges";
+
+//JSON rendition properties
+NSString * const kCMISBrowserJSONRenditionStreamId = @"streamId";
+NSString * const kCMISBrowserJSONRenditionMimeType = @"mimeType";
+NSString * const kCMISBrowserJSONRenditionLength = @"length";
+NSString * const kCMISBrowserJSONRenditionKind = @"kind";
+NSString * const kCMISBrowserJSONRenditionTitle = @"title";
+NSString * const kCMISBrowserJSONRenditionHeight = @"height";
+NSString * const kCMISBrowserJSONRenditionWidth = @"width";
+NSString * const kCMISBrowserJSONRenditionDocumentId = @"renditionDocumentId";
+
++(NSSet *)objectKeys
+{
+    if(!_objectKeys) {
+        _objectKeys = [NSSet setWithObjects:
+                       kCMISBrowserJSONProperties,
+                       kCMISBrowserJSONSuccinctProperties,
+                       kCMISBrowserJSONAllowableActions,
+                       kCMISBrowserJSONRelationships,
+                       kCMISBrowserJSONChangeEventInfo,
+                       kCMISBrowserJSONAcl,
+                       kCMISBrowserJSONExactAcl,
+                       kCMISBrowserJSONPolicyIds,
+                       kCMISBrowserJSONRenditions,
+                       nil];
+    }
+    return _objectKeys;
+}
+
++ (NSSet *)repositoryInfoKeys
+{
+    if(!_repositoryInfoKeys) {
+        _repositoryInfoKeys = [NSSet setWithObjects:
+                               kCMISBrowserJSONRepositoryId,
+                               kCMISBrowserJSONRepositoryName,
+                               kCMISBrowserJSONRepositoryDescription,
+                               kCMISBrowserJSONVendorName,
+                               kCMISBrowserJSONProductName,
+                               kCMISBrowserJSONProductVersion,
+                               kCMISBrowserJSONRootFolderId,
+                               kCMISBrowserJSONRepositoryUrl,
+                               kCMISBrowserJSONRootFolderUrl,
+                               kCMISBrowserJSONCapabilities,
+                               kCMISBrowserJSONAclCapabilities,
+                               kCMISBrowserJSONLatestChangeLogToken,
+                               kCMISBrowserJSONCMISVersionSupported,
+                               kCMISBrowserJSONThinClientUri,
+                               kCMISBrowserJSONChangesIncomplete,
+                               kCMISBrowserJSONChangesOnType,
+                               kCMISBrowserJSONPrincipalIdAnonymous,
+                               kCMISBrowserJSONPrincipalIdAnyone,
+                               kCMISBrowserJSONExtendedFeatures,
+                               nil];
+    }
+    return _repositoryInfoKeys;
+}
+
++ (NSSet *)typeKeys
+{
+    if(!_typeKeys) {
+        _typeKeys = [NSSet setWithObjects:
+                     kCMISBrowserJSONId,
+                     kCMISBrowserJSONLocalName,
+                     kCMISBrowserJSONLocalNamespace,
+                     kCMISBrowserJSONDisplayName,
+                     kCMISBrowserJSONQueryName,
+                     kCMISBrowserJSONDescription,
+                     kCMISBrowserJSONBaseId,
+                     kCMISBrowserJSONParentId,
+                     kCMISBrowserJSONCreateable,
+                     kCMISBrowserJSONFileable,
+                     kCMISBrowserJSONQueryable,
+                     kCMISBrowserJSONFullTextIndexed,
+                     kCMISBrowserJSONIncludedInSuperTypeQuery,
+                     kCMISBrowserJSONControllablePolicy,
+                     kCMISBrowserJSONControllableAcl,
+                     kCMISBrowserJSONPropertyDefinitions,
+                     kCMISBrowserJSONVersionable,
+                     kCMISBrowserJSONContentStreamAllowed,
+                     kCMISBrowserJSONAllowedSourceTypes,
+                     kCMISBrowserJSONAllowedTargetTypes,
+                     kCMISBrowserJSONTypeMutability,
+                     nil];
+    }
+    return _typeKeys;
+}
+
++ (NSSet *)propertyTypeKeys
+{
+    if(!_propertyTypeKeys) {
+        _propertyTypeKeys = [NSSet setWithObjects:
+                             kCMISBrowserJSONId,
+                             kCMISBrowserJSONLocalName,
+                             kCMISBrowserJSONLocalNamespace,
+                             kCMISBrowserJSONDisplayName,
+                             kCMISBrowserJSONQueryName,
+                             kCMISBrowserJSONDescription,
+                             kCMISBrowserJSONPropertyType,
+                             kCMISBrowserJSONCardinality,
+                             kCMISBrowserJSONUpdateability,
+                             kCMISBrowserJSONInherited,
+                             kCMISBrowserJSONRequired,
+                             kCMISBrowserJSONQueryable,
+                             kCMISBrowserJSONOrderable,
+                             kCMISBrowserJSONOpenChoice,
+                             kCMISBrowserJSONDefaultValue,
+                             kCMISBrowserJSONMaxLength,
+                             kCMISBrowserJSONMinValue,
+                             kCMISBrowserJSONMaxValue,
+                             kCMISBrowserJSONPrecision,
+                             kCMISBrowserJSONResolution,
+                             kCMISBrowserJSONChoice,
+                             nil];
+    }
+    return _propertyTypeKeys;
+}
+
++(NSSet *)renditionKeys
+{
+    if(!_renditionKeys) {
+        _renditionKeys = [NSSet setWithObjects:
+                          kCMISBrowserJSONRenditionStreamId,
+                          kCMISBrowserJSONRenditionMimeType,
+                          kCMISBrowserJSONRenditionLength,
+                          kCMISBrowserJSONRenditionKind,
+                          kCMISBrowserJSONRenditionTitle,
+                          kCMISBrowserJSONRenditionHeight,
+                          kCMISBrowserJSONRenditionWidth,
+                          kCMISBrowserJSONRenditionDocumentId,
+                          nil];
+    }
+    return _renditionKeys;
+}
+
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
index 2c52d44..00c9d12 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserNavigationService.m
@@ -23,6 +23,7 @@
 #import "CMISConstants.h"
 #import "CMISBrowserUtil.h"
 #import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
 
 @implementation CMISBrowserNavigationService
 
@@ -37,14 +38,20 @@
                         maxItems:(NSNumber *)maxItems
                  completionBlock:(void (^)(CMISObjectList *objectList, NSError *error))completionBlock
 {
-    // TODO: Use a CMISChildrenByIdUriBuilder class??
-    NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
-    NSString *urlString = [NSString stringWithFormat:@"%@?objectId=%@&succinct=true&cmisselector=children", rootUrl, objectId];
-    NSURL *childrenUrl = [NSURL URLWithString:urlString];
+    NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorChildren];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterOrderBy value:orderBy urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePathSegment boolValue:includePathSegment urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterMaxItems numberValue:maxItems urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSkipCount numberValue:skipCount urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
-    [self.bindingSession.networkProvider invokeGET:childrenUrl
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
                                            session:self.bindingSession
                                        cmisRequest:cmisRequest
                                    completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
index 7584764..c7fb39f 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserObjectService.m
@@ -23,6 +23,10 @@
 #import "CMISConstants.h"
 #import "CMISBrowserUtil.h"
 #import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
+#import "CMISFileUtil.h"
+#import "CMISErrors.h"
+#import "CMISLog.h"
 
 @implementation CMISBrowserObjectService
 
@@ -35,28 +39,29 @@
        includeAllowableActions:(BOOL)includeAllowableActions
                completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
-    // TODO: Use the CMISObjectByIdUriBuilder class (after it's moved out of AtomPub folder)
-    NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
-    NSString *urlString = [NSString stringWithFormat:@"%@?objectId=%@&succinct=true&cmisselector=object", rootUrl, objectId];
-    NSURL *objectUrl = [NSURL URLWithString:urlString];
+    NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorObject];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeACL urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
     
     CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
-    [self.bindingSession.networkProvider invokeGET:objectUrl
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
                                            session:self.bindingSession
                                        cmisRequest:cmisRequest
                                    completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
-                                       if (httpResponse) {
-                                           NSData *data = httpResponse.data;
-                                           if (data) {
-                                               NSError *parsingError = nil;
-                                               CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:data error:&parsingError];
-                                               if (parsingError)
-                                               {
-                                                   completionBlock(nil, parsingError);
-                                               } else {
-                                                   completionBlock(objectData, nil);
-                                               }
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           NSError *parsingError = nil;
+                                           CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
+                                           if (parsingError)
+                                           {
+                                               completionBlock(nil, parsingError);
+                                           } else {
+                                               completionBlock(objectData, nil);
                                            }
                                        } else {
                                            completionBlock(nil, error);
@@ -75,9 +80,36 @@
              includeAllowableActions:(BOOL)includeAllowableActions
                      completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    NSString *objectUrl = [self getObjectUrlByPath:path selector:kCMISBrowserJSONSelectorObject];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeACL urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
+    
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           NSError *parsingError = nil;
+                                           CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
+                                           if (parsingError)
+                                           {
+                                               completionBlock(nil, parsingError);
+                                           } else {
+                                               completionBlock(objectData, nil);
+                                           }
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
+                                   }];
+    
+    return cmisRequest;
 }
 
 - (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -86,9 +118,17 @@
                         completionBlock:(void (^)(NSError *error))completionBlock
                           progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    return [self downloadContentOfObject:objectId
+                                streamId:streamId
+                                  toFile:filePath
+                                  offset:nil
+                                  length:nil
+                         completionBlock:completionBlock
+                           progressBlock:^(unsigned long long bytesDownloaded, unsigned long long bytesTotal) {
+                               if (progressBlock) {
+                                   progressBlock(bytesDownloaded, bytesTotal);
+                               }
+                           }];
 }
 
 - (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -99,9 +139,14 @@
                         completionBlock:(void (^)(NSError *error))completionBlock
                           progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
+    return [self downloadContentOfObject:objectId
+                                streamId:streamId
+                          toOutputStream:outputStream
+                                  offset:offset
+                                  length:length
+                         completionBlock:completionBlock
+                           progressBlock:progressBlock];
 }
 
 - (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -110,9 +155,17 @@
                         completionBlock:(void (^)(NSError *error))completionBlock
                           progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    return [self downloadContentOfObject:objectId
+                                streamId:streamId
+                          toOutputStream:outputStream
+                                  offset:nil
+                                  length:nil
+                         completionBlock:completionBlock
+                           progressBlock:^(unsigned long long bytesDownloaded, unsigned long long bytesTotal) {
+                               if (progressBlock) {
+                                   progressBlock(bytesDownloaded, bytesTotal);
+                               }
+                           }];
 }
 
 - (CMISRequest*)downloadContentOfObject:(NSString *)objectId
@@ -123,9 +176,32 @@
                         completionBlock:(void (^)(NSError *error))completionBlock
                           progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    CMISRequest *request = [[CMISRequest alloc] init];
+    
+    NSString *rootUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+    
+    NSString *contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterStreamId value:streamId urlString:rootUrl];
+    contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterObjectId value:objectId urlString:contentUrl];
+    contentUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSelector value:kCMISBrowserJSONSelectorContent urlString:contentUrl];
+
+    unsigned long long streamLength = 0; //TODO do we need this?
+
+    [self.bindingSession.networkProvider invoke:[NSURL URLWithString:contentUrl]
+                                  httpMethod:HTTP_GET
+                                     session:self.bindingSession
+                                outputStream:outputStream
+                               bytesExpected:streamLength
+                                      offset:offset
+                                      length:length
+                                 cmisRequest:request
+                             completionBlock:^(CMISHttpResponse *httpResponse, NSError *error)
+    {
+        if (completionBlock) {
+          completionBlock(error);
+        }
+    } progressBlock:progressBlock];
+    
+    return request;
 }
 
 - (CMISRequest*)deleteContentOfObject:(CMISStringInOutParameter *)objectIdParam
@@ -172,9 +248,29 @@
                            completionBlock:(void (^)(NSString *objectId, NSError *error))completionBlock
                              progressBlock:(void (^)(unsigned long long bytesUploaded, unsigned long long bytesTotal))progressBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:filePath];
+    if (inputStream == nil) {
+        CMISLogError(@"Could not find file %@", filePath);
+        if (completionBlock) {
+            completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument
+                                                 detailedDescription:@"Invalid file"]);
+        }
+        return nil;
+    }
+    
+    NSError *fileError = nil;
+    unsigned long long bytesExpected = [CMISFileUtil fileSizeForFileAtPath:filePath error:&fileError];
+    if (fileError) {
+        CMISLogError(@"Could not determine size of file %@: %@", filePath, [fileError description]);
+    }
+    
+    return [self createDocumentFromInputStream:inputStream
+                                      mimeType:mimeType
+                                    properties:properties
+                                      inFolder:folderObjectId
+                                 bytesExpected:bytesExpected
+                               completionBlock:completionBlock
+                                 progressBlock:progressBlock];
 }
 
 - (CMISRequest*)createDocumentFromInputStream:(NSInputStream *)inputStream
@@ -235,9 +331,32 @@
                          skipCount:(NSNumber *)skipCount
                    completionBlock:(void (^)(NSArray *renditions, NSError *error))completionBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorRenditions];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterMaxItems value:[maxItems stringValue] urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSkipCount value:[skipCount stringValue] urlString:objectUrl];
+    
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           NSError *parsingError = nil;
+                                           NSArray *renditions = [CMISBrowserUtil renditionsFromJSONData:httpResponse.data error:&parsingError];
+                                           if (parsingError)
+                                           {
+                                               completionBlock(nil, parsingError);
+                                           } else {
+                                               completionBlock(renditions, nil);
+                                           }
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
+                                   }];
+    
+    return cmisRequest;
 }
 
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
index 04067fe..b6f20e9 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserRepositoryService.m
@@ -26,7 +26,9 @@
 #import "CMISTypeDefinition.h"
 #import "CMISPropertyDefinition.h"
 #import "CMISBrowserUtil.h"
+#import "CMISConstants.h"
 #import "CMISBrowserConstants.h"
+#import "CMISURLUtil.h"
 
 @interface CMISBrowserRepositoryService ()
 @property (nonatomic, strong) NSDictionary *repositories;
@@ -90,15 +92,12 @@
 - (CMISRequest*)retrieveTypeDefinition:(NSString *)typeId
                        completionBlock:(void (^)(CMISTypeDefinition *typeDefinition, NSError *error))completionBlock
 {
-    // TODO: Use the CMISTypeByIdUriBuilder class (after it's moved out of AtomPub folder)
-    NSString *repoUrl = [self.bindingSession objectForKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
-    NSString *urlString = [NSString stringWithFormat:@"%@?cmisselector=typeDefinition&typeId=%@", repoUrl, typeId];
+    NSString *repoUrl = [self getRepositoryUrlWithSelector:kCMISBrowserJSONSelectorTypeDefinition];
+    repoUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterTypeId value:typeId urlString:repoUrl];
     
-    NSURL *typeUrl = [NSURL URLWithString:urlString];
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
     
-    CMISRequest *cmisRequest = [CMISRequest new];
-    
-    [self.bindingSession.networkProvider invokeGET:typeUrl
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:repoUrl]
                                            session:self.bindingSession
                                        cmisRequest:cmisRequest
                                    completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
index 8770b7a..b0070d5 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.h
@@ -45,4 +45,9 @@
  */
 + (CMISObjectList *)objectListFromJSONData:(NSData *)jsonData error:(NSError **)outError;
 
+/**
+ Returns an array of CMISRenditionData objects, parsed from the given JSON data.
+ */
++ (NSArray *)renditionsFromJSONData:(NSData *)jsonData error:(NSError **)outError;
+
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
index b997216..df8f4bb 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserUtil.m
@@ -22,6 +22,13 @@
 #import "CMISBrowserConstants.h"
 #import "CMISRepositoryInfo.h"
 #import "CMISPropertyDefinition.h"
+#import "CMISRenditionData.h"
+#import "CMISDocumentTypeDefinition.h"
+#import "CMISFolderTypeDefinition.h"
+#import "CMISRelationshipTypeDefinition.h"
+#import "CMISItemTypeDefinition.h"
+#import "CMISSecondaryTypeDefinition.h"
+#import "CMISErrors.h"
 
 @implementation CMISBrowserUtil
 
@@ -44,18 +51,33 @@
             repoInfo.identifier = repo[kCMISBrowserJSONRepositoryId];
             repoInfo.name = repo[kCMISBrowserJSONRepositoryName];
             repoInfo.desc = repo[kCMISBrowserJSONRepositoryDescription];
-            repoInfo.rootFolderId = repo[kCMISBrowserJSONRootFolderId];
-            repoInfo.cmisVersionSupported = repo[kCMISBrowserJSONCMISVersionSupported];
+            repoInfo.vendorName = repo[kCMISBrowserJSONVendorName];
             repoInfo.productName = repo[kCMISBrowserJSONProductName];
             repoInfo.productVersion = repo[kCMISBrowserJSONProductVersion];
-            repoInfo.vendorName = repo[kCMISBrowserJSONVendorName];
+            repoInfo.rootFolderId = repo[kCMISBrowserJSONRootFolderId];
+            repoInfo.repositoryUrl = repo[kCMISBrowserJSONRepositoryUrl];
+            repoInfo.rootFolderUrl = repo[kCMISBrowserJSONRootFolderUrl];
+            
+            repoInfo.repositoryCapabilities = repo[kCMISBrowserJSONCapabilities]; //TODO should be own type instead of dictionary
+            //TOOD aclCapabilities
+            repoInfo.latestChangeLogToken = repo[kCMISBrowserJSONLatestChangeLogToken];
+            
+            repoInfo.cmisVersionSupported = repo[kCMISBrowserJSONCMISVersionSupported];
+            repoInfo.thinClientUri = repo[kCMISBrowserJSONThinClientUri];
+
+            //TODO repoInfo.changesIncomplete = repo[kCMISBrowserJSONChangesIncomplete];
+            //TODO changesOnType
+
             repoInfo.principalIdAnonymous = repo[kCMISBrowserJSONPrincipalIdAnonymous];
             repoInfo.principalIdAnyone = repo[kCMISBrowserJSONPrincipalIdAnyone];
             
+            //handle extensions
+            repoInfo.extensions = [CMISBrowserUtil convertExtensions:repo cmisKeys:[CMISBrowserConstants repositoryInfoKeys]];
+            
             // store the repo and root folder URLs in the session (when the repoId matches)
             if ([repoInfo.identifier isEqualToString:bindingSession.repositoryId]) {
-                [bindingSession setObject:repo[kCMISBrowserJSONRootFolderUrl] forKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
-                [bindingSession setObject:repo[kCMISBrowserJSONRepositoryUrl] forKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
+                [bindingSession setObject:repoInfo.rootFolderUrl forKey:kCMISBrowserBindingSessionKeyRootFolderUrl];
+                [bindingSession setObject:repoInfo.repositoryUrl forKey:kCMISBrowserBindingSessionKeyRepositoryUrl];
             }
             
             [repositories setObject:repoInfo forKey:repoInfo.identifier];
@@ -75,89 +97,80 @@
     
     CMISTypeDefinition *typeDef = nil;
     if (!serialisationError) {
-        typeDef = [CMISTypeDefinition new];
-        typeDef.id = jsonDictionary[kCMISBrowserJSONId];
-        typeDef.localName = jsonDictionary[kCMISBrowserJSONLocalName];
-        typeDef.localNameSpace = jsonDictionary[kCMISBrowserJSONLocalNamespace];
-        typeDef.displayName = jsonDictionary[kCMISBrowserJSONDisplayName];
-        typeDef.queryName = jsonDictionary[kCMISBrowserJSONQueryName];
-        typeDef.description = jsonDictionary[kCMISBrowserJSONDescription];
-        
-        NSString *baseIdString = jsonDictionary[kCMISBrowserJSONBaseId];
-        if ([baseIdString isEqualToString:kCMISPropertyObjectTypeIdValueDocument]) {
-            typeDef.baseTypeId = CMISBaseTypeDocument;
-        } else if ([baseIdString isEqualToString:kCMISPropertyObjectTypeIdValueFolder]) {
-            typeDef.baseTypeId = CMISBaseTypeFolder;
+        //TODO check for valid baseTypeId (cmis:document, cmis:folder, cmis:relationship, cmis:policy, [cmis:item, cmis:secondary])
+        CMISBaseType baseType = [CMISEnums enumForBaseId:jsonDictionary[kCMISBrowserJSONBaseId]];
+        switch (baseType) {
+            case CMISBaseTypeDocument:
+                typeDef = [CMISDocumentTypeDefinition new];
+                ((CMISDocumentTypeDefinition*)typeDef).contentStreamAllowed = [CMISEnums enumForContentStreamAllowed:jsonDictionary[kCMISBrowserJSONContentStreamAllowed]];
+                ((CMISDocumentTypeDefinition*)typeDef).versionable = [jsonDictionary[kCMISBrowserJSONVersionable] boolValue];
+                break;
+            case CMISBaseTypeFolder:
+                typeDef = [CMISFolderTypeDefinition new];
+                break;
+                
+            case CMISBaseTypeRelationship: {
+                typeDef = [CMISRelationshipTypeDefinition new];
+                
+                id allowedSourceTypes = jsonDictionary[kCMISBrowserJSONAllowedSourceTypes];
+                if([allowedSourceTypes isKindOfClass:NSArray.class]){
+                    NSMutableArray *types = [[NSMutableArray alloc] init];
+                    for (id type in allowedSourceTypes) {
+                        if(type){
+                            [types addObject:type];
+                        }
+                    }
+                    ((CMISRelationshipTypeDefinition*)typeDef).allowedSourceTypes = types;
+                }
+                
+                id allowedTargetTypes = jsonDictionary[kCMISBrowserJSONAllowedTargetTypes];
+                if([allowedTargetTypes isKindOfClass:NSArray.class]){
+                    NSMutableArray *types = [[NSMutableArray alloc] init];
+                    for (id type in allowedTargetTypes) {
+                        if(type){
+                            [types addObject:type];
+                        }
+                    }
+                    ((CMISRelationshipTypeDefinition*)typeDef).allowedTargetTypes = types;
+                }
+                break;
+            }
+            case CMISBaseTypeItem:
+                typeDef = [CMISItemTypeDefinition new];
+                break;
+            case CMISBaseTypeSecondary:
+                typeDef = [CMISSecondaryTypeDefinition new];
+                break;
+            default:
+                if (outError != NULL) *outError = [CMISErrors createCMISErrorWithCode:kCMISErrorCodeInvalidArgument detailedDescription:[NSString stringWithFormat:@"Type '%@' does not match a base type!", jsonDictionary[kCMISBrowserJSONBaseId]]];
+                return nil;
         }
-        
-        typeDef.creatable = [jsonDictionary[kCMISBrowserJSONCreateable] boolValue];
-        typeDef.fileable = [jsonDictionary[kCMISBrowserJSONFileable] boolValue];
-        typeDef.queryable = [jsonDictionary[kCMISBrowserJSONQueryable] boolValue];
-        typeDef.fullTextIndexed = [jsonDictionary[kCMISBrowserJSONFullTextIndexed] boolValue];
-        typeDef.includedInSupertypeQuery = [jsonDictionary[kCMISBrowserJSONIncludedInSuperTypeQuery] boolValue];
+
+        typeDef.baseTypeId = baseType;
+        typeDef.description = jsonDictionary[kCMISBrowserJSONDescription];
+        typeDef.displayName = jsonDictionary[kCMISBrowserJSONDisplayName];
+        typeDef.id = jsonDictionary[kCMISBrowserJSONId];
         typeDef.controllablePolicy = [jsonDictionary[kCMISBrowserJSONControllablePolicy] boolValue];
         typeDef.controllableAcl = [jsonDictionary[kCMISBrowserJSONControllableAcl] boolValue];
+        typeDef.creatable = [jsonDictionary[kCMISBrowserJSONCreateable] boolValue];
+        typeDef.fileable = [jsonDictionary[kCMISBrowserJSONFileable] boolValue];
+        typeDef.fullTextIndexed = [jsonDictionary[kCMISBrowserJSONFullTextIndexed] boolValue];
+        typeDef.includedInSupertypeQuery = [jsonDictionary[kCMISBrowserJSONIncludedInSuperTypeQuery] boolValue];
+        typeDef.queryable = [jsonDictionary[kCMISBrowserJSONQueryable] boolValue];
+        typeDef.localName = jsonDictionary[kCMISBrowserJSONLocalName];
+        typeDef.localNameSpace = jsonDictionary[kCMISBrowserJSONLocalNamespace];
+        typeDef.parentTypeId = jsonDictionary[kCMISBrowserJSONParentId];
+        typeDef.queryName = jsonDictionary[kCMISBrowserJSONQueryName];
+        
+        //TODO type mutability
         
         NSDictionary *propertyDefinitions = jsonDictionary[kCMISBrowserJSONPropertyDefinitions];
-        for (NSDictionary *propertyDictionary in [propertyDefinitions allValues]) {
-            // create property definition and add to type definition
-            CMISPropertyDefinition *propDef = [CMISPropertyDefinition new];
-            propDef.id = propertyDictionary[kCMISBrowserJSONId];
-            propDef.localName = propertyDictionary[kCMISBrowserJSONLocalName];
-            propDef.localNamespace = propertyDictionary[kCMISBrowserJSONLocalNamespace];
-            propDef.displayName = propertyDictionary[kCMISBrowserJSONDisplayName];
-            propDef.queryName = propertyDictionary[kCMISBrowserJSONQueryName];
-            propDef.description = propertyDictionary[kCMISBrowserJSONDescription];
-            propDef.inherited = [propertyDictionary[kCMISBrowserJSONInherited] boolValue];
-            propDef.required = [propertyDictionary[kCMISBrowserJSONRequired] boolValue];
-            propDef.queryable = [propertyDictionary[kCMISBrowserJSONQueryable] boolValue];
-            propDef.orderable = [propertyDictionary[kCMISBrowserJSONOrderable] boolValue];
-            
-            // determine property type
-            NSString *typeString = propertyDictionary[kCMISBrowserJSONPropertyType];
-            if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueString]) {
-                propDef.propertyType = CMISPropertyTypeString;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueId]) {
-                propDef.propertyType = CMISPropertyTypeId;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueInteger]) {
-                propDef.propertyType = CMISPropertyTypeInteger;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueDecimal]) {
-                propDef.propertyType = CMISPropertyTypeDecimal;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueBoolean]) {
-                propDef.propertyType = CMISPropertyTypeBoolean;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueDateTime]) {
-                propDef.propertyType = CMISPropertyTypeDateTime;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueHtml]) {
-                propDef.propertyType = CMISPropertyTypeHtml;
-            } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueUri]) {
-                propDef.propertyType = CMISPropertyTypeUri;
-            }
-            
-            // determine cardinality
-            NSString *cardinalityString = propertyDictionary[kCMISBrowserJSONCardinality];
-            if ([cardinalityString isEqualToString:kCMISBrowserJSONCardinalityValueSingle]) {
-                propDef.cardinality = CMISCardinalitySingle;
-            } else if ([cardinalityString isEqualToString:kCMISBrowserJSONCardinalityValueMultiple]) {
-                propDef.cardinality = CMISCardinalityMulti;
-            }
-            
-            // determine updatability
-            NSString *updatabilityString = propertyDictionary[kCMISBrowserJSONUpdateability];
-            if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueReadOnly]) {
-                propDef.updatability = CMISUpdatabilityReadOnly;
-            } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueReadWrite]) {
-                propDef.updatability = CMISUpdatabilityReadWrite;
-            } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueOnCreate]) {
-                propDef.updatability = CMISUpdatabilityOnCreate;
-            } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueWhenCheckedOut]) {
-                propDef.updatability = CMISUpdatabilityWhenCheckedOut;
-            }
-            
-            // TODO: look for restricted choices
-            propDef.openChoice = YES;
-            
-            [typeDef addPropertyDefinition:propDef];
+        for (NSDictionary *propertyDefDictionary in [propertyDefinitions allValues]) {
+            [typeDef addPropertyDefinition:[CMISBrowserUtil convertPropertyDefinition:propertyDefDictionary]];
         }
+        
+        // handle extensions
+        typeDef.extensions = [CMISBrowserUtil convertExtensions:jsonDictionary cmisKeys:[CMISBrowserConstants typeKeys]];
     }
     
     return typeDef;
@@ -174,7 +187,7 @@
     CMISObjectData *objectData = nil;
     if (!serialisationError) {
         // parse the json into a CMISObjectData object
-        objectData = [CMISBrowserUtil objectDataFromDictionary:jsonDictionary];
+        objectData = [CMISBrowserUtil convertObject:jsonDictionary];
     }
     
     return objectData;
@@ -194,34 +207,68 @@
         objectList = [CMISObjectList new];
         
         // parse the objects
-        NSArray *objectsArray = jsonDictionary[@"objects"];
+        NSArray *objectsArray;
+        if([jsonDictionary isKindOfClass:NSArray.class]){ // is NSArray
+            objectsArray = jsonDictionary;
+            
+            objectList.hasMoreItems = NO;
+            objectList.numItems = (int)objectsArray.count;
+        } else { // is NSDictionary
+            objectsArray = jsonDictionary[kCMISBrowserJSONObjects];
+            
+            // retrieve the paging data
+            objectList.hasMoreItems = [jsonDictionary[kCMISBrowserJSONHasMoreItems] boolValue];
+            objectList.numItems = [jsonDictionary[kCMISBrowserJSONNumberItems] intValue];
+        }
         if (objectsArray) {
             NSMutableArray *objects = [NSMutableArray arrayWithCapacity:objectsArray.count];
             for (NSDictionary *dictionary in objectsArray) {
-                NSDictionary *objectDictionary = dictionary[@"object"];
-                CMISObjectData *objectData = [CMISBrowserUtil objectDataFromDictionary:objectDictionary];
-                [objects addObject:objectData];
+                NSDictionary *objectDictionary = dictionary[kCMISBrowserJSONObject];
+                if(!objectDictionary) {
+                    objectDictionary = dictionary;
+                }
+                CMISObjectData *objectData = [CMISBrowserUtil convertObject:objectDictionary];
+                if(objectData){
+                    [objects addObject:objectData];
+                }
             }
             
             // pass objects to list
             objectList.objects = objects;
         }
-        
-        // retrieve the paging data
-        objectList.hasMoreItems = [jsonDictionary[@"hasMoreItems"] boolValue];
-        objectList.numItems = [jsonDictionary[@"numItems"] intValue];
     }
     
     return objectList;
 }
 
++ (NSArray *)renditionsFromJSONData:(NSData *)jsonData error:(NSError **)outError
+{
+    // TODO: error handling i.e. if jsonData is nil, also handle outError being nil
+    
+    // parse the JSON response
+    NSError *serialisationError = nil;
+    id jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&serialisationError];
+    
+    NSArray *renditions = nil;
+    if (!serialisationError) {
+        // parse the json into a CMISObjectData object
+        renditions = [CMISBrowserUtil renditionsFromArray:jsonDictionary];
+    }
+    
+    return renditions;
+}
+
 #pragma mark -
 #pragma mark Private helper methods
 
-+ (CMISObjectData *)objectDataFromDictionary:(NSDictionary *)dictionary
++ (CMISObjectData *)convertObject:(NSDictionary *)dictionary
 {
+    if(!dictionary) {
+        return nil;
+    }
+    
     CMISObjectData *objectData = [CMISObjectData new];
-    NSDictionary *propertiesJson = dictionary[@"succinctProperties"];
+    NSDictionary *propertiesJson = dictionary[kCMISBrowserJSONSuccinctProperties];
     objectData.identifier = propertiesJson[kCMISPropertyObjectId];
     
     // determine the object type
@@ -232,6 +279,50 @@
         objectData.baseType = CMISBaseTypeFolder;
     }
     
+    // set the properties
+    NSDictionary *propertiesExtension = dictionary[kCMISBrowserJSONPropertiesExtension];
+    objectData.properties = [CMISBrowserUtil convertSuccinctProperties:propertiesJson propertiesExtension:propertiesExtension];
+    
+    // relationships
+    NSArray *relationshipsJson = dictionary[kCMISBrowserJSONRelationships];
+    objectData.relationships = [CMISBrowserUtil convertObjects:relationshipsJson];
+    
+    //renditions
+    NSArray *renditionsJson = dictionary[kCMISBrowserJSONRenditions];
+    objectData.renditions = [self renditionsFromArray:renditionsJson];
+    
+    // handle extensions
+    objectData.extensions = [CMISBrowserUtil convertExtensions:dictionary cmisKeys:[CMISBrowserConstants objectKeys]];
+    
+    return objectData;
+}
+
++ (NSArray *)convertObjects:(NSArray *)json
+{
+    if (!json){
+        return nil;
+    }
+    
+    NSMutableArray *result = [[NSMutableArray alloc] init];
+    for (id obj in json) {
+        //TODO check if obj is NSDictionary or else abort with error
+        CMISObjectData *relationship = [CMISBrowserUtil convertObject:obj];
+        if(relationship){
+            [result addObject:relationship];
+        }
+    }
+    
+    return result;
+}
+
++ (CMISProperties *)convertSuccinctProperties:(NSDictionary *)propertiesJson propertiesExtension:(NSDictionary *)extJson
+{
+    if(!propertiesJson) {
+        return nil;
+    }
+    
+    // TODO convert properties according to typeDefinition
+    
     // create properties
     CMISProperties *properties = [CMISProperties new];
     NSArray *propNames = [propertiesJson allKeys];
@@ -248,10 +339,177 @@
         [properties addProperty:propertyData];
     }
     
-    // set the properties
-    objectData.properties = properties;
+    if(extJson){
+        properties.extensions = [CMISBrowserUtil convertExtensions:extJson cmisKeys:[NSSet set]];
+    }
     
-    return objectData;
+    return properties;
+}
+
++ (NSArray *)renditionsFromArray:(NSArray *)array
+{
+    if(!array) {
+        return nil;
+    }
+    NSMutableArray *renditions = [[NSMutableArray alloc] initWithCapacity:array.count];
+    for(NSDictionary *renditionJson in array){
+        CMISRenditionData *renditionData = [CMISRenditionData new];
+        renditionData.height = [NSNumber numberWithLongLong:[renditionJson[kCMISBrowserJSONRenditionHeight] longLongValue]];
+        renditionData.kind = renditionJson[kCMISBrowserJSONRenditionKind];
+        renditionData.length = [NSNumber numberWithLongLong:[renditionJson[kCMISBrowserJSONRenditionLength] longLongValue]];
+        renditionData.mimeType = renditionJson[kCMISBrowserJSONRenditionMimeType];
+        renditionData.renditionDocumentId = renditionJson[kCMISBrowserJSONRenditionDocumentId];
+        renditionData.streamId = renditionJson[kCMISBrowserJSONRenditionStreamId];
+        renditionData.title = renditionJson[kCMISBrowserJSONRenditionTitle];
+        renditionData.width = [NSNumber numberWithLongLong:[renditionJson[kCMISBrowserJSONRenditionWidth] longLongValue]];
+        
+        // handle extensions
+        renditionData.extensions = [CMISBrowserUtil convertExtensions:renditionJson cmisKeys:[CMISBrowserConstants renditionKeys]];
+        
+        [renditions addObject:renditionData];
+    }
+    
+    return renditions;
+}
+
++ (CMISPropertyDefinition *)convertPropertyDefinition:(NSDictionary *)propertyDictionary
+{
+    if(!propertyDictionary){
+        return nil;
+    }
+    
+    // create property definition and add to type definition
+    CMISPropertyDefinition *propDef = [CMISPropertyDefinition new];
+    propDef.id = propertyDictionary[kCMISBrowserJSONId];
+    propDef.localName = propertyDictionary[kCMISBrowserJSONLocalName];
+    propDef.localNamespace = propertyDictionary[kCMISBrowserJSONLocalNamespace];
+    propDef.queryName = propertyDictionary[kCMISBrowserJSONQueryName];
+    propDef.description = propertyDictionary[kCMISBrowserJSONDescription];
+    propDef.displayName = propertyDictionary[kCMISBrowserJSONDisplayName];
+    propDef.inherited = [propertyDictionary[kCMISBrowserJSONInherited] boolValue];
+    propDef.openChoice = [propertyDictionary[kCMISBrowserJSONOpenChoice] boolValue];
+    propDef.orderable = [propertyDictionary[kCMISBrowserJSONOrderable] boolValue];
+    propDef.queryable = [propertyDictionary[kCMISBrowserJSONQueryable] boolValue];
+    propDef.required = [propertyDictionary[kCMISBrowserJSONRequired] boolValue];
+    
+    // determine property type
+    NSString *typeString = propertyDictionary[kCMISBrowserJSONPropertyType];
+    if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueString]) {
+        propDef.propertyType = CMISPropertyTypeString;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueId]) {
+        propDef.propertyType = CMISPropertyTypeId;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueInteger]) {
+        propDef.propertyType = CMISPropertyTypeInteger;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueDecimal]) {
+        propDef.propertyType = CMISPropertyTypeDecimal;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueBoolean]) {
+        propDef.propertyType = CMISPropertyTypeBoolean;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueDateTime]) {
+        propDef.propertyType = CMISPropertyTypeDateTime;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueHtml]) {
+        propDef.propertyType = CMISPropertyTypeHtml;
+    } else if ([typeString isEqualToString:kCMISBrowserJSONPropertyTypeValueUri]) {
+        propDef.propertyType = CMISPropertyTypeUri;
+    }
+    
+    // determine cardinality
+    NSString *cardinalityString = propertyDictionary[kCMISBrowserJSONCardinality];
+    if ([cardinalityString isEqualToString:kCMISBrowserJSONCardinalityValueSingle]) {
+        propDef.cardinality = CMISCardinalitySingle;
+    } else if ([cardinalityString isEqualToString:kCMISBrowserJSONCardinalityValueMultiple]) {
+        propDef.cardinality = CMISCardinalityMulti;
+    }
+    
+    // determine updatability
+    NSString *updatabilityString = propertyDictionary[kCMISBrowserJSONUpdateability];
+    if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueReadOnly]) {
+        propDef.updatability = CMISUpdatabilityReadOnly;
+    } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueReadWrite]) {
+        propDef.updatability = CMISUpdatabilityReadWrite;
+    } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueOnCreate]) {
+        propDef.updatability = CMISUpdatabilityOnCreate;
+    } else if ([updatabilityString isEqualToString:kCMISBrowserJSONUpdateabilityValueWhenCheckedOut]) {
+        propDef.updatability = CMISUpdatabilityWhenCheckedOut;
+    }
+    
+    // TODO default value
+    
+    // handle extensions
+    propDef.extensions = [CMISBrowserUtil convertExtensions:propertyDictionary cmisKeys:[CMISBrowserConstants propertyTypeKeys]];
+    
+    return propDef;
+}
+
++ (NSArray *)convertExtensions:(NSDictionary *)source cmisKeys:(NSSet *)cmisKeys
+{
+    if (!source) {
+        return nil;
+    }
+    
+    NSMutableArray *extensions = nil; // array of CMISExtensionElement's
+    
+    for (NSString *key in source.keyEnumerator) {
+        if ([cmisKeys containsObject:key]) {
+            continue;
+        }
+        
+        if (!extensions) {
+            extensions = [[NSMutableArray alloc] init];
+        }
+        
+        id value = source[key];
+        if ([value isKindOfClass:NSDictionary.class]) {
+            [extensions addObject:[[CMISExtensionElement alloc] initNodeWithName:key namespaceUri:nil attributes:nil children:[CMISBrowserUtil convertExtension:value]]];
+        } else if ([value isKindOfClass:NSArray.class]) {
+            [extensions addObjectsFromArray:[CMISBrowserUtil convertExtension: key fromArray:value]];
+        } else {
+            [extensions addObject:[[CMISExtensionElement alloc] initLeafWithName:key namespaceUri:nil attributes:nil value:value]];
+        }
+    }
+    return extensions;
+}
+
++ (NSArray *)convertExtension:(NSDictionary *)dictionary
+{
+    if (!dictionary) {
+        return nil;
+    }
+    
+    NSMutableArray *extensions = [[NSMutableArray alloc] init]; // array of CMISExtensionElement's
+    
+    for (NSString *key in dictionary.keyEnumerator) {
+        id value = dictionary[key];
+        if ([value isKindOfClass:NSDictionary.class]) {
+            [extensions addObject:[[CMISExtensionElement alloc] initNodeWithName:key namespaceUri:nil attributes:nil children:[CMISBrowserUtil convertExtension:value]]];
+        } else if ([value isKindOfClass:NSArray.class]) {
+            [extensions addObjectsFromArray:[CMISBrowserUtil convertExtension: key fromArray:value]];
+        } else {
+            [extensions addObject:[[CMISExtensionElement alloc] initLeafWithName:key namespaceUri:nil attributes:nil value:value]];
+        }
+    }
+    
+    return extensions;
+}
+
++ (NSArray *)convertExtension:(NSString *)key fromArray:(NSArray *)array
+{
+    if (!array) {
+        return nil;
+    }
+    
+    NSMutableArray *extensions = [[NSMutableArray alloc] init]; // array of CMISExtensionElement's
+    
+    for (id element in array) {
+        if ([element isKindOfClass:NSDictionary.class]) {
+            [extensions addObject:[[CMISExtensionElement alloc] initNodeWithName:key namespaceUri:nil attributes:nil children:[CMISBrowserUtil convertExtension:element]]];
+        } else if ([element isKindOfClass:NSArray.class]) {
+            [extensions addObjectsFromArray:[CMISBrowserUtil convertExtension: key fromArray:element]];
+        } else {
+            [extensions addObject:[[CMISExtensionElement alloc] initLeafWithName:key namespaceUri:nil attributes:nil value:element]];
+        }
+    }
+    
+    return extensions;
 }
 
 @end
diff --git a/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m b/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
index 658d3cd..f04ddc5 100644
--- a/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
+++ b/ObjectiveCMIS/Bindings/Browser/CMISBrowserVersioningService.m
@@ -18,6 +18,12 @@
  */
 
 #import "CMISBrowserVersioningService.h"
+#import "CMISRequest.h"
+#import "CMISBrowserConstants.h"
+#import "CMISHttpResponse.h"
+#import "CMISBrowserUtil.h"
+#import "CMISURLUtil.h"
+#import "CMISConstants.h"
 
 @implementation CMISBrowserVersioningService
 
@@ -31,19 +37,70 @@
                       includeAllowableActions:(BOOL)includeAllowableActions
                               completionBlock:(void (^)(CMISObjectData *objectData, NSError *error))completionBlock
 {
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+    NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorObject];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions boolValue:includeAllowableActions urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeRelationships value:[CMISEnums stringForIncludeRelationShip:relationships] urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterRenditionFilter value:renditionFilter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludePolicyIds boolValue:includePolicyIds urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAcl boolValue:includeACL urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterReturnVersion value:[CMISEnums stringForReturnVersion:major] urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:kCMISParameterValueTrue urlString:objectUrl];
+    
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           NSError *parsingError = nil;
+                                           CMISObjectData *objectData = [CMISBrowserUtil objectDataFromJSONData:httpResponse.data error:&parsingError];
+                                           if (parsingError)
+                                           {
+                                               completionBlock(nil, parsingError);
+                                           } else {
+                                               completionBlock(objectData, nil);
+                                           }
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
+                                   }];
+    
+    return cmisRequest;
 }
 
 - (CMISRequest*)retrieveAllVersions:(NSString *)objectId
                              filter:(NSString *)filter
             includeAllowableActions:(BOOL)includeAllowableActions
                     completionBlock:(void (^)(NSArray *objects, NSError *error))completionBlock
-{
-    NSString * message = [NSString stringWithFormat:@"%s is not implemented yet", __PRETTY_FUNCTION__];
-    NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException reason:message userInfo:nil];
-    @throw exception;
+{    
+    NSString *objectUrl = [self getObjectUrlObjectId:objectId selector:kCMISBrowserJSONSelectorVersions];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterFilter value:filter urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterIncludeAllowableActions value:(includeAllowableActions ? @"true" : @"false") urlString:objectUrl];
+    objectUrl = [CMISURLUtil urlStringByAppendingParameter:kCMISParameterSuccinct value:@"true" urlString:objectUrl];
+    
+    CMISRequest *cmisRequest = [[CMISRequest alloc] init];
+    
+    [self.bindingSession.networkProvider invokeGET:[NSURL URLWithString:objectUrl]
+                                           session:self.bindingSession
+                                       cmisRequest:cmisRequest
+                                   completionBlock:^(CMISHttpResponse *httpResponse, NSError *error) {
+                                       if (httpResponse.statusCode == 200 && httpResponse.data) {
+                                           NSError *parsingError = nil;
+                                           CMISObjectList *objectList = [CMISBrowserUtil objectListFromJSONData:httpResponse.data error:&parsingError];
+                                           if (!objectList.objects)
+                                           {
+                                               completionBlock(nil, parsingError);
+                                           } else {
+                                               completionBlock(objectList.objects, nil);
+                                           }
+                                       } else {
+                                           completionBlock(nil, error);
+                                       }
+                                   }];
+    
+    return cmisRequest;
 }
 
 /**
diff --git a/ObjectiveCMIS/Bindings/CMISBindingSession.h b/ObjectiveCMIS/Bindings/CMISBindingSession.h
index 68c459f..7551aab 100644
--- a/ObjectiveCMIS/Bindings/CMISBindingSession.h
+++ b/ObjectiveCMIS/Bindings/CMISBindingSession.h
@@ -26,6 +26,7 @@
 extern NSString * const kCMISBindingSessionKeyUrl;
 extern NSString * const kCMISBindingSessionKeyObjectByIdUriBuilder;
 extern NSString * const kCMISBindingSessionKeyObjectByPathUriBuilder;
+extern NSString * const kCMISBindingSessionKeyChildrenByIdUriBuilder;
 extern NSString * const kCMISBindingSessionKeyTypeByIdUriBuilder;
 
 @interface CMISBindingSession : NSObject
diff --git a/ObjectiveCMIS/Bindings/CMISBindingSession.m b/ObjectiveCMIS/Bindings/CMISBindingSession.m
index cff188e..87d9005 100644
--- a/ObjectiveCMIS/Bindings/CMISBindingSession.m
+++ b/ObjectiveCMIS/Bindings/CMISBindingSession.m
@@ -22,6 +22,7 @@
 NSString * const kCMISBindingSessionKeyUrl = @"cmis_session_key_url";
 NSString * const kCMISBindingSessionKeyObjectByIdUriBuilder = @"cmis_session_key_objectbyid_uri_builder";
 NSString * const kCMISBindingSessionKeyObjectByPathUriBuilder = @"cmis_session_key_objectbypath_uri_builder";
+NSString * const kCMISBindingSessionKeyChildrenByIdUriBuilder = @"cmis_session_key_childrenbyid_uri_builder";
 NSString * const kCMISBindingSessionKeyTypeByIdUriBuilder = @"cmis_session_key_type_by_id_uri_builder";
 
 @interface CMISBindingSession ()
diff --git a/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.h
new file mode 100644
index 0000000..9d665fb
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.h
@@ -0,0 +1,26 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISFolderTypeDefinition : CMISTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.m
new file mode 100644
index 0000000..9aec7fb
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISFolderTypeDefinition.m
@@ -0,0 +1,24 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISFolderTypeDefinition.h"
+
+@implementation CMISFolderTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.h
new file mode 100644
index 0000000..ff46af2
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.h
@@ -0,0 +1,26 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISItemTypeDefinition : CMISTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.m
new file mode 100644
index 0000000..9b6ae5b
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISItemTypeDefinition.m
@@ -0,0 +1,24 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISItemTypeDefinition.h"
+
+@implementation CMISItemTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h b/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
index 5164e80..99b8103 100644
--- a/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
+++ b/ObjectiveCMIS/Bindings/CMISPropertyDefinition.h
@@ -19,10 +19,11 @@
 
 #import <Foundation/Foundation.h>
 #import "CMISEnums.h"
+#import "CMISExtensionData.h"
 
 
 // TODO: type specific properties, see cmis spec line 527
-@interface CMISPropertyDefinition : NSObject
+@interface CMISPropertyDefinition : CMISExtensionData
 
 
 @property (nonatomic, strong) NSString *id;
diff --git a/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.h
new file mode 100644
index 0000000..245bdb8
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.h
@@ -0,0 +1,29 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISRelationshipTypeDefinition : CMISTypeDefinition
+
+@property (nonatomic, strong) NSArray * allowedSourceTypes;
+@property (nonatomic, strong) NSArray * allowedTargetTypes;
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.m
new file mode 100644
index 0000000..df39d7f
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISRelationshipTypeDefinition.m
@@ -0,0 +1,24 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISRelationshipTypeDefinition.h"
+
+@implementation CMISRelationshipTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISRenditionData.h b/ObjectiveCMIS/Bindings/CMISRenditionData.h
index 4d5f7fc..868fc34 100644
--- a/ObjectiveCMIS/Bindings/CMISRenditionData.h
+++ b/ObjectiveCMIS/Bindings/CMISRenditionData.h
@@ -18,9 +18,9 @@
  */
  
 #import <Foundation/Foundation.h>
+#import "CMISExtensionData.h"
 
-
-@interface CMISRenditionData : NSObject
+@interface CMISRenditionData : CMISExtensionData
 
 /**  Identifies the rendition stream. */
 @property (nonatomic, strong) NSString *streamId;
diff --git a/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.h
new file mode 100644
index 0000000..32174f3
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.h
@@ -0,0 +1,26 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "CMISEnums.h"
+#import "CMISTypeDefinition.h"
+
+@interface CMISSecondaryTypeDefinition : CMISTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.m
new file mode 100644
index 0000000..424ad5c
--- /dev/null
+++ b/ObjectiveCMIS/Bindings/CMISSecondaryTypeDefinition.m
@@ -0,0 +1,24 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CMISSecondaryTypeDefinition.h"
+
+@implementation CMISSecondaryTypeDefinition
+
+@end
diff --git a/ObjectiveCMIS/Bindings/CMISTypeDefinition.h b/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
index 1a07969..c2446e4 100644
--- a/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
+++ b/ObjectiveCMIS/Bindings/CMISTypeDefinition.h
@@ -19,11 +19,12 @@
 
 #import <Foundation/Foundation.h>
 #import "CMISEnums.h"
+#import "CMISExtensionData.h"
 
 @class CMISPropertyDefinition;
 
 
-@interface CMISTypeDefinition : NSObject
+@interface CMISTypeDefinition : CMISExtensionData
 
 // TODO: rename "id" property to identifier as id is a reserved keyword in ObjectiveC
 // TODO: rename "description" property to summary as description is a reserved keyword in ObjectiveC
@@ -35,6 +36,7 @@
 @property (nonatomic, strong) NSString *queryName;
 @property (nonatomic, strong) NSString *description;
 @property (nonatomic, assign) CMISBaseType baseTypeId;
+@property (nonatomic, strong) NSString *parentTypeId;
 
 @property (nonatomic, assign, getter = isCreatable) BOOL creatable;
 @property (nonatomic, assign, getter = isFileable) BOOL fileable;
diff --git a/ObjectiveCMIS/Bindings/CMISTypeDefinition.m b/ObjectiveCMIS/Bindings/CMISTypeDefinition.m
index 8fe5c1a..ac31660 100644
--- a/ObjectiveCMIS/Bindings/CMISTypeDefinition.m
+++ b/ObjectiveCMIS/Bindings/CMISTypeDefinition.m
@@ -47,4 +47,13 @@
     return [self.internalPropertyDefinitions objectForKey:propertyId];
 }
 
+-(void)setParentTypeId:(NSString *)parentTypeId
+{
+    if (!parentTypeId || parentTypeId.length == 0) {
+        _parentTypeId = nil;
+    } else {
+        _parentTypeId = parentTypeId;
+    }
+}
+
 @end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISConstants.h b/ObjectiveCMIS/Common/CMISConstants.h
index 57566d6..09eda93 100644
--- a/ObjectiveCMIS/Common/CMISConstants.h
+++ b/ObjectiveCMIS/Common/CMISConstants.h
@@ -45,7 +45,50 @@
 // Property values
 extern NSString * const kCMISPropertyObjectTypeIdValueDocument;
 extern NSString * const kCMISPropertyObjectTypeIdValueFolder;
+extern NSString * const kCMISPropertyObjectTypeIdValueRelationship;
+extern NSString * const kCMISPropertyObjectTypeIdValuePolicy;
+extern NSString * const kCMISPropertyObjectTypeIdValueItem;
+extern NSString * const kCMISPropertyObjectTypeIdValueSecondary;
 
 // Session cache keys
 
 extern NSString * const kCMISSessionKeyWorkspaces;
+
+// URL parameters
+extern NSString * const kCMISParameterChangeToken;
+extern NSString * const kCMISParameterOverwriteFlag;
+extern NSString * const kCMISParameterIncludeAllowableActions;
+extern NSString * const kCMISParameterFilter;
+extern NSString * const kCMISParameterMaxItems;
+extern NSString * const kCMISParameterObjectId;
+extern NSString * const kCMISParameterOrderBy;
+extern NSString * const kCMISParameterIncludePathSegment;
+extern NSString * const kCMISParameterIncludeRelationships;
+extern NSString * const kCMISParameterIncludePolicyIds;
+extern NSString * const kCMISParameterIncludeAcl;
+extern NSString * const kCMISParameterRenditionFilter;
+extern NSString * const kCMISParameterSkipCount;
+extern NSString * const kCMISParameterStreamId;
+extern NSString * const kCMISParameterAllVersions;
+extern NSString * const kCMISParameterContinueOnFailure;
+extern NSString * const kCMISParameterUnfileObjects;
+extern NSString * const kCMISParameterRelativePathSegment;
+extern NSString * const kCMISParameterMajor;
+extern NSString * const kCMISParameterCheckin;
+extern NSString * const kCMISParameterCheckinComment;
+extern NSString * const kCMISParameterSelector;
+extern NSString * const kCMISParameterSuccinct;
+extern NSString * const kCMISParameterReturnVersion;
+extern NSString * const kCMISParameterTypeId;
+
+// Parameter Values
+extern NSString * const kCMISParameterValueTrue;
+extern NSString * const kCMISParameterValueFalse;
+extern NSString * const kCMISParameterValueReturnValueThis;
+extern NSString * const kCMISParameterValueReturnValueLatest;
+extern NSString * const kCMISParameterValueReturnValueLatestMajor;
+
+//ContentStreamAllowed enum values
+extern NSString * const kCMISContentStreamAllowedValueRequired;
+extern NSString * const kCMISContentStreamAllowedValueAllowed;
+extern NSString * const kCMISContentStreamAllowedValueNotAllowed;
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISConstants.m b/ObjectiveCMIS/Common/CMISConstants.m
index 18c4d46..a5fa66f 100644
--- a/ObjectiveCMIS/Common/CMISConstants.m
+++ b/ObjectiveCMIS/Common/CMISConstants.m
@@ -49,8 +49,50 @@
 
 NSString * const kCMISPropertyObjectTypeIdValueDocument = @"cmis:document";
 NSString * const kCMISPropertyObjectTypeIdValueFolder = @"cmis:folder";
+NSString * const kCMISPropertyObjectTypeIdValueRelationship = @"cmis:relationship";
+NSString * const kCMISPropertyObjectTypeIdValuePolicy = @"cmis:policy";
+NSString * const kCMISPropertyObjectTypeIdValueItem = @"cmis:item";
+NSString * const kCMISPropertyObjectTypeIdValueSecondary = @"cmis:secondary";
 
 // Session cache keys
 
 NSString * const kCMISSessionKeyWorkspaces = @"cmis_session_key_workspaces";
 
+// Parameters
+NSString * const kCMISParameterChangeToken = @"changeToken";
+NSString * const kCMISParameterOverwriteFlag = @"overwriteFlag";
+NSString * const kCMISParameterIncludeAllowableActions = @"includeAllowableActions";
+NSString * const kCMISParameterFilter = @"filter";
+NSString * const kCMISParameterMaxItems = @"maxItems";
+NSString * const kCMISParameterObjectId = @"objectId";
+NSString * const kCMISParameterOrderBy = @"orderBy";
+NSString * const kCMISParameterIncludePathSegment = @"includePathSegment";
+NSString * const kCMISParameterIncludeRelationships = @"includeRelationships";
+NSString * const kCMISParameterIncludePolicyIds = @"includePolicyIds";
+NSString * const kCMISParameterIncludeAcl = @"includeACL";
+NSString * const kCMISParameterRenditionFilter = @"renditionFilter";
+NSString * const kCMISParameterSkipCount = @"skipCount";
+NSString * const kCMISParameterStreamId = @"streamId";
+NSString * const kCMISParameterAllVersions = @"allVersions";
+NSString * const kCMISParameterContinueOnFailure= @"continueOnFailure";
+NSString * const kCMISParameterUnfileObjects = @"unfileObjects";
+NSString * const kCMISParameterRelativePathSegment = @"includeRelativePathSegment";
+NSString * const kCMISParameterMajor = @"major";
+NSString * const kCMISParameterCheckin = @"checkin";
+NSString * const kCMISParameterCheckinComment = @"checkinComment";
+NSString * const kCMISParameterSelector = @"cmisselector";
+NSString * const kCMISParameterSuccinct = @"succinct";
+NSString * const kCMISParameterReturnVersion = @"returnVersion";
+NSString * const kCMISParameterTypeId = @"typeId";
+
+// Parameter Values
+NSString * const kCMISParameterValueTrue = @"true";
+NSString * const kCMISParameterValueFalse = @"false";
+NSString * const kCMISParameterValueReturnValueThis = @"this";
+NSString * const kCMISParameterValueReturnValueLatest = @"latest";
+NSString * const kCMISParameterValueReturnValueLatestMajor = @"latestmajor";
+
+//ContentStreamAllowed enum values
+NSString * const kCMISContentStreamAllowedValueRequired = @"required";
+NSString * const kCMISContentStreamAllowedValueAllowed = @"allowed";
+NSString * const kCMISContentStreamAllowedValueNotAllowed = @"notallowed";
diff --git a/ObjectiveCMIS/Common/CMISEnums.h b/ObjectiveCMIS/Common/CMISEnums.h
index 2a81cab..566021e 100644
--- a/ObjectiveCMIS/Common/CMISEnums.h
+++ b/ObjectiveCMIS/Common/CMISEnums.h
@@ -30,10 +30,13 @@
 // Base type
 typedef NS_ENUM(NSInteger, CMISBaseType)
 {
+    CMISBaseTypeUnknown,
     CMISBaseTypeDocument,
     CMISBaseTypeFolder,
     CMISBaseTypeRelationship,
-    CMISBaseTypePolicy
+    CMISBaseTypePolicy,
+    CMISBaseTypeItem,
+    CMISBaseTypeSecondary
 };
 
 typedef NS_ENUM(NSInteger, CMISIncludeRelationship)
@@ -141,12 +144,25 @@
 {
     CMISContentStreamNotAllowed,
     CMISContentStreamAllowed,
-    CMISContentStreamRequired
+    CMISContentStreamRequired,
+    CMISContentStreamUnknown
+};
+
+// ReturnVersion
+typedef NS_ENUM(NSInteger, CMISReturnVersion)
+{
+    NOT_PROVIDED,
+    THIS,
+    LATEST,
+    LATEST_MAJOR
 };
 
 @interface CMISEnums : NSObject 
 
 + (NSString *)stringForIncludeRelationShip:(CMISIncludeRelationship)includeRelationship;
 + (NSString *)stringForUnfileObject:(CMISUnfileObject)unfileObject;
++ (NSString *)stringForReturnVersion:(BOOL)major;
++ (CMISBaseType)enumForBaseId:(NSString *)baseId;
++ (CMISContentStreamAllowedType)enumForContentStreamAllowed:(NSString *)contentStreamAllowed;
 
 @end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISEnums.m b/ObjectiveCMIS/Common/CMISEnums.m
index 305b19b..c41c509 100644
--- a/ObjectiveCMIS/Common/CMISEnums.m
+++ b/ObjectiveCMIS/Common/CMISEnums.m
@@ -19,6 +19,7 @@
 
 #import "CMISEnums.h"
 #import "CMISLog.h"
+#import "CMISConstants.h"
 
 @implementation CMISEnums
 
@@ -65,4 +66,41 @@
     return unfileObjectString;
 }
 
++ (NSString *)stringForReturnVersion:(BOOL)major
+{
+    return major == NO ? kCMISParameterValueReturnValueLatest : kCMISParameterValueReturnValueLatestMajor;
+}
+
++ (CMISBaseType)enumForBaseId:(NSString *)baseId
+{
+    if([kCMISPropertyObjectTypeIdValueDocument isEqualToString:baseId]) {
+        return CMISBaseTypeDocument;
+    } else if([kCMISPropertyObjectTypeIdValueFolder isEqualToString:baseId]) {
+        return CMISBaseTypeFolder;
+    } else if([kCMISPropertyObjectTypeIdValueRelationship isEqualToString:baseId]) {
+        return CMISBaseTypeRelationship;
+    } else if([kCMISPropertyObjectTypeIdValuePolicy isEqualToString:baseId]) {
+        return CMISBaseTypePolicy;
+    } else if([kCMISPropertyObjectTypeIdValueItem isEqualToString:baseId]) {
+        return CMISBaseTypeItem;
+    } else if([kCMISPropertyObjectTypeIdValueSecondary isEqualToString:baseId]) {
+        return CMISBaseTypeSecondary;
+    } else {
+        return CMISBaseTypeUnknown;
+    }
+}
+
++ (CMISContentStreamAllowedType)enumForContentStreamAllowed:(NSString *)contentStreamAllowed
+{
+    if([kCMISContentStreamAllowedValueAllowed isEqualToString:contentStreamAllowed]) {
+        return CMISContentStreamAllowed;
+    } else if([kCMISContentStreamAllowedValueNotAllowed isEqualToString:contentStreamAllowed]) {
+        return CMISContentStreamNotAllowed;
+    } else if([kCMISContentStreamAllowedValueRequired isEqualToString:contentStreamAllowed]) {
+        return CMISContentStreamRequired;
+    } else {
+        return CMISContentStreamUnknown;
+    }
+}
+
 @end
\ No newline at end of file
diff --git a/ObjectiveCMIS/Common/CMISObjectData.h b/ObjectiveCMIS/Common/CMISObjectData.h
index de589c9..f16161b 100644
--- a/ObjectiveCMIS/Common/CMISObjectData.h
+++ b/ObjectiveCMIS/Common/CMISObjectData.h
@@ -37,5 +37,6 @@
 @property (nonatomic, strong) CMISAllowableActions *allowableActions;
 @property (nonatomic, strong) CMISAcl *acl;
 @property (nonatomic, strong) NSArray *renditions; // An array containing CMISRenditionData objects
+@property (nonatomic, strong) NSArray *relationships; // An array containing CMISObjectData objects; Relationships from and to this object.
 
 @end
diff --git a/ObjectiveCMIS/Common/CMISRepositoryInfo.h b/ObjectiveCMIS/Common/CMISRepositoryInfo.h
index f94897a..02f9b05 100644
--- a/ObjectiveCMIS/Common/CMISRepositoryInfo.h
+++ b/ObjectiveCMIS/Common/CMISRepositoryInfo.h
@@ -26,11 +26,15 @@
 @property (nonatomic, strong) NSString *name;
 @property (nonatomic, strong) NSString *desc;
 @property (nonatomic, strong) NSString *rootFolderId;
+@property (nonatomic, strong) NSString *rootFolderUrl;
+@property (nonatomic, strong) NSString *repositoryUrl;
 
 @property (nonatomic, strong) NSString *cmisVersionSupported;
 @property (nonatomic, strong) NSString *productName;
 @property (nonatomic, strong) NSString *productVersion;
 @property (nonatomic, strong) NSString *vendorName;
+@property (nonatomic, strong) NSString *thinClientUri;
+@property (nonatomic, strong) NSString *latestChangeLogToken;
 
 /**
  * Returns principal ID for an anonymous user (any authenticated user). This
diff --git a/ObjectiveCMIS/Utils/CMISURLUtil.h b/ObjectiveCMIS/Utils/CMISURLUtil.h
index 78fe684..6551467 100644
--- a/ObjectiveCMIS/Utils/CMISURLUtil.h
+++ b/ObjectiveCMIS/Utils/CMISURLUtil.h
@@ -21,8 +21,15 @@
 
 
 @interface CMISURLUtil : NSObject
-/// utility method to obtain a URL string
+/// utility method to obtain a URL string for given parameter and string value
 + (NSString *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue urlString:(NSString *)urlString;
+/// convenient utility method to obtain a URL string for given parameter and boolean value
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName boolValue:(BOOL)parameterValue urlString:(NSString *)urlString;
+/// convenient utility method to obtain a URL string for given parameter and boolean value
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName numberValue:(NSNumber *)parameterValue urlString:(NSString *)urlString;
+/// utility method to obtain a URL string by appending the given path
++ (NSString *)urlStringByAppendingPath:(NSString *)path urlString:(NSString *)urlString;
+
 /// utility method to obtain a URL string
 + (NSURL *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue url:(NSURL *)url;
 
diff --git a/ObjectiveCMIS/Utils/CMISURLUtil.m b/ObjectiveCMIS/Utils/CMISURLUtil.m
index 68b0594..69eaf4d 100644
--- a/ObjectiveCMIS/Utils/CMISURLUtil.m
+++ b/ObjectiveCMIS/Utils/CMISURLUtil.m
@@ -18,10 +18,21 @@
  */
  
 #import "CMISURLUtil.h"
+#import "CMISConstants.h"
 
 
 @implementation CMISURLUtil
 
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName boolValue:(BOOL)parameterValue urlString:(NSString *)urlString
+{
+    return [CMISURLUtil urlStringByAppendingParameter:parameterName value:parameterValue ? kCMISParameterValueTrue : kCMISParameterValueFalse urlString:urlString];
+}
+
++ (NSString *)urlStringByAppendingParameter:(NSString *)parameterName numberValue:(NSNumber *)parameterValue urlString:(NSString *)urlString
+{
+    return [CMISURLUtil urlStringByAppendingParameter:parameterName value:[parameterValue stringValue] urlString:urlString];
+}
+
 + (NSString *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue urlString:(NSString *)urlString
 {
     if (parameterName == nil || parameterValue == nil) {
@@ -34,7 +45,9 @@
     if ([result rangeOfString:@"?"].location == NSNotFound) {
         [result appendString:@"?"];
     } else {
-        [result appendString:@"&"];
+        if([result rangeOfString:@"?"].location != result.length -1){ // Only add ampersand if there is already a parameter added
+            [result appendString:@"&"];
+        }
     }
 
     // Append param
@@ -45,6 +58,13 @@
     return result;
 }
 
++ (NSString *)urlStringByAppendingPath:(NSString *)path urlString:(NSString *)urlString
+{
+    NSURL *url = [[NSURL URLWithString:urlString] URLByAppendingPathComponent:path];
+    
+    return [url absoluteString];
+}
+
 + (NSURL *)urlStringByAppendingParameter:(NSString *)parameterName value:(NSString *)parameterValue url:(NSURL *)url
 {
     return [NSURL URLWithString:[CMISURLUtil urlStringByAppendingParameter:parameterName value:parameterValue urlString:[url absoluteString]]];
diff --git a/ObjectiveCMISTests/ObjectiveCMISTests.m b/ObjectiveCMISTests/ObjectiveCMISTests.m
index 1cdbb00..2dfd098 100644
--- a/ObjectiveCMISTests/ObjectiveCMISTests.m
+++ b/ObjectiveCMISTests/ObjectiveCMISTests.m
@@ -42,6 +42,7 @@
 #import "CMISErrors.h"
 #import "CMISDateUtil.h"
 #import "CMISLog.h"
+#import "CMISURLUtil.h"
 
 @interface ObjectiveCMISTests ()
 
@@ -295,22 +296,22 @@
                     }
                     
                     
-                    // Bug on Alfresco server. Uncomment when fixed.
                     // Fetch third page, just to be sure
-                    //    CMISPagedResult *thirdPageResult = [secondPageResult fetchNextPageAndReturnError:&error];
-                    //    STAssertNil(error, @"Got error while retrieving children: %@", [error description]);
-                    //    STAssertTrue(thirdPageResult.hasMoreItems, @"There should still be more children");
-                    //    STAssertTrue(thirdPageResult.numItems > 6, @"The test repository should have more than 6 objects");
-                    //    STAssertTrue(thirdPageResult.resultArray.count == 2, @"Expected 2 children in the page, but got %d", thirdPageResult.resultArray.count);
-                    //
-                    //    // Verify if no double object ids were found
-                    //    for (CMISObject *object in thirdPageResult.resultArray)
-                    //    {
-                    //        STAssertTrue(![objectIds containsObject:object.identifier], @"Object was already returned in a previous page. This is a serious impl bug!");
-                    //        [objectIds addObject:object.identifier];
-                    //    }
+                    [secondPageResult fetchNextPageWithCompletionBlock:^(CMISPagedResult *thirdPageResult, NSError *error) {
+                        XCTAssertNil(error, @"Got error while retrieving children: %@", [error description]);
+                        XCTAssertTrue(thirdPageResult.hasMoreItems, @"There should still be more children");
+                        XCTAssertTrue(thirdPageResult.numItems > 6, @"The test repository should have more than 6 objects");
+                        XCTAssertTrue(thirdPageResult.resultArray.count == 2, @"Expected 2 children in the page, but got %lu", (unsigned long)thirdPageResult.resultArray.count);
                     
-                    self.testCompleted = YES;
+                        // Verify if no double object ids were found
+                        for (CMISObject *object in thirdPageResult.resultArray)
+                        {
+                            XCTAssertTrue(![objectIds containsObject:object.identifier], @"Object was already returned in a previous page. This is a serious impl bug!");
+                            [objectIds addObject:object.identifier];
+                        }
+                        
+                        self.testCompleted = YES;
+                    }];
                 }];
             }];
         }];
@@ -338,7 +339,7 @@
             XCTAssertNotNil(document.versionSeriesId, @"Document version series id should not be nil");
             XCTAssertTrue(document.isLatestVersion, @"Document should be latest version");
             //XCTAssertFalse(document.isLatestMajorVersion, @"Document should be latest major version");
-            XCTAssertFalse(document.isMajorVersion, @"Document should be major version");
+            XCTAssertFalse(document.isMajorVersion, @"Document should not be major version");
             
             XCTAssertNotNil(document.contentStreamId, @"Document content stream id should not be nil");
             XCTAssertNotNil(document.contentStreamFileName, @"Document content stream file name should not be nil");
@@ -1879,4 +1880,53 @@
     }];
 }
 
+-(void)testUrlUtilAppendParameter
+{
+    NSString *path;
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"scheme://host:12345/path?"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path?param1=value1", @"expected url with with one parameter and it's value");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"scheme://host:12345/path"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path?param1=value1", @"expected url with with one parameter and it's value");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"param2" value:@"value2" urlString:@"scheme://host:12345/path?param1=value1"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path?param1=value1&param2=value2", @"expected url with with two parameters plus value");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"umlautParam" value:@"välüe1" urlString:@"scheme://host:12345/path"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path?umlautParam=v%C3%A4l%C3%BCe1", @"expected url with with encoded value");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:nil value:@"paramIsNil" urlString:@"scheme://host:12345/path"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path", @"expected url not to be modified as parameter is nil");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"valueIsNil" value:nil urlString:@"scheme://host:12345/path"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path", @"expected url not to be modified as value is nil");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"scheme://host/"];
+    XCTAssertEqualObjects(path, @"scheme://host/?param1=value1", @"expected url (no port) with with one parameter and it's value");
+    
+    path = [CMISURLUtil urlStringByAppendingParameter:@"param1" value:@"value1" urlString:@"https://example.com:12345/path1/path2"];
+    XCTAssertEqualObjects(path, @"https://example.com:12345/path1/path2?param1=value1", @"expected url with with one parameter and it's value");
+}
+
+-(void)testUrlUtilAppendPath
+{
+    NSString *path;
+    
+    path = [CMISURLUtil urlStringByAppendingPath:@"aPath" urlString:@"scheme://host:12345?"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/aPath?", @"expected url with path");
+    
+    path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path?"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath?", @"expected url with sub path component");
+    
+    path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath", @"expected url with sub path component");
+    
+    path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path/"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath", @"expected url with sub path component");
+    
+    path = [CMISURLUtil urlStringByAppendingPath:@"subPath" urlString:@"scheme://host:12345/path?parm1=value1"];
+    XCTAssertEqualObjects(path, @"scheme://host:12345/path/subPath?parm1=value1", @"expected url with sub path component, parmater and it's value");
+}
+
 @end