diff --git a/composer.json b/composer.json
index b71a24042c8a5b4c73209a3d01302c53037a076c..28174e95c7ac3a9955ecf94e9ff8165dc5c66b5c 100644
--- a/composer.json
+++ b/composer.json
@@ -9,14 +9,14 @@
             "homepage": "http://library.wur.nl"
         }
     ],
-    "version": "0.1.2",
+    "version": "0.2.0",
     "require": {
         "php": ">=7.0.0",
         "guzzlehttp/guzzle": "^6.3"
     },
     "autoload": {
         "psr-4": {
-            "Library\\": "src/library"
+            "Library\\": "src/Library"
         }
     },
     "require-dev": {
diff --git a/src/library/LoggerTrait.php b/src/Library/LoggerTrait.php
similarity index 80%
rename from src/library/LoggerTrait.php
rename to src/Library/LoggerTrait.php
index e1e62f08433b8d75815e48f588916cb02e584fb1..6a4f5ec8ebf8fd345cba6d55bac29896d18d9f98 100644
--- a/src/library/LoggerTrait.php
+++ b/src/Library/LoggerTrait.php
@@ -30,14 +30,42 @@ trait LoggerTrait {
     /**
      * initialize logger
      *
-     * @param array $settings with (optional) keys: name, path, level and format
-     * @param string $base_dir base direcory for relative paths
+     * @param array $settings with (optional) keys: name, handler, path, level and format
+     * @param string $base_dir base directory for relative paths
      * @return $this
      */
     public function init_logger(array $settings, string $base_dir = ".") {
 
         $name = isset($settings["name"]) ? $settings["name"] : "default";
-        $path =  isset($settings["path"]) ? $settings["path"] : "php://stderr";
+        // create the logger
+        $logger = new \Monolog\Logger($name);
+
+        // add handlers
+        if (isset($settings["handler"])) {
+            foreach ($settings["handler"] as $handler) {
+                $this->add_handler($logger, $handler, $base_dir);
+            }
+        } else {
+            // if no handler array the settings
+            // then the handler parameters are in the settings (backward compatibility)
+            $this->add_handler($logger, $settings, $base_dir);
+        }
+
+        return $this->set_logger($logger);
+    }
+
+
+    /**
+     * initialize logger
+     *
+     * @param Monolog\Logger $logger logger instance
+     * @param array $settings with (optional) keys: path, level and format
+     * @param string $base_dir base directory for relative paths
+     * @return $this
+     */
+    protected function add_handler($logger, array $settings, string $base_dir) {
+
+        $path = isset($settings["path"]) ? $settings["path"] : "php://stderr";
         // adjust log path if it is not a php i/o stream or absolute path
         // so only adjust relative paths
         if (strncmp($path, 'php:', 4) != 0 && strncmp($path, '/', 1)) {
@@ -46,18 +74,13 @@ trait LoggerTrait {
         $level = isset($settings["level"]) ? $settings["level"] : "info";
         $format = isset($settings["format"]) ? $settings["format"] : "[%datetime%] %channel% %level_name% %extra% %context%: %message%";
 
-        // create the logger
-        $logger = new \Monolog\Logger($name);
         // add stream handler
         $stream = new \Monolog\Handler\StreamHandler($path, $level);
         $formatter = new \Monolog\Formatter\LineFormatter("$format\n");
         $stream->setFormatter($formatter);
         $logger->pushHandler($stream);
-
-        return $this->set_logger($logger);
     }
 
-
     /**
      * get logger instance
      * @return \Psr\Log\LoggerInterface or null if not set
diff --git a/src/library/Webquery.php b/src/Library/Webquery.php
similarity index 100%
rename from src/library/Webquery.php
rename to src/Library/Webquery.php
diff --git a/tests/Library/LoggerTraitTest.php b/tests/Library/LoggerTraitTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ef99a2cfad99bb2e75fc84e6408f519f933b991
--- /dev/null
+++ b/tests/Library/LoggerTraitTest.php
@@ -0,0 +1,100 @@
+<?php
+namespace Tests\Library;
+
+
+class Logger {
+    use \Library\LoggerTrait;
+}
+
+class LoggerTraitTest extends \PHPUnit_Framework_TestCase {
+
+
+    public function test_default_init_logger() {
+
+        $testlog = new \Tests\Library\Logger();
+        $this->assertNull($testlog->get_logger(), "no logger without init_logger()");
+
+        $testlog->init_logger([]);
+        $logger = $testlog->get_logger();
+        $this->assertInstanceOf("\Monolog\Logger", $logger, 'get_logger() returns instance of \Monolog\Logger');
+        $this->assertEquals("default", $logger->getName(), "default name");
+        $handlers = $logger->getHandlers();
+        $this->assertEquals(1, count($handlers), "default logger has 1 handler");
+        $handler = $handlers[0];
+        $this->assertInstanceOf("\Monolog\Handler\StreamHandler", $handler, 'default log handler is a StreamHandler');
+        $this->assertEquals("php://stderr", $handler->getUrl(), "default log handler path (url)");
+        $this->assertEquals(\Monolog\Logger::toMonologLevel("info"), $handler->getLevel(), "default log handler level is 'info'");
+        $formatter = $handler->getFormatter();
+        $this->assertInstanceOf("\Monolog\Formatter\LineFormatter", $formatter, 'default log handler formatter is a LineFormatter');
+    }
+
+
+    public function test_init_logger_single_handler() {
+
+        $settings = [
+            "name" => "test-logger",
+            "path" => "log/test.log",
+            "level" => "debug",
+            "format" => "[%datetime%]%level_name% %extra% %context%: %message%", // not testable
+        ];
+
+        $testlog = new \Tests\Library\Logger();
+        $testlog->init_logger($settings);
+        $logger = $testlog->get_logger();
+        $this->assertEquals($settings["name"], $logger->getName(), "name");
+        $handlers = $logger->getHandlers();
+        $this->assertEquals(1, count($handlers), "logger has 1 handler");
+        $handler = $handlers[0];
+        $this->assertEquals("./" . $settings["path"], $handler->getUrl(), "log handler path (with default basedir)");
+        $this->assertEquals(\Monolog\Logger::toMonologLevel($settings["level"]), $handler->getLevel(), "log handler level");
+
+        $basedir = "/var/log/local";
+        $testlog = new \Tests\Library\Logger();
+        $testlog->init_logger($settings, $basedir);
+        $logger = $testlog->get_logger();
+        $this->assertEquals($settings["name"], $logger->getName(), "name");
+        $handlers = $logger->getHandlers();
+        $this->assertEquals(1, count($handlers), "logger has 1 handler");
+        $handler = $handlers[0];
+        $this->assertEquals("$basedir/" . $settings["path"], $handler->getUrl(), "log handler path (with passed basedir)");
+        $this->assertEquals(\Monolog\Logger::toMonologLevel($settings["level"]), $handler->getLevel(), "log handler level");
+    }
+
+
+    public function test_init_logger_two_handlers() {
+
+        $basedir = "/var/log/local";
+        $settings = [
+            "name" => "test-logger",
+            "handler" => [
+                [
+                    "path" => "log/test.log",
+                    "expectpath" => "$basedir/log/test.log", // expected path for testing
+                    "level" => "debug",
+                    "format" => "[%datetime%]%level_name% %extra% %context%: %message%", // not testable
+                ],
+                [
+                    "path" => "php://stdout",
+                    "expectpath" => "php://stdout",
+                    "level" => "warning",
+                    "format" => "[%datetime%]%level_name% %extra% %context%: %message%", // not testable
+                ],
+            ],
+        ];
+
+        $testlog = new \Tests\Library\Logger();
+        $testlog->init_logger($settings, $basedir);
+        $logger = $testlog->get_logger();
+        $this->assertEquals($settings["name"], $logger->getName(), "name");
+        $expects = $settings["handler"];
+        $handlers = $logger->getHandlers();
+        $this->assertEquals(count($expects), count($handlers), "number of handlers in settings");
+        for ($i = 0; $i < count($expects); $i++) {
+            $expect = $expects[$i];
+            $handler = array_pop($handlers);  // handlers are in reverse order
+            $this->assertEquals($expect["expectpath"], $handler->getUrl(), "$i: log handler path");
+            $this->assertEquals(\Monolog\Logger::toMonologLevel($expect["level"]), $handler->getLevel(), "$i: log handler level");
+        }
+    }
+
+}
diff --git a/tests/library/WebqueryTest.php b/tests/Library/WebqueryTest.php
similarity index 100%
rename from tests/library/WebqueryTest.php
rename to tests/Library/WebqueryTest.php