diff --git a/extension/Classes/Core/Helper/HelperFile.php b/extension/Classes/Core/Helper/HelperFile.php
index 8789e3c0c184908b80c30b92d5178db77ac3ccd6..5619f9c0c6cf2510d4c215ad5adcbd673690e00d 100644
--- a/extension/Classes/Core/Helper/HelperFile.php
+++ b/extension/Classes/Core/Helper/HelperFile.php
@@ -9,8 +9,6 @@
 namespace IMATHUZH\Qfq\Core\Helper;
 
 
- 
-
 /**
  * Class HelperFile
  * @package qfq
@@ -517,5 +515,30 @@ class HelperFile {
         return $new;
     }
 
+    /**
+     * Joins $pre and $post. If $post is absolute, returns only $post. If $pre ends without '/', a '/' is injected.
+     *
+     * @param $pre
+     * @param $post
+     *
+     * @return string
+     */
+    public static function joinPathFilename($pre, $post) {
+        $separator = '';
+
+        if ($pre == '' || $post == '') {
+            return $pre . $post;
+        }
+
+        if ($post[0] == '/') {
+            return $post;
+        }
+
+        if ((substr($pre, -1) != '/')) {
+            $separator = '/';
+        }
+
+        return $pre . $separator . $post;
+    }
 }
 
diff --git a/extension/Classes/Core/Report/Report.php b/extension/Classes/Core/Report/Report.php
index 13bd0939090f6f1bf2006b56dacaccc0667368bf..dda49138af3404759c9fda97aa9829068bb30d41 100644
--- a/extension/Classes/Core/Report/Report.php
+++ b/extension/Classes/Core/Report/Report.php
@@ -191,10 +191,7 @@ class Report {
 
         $sqlLog = $this->store->getVar(TYPO3_SQL_LOG, STORE_TYPO3);
         if (false !== $sqlLog) {
-            if ($sqlLog != '' && $sqlLog[0] !== '/') {
-                $sqlLog = $this->store->getVar(SYSTEM_EXT_PATH, STORE_SYSTEM) . '/' . $sqlLog;
-            }
-
+            $sqlLog = HelperFile::joinPathFilename($this->store->getVar(SYSTEM_EXT_PATH, STORE_SYSTEM), $sqlLog);
             $this->store->setVar(SYSTEM_SQL_LOG, $sqlLog, STORE_SYSTEM);
         }
 
@@ -249,7 +246,7 @@ class Report {
      * Split line in level, command, content and fill 'frArray', 'levelCount', 'indexArray'
      * Example: 10.50.5.sql = select * from person
      *
-     * @param    string $ttLine : line to split in level, command, content
+     * @param string $ttLine : line to split in level, command, content
      *
      * @throws \UserReportException
      */
@@ -810,11 +807,11 @@ class Report {
      * 3) if none above take default
      * Set value on $full_level
      *
-     * @param    string $level_key - 'db' or 'debug'
-     * @param    string $full_super_level - f.e.: 10.10.
-     * @param    string $full_level - f.e.: 10.10.10.
-     * @param    string $cur_level - f.e.: 2
-     * @param    string $default - f.e.: 0
+     * @param string $level_key - 'db' or 'debug'
+     * @param string $full_super_level - f.e.: 10.10.
+     * @param string $full_level - f.e.: 10.10.10.
+     * @param string $cur_level - f.e.: 2
+     * @param string $default - f.e.: 0
      *
      * @return   string  The calculated value.
      */
@@ -1219,8 +1216,8 @@ class Report {
     /**
      * Renders PageX: convert position content to token content. Respect default values depending on PageX
      *
-     * @param    string $columnName
-     * @param    string $columnValue
+     * @param string $columnName
+     * @param string $columnValue
      * @return string rendered link
      *
      * $columnValue:
@@ -1347,9 +1344,9 @@ class Report {
     /**
      * If there is a value (or a defaultValue): compose it together with qualifier and delimiter.
      *
-     * @param    string $qualifier
-     * @param    string $value
-     * @param    string $defaultValue
+     * @param string $qualifier
+     * @param string $value
+     * @param string $defaultValue
      *
      * @return    string        rendered link
      */
@@ -1369,8 +1366,8 @@ class Report {
     /**
      * Renders _pageX: extract token and determine if any default value has to be applied
      *
-     * @param    string $columnName
-     * @param    string $columnValue
+     * @param string $columnName
+     * @param string $columnValue
      *
      * @return    string        rendered link
      */
diff --git a/extension/Classes/Core/Save.php b/extension/Classes/Core/Save.php
index fea100a401cae9e63e0cde32a675a18d0f995c84..886444cae4b6274f6ee793ced7195c907f2799be 100644
--- a/extension/Classes/Core/Save.php
+++ b/extension/Classes/Core/Save.php
@@ -72,8 +72,9 @@ class Save {
         $this->evaluate = new Evaluate($this->store, $this->db);
         $this->formAction = new FormAction($formSpec, $this->db);
 
-        $this->qfqLogFilename = $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM) . '/' . $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM);
-
+        $this->qfqLogFilename = HelperFile::joinPathFilename(
+            $this->store->getVar(SYSTEM_SITE_PATH, STORE_SYSTEM),
+            $this->store->getVar(SYSTEM_QFQ_LOG, STORE_SYSTEM));
     }
 
     /**
diff --git a/extension/Classes/Core/Store/Store.php b/extension/Classes/Core/Store/Store.php
index b3b298e036c844fae96818db467366d5333a82f2..a39166e74b26dbe1e91f841a62fb24ca31dc2fc5 100644
--- a/extension/Classes/Core/Store/Store.php
+++ b/extension/Classes/Core/Store/Store.php
@@ -297,7 +297,7 @@ class Store {
         // Make path absolute
         foreach ([SYSTEM_MAIL_LOG, SYSTEM_QFQ_LOG, SYSTEM_SQL_LOG] AS $key) {
             if (!empty($config[$key]) && $config[$key][0] != '/') {
-                $config[$key] = $config[SYSTEM_SITE_PATH] . '/' . $config[$key];
+                $config[$key] = HelperFile::joinPathFilename($config[SYSTEM_SITE_PATH], $config[$key]);
             }
         }
 
diff --git a/extension/Tests/Unit/Core/Helper/HelperFileTest.php b/extension/Tests/Unit/Core/Helper/HelperFileTest.php
index aa6da1c7eb215c29572c205aab92ad667cea9530..98ae13a4f53166a76e8847a522f6e1c37a74f69b 100644
--- a/extension/Tests/Unit/Core/Helper/HelperFileTest.php
+++ b/extension/Tests/Unit/Core/Helper/HelperFileTest.php
@@ -38,15 +38,34 @@ class HelperFileTest extends TestCase {
         $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,''));
 
         $this->assertEquals(DIR_HIGHLIGHT_JSON . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_JAVASCRIPT,'fileadmin/test.js'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ,'fileadmin/test.js'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON,'fileadmin/test.js'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB,'fileadmin/test.js'));
-
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'fileadmin/test.js'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'fileadmin/test.php'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'fileadmin/test.qfq'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'fileadmin/test.py'));
-        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO,'fileadmin/test.m'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_QFQ, 'fileadmin/test.js'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_PYTHON, 'fileadmin/test.js'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_MATLAB, 'fileadmin/test.js'));
+
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/javascript.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.js'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.php.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.php'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.qfq.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.qfq'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.py.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.py'));
+        $this->assertEquals(DIR_HIGHLIGHT_JSON . '/highlight.m.json', HelperFile::getFileTypeHighlight(FE_HIGHLIGHT_AUTO, 'fileadmin/test.m'));
     }
+
+    public function testJoinPathFilename() {
+
+        $this->assertEquals('', HelperFile::joinPathFilename('', ''));
+        $this->assertEquals('/', HelperFile::joinPathFilename('/', ''));
+        $this->assertEquals('/', HelperFile::joinPathFilename('', '/'));
+        $this->assertEquals('/', HelperFile::joinPathFilename('/', '/'));
+
+        $this->assertEquals('a/b', HelperFile::joinPathFilename('a', 'b'));
+        $this->assertEquals('/a/b', HelperFile::joinPathFilename('/a', 'b'));
+        $this->assertEquals('/b', HelperFile::joinPathFilename('a', '/b'));
+        $this->assertEquals('/b', HelperFile::joinPathFilename('/a', '/b'));
+
+        $this->assertEquals('a/b', HelperFile::joinPathFilename('a/', 'b'));
+        $this->assertEquals('a/b', HelperFile::joinPathFilename('a', 'b'));
+        $this->assertEquals('/b', HelperFile::joinPathFilename('a/', '/b'));
+        $this->assertEquals('/b', HelperFile::joinPathFilename('a', '/b'));
+    }
+
 }