diff --git a/guzzle.admin.inc b/guzzle.admin.inc
new file mode 100644
index 0000000..5d02548
--- /dev/null
+++ b/guzzle.admin.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Guzzle Settings
+ */
+
+/**
+ * Implements guzzle settings form.
+ */
+function guzzle_settings_form() {
+  $form = array();
+  $form['use_guzzle_http_request'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Override drupal_http_request by guzzle_http_request?'),
+    '#description' => t('Check if you want to use guzzle for http request.'),
+    '#default_value' => (variable_get('drupal_http_request_function', FALSE) == 'guzzle_http_request') ? 1 : 0,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+  return $form;
+}
+
+/**
+ * Implements guzzle settings form submit handler.
+ */
+function guzzle_settings_form_submit($form, &$form_state) {
+  $use_guzzle_http_request = $form_state['values']['use_guzzle_http_request'];
+  if ($use_guzzle_http_request) {
+    variable_set('drupal_http_request_function', 'guzzle_http_request');
+  }
+  elseif (variable_get('drupal_http_request_function', FALSE) == 'guzzle_http_request') {
+    variable_set('drupal_http_request_function', FALSE);
+  }
+}
diff --git a/guzzle.module b/guzzle.module
index 0188270..9e59f89 100644
--- a/guzzle.module
+++ b/guzzle.module
@@ -31,3 +31,101 @@ function guzzle_help($path, $arg) {
 
   return $output;
 }
+
+/**
+ * Implements of hook_menu().
+ */
+function guzzle_menu() {
+  $items['admin/config/system/guzzle'] = array(
+    'title' => 'Guzzle configuration',
+    'description' => 'Configure Guzzle http request.',
+    'page callback' => 'drupal_get_form',
+    'file' => 'guzzle.admin.inc',
+    'page arguments' => array('guzzle_settings_form'),
+    'access arguments' => array('administer guzzle'),
+  );
+  return $items;
+}
+
+/**
+ * Implements of hook_permission().
+ */
+function guzzle_permission() {
+  return array(
+    'administer guzzle' => array(
+      'title' => t('Administer guzzle'),
+    ),
+  );
+}
+
+/**
+ * Implements guzzle_http_request().
+ */
+function guzzle_http_request($url, array $options = array()) {
+  composer_manager_register_autoloader();
+  $proxy_options = array();
+  if ($proxy_server = variable_get('proxy_server', '')) {
+    $proxy = $proxy_server . ':' . variable_get('proxy_port', 8080);
+    $proxy_options[CURLOPT_PROXY] = $proxy;
+    if ($proxy_username = variable_get('proxy_username', '')) {
+      $proxy_auth = $proxy_username . ':' . variable_get('proxy_password', '');
+      $proxy_options[CURLOPT_PROXYUSERPWD] = $proxy_auth;
+    }
+  }
+
+  $client = new Guzzle\Http\Client('', array(
+    'curl.options' => $proxy_options,
+  ));
+  if (isset($options['headers']) && is_array($options['headers'])) {
+    $client->setDefaultOption('headers', $options['headers']);
+  }
+  $timeout = 30;
+  if (isset($options['timeout']) && is_array($options['timeout']) && $options['timeout'] > 0) {
+    $timeout = $options['timeout'];
+  }
+  // This is needed because in some PHP versions the CURLOPT_TIMEOUT_MS
+  // is not defined and Guzzle use this constant.
+  if (!defined('CURLOPT_TIMEOUT_MS')) {
+    define('CURLOPT_TIMEOUT_MS', 155);
+  }
+  $client->setDefaultOption('timeout', $timeout);
+  if (isset($options['max_redirects']) && is_numeric($options['max_redirects']) && $options['max_redirects'] > 0) {
+    $request->getParams()->set('redirect.max', $options['max_redirects']);
+  }
+  $method = (isset($options['method'])) ? strtolower($options['method']) : 'get';
+
+  if (in_array($method, array('post', 'put', 'delete', 'patch')) && isset($options['data'])) {
+    $data = Guzzle\Http\QueryString::fromString($options['data'])->toArray();
+    $client->setDefaultOption('data', $data);
+  }
+  $result = new stdClass();
+  // Return error message when invalid method provided.
+  if (!in_array($method, array('get', 'post', 'put', 'delete', 'patch'))) {
+    $result->code = 405;
+    $result->error = 'Method Not Allowed';
+    $result->status_message = $result->error;
+    $result->data = NULL;
+    return $result;
+  }
+  $request = $client->$method($url);
+
+  try {
+    $response = $request->send();
+  } catch (Guzzle\Http\Exception\RequestException $e) {
+    $response = $e->getResponse();
+    $result->error = $response->getReasonPhrase();
+  }
+  $result->code = $response->getStatusCode();
+  $result->status_message = $response->getReasonPhrase();
+  $header_map = $response->getHeaders()->toArray();
+  $header = array();
+  foreach ($header_map as $key => $value) {
+    $header[$key] = $value[0];
+  }
+  $result->header = $header;
+  $result->protocol = $response->getProtocol() . '/' . $response->getProtocolVersion();
+  $result->data = $response->getBody(TRUE);
+  $result->request = $request->getRawHeaders();
+
+  return $result;
+}
