private String calculateStringToSignV2(Map<String, String> parameters, 
	        String httpMethod, String hostHeader, String requestURI) throws SignatureException {
		StringBuffer stringToSign = new StringBuffer("");
		if (httpMethod == null) throw new SignatureException("HttpMethod cannot be null");
		stringToSign.append(httpMethod);
		stringToSign.append(NewLine);

		// The host header - must eventually convert to lower case
		// Host header should not be null, but in Http 1.0, it can be, in that
		// case just append empty string ""
		if (hostHeader == null) {
			stringToSign.append("");
		} else {
			stringToSign.append(hostHeader.toLowerCase());
		}
		stringToSign.append(NewLine);

		if (requestURI == null || requestURI.length() == 0) {
			stringToSign.append(EmptyUriPath);
		} else {
			stringToSign.append(urlEncode(requestURI, true));
		}
		stringToSign.append(NewLine);

		Map<String, String> sortedParamMap = new TreeMap<String, String>();
		sortedParamMap.putAll(parameters);
		Iterator<Map.Entry<String, String>> pairs = sortedParamMap.entrySet().iterator();
		while (pairs.hasNext()) {
			Map.Entry<String, String> pair = pairs.next();
			if (pair.getKey().equalsIgnoreCase(SIGNATURE_KEYNAME)) continue;
			stringToSign.append(urlEncode(pair.getKey(), false));
			stringToSign.append(Equals);
			stringToSign.append(urlEncode(pair.getValue(), false));
			if (pairs.hasNext()) stringToSign.append(And);
		}
		return stringToSign.toString();
	}