Index: handlers/views_handler_relationship.inc
===================================================================
--- handlers/views_handler_relationship.inc	(revision 874)
+++ handlers/views_handler_relationship.inc	(working copy)
@@ -63,6 +63,7 @@
     $label = !empty($this->definition['label']) ? $this->definition['label'] : $this->definition['field'];
     $options['label'] = array('default' => $label, 'translatable' => TRUE);
     $options['required'] = array('default' => FALSE);
+    $options['reverse_relation'] = array('default' => FALSE);
 
     return $options;
   }
@@ -86,6 +87,12 @@
       '#description' => t('Enable to hide items that do not contain this relationship'),
       '#default_value' => !empty($this->options['required']),
     );
+    $form['reverse_relation'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Reverse this relationship'),
+      '#description' => t('If reversed, the new entity holds a reference to the main entity.'),
+      '#default_value' => !empty($this->options['reverse_relation']),
+    );
   }
 
   /**
@@ -107,6 +114,22 @@
       $def['type'] = 'INNER';
     }
 
+    if (empty($this->options['reverse_relation'])) {
+      $def['left_field_reverse_relation'] = NULL;
+    }
+    else {
+      // Set the fields for the next relationship
+      $def['left_field'] = 'entity_id';
+      $def['left_field_reverse_relation'] = $this->field;
+
+      // Adjust_join for the previous base table
+      $t = end($this->query->table_queue);  // get the current/last tabel/join from the queue
+      $swapped_field = $def['left_field_reverse_relation'];
+
+      $t['join']->definition['left_table'] = $t['relationship']; // The alias is not stored in the definition
+      $t['join']->definition['field'] = $swapped_field;          // The left_field is the swapped field from the relationship  !!!!!!!!!!!!!!!!!!
+      $t['join']->construct();    // You need to build the join again from the new definition
+    }
     if (!empty($def['join_handler']) && class_exists($def['join_handler'])) {
       $join = new $def['join_handler'];
     }
Index: includes/handlers.inc
===================================================================
--- includes/handlers.inc	(revision 874)
+++ includes/handlers.inc	(working copy)
@@ -1315,7 +1315,7 @@
   /**
    * Construct the views_join object.
    */
-  function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT') {
+  function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT', $reverse = NULL) {
     $this->extra_type = 'AND';
     if (!empty($table)) {
       $this->table = $table;
@@ -1324,6 +1324,7 @@
       $this->field = $field;
       $this->extra = $extra;
       $this->type = strtoupper($type);
+      $this->left_field_reverse_relation = $reverse;
     }
     elseif (!empty($this->definition)) {
       // if no arguments, construct from definition.
@@ -1340,6 +1341,9 @@
       }
 
       $this->type = !empty($this->definition['type']) ? strtoupper($this->definition['type']) : 'LEFT';
+      if (!empty($this->definition['left_field_reverse_relation'])) {
+        $this->left_field_reverse_relation = $this->definition['left_field_reverse_relation'];
+      }
     }
   }
 
Index: plugins/views_plugin_query_default.inc
===================================================================
--- plugins/views_plugin_query_default.inc	(revision 874)
+++ plugins/views_plugin_query_default.inc	(working copy)
@@ -624,6 +624,30 @@
       return $join;
     }
 
+    $t = end($this->table_queue);   // get the last added table
+
+    if (!empty($t['join'])) {
+
+      // Check if the last one is reversed.
+      if  ((!empty($t['join']->definition['left_field_reverse_relation'])) 
+      && (!($t['join']->definition['left_field_reverse_relation'] == NULL))) {
+
+        // Adjust_join for the previous base table
+        // rescue the left_field from the relation ship
+        $swapped_field = $t['join']->left_field_reverse_relation; 
+        // Now fetch the previous table
+        $t = prev($this->table_queue);
+
+        if (($t['join']->definition['left_table'] == 'node') 
+         && (!empty($left_field_reverse_relation))) {
+          $t['join']->definition['left_table'] = $t['relationship'];     // The alias is not stored in the definition
+          $t['join']->definition['field'] = $swapped_field;  // The left_field is the swapped field from the relationship  !!!!!!!!!!!!!!!!!!
+          $t['join']->construct();    // You need to build the join again from the new definition
+        } 
+      }
+      $t = end($this->table_queue);  //reset cursor
+    }
+    
     // Adjusts the left table for our relationship.
     if ($relationship != $this->base_table) {
       // If we're linking to the primary table, the relationship to use will
