anchor.diff:  		string throwOnRequestError = true,
   		boolean autoContentType    = false,
   		boolean autoMD5            = false,
  +		string serviceName         = "s3",
   		boolean debug              = false
   	) {
  +		if ( arguments.awsDomain == "amazonaws.com" && arguments.awsRegion == "" ) {
  +			arguments.awsRegion = "us-east-1";
  +		}
   		variables.accessKey           = arguments.accessKey;
   		variables.secretKey           = arguments.secretKey;
   		variables.encryption_charset  = arguments.encryption_charset;
  -		variables.signature           = arguments.signature;
  +		variables.signatureType       = arguments.signatureType;
   		variables.awsDomain           = arguments.awsDomain;
   		variables.awsRegion           = arguments.awsRegion;
   		variables.defaultTimeOut      = arguments.defaultTimeOut;
  
positive.code: 		return toBase64( result );
  	}
  
  	/**
  	 * Generates a version 2 signature and returns headers for the request
  	 *
  	 *  @requestMethod   - Request operation, ie PUT, GET, POST, etcetera.
  	 *  @requestURI      - Absolute path of the URI. Portion of the URL after the host, to the "?" beginning the query string
  	 *  @requestHeaders  - Structure of http headers for used the request.
  	 *  @requestParams   - Structure containing any url parameters for the request.
  	 *  @amzHeaders      - Structure containing any amazon headers used to build the signature.
  	 */
  	struct function generateBasicSignatureData(
  		required string requestMethod,
  		required string requestURI,
  		required struct requestHeaders,
  		required struct requestParams,
  		required struct amzHeaders
  	) {
  		var out = {
  			amzDate        : getHTTPTimeString( now() ),
  			requestHeaders : arguments.requestHeaders,
  			requestParams  : arguments.requestParams,
  			canonical      : ""
  		};
  
  		for ( header in structSort( arguments.amzHeaders, "text", "asc" ) ) {
  			out.canonical &= lCase( trim( header ) ) & ":" & arguments.amzHeaders[ header ] & chr( 10 );
  		};
  
  		out.cs = arguments.requestMethod & chr( 10 )
  		& ( arguments.requestHeaders[ "content-md5" ] ?: "" ) & chr( 10 )
  		& ( arguments.requestHeaders[ "content-type" ] ?: "" ) & chr( 10 )
  		& out.amzDate & chr( 10 )
  		& out.canonical
  		& "/" & arguments.requestURI;
  
  		//  Calculate the hash of the information
  		out.digest              = hMAC_SHA1( variables.secretKey, out.cs );
  		//  fix the returned data to be a proper signature
  		out.signature           = toBase64( out.digest );
  		out.authorizationHeader = "AWS #variables.accessKey#:#out.signature#";
  
  		if ( log.canDebug() ) {
  			log.debug( "Created basic v2 signature", out );
  		}
  
  		return out;
  	}
  
  	/**
  	 * Helper function to catch missing bucket name
  
negative.code: 	struct function downloadObject(
  		required string bucketName = variables.defaultBucketName,
  		required string uri,
  		required string filepath
  	) {
  		requireBucketName( arguments.bucketName );
  
  		// if filepath is a directory, append filename
  		if ( right( arguments.filepath, 1 ) == "/" || right( arguments.filepath, 1 ) == "\" ) {
  			arguments.filepath &= listLast( arguments.uri, "/\" );
  		}
  
  		var results = s3Request(
  			method        = "GET",
  			resource      = arguments.bucketName & "/" & arguments.uri,
  			filename      = arguments.filepath,
  			parseResponse = false
  		);
  