diff --git a/core/DataAccess/LogQueryBuilder/JoinGenerator.php b/core/DataAccess/LogQueryBuilder/JoinGenerator.php
index 7b69184f0b6ec0706117cf7c631349b354d8ebcb..0324bff9b5477dc77a35e9fa0ffe79e1222b2402 100644
--- a/core/DataAccess/LogQueryBuilder/JoinGenerator.php
+++ b/core/DataAccess/LogQueryBuilder/JoinGenerator.php
@@ -81,7 +81,14 @@ class JoinGenerator
 
                 // join condition provided
                 $alias = isset($table['tableAlias']) ? $table['tableAlias'] : $table['table'];
-                $this->joinString .= " LEFT JOIN " . Common::prefixTable($table['table']) . " AS " . $alias
+
+                if (isset($table['join'])) {
+                    $this->joinString .= ' ' . $table['join'];
+                } else {
+                    $this->joinString .= ' LEFT JOIN';
+                }
+
+                $this->joinString .= ' ' . Common::prefixTable($table['table']) . " AS " . $alias
                                    . " ON " . $table['joinOn'];
                 continue;
             }
diff --git a/core/DataAccess/LogQueryBuilder/JoinTables.php b/core/DataAccess/LogQueryBuilder/JoinTables.php
index 1faad323a7f2868a535fea6145b41d67fed56dee..c77375015593d32e01946103c3c79c3a84775923 100644
--- a/core/DataAccess/LogQueryBuilder/JoinTables.php
+++ b/core/DataAccess/LogQueryBuilder/JoinTables.php
@@ -58,6 +58,7 @@ class JoinTables extends \ArrayObject
                 && !empty($table['table'])
                 && $table['table'] === $tableToFind
                 && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableToFind)
+                && (!isset($table['join']) || strtolower($table['join']) === 'left join')
                 && isset($table['joinOn']) && $table['joinOn'] === $joinToFind) {
                 return true;
             }
@@ -77,6 +78,7 @@ class JoinTables extends \ArrayObject
             if (is_array($table)
                 && !empty($table['table'])
                 && $table['table'] === $tableNameToFind
+                && (!isset($table['join']) || strtolower($table['join']) === 'left join')
                 && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableNameToFind)) {
                 return $index;
             }
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
index cb207269680440f4b5778c977efc46edf3de0735..746f2e45ff7aece5eb7854df03225e5b435e152a 100644
--- a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
@@ -102,6 +102,41 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($expected, $generator->getJoinString());
     }
 
+    public function test_generate_getJoinString_manuallyJoinedAlreadyPlusCustomJoinButAlsoLeft()
+    {
+        $generator = $this->generate(array(
+            'log_link_visit_action',
+            array('table' => 'log_visit', 'joinOn' => 'log_visit.idvisit = log_link_visit_action.idvisit'),
+            array('table' => 'log_action', 'join' => 'LeFt JOIN', 'joinOn' => 'log_link_visit_action.idaction_name = log_action.idaction'),
+            'log_action'
+        ));
+
+        $expected  = 'log_link_visit_action AS log_link_visit_action ';
+        $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
+        $expected .= 'LEFT JOIN log_action AS log_action ON (log_link_visit_action.idaction_name = log_action.idaction AND log_link_visit_action.idaction_url = log_action.idaction)';
+        $this->assertEquals($expected, $generator->getJoinString());
+    }
+
+    public function test_generate_getJoinString_manualJoin()
+    {
+        $generator = $this->generate(array(
+            'log_link_visit_action',
+            array('table' => 'log_visit',
+                'join' => 'RIGHT JOIN','joinOn' => 'log_visit.idvisit = log_link_visit_action.idvisit'),
+            array('table' => 'log_action',
+                  'tableAlias' => 'log_action_r',
+                  'join' => 'RIGHT JOIN',
+                  'joinOn' => 'log_link_visit_action.idaction_test = log_action_r.idaction'),
+            'log_action'
+        ));
+
+        $expected  = 'log_link_visit_action AS log_link_visit_action ';
+        $expected .= 'RIGHT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
+        $expected .= 'RIGHT JOIN log_action AS log_action_r ON log_link_visit_action.idaction_test = log_action_r.idaction ';
+        $expected .= 'LEFT JOIN log_action AS log_action ON log_link_visit_action.idaction_url = log_action.idaction';
+        $this->assertEquals($expected, $generator->getJoinString());
+    }
+
     public function test_generate_getJoinString_allTables()
     {
         $generator = $this->generate(array(
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
index 8f5a52fd0bbdbc67bd2669c7bef2418750d13c29..98aeb339ee16acff4f54d88eb80ebb524c4e2be4 100644
--- a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
@@ -88,6 +88,17 @@ class JoinTablesTest extends \PHPUnit_Framework_TestCase
         $this->assertFalse($result);
     }
 
+    public function test_hasJoinedTableManually_shouldReturnFalse_IfTableOrJoinHasCustomJoin()
+    {
+        $this->tables = $this->makeTables(array(
+            'log_visit',
+            array('table' => 'log_conversion', 'join' => 'right JOIN', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+            'log_action'));
+
+        $result = $this->tables->hasJoinedTableManually('log_conversion', 'log_conversion.idvisit = log_visit.idvisit');
+        $this->assertFalse($result);
+    }
+
     public function test_hasAddedTableManually_shouldReturnTrue_IfTableWasAddedManually()
     {
         $result = $this->tables->hasAddedTableManually('log_conversion');