diff --git a/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php b/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php
index fb5b3e9294d6067ee23558e94de2586fd5e55347..3abeeb2dd43a1b50509e6e067880f7697a7ce715 100644
--- a/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php
+++ b/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php
@@ -70,7 +70,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
      */
     protected $insert_mode;
 
-        /**
+    /**
      * SQL Query part: UPDATE clause
      * @var String
      */
@@ -161,32 +161,39 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     protected $is_unfinished_join;
 
     /**
+     * SQL Query part: string identifying if the join type is type "using" or "on"
+     * @var String
+     */
+    protected $join_type;
+
+    /**
      * Constructor.
      */
     public function __construct()
     {
-        $this->select            = '';
-        $this->select_mode      = array();
-        $this->update           = '';
-        $this->update_mode      = array();
-        $this->delete           = '';
-        $this->delete_mode      = array();
-        $this->from             = '';
-        $this->join             = '';
-        $this->where            = '';
-        $this->group_by         = '';
-        $this->having           = '';
-        $this->order_by         = '';
-        $this->limit            = '';
-        $this->connector        = '';
-        $this->into             = '';
-        $this->insert_mode      = array();
-        $this->set              = '';
-        $this->column_names     = '';
-        $this->values           = '';
-        $this->select_statement = '';
-        $this->compound         = '';
-        $this->is_unfinished_join  = FALSE;
+        $this->select             = '';
+        $this->select_mode        = array();
+        $this->update             = '';
+        $this->update_mode        = array();
+        $this->delete             = '';
+        $this->delete_mode        = array();
+        $this->from               = '';
+        $this->join               = '';
+        $this->where              = '';
+        $this->group_by           = '';
+        $this->having             = '';
+        $this->order_by           = '';
+        $this->limit              = '';
+        $this->connector          = '';
+        $this->into               = '';
+        $this->insert_mode        = array();
+        $this->set                = '';
+        $this->column_names       = '';
+        $this->values             = '';
+        $this->select_statement   = '';
+        $this->compound           = '';
+        $this->is_unfinished_join = FALSE;
+        $this->join_type          = '';
     }
 
     /**
@@ -216,6 +223,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
         unset($this->values);
         unset($this->select_statement);
         unset($this->is_unfinished_join);
+        unset($this->join_type);
     }
 
     /**
@@ -291,7 +299,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
             $components[] = 'column_names';
             $components[] = 'select_statement';
 
-            $valid = array('HIGH_PRIORITY', 'LOW_PRIORITY', 'IGNORE');
+            $valid = array( 'HIGH_PRIORITY', 'LOW_PRIORITY', 'IGNORE' );
 
             $this->insert_mode = array_intersect($this->insert_mode, $valid);
         }
@@ -320,7 +328,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
             return '';
         }
 
-        $valid = array('LOW_PRIORITY', 'DELAYED');
+        $valid = array( 'LOW_PRIORITY', 'DELAYED' );
 
         $this->insert_mode = array_intersect($this->insert_mode, $valid);
 
@@ -358,7 +366,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
             return '';
         }
 
-        $valid = array('LOW_PRIORITY', 'IGNORE');
+        $valid = array( 'LOW_PRIORITY', 'IGNORE' );
 
         $this->update_mode = array_intersect($this->update_mode, $valid);
 
@@ -473,6 +481,40 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
         {
             $this->is_unfinished_join = TRUE;
         }
+
+        $this->join_type = '';
+    }
+
+    /**
+     * Define USING clause of the SQL statement.
+     *
+     * @param String $column_list Column name to use.
+     */
+    function sql_using($column_list)
+    {
+        // Select join type.
+        if ($this->join_type === '')
+        {
+            $this->join_type = 'using';
+        }
+
+        // Prevent USING and ON to be used at the same time.
+        if ($this->join_type !== 'using')
+        {
+            return;
+        }
+
+        if ($this->is_unfinished_join)
+        {
+            $this->join .= ' ' . 'USING (';
+            $this->is_unfinished_join = FALSE;
+        }
+        elseif (substr($this->join, -1) !== '(')
+        {
+            $this->join = rtrim($this->join, ')') . ', ';
+        }
+
+        $this->join .= $column_list . ')';
     }
 
     /**
@@ -531,7 +573,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
      * Define Values for Insert or Update SQL statement.
      *
      * @param Array $values Array containing escaped values to be set, can be either an
-     * array or an array of arrays
+     *                      array or an array of arrays
      *
      * @return void
      */
@@ -553,7 +595,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
 
         if (!isset($values[0]) || !is_array($values[0]))
         {
-            $values = array($values);
+            $values = array( $values );
         }
 
         foreach ($values as $value)
@@ -595,6 +637,18 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     {
         $condition = ($base === 'ON') ? 'join' : strtolower($base);
 
+        // select join type.
+        if ($this->join_type === '' && $this->is_unfinished_join === TRUE && $base === 'ON')
+        {
+            $this->join_type = strtolower($base);
+        }
+
+        // Prevent USING and ON to be used at the same time.
+        if ($this->join_type === 'using' && $condition === 'join')
+        {
+            return;
+        }
+
         if (rtrim($this->$condition, '(') == '' || $this->is_unfinished_join)
         {
             if ($this->is_unfinished_join)
@@ -606,13 +660,13 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
                 $this->$condition = $base . ' ' . $this->$condition;
             }
 
-            $this->connector       = '';
+            $this->connector          = '';
             $this->is_unfinished_join = FALSE;
         }
         elseif ($this->connector != '')
         {
             $this->$condition .= ' ' . $this->connector . ' ';
-            $this->connector   = '';
+            $this->connector = '';
         }
         elseif (substr($this->$condition, -1) !== '(')
         {
@@ -761,10 +815,13 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
      */
     protected function prepare_index_hints($index_hints)
     {
-        if (is_array($index_hints) && !empty($index_hints)) {
-            $index_hints = array_diff($index_hints, array(NULL));
-            $hints = ' ' . implode(', ', $index_hints);
-        } else {
+        if (is_array($index_hints) && !empty($index_hints))
+        {
+            $index_hints = array_diff($index_hints, array( NULL ));
+            $hints       = ' ' . implode(', ', $index_hints);
+        }
+        else
+        {
             $hints = '';
         }
 
@@ -774,17 +831,29 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     /**
      * Open the parentheses for the sql condition.
      *
-     * @param String $condition String indication Statement to group
+     * @param String $base String indication Statement to group
      *
      * @return void
      */
-    public function sql_group_start($condition = 'WHERE')
+    public function sql_group_start($base = 'WHERE')
     {
-        $condition = ($condition === 'ON') ? 'join' : strtolower($condition);
+        $condition = ($base === 'ON') ? 'join' : strtolower($base);
+
+        // select join type.
+        if ($this->join_type === '' && $this->is_unfinished_join === TRUE && $base === 'ON')
+        {
+            $this->join_type = strtolower($base);
+        }
+
+        // Prevent USING and ON to be used at the same time.
+        if ($this->join_type === 'using' && $condition === 'join')
+        {
+            return;
+        }
 
         if ($this->is_unfinished_join)
         {
-            $this->$condition     .= 'ON ';
+            $this->$condition        .= 'ON ';
             $this->is_unfinished_join = FALSE;
         }
         elseif ($this->connector != '')
@@ -809,7 +878,14 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
      */
     public function sql_group_end($condition = 'WHERE')
     {
-        $condition         = ($condition === 'ON') ? 'join' : strtolower($condition);
+        $condition = ($condition === 'ON') ? 'join' : strtolower($condition);
+
+        // Prevent USING and ON to be used at the same time.
+        if ($this->join_type === 'using' && $condition === 'join')
+        {
+            return;
+        }
+
         $this->$condition .= ')';
     }
 
diff --git a/src/Lunr/Gravity/Database/MySQL/MySQLSimpleDMLQueryBuilder.php b/src/Lunr/Gravity/Database/MySQL/MySQLSimpleDMLQueryBuilder.php
index 0a36f773844f819fb5a7439945060fce6885d8d4..cae508c2acdb5f14ad51e9766371332d2d36e6f8 100644
--- a/src/Lunr/Gravity/Database/MySQL/MySQLSimpleDMLQueryBuilder.php
+++ b/src/Lunr/Gravity/Database/MySQL/MySQLSimpleDMLQueryBuilder.php
@@ -141,6 +141,25 @@ class MySQLSimpleDMLQueryBuilder extends MySQLDMLQueryBuilder
     }
 
     /**
+     * Define USING part of the SQL statement.
+     *
+     * @param String $column_list columns to use.
+     *
+     * @return MySQLDMLQueryBuilder $self Self reference
+     */
+    public function using($column_list)
+    {
+        $columns = '';
+
+        foreach (explode(',', $column_list) as $column)
+        {
+            $columns .= $this->escaper->column(trim($column)) . ', ';
+        }
+
+        return parent::using(rtrim($columns, ', '));
+    }
+
+    /**
      * Define ON part of a JOIN clause of the SQL statement.
      *
      * @param String $left     Left expression
diff --git a/src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderUsingTest.php b/src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderUsingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d3824e5b83e1cd7826192c0035099e20ebe27a2
--- /dev/null
+++ b/src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderUsingTest.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * This file contains the MySQLSimpleDMLQueryBuilderUsingTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @package    Lunr\Gravity\Database\MySQL
+ * @author     Patrick Valk <p.valk@m2mobi.com>
+ * @copyright  2016, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Gravity\Database\MySQL\Tests;
+
+use Lunr\Gravity\Database\MySQL\MySQLDMLQueryBuilder;
+use ReflectionClass;
+
+/**
+ * This class contains select tests for the MySQLSimpleDMLQueryBuilder class.
+ *
+ * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder
+ */
+class MySQLSimpleDMLQueryBuilderUsingTest extends MySQLSimpleDMLQueryBuilderTest
+{
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     */
+    public function testUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $this->escaper->expects($this->once())
+            ->method('column')
+            ->with($this->equalTo('column1'))
+            ->will($this->returnValue('`column1`'));
+
+        $this->class->using('column1');
+
+        $this->assertEquals('INNER JOIN `table2` USING (`column1`)', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     */
+    public function testUsingTwice()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2` USING (`column1`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+
+        $this->escaper->expects($this->at(0))
+            ->method('column')
+            ->with($this->equalTo('column2'))
+            ->will($this->returnValue('`column2`'));
+
+        $this->class->using('column2');
+
+        $this->assertEquals('INNER JOIN `table2` USING (`column1`, `column2`)', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     */
+    public function testUsingMultipleColumn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $this->escaper->expects($this->at(0))
+            ->method('column')
+            ->with($this->equalTo('column1'))
+            ->will($this->returnValue('`column1`'));
+
+        $this->escaper->expects($this->at(1))
+            ->method('column')
+            ->with($this->equalTo('column2'))
+            ->will($this->returnValue('`column2`'));
+
+        $this->class->using('column1, column2');
+
+        $this->assertEquals('INNER JOIN `table2` USING (`column1`, `column2`)', $this->get_reflection_property_value('join'));
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Gravity/Database/SQLDMLQueryBuilder.php b/src/Lunr/Gravity/Database/SQLDMLQueryBuilder.php
index 6296e70626d239c092488dd7d59ef2c218c322b2..f40398d32284b8026736dc1a5ba9c08d26e471f5 100644
--- a/src/Lunr/Gravity/Database/SQLDMLQueryBuilder.php
+++ b/src/Lunr/Gravity/Database/SQLDMLQueryBuilder.php
@@ -172,6 +172,19 @@ abstract class SQLDMLQueryBuilder extends DatabaseDMLQueryBuilder
     }
 
     /**
+     * Define USING part of the SQL statement.
+     *
+     * @param String  $column_list Column name to use.
+     *
+     * @return SQLDMLQueryBuilder $self Self reference
+     */
+    public function using($column_list)
+    {
+        $this->sql_using($column_list);
+        return $this;
+    }
+
+    /**
      * Define ON part of a JOIN clause of the SQL statement.
      *
      * @param String $left     Left expression
diff --git a/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsConditionTest.php b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsConditionTest.php
index d3f6f387d79a1d35e19089acdcb4b224bfa725b6..2e5af1eb7d51156bcf786fddb15fa23230a9cb97 100644
--- a/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsConditionTest.php
+++ b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsConditionTest.php
@@ -36,14 +36,14 @@ class DatabaseDMLQueryBuilderQueryPartsConditionTest extends DatabaseDMLQueryBui
     }
 
     /**
-    * Test creating a simple where/having statement.
-    *
-    * @param String $keyword   The expected statement keyword
-    * @param String $attribute The name of the property where the statement is stored
-    *
-    * @dataProvider ConditionalKeywordProvider
-    * @covers       Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
-    */
+     * Test creating a simple where/having statement.
+     *
+     * @param String $keyword   The expected statement keyword
+     * @param String $attribute The name of the property where the statement is stored
+     *
+     * @dataProvider ConditionalKeywordProvider
+     * @covers       Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
     public function testConditionCreatesSimpleStatement($keyword, $attribute)
     {
         $method = $this->get_accessible_reflection_method('sql_condition');
@@ -56,10 +56,10 @@ class DatabaseDMLQueryBuilderQueryPartsConditionTest extends DatabaseDMLQueryBui
     }
 
     /**
-    * Test creating a simple JOIN ON statement.
-    *
-    * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
-    */
+     * Test creating a simple JOIN ON statement.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
     public function testConditionCreatesSimpleJoinStatement()
     {
         $method = $this->get_accessible_reflection_method('sql_condition');
@@ -75,10 +75,10 @@ class DatabaseDMLQueryBuilderQueryPartsConditionTest extends DatabaseDMLQueryBui
     }
 
     /**
-    * Test creating a simple JOIN ON statement.
-    *
-    * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
-    */
+     * Test creating a simple JOIN ON statement.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
     public function testConditionCreatesGroupedJoinStatement()
     {
         $method = $this->get_accessible_reflection_method('sql_condition');
@@ -87,7 +87,7 @@ class DatabaseDMLQueryBuilderQueryPartsConditionTest extends DatabaseDMLQueryBui
 
         $this->set_reflection_property_value('join', 'JOIN table ON (');
 
-        $method->invokeArgs($this->class, array('a', 'b', '=', 'ON'));
+        $method->invokeArgs($this->class, array( 'a', 'b', '=', 'ON' ));
 
         $string = 'JOIN table ON (a = b';
 
@@ -163,19 +163,19 @@ class DatabaseDMLQueryBuilderQueryPartsConditionTest extends DatabaseDMLQueryBui
     }
 
     /**
-    * Test getting a select query with grouped condition.
-    *
-    * @param String $keyword   The expected statement keyword
-    * @param String $attribute The name of the property where the statement is stored
-    *
-    * @dataProvider conditionalKeywordProvider
-    * @covers       Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
-    */
+     * Test getting a select query with grouped condition.
+     *
+     * @param String $keyword   The expected statement keyword
+     * @param String $attribute The name of the property where the statement is stored
+     *
+     * @dataProvider conditionalKeywordProvider
+     * @covers       Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
     public function testGroupedSQLCondition($keyword, $attribute)
     {
         $method_cond = $this->get_accessible_reflection_method('sql_condition');
 
-        $arguments = array('a', 'b', '=', $keyword);
+        $arguments = array( 'a', 'b', '=', $keyword );
 
         $this->set_reflection_property_value($attribute, '(');
 
@@ -184,6 +184,560 @@ class DatabaseDMLQueryBuilderQueryPartsConditionTest extends DatabaseDMLQueryBui
         $this->assertEquals($string, $this->get_reflection_property_value($attribute));
     }
 
+    /**
+     * Test if 'where' works after 'using'.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testWhereWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (column3)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column4', 'column5', '=', "WHERE" ]);
+
+        $this->assertSame('INNER JOIN `table1` USING (column3)', $this->get_reflection_property_value('join'));
+        $this->assertSame('WHERE column4 = column5', $this->get_reflection_property_value('where'));
+    }
+
+    /**
+     * Test if 'where' works after 'on'.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testWhereWithJoinTypeOn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column2` = `column3`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column4', 'column5', '=', "WHERE" ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column2` = `column3`)', $this->get_reflection_property_value('join'));
+        $this->assertSame('WHERE column4 = column5', $this->get_reflection_property_value('where'));
+    }
+
+    /**
+     * Test if 'where' works with join type empty.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testWhereWithJoinTypeEmpty()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column2` = `column3`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column4', 'column5', '=', "WHERE" ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column2` = `column3`)', $this->get_reflection_property_value('join'));
+        $this->assertSame('WHERE column4 = column5', $this->get_reflection_property_value('where'));
+    }
+
+    /**
+     * Test if 'having' works after 'using'.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testHavingWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (column3)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column4', 'column5', '=', "HAVING" ]);
+
+        $this->assertSame('INNER JOIN `table1` USING (column3)', $this->get_reflection_property_value('join'));
+        $this->assertSame('HAVING column4 = column5', $this->get_reflection_property_value('having'));
+    }
+
+    /**
+     * Test if 'having' works after 'on'.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testHavingWithJoinTypeOn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column2` = `column3`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column4', 'column5', '=', "HAVING" ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column2` = `column3`)', $this->get_reflection_property_value('join'));
+        $this->assertSame('HAVING column4 = column5', $this->get_reflection_property_value('having'));
+    }
+
+    /**
+     * Test if 'having' works with empty join_type.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testHavingWithJoinTypeEmpty()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column2` = `column3`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column4', 'column5', '=', "HAVING" ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column2` = `column3`)', $this->get_reflection_property_value('join'));
+        $this->assertSame('HAVING column4 = column5', $this->get_reflection_property_value('having'));
+    }
+
+    /**
+     * Test start_on_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartOnGroupWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2` USING (`column1`)');
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table2` USING (`column1`)', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test start_on_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartOnGroupWithJoinTypeOn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2` USING (`column1`)');
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table2` USING (`column1`) AND (', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test start_on_group() after using join().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartOnGroupWithEmptyJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_having_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartHavingGroupWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'having' ]);
+
+        $this->assertSame('INNER JOIN `table1` USING (`column1`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_having_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartHavingGroupWithJoinTypeOn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column1` = `column2`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'having' ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column1` = `column2`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_having_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartHavingGroupWithJoinTypeEmpty()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column1` = `column2`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'having' ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column1` = `column2`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_having_group() after using join().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartHavingGroupWithJoinTypeEmptyDoesntchangeJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'having' ]);
+
+        $this->assertSame('', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test start_where_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartWhereGroupWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'where' ]);
+
+        $this->assertSame('INNER JOIN `table1` USING (`column1`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_where_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartWhereGroupWithJoinTypeOn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column1` = `column2`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'where' ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column1` = `column2`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_where_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartWhereGroupWithJoinTypeEmpty()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column1` = `column2`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'where' ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column1` = `column2`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test start_where_group() after using join().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartWhereGroupWithJoinTypeEmptyDoesntchangeJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'where' ]);
+
+        $this->assertSame('', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test if start_on_group() sets right join type.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartOnGroupSetsRightJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`) INNER JOIN `table2`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('on', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test if start_on_group() returns without affecting any data when wrong join_type is active.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartOnGroupReturnsOnWrongJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`) INNER JOIN `table2`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'using');
+        $join = $this->get_reflection_property_value('join');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame($join, $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test sql_group_start() if join_type stays using.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     */
+    public function testStartOnGroupJoinTypeDoesntChange()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`) INNER JOIN `table2`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_group_start');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('using', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test end_on_group() after using join()->using()->join()->group_on_start()-on().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_end
+     */
+    public function testEndOnGroupWithJoinTypeEmpty()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', true);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_group_end');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table1`)', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test end_on_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_end
+     */
+    public function testEndOnGroupWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2` USING (`column1`)');
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_group_end');
+
+        $method->invokeArgs($this->class, [ 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table2` USING (`column1`)', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test end_on_group() after using join()->using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testOnWithJoinTypeUsing()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table1` USING (`column1`)', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test end_on_group() after using join()-on().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testOnWithJoinTypeOn()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`ON (`column1` = `column2`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table1`ON (`column1` = `column2`) AND column2 = column3', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test on() with empty join type.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testOnWithJoinTypeEmpty()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', true);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'ON' ]);
+
+        $this->assertSame('INNER JOIN `table1` ON column2 = column3', $this->get_reflection_property_value('join'));
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test if sql_condition() returns without affecting any data when wrong join_type is active.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testOnWithJoinTypeUsingDoesntChangeJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1` USING (`column1`)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'ON' ]);
+
+        $this->assertSame('using', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test if sql_condition() finishes join.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testOnSettingFinishedJoin()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'ON' ]);
+
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test if sql_condition() finishes join.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testWhereSettingFinishedJoin()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'WHERE' ]);
+
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test if sql_condition() finishes join.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testHavingSettingFinishedJoin()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'WHERE' ]);
+
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test if sql_condition() sets right join_type.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     */
+    public function testOnSetRightJoinType()
+    {
+        $this->set_reflection_property_value('join', 'INNER JOIN `table1`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method = $this->get_accessible_reflection_method('sql_condition');
+
+        $method->invokeArgs($this->class, [ 'column2', 'column3', '=', 'ON' ]);
+
+        $this->assertSame('on', $this->get_reflection_property_value('join_type'));
+    }
+
 }
 
 ?>
diff --git a/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsJoinTest.php b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsJoinTest.php
index f336945404c735f61e71cd7ce1306bc8d48fab1d..f3ec10282d89d7735940c0bd2b2ccc7ccbbb883e 100644
--- a/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsJoinTest.php
+++ b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsJoinTest.php
@@ -221,6 +221,23 @@ class DatabaseDMLQueryBuilderQueryPartsJoinTest extends DatabaseDMLQueryBuilderT
         $this->assertTrue($this->get_reflection_property_value('is_unfinished_join'));
     }
 
+    /**
+     * Test that specifying a join clause resets the property join_type to ' ' after having used join before.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_join
+     */
+    public function testJoinSetsJoinType()
+    {
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method = $this->get_accessible_reflection_method('sql_join');
+
+        $method->invokeArgs($this->class, [ 'table', 'INNER' ]);
+
+        $this->assertTrue($this->get_reflection_property_value('is_unfinished_join'));
+        $this->assertSame('', $this->get_reflection_property_value('join_type'));
+    }
+
 }
 
 ?>
diff --git a/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUsingTest.php b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUsingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c33343eaa076fb7d0a72e1bf653307c92b56e35
--- /dev/null
+++ b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUsingTest.php
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * This file contains the DatabaseDMLQueryBuilderQueryPartsUsingTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @package    Lunr\Gravity\Database
+ * @author     Patrick Valk <p.valk@m2mobi.com>
+ * @copyright  2016, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Gravity\Database\Tests;
+
+/**
+ * This class contains the tests for the query parts methods.
+ *
+ * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder
+ */
+class DatabaseDMLQueryBuilderQueryPartsUsingTest extends DatabaseDMLQueryBuilderTest
+{
+
+    /**
+     * Test sql_using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingWithJoinTypeEmpty()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $method->invokeArgs($this->class, [ 'column1' ]);
+
+        $string = ' USING (column1)';
+
+        $this->assertSame($string, $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test sql_using() with join_type using.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingAppendsNewColumnithJoinTypeUsing()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2` USING (column1)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method->invokeArgs($this->class, [ 'column2' ]);
+
+        $string = 'INNER JOIN `table2` USING (column1, column2)';
+
+        $this->assertSame($string, $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test sql_using() if join_type stays using.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingJoinTypeStaysUsing()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2` USING (column1)');
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+
+        $method->invokeArgs($this->class, [ 'column2' ]);
+
+        $this->assertSame('using', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test sql_using().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingMultipleColumn()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $method->invokeArgs($this->class, [ 'column1, column2' ]);
+
+        $string = ' USING (column1, column2)';
+
+        $this->assertSame($string, $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test sql_using() after using join()->on().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingWithJoinTypeOn()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2`ON (`column3` = `column4`)');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method->invokeArgs($this->class, [ 'column1' ]);
+
+        $this->assertSame('INNER JOIN `table2`ON (`column3` = `column4`)', $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test sql_using() after using join().
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingFinishedJoin()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+
+        $this->set_reflection_property_value('join', 'INNER JOIN `table2`');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $method->invokeArgs($this->class, [ 'column1' ]);
+
+        $this->assertFalse($this->get_reflection_property_value('is_unfinished_join'));
+    }
+
+    /**
+     * Test if sql_using() sets the right type.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingSetCorrectJoinType()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', '');
+
+        $method->invokeArgs($this->class, [ 'column1' ]);
+
+        $this->assertSame('using', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test if sql_using() sets the right type.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingSetDoesntChangeJoinType()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'on');
+
+        $method->invokeArgs($this->class, [ 'column1' ]);
+
+        $this->assertSame('on', $this->get_reflection_property_value('join_type'));
+    }
+
+    /**
+     * Test if sql_using() returns without affecting any data when wrong join_type is active.
+     *
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_using
+     */
+    public function testUsingReturnsIfWrongJoinType()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+        $this->set_reflection_property_value('join_type', 'on');
+        $join = $this->get_reflection_property_value('join');
+
+        $method->invokeArgs($this->class, [ 'column1' ]);
+
+        $this->assertSame('on', $this->get_reflection_property_value('join_type'));
+        $this->assertSame($join, $this->get_reflection_property_value('join'));
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php b/src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d68b782bf232db694719218f14d4d1f83638f07
--- /dev/null
+++ b/src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * This file contains the SQLDMLQueryBuilderUsingTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @package    Lunr\Gravity\Database
+ * @author     Patrick Valk <p.valk@m2mobi.com>
+ * @copyright  2016, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\Gravity\Database\Tests;
+
+/**
+ * This class contains the tests for the query parts methods.
+ *
+ * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder
+ */
+class SQLDMLQueryBuilderUsingTest extends SQLDMLQueryBuilderTest
+{
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\SQLDMLQueryBuilder::using
+     */
+    public function testUsing()
+    {
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $this->class->using('column1');
+
+        $string = ' USING (column1)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\SQLDMLQueryBuilder::using
+     */
+    public function testUsing2()
+    {
+        $this->set_reflection_property_value('is_unfinished_join', FALSE);
+        $this->set_reflection_property_value('join_type', 'using');
+        $this->set_reflection_property_value('join', ' USING (column1)');
+
+        $this->class->using('column2');
+
+        $string = ' USING (column1, column2)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('join'));
+    }
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\SQLDMLQueryBuilder::using
+     */
+    public function testUsingMultipleColumn()
+    {
+        $this->set_reflection_property_value('is_unfinished_join', TRUE);
+
+        $this->class->using('column1, column2');
+
+        $string = ' USING (column1, column2)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('join'));
+    }
+
+}
+
+?>
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index ecc5759f5caa9cab0b4d4b91e12339342b46b99c..ec3fd940d12129c36308946092df43cde466245c 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -120,6 +120,7 @@
             <file>../src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsDeleteTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsInsertTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUpdateTest.php</file>
+            <file>../src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUsingTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderSelectTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderInsertTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUpdateTest.php</file>
@@ -127,6 +128,7 @@
             <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderConditionTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderOrderByTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderLimitTest.php</file>
+            <file>../src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLDMLQueryBuilderSelectTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLDMLQueryBuilderDeleteTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLDMLQueryBuilderInsertTest.php</file>
@@ -138,6 +140,7 @@
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderSelectTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderWriteTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderFluidInterfaceTest.php</file>
+            <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderUsingTest.php</file>
             <file>../src/Lunr/Gravity/Database/Tests/DatabaseConnectionBaseTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLConnectionBaseTest.php</file>
             <file>../src/Lunr/Gravity/Database/MySQL/Tests/MySQLConnectionSetTest.php</file>
