diff --git a/composer.json b/composer.json
index 679380b28eead44c9aab11ccec3fde92c79be1bb..929a980f815a0c62c2f46bdc558a877a71eaa583 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,7 @@
             "homepage": "http://library.wur.nl"
         }
     ],
-    "version": "0.3.1",
+    "version": "0.3.2",
     "require": {
         "php": ">=7.0.0",
         "guzzlehttp/guzzle": "^6.3"
diff --git a/src/Library/HttpClientTrait.php b/src/Library/HttpClientTrait.php
index f622af603c9fdbe5a3eeae74bd3a8b5db9ffa35f..970da0548669c517e7c7a7a30a94e8d04d4df2a9 100644
--- a/src/Library/HttpClientTrait.php
+++ b/src/Library/HttpClientTrait.php
@@ -219,7 +219,7 @@ trait HttpClientTrait {
 
 
     /**
-     * run post request with the http_client
+     * send post request with the http_client
      * @param type $url post url
      * @param type $body post data
      * @param array $http_options optional http client options, is merged with options from get_http_options()
@@ -235,6 +235,22 @@ trait HttpClientTrait {
     }
 
 
+    /**
+     * send put request with the http_client
+     * @param type $url put url
+     * @param type $body put data
+     * @param array $http_options optional http client options, is merged with options from get_http_options()
+     * @return \GuzzleHttp\Psr7\Response
+     */
+    public function http_put(string $url, $body, array $http_options = []) {
+
+        $this->debug("http put, url: $url, data size: " . count($body));
+
+        $options = $this->get_merged_http_options($http_options);
+        $options["body"] = $body;
+        return $this->http_request("PUT", $url, $options);
+    }
+
     /**
      * low level routine to send http request with the http_client
      * @param string $method
diff --git a/tests/Library/HttpClientTraitTest.php b/tests/Library/HttpClientTraitTest.php
index 3895b278963c01a9d4d72c479a33e72b44db816f..83c8075e63cc9d7e139af2d4a75eb28f4231b43c 100644
--- a/tests/Library/HttpClientTraitTest.php
+++ b/tests/Library/HttpClientTraitTest.php
@@ -316,6 +316,58 @@ class HttpClientTraitTest extends \PHPUnit_Framework_TestCase {
         $this->assertEquals("<test>response 3</test>", $response->getBody(), 'request 3 response body');
     }
 
+
+    public function test_http_put() {
+
+        $testclient = new HttpClient();
+        //$testclient->set_logger(new \Monolog\Logger('test'));
+
+        $responses = [
+            new Response(200, ["Content-Type" => "text/xml"], "<test>response 1</test>"),
+            new Response(200, ["Content-Type" => "text/xml"], "<test>response 2</test>"),
+            new Response(200, ["Content-Type" => "text/xml"], "<test>response 3</test>"),
+        ];
+        $request_history = [];
+        $mock_httpclient = get_mock_httpclient($responses, $request_history);
+        $testclient->set_http_client($mock_httpclient);
+
+        //
+        $testclient->set_http_options(["headers" => ["Content-Type" => "text/xml"]]);
+        $response = $testclient->http_put("http://localhost/1", "<body>1</body>");
+        // check if request is correctly done
+        $request = $request_history[0]['request'];
+        $this->assertEquals("PUT", $request->getMethod(), 'request 1 with PUT method');
+        $this->assertEquals("http://localhost/1", $request->getUri(), 'request 1 url');
+        $this->assertEquals(["text/xml"], $request->getHeader("Content-Type"), 'request 1 content type from default options');
+        $this->assertEquals("<body>1</body>", $request->getBody(), 'request 1 body');
+        // check response
+        $this->assertEquals($response, $testclient->get_http_response(), 'request 1 response is set in property');
+        $this->assertEquals("<test>response 1</test>", $response->getBody(), 'request 1 response body');
+
+        $testclient->set_http_headers(["Content-Type" => "application/xml"]);
+        $response = $testclient->http_put("http://localhost/2", "<body>2</body>");
+        // check if request is correctly done
+        $request = $request_history[1]['request'];
+        $this->assertEquals("PUT", $request->getMethod(), 'request 2 with PUT method');
+        $this->assertEquals("http://localhost/2", $request->getUri(), 'request 2 url');
+        $this->assertEquals(["application/xml"], $request->getHeader("Content-Type"), 'request 2 content type from default options');
+        $this->assertEquals("<body>2</body>", $request->getBody(), 'request 2 body');
+        // check response
+        $this->assertEquals($response, $testclient->get_http_response(), 'request 2 response is set in property');
+        $this->assertEquals("<test>response 2</test>", $response->getBody(), 'request 2 response body');
+
+        $response = $testclient->http_put("http://localhost/3", "<body>3</body>", ["headers" => ["Content-Type" => "last/xml"]]);
+        // check if request is correctly done
+        $request = $request_history[2]['request'];
+        $this->assertEquals("PUT", $request->getMethod(), 'request 3 with PUT method');
+        $this->assertEquals("http://localhost/3", $request->getUri(), 'request 3 url');
+        $this->assertEquals(["last/xml"], $request->getHeader("Content-Type"), 'request 3 content type from default options');
+        $this->assertEquals("<body>3</body>", $request->getBody(), 'request 3 body');
+        // check response
+        $this->assertEquals($response, $testclient->get_http_response(), 'request 3 response is set in property');
+        $this->assertEquals("<test>response 3</test>", $response->getBody(), 'request 3 response body');
+    }
+
 }