diff --git a/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php b/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php
index fb5b3e9294d6067ee23558e94de2586fd5e55347..2ff93132284f149494e20ee487918725c306804d 100644
--- a/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php
+++ b/src/Lunr/Gravity/Database/DatabaseDMLQueryBuilder.php
@@ -113,6 +113,12 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     protected $join;
 
     /**
+     * SQL Query part: USING clause
+     * @var String
+     */
+    protected $using;
+
+    /**
      * SQL Query part: WHERE clause
      * @var String
      */
@@ -232,7 +238,7 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
 
         $components = array();
 
-        array_push($components, 'select_mode', 'select', 'from', 'join', 'where');
+        array_push($components, 'select_mode', 'select', 'from', 'join', 'using', 'where');
         array_push($components, 'group_by', 'having', 'order_by', 'limit', 'lock_mode');
 
         $standard = 'SELECT ' . $this->implode_query($components);
@@ -260,9 +266,9 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
         }
 
         $components = array();
-        array_push($components, 'delete_mode', 'delete', 'from', 'join', 'where');
+        array_push($components, 'delete_mode', 'delete', 'from', 'join', 'using', 'where');
 
-        if (($this->delete == '') && ($this->join == ''))
+        if (($this->delete == '') && ($this->join == '') && ($this->using == ''))
         {
             array_push($components, 'order_by', 'limit');
         }
@@ -363,9 +369,9 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
         $this->update_mode = array_intersect($this->update_mode, $valid);
 
         $components = array();
-        array_push($components, 'update_mode', 'update', 'join', 'set', 'where');
+        array_push($components, 'update_mode', 'update', 'join', 'using', 'set', 'where');
 
-        if ((strpos($this->update, ',') === FALSE) && $this->join == '')
+        if ((strpos($this->update, ',') === FALSE) && $this->join == '' && $this->using == '')
         {
             $components[] = 'order_by';
             $components[] = 'limit';
@@ -476,6 +482,30 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     }
 
     /**
+     * Define USING clause of the SQL statement.
+     *
+     * @param String $name Column name to use.
+     */
+    function sql_using($name)
+    {
+        // Prevent USING and JOIN to be used at the same time.
+        if (!isset($this->join) || empty($this->join) || (strpos($this->join, 'ON') == false))
+        {
+            if (empty($this->using))
+            {
+                $this->using = 'USING (';
+            }
+            elseif (substr($this->using, -1) == ')')
+            {
+                $this->using = rtrim($this->using, ')');
+                $this->using .= ', ';
+            }
+
+            $this->using .= $name . ')';
+        }
+    }
+
+    /**
      * Define INTO clause of the SQL statement.
      *
      * @param String $table Table reference
@@ -595,6 +625,12 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     {
         $condition = ($base === 'ON') ? 'join' : strtolower($base);
 
+        // Prevent USING and JOIN to be used at the same time.
+        if (isset($this->using) && (empty($this->using) == false) && $condition == 'join')
+        {
+            return;
+        }
+
         if (rtrim($this->$condition, '(') == '' || $this->is_unfinished_join)
         {
             if ($this->is_unfinished_join)
@@ -782,6 +818,12 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     {
         $condition = ($condition === 'ON') ? 'join' : strtolower($condition);
 
+        // Prevent USING and JOIN to be used at the same time.
+        if (isset($this->using) && (empty($this->using) == false) && $condition == 'join')
+        {
+            return;
+        }
+
         if ($this->is_unfinished_join)
         {
             $this->$condition     .= 'ON ';
@@ -810,6 +852,13 @@ abstract class DatabaseDMLQueryBuilder implements DMLQueryBuilderInterface
     public function sql_group_end($condition = 'WHERE')
     {
         $condition         = ($condition === 'ON') ? 'join' : strtolower($condition);
+
+        // Prevent USING and JOIN to be used at the same time.
+        if (isset($this->using) && (empty($this->using) == false) && $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..b2e0943696748af22a6b1d4e02c04bdde0cb7572 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 $using columns to use.
+     *
+     * @return MySQLDMLQueryBuilder $self Self reference
+     */
+    public function using($using)
+    {
+        $columns = '';
+
+        foreach (explode(',', $using) as $column)
+        {
+            $columns .= $this->escaper->table(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/MySQLSimpleDMLQueryBuilderSelectTest.php b/src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderSelectTest.php
index db2f331b0b307fe7873c3b711c82990f01e31f8a..3e095ba56a05c08d9cf89f7b655001e521c5a2cb 100644
--- a/src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderSelectTest.php
+++ b/src/Lunr/Gravity/Database/MySQL/Tests/MySQLSimpleDMLQueryBuilderSelectTest.php
@@ -98,6 +98,112 @@ class MySQLSimpleDMLQueryBuilderSelectTest extends MySQLSimpleDMLQueryBuilderTes
     }
 
     /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     */
+    public function testUsing()
+    {
+        $this->escaper->expects($this->once())
+                      ->method('table')
+                      ->with($this->equalTo('table'))
+                      ->will($this->returnValue('`table`'));
+
+        $this->class->using('table');
+
+        $this->assertEquals('USING (`table`)', $this->get_reflection_property_value('using'));
+    }
+
+    /**
+     * Test specifying the using part.
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     */
+    public function testUsingArray()
+    {
+        $this->escaper->expects($this->at(0))
+            ->method('table')
+            ->with($this->equalTo('same_table_name1'))
+            ->will($this->returnValue('`same_table_name1`'));
+
+        $this->escaper->expects($this->at(1))
+            ->method('table')
+            ->with($this->equalTo('same_table_name2'))
+            ->will($this->returnValue('`same_table_name2`'));
+
+        $this->class->using('same_table_name1, same_table_name2');
+
+        $this->assertEquals('USING (`same_table_name1`, `same_table_name2`)', $this->get_reflection_property_value('using'));
+    }
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_join
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_end
+     */
+    public function testUsingBeforeJoin()
+    {
+        $this->escaper->expects($this->at(0))
+            ->method('table')
+            ->with($this->equalTo('table2'))
+            ->will($this->returnValue('`table2`'));
+
+        $this->escaper->expects($this->at(1))
+            ->method('table')
+            ->with($this->equalTo('table1'))
+            ->will($this->returnValue('`table1`'));
+
+        $this->class->join('table2');
+        $this->class->using('table1');
+        $this->class->start_on_group();
+        $this->class->on('table3', 'table4');
+        $this->class->end_on_group();
+
+        $this->assertEquals('INNER JOIN `table2`', $this->get_reflection_property_value('join'));
+        $this->assertEquals('USING (`table1`)', $this->get_reflection_property_value('using'));
+    }
+
+    /**
+     * Test using().
+     *
+     * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::using
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_join
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_condition
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_start
+     * @covers Lunr\Gravity\Database\DatabaseDMLQueryBuilder::sql_group_end
+     */
+    public function testUsingAfterJoin()
+    {
+        $this->escaper->expects($this->at(0))
+            ->method('table')
+            ->with($this->equalTo('table2'))
+            ->will($this->returnValue('`table2`'));
+
+        $this->escaper->expects($this->at(1))
+            ->method('column')
+            ->with($this->equalTo('column3'))
+            ->will($this->returnValue('`column3`'));
+
+        $this->escaper->expects($this->at(2))
+            ->method('column')
+            ->with($this->equalTo('column4'))
+            ->will($this->returnValue('`column4`'));
+
+        $this->class->join('table2');
+        $this->class->start_on_group();
+        $this->class->on('column3', 'column4', '=');
+        $this->class->end_on_group();
+        $this->class->using('table1');
+
+        $this->assertEquals('INNER JOIN `table2`ON (`column3` = `column4`)', $this->get_reflection_property_value('join'));
+        $this->assertPropertyEmpty('using');
+    }
+
+    /**
      * Test group_by().
      *
      * @covers Lunr\Gravity\Database\MySQL\MySQLSimpleDMLQueryBuilder::group_by
diff --git a/src/Lunr/Gravity/Database/SQLDMLQueryBuilder.php b/src/Lunr/Gravity/Database/SQLDMLQueryBuilder.php
index 6296e70626d239c092488dd7d59ef2c218c322b2..13f558ca232414ad8048fc4e8d32b57cfdedfe1d 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  $using Column name to use.
+     *
+     * @return SQLDMLQueryBuilder $self Self reference
+     */
+    public function using($using)
+    {
+        $this->sql_using($using);
+        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/DatabaseDMLQueryBuilderQueryPartsUsingTest.php b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUsingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc1126d84961bea3d63e5f26a7bc121ae9ee95b4
--- /dev/null
+++ b/src/Lunr/Gravity/Database/Tests/DatabaseDMLQueryBuilderQueryPartsUsingTest.php
@@ -0,0 +1,55 @@
+<?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.
+     */
+    public function testUsing()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+
+        $method->invokeArgs($this->class, [ 'table' ]);
+
+        $string = 'USING (table)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('using'));
+    }
+
+    /**
+     * Test sql_using.
+     */
+    public function testUsingTwice()
+    {
+        $method = $this->get_accessible_reflection_method('sql_using');
+
+        $method->invokeArgs($this->class, [ 'table1' ]);
+        $method->invokeArgs($this->class, [ 'table2' ]);
+
+        $string = 'USING (table1, table2)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('using'));
+    }
+
+}
+
+?>
diff --git a/src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php b/src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6419b6d646f8c8c41b1232a0fdc5f23866ca735f
--- /dev/null
+++ b/src/Lunr/Gravity/Database/Tests/SQLDMLQueryBuilderUsingTest.php
@@ -0,0 +1,55 @@
+<?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 specifying the using part.
+     *
+     * @covers Lunr\Gravity\Database\SQLDMLQueryBuilder::using
+     */
+    public function testUsing()
+    {
+        $this->class->using('table');
+
+        $string = 'USING (table)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('using'));
+    }
+
+    /**
+     * Test specifying the using part.
+     *
+     * @covers Lunr\Gravity\Database\SQLDMLQueryBuilder::using
+     */
+    public function testUsingTwice()
+    {
+        $this->class->using('same_table_name1');
+        $this->class->using('same_table_name2');
+
+        $string = 'USING (same_table_name1, same_table_name2)';
+
+        $this->assertEquals($string, $this->get_reflection_property_value('using'));
+    }
+
+}
+
+?>
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index ecc5759f5caa9cab0b4d4b91e12339342b46b99c..2b5f9cf8498d924a8bf0ce1f867e983d72ad6db0 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>
