private HttpResponse execute(final HttpUriRequest req) {
		final HttpClientBuilder builder = HttpClientBuilder.create();
		final Builder reqConfig = RequestConfig.custom();
		if (this.timeout != null) {
			reqConfig.setConnectTimeout(this.timeout);
		}
		reqConfig.setRedirectsEnabled(this.followRedirect);
		builder.setDefaultRequestConfig(reqConfig.build());
		if ((this.userAgent != null) && !this.userAgent.isEmpty()) {
			builder.setUserAgent(this.userAgent);
		}
		try {
			final CloseableHttpClient httpclient = builder.build();
			// if request has data populate body
			if (req instanceof HttpEntityEnclosingRequestBase) {
				final HttpEntityEnclosingRequestBase entityBase = (HttpEntityEnclosingRequestBase) req;
				entityBase.setEntity(new StringEntity(this.body, "UTF-8"));
			}
			// Set headers
			final Set<Entry<String, List<String>>> entrySet = this.headers.entrySet();
			for (final Entry<String, List<String>> entry : entrySet) {
				final List<String> list = entry.getValue();
				for (final String string : list) {
					req.addHeader(entry.getKey(), string);
				}
			}
			
			final HttpResponse response = httpclient.execute(req);
			return response;
		} catch (final ClientProtocolException e) {
			throw new RuntimeException(e);
		} catch (final IOException e) {
			throw new RuntimeException(e);
		}
	}