diff --git a/draggableviews.module b/draggableviews.module
index bd8d1e6..229505b 100644
--- a/draggableviews.module
+++ b/draggableviews.module
@@ -144,6 +144,12 @@ function draggableviews_views_submit($form, &$form_state) {
   $handler_object = draggableviews_get_handler_class($view->field['draggableviews']->options['draggableviews']['handler']);
   $handler_object->set($form_state);
 
+  // Set the parent.
+  if ($view->field['draggableviews']->options['draggableviews']['hierarchy_handler']) {
+    $hierarchy_handler_object = draggableviews_get_handler_class($view->field['draggableviews']->options['draggableviews']['hierarchy_handler']);
+    $hierarchy_handler_object->set($form_state);
+  }
+
   // Trigger the event "A view has been sorted"
   if (module_exists('rules')) {
     rules_invoke_event('draggableviews_rules_event_sorted', $view->name, $view->current_display);
@@ -157,10 +163,14 @@ function draggableviews_preprocess_views_view_table(&$vars) {
   if ($order_view = _draggableviews_load_order_view($vars['view'])) {
     // Add indentation if hierarchy is available.
     if (!empty($order_view->field['draggableviews']->options['draggableviews']['hierarchy_handler'])) {
-      $hierarchy_handler_object = draggableviews_get_handler_class($order_view->field['draggableviews']->options['draggableviews']['hierarchy_handler'], 'hierarchy_handler');
+      $hierarchy_handler = $order_view->field['draggableviews']->options['draggableviews']['hierarchy_handler'];
+      $hierarchy_handler_object = draggableviews_get_handler_class($hierarchy_handler, 'hierarchy_handler');
       foreach ($vars['rows'] as $key => $row) {
         $first_column = current(array_keys($row));
         $field = (object) array('view' => $vars['view']);
+        // I believe we have to set this here so that we know that what field we are using for the hierarchy handler to determin depth
+        $field->hierarchy_handler_field = $order_view->field['draggableviews']->options['draggableviews'][$hierarchy_handler]['field'];
+
         $depth = $hierarchy_handler_object->get_depth($field, $key);
         $vars['rows'][$key][$first_column] = theme('indentation', array('size' => $depth)) . $vars['rows'][$key][$first_column];
         $vars['row_classes'][$key][] = 'depth-' . $depth;
diff --git a/handlers/draggableviews_handler.inc b/handlers/draggableviews_handler.inc
index cecc8d7..3e25c20 100644
--- a/handlers/draggableviews_handler.inc
+++ b/handlers/draggableviews_handler.inc
@@ -51,4 +51,29 @@ class draggableviews_handler {
    *   Array with default values.
    */
   public function option_definition() {}
+
+  /**
+   * Get field info.
+   *
+   * @return array
+   *   Array with field specific info.
+   */
+  public function field_info($field_option) {
+	// Get the name of selected field.
+    list($field_table, $field_name) = explode(':', $field_option);
+
+	$field_info_field = field_info_field($field_name);
+
+	reset($field_info_field['columns']);
+	$column = key($field_info_field['columns']);
+
+	$field_info = array(
+	  'table' => $field_table,
+	  'name' => $field_name,
+	  'type' => $field_info_field['type'],
+	  'column' => $column,
+	);
+
+	return $field_info;
+  }
 }
\ No newline at end of file
diff --git a/handlers/draggableviews_handler_fieldapi.inc b/handlers/draggableviews_handler_fieldapi.inc
index b78a259..195e636 100644
--- a/handlers/draggableviews_handler_fieldapi.inc
+++ b/handlers/draggableviews_handler_fieldapi.inc
@@ -27,30 +27,26 @@ class draggableviews_handler_fieldapi extends draggableviews_handler {
     $form = array();
     $options = array('' => t('- Select -'));
 
-    // Check all the sortings added to a view.
-    // TODO: Research a better way to do this.
-    $sorts = isset($field->view->display_handler->display->display_options['sorts'])
-        ? $field->view->display_handler->display->display_options['sorts']
-        : array();
-    // If no sorts available for current display, use sorts from default display.
-    if (empty($sorts)) {
-      $sorts = isset($field->view->display['default']->display_options['sorts'])
-          ? $field->view->display['default']->display_options['sorts']
-          : array();
+    $fields = $field->view->display_handler->display->display_options['fields'];
+    // If no sorts avaialble for current display, use sorts from default display.
+    if (empty($fields)) {
+      $fields = $field->view->display['default']->display_options['fields'];
     }
-    foreach ($sorts as $sort_option) {
-      $field_name = $sort_option['field'];
+
+    foreach ($fields as $field_option) {
+      $field_name = $field_option['field'];
+
       // Field should be like "field_name_value".
-      if (strpos($field_name, 'field_') === FALSE || strpos($field_name, '_value') === FALSE) {
+      if (strpos($field_name, 'field_') === FALSE) {
         continue;
       }
 
       // Remove "_value" from field name and try to load the field.
       $field_name = drupal_substr($field_name, 0, drupal_strlen($field_name) - 6);
       if ($field_info = field_info_field($field_name)) {
-        if ($field_info['type'] == 'number_integer' || $field_info['type'] == 'list_integer') {
+        if ($field_info['type'] == 'number_integer' || $field_info['type'] == 'list_integer' || $field_info['type'] == 'entityreference') {
           $views_field_data = field_views_field_default_views_data($field_info);
-          $options[$sort_option['table'] . ':' . $sort_option['field']] = filter_xss($views_field_data[$sort_option['table']][$sort_option['field']]['title']);
+          $options[$field_option['table'] . ':' . $field_option['field']] = filter_xss($views_field_data[$field_option['table']][$field_option['field']]['title']);
         }
       }
     }
@@ -74,13 +70,17 @@ class draggableviews_handler_fieldapi extends draggableviews_handler {
   }
 
   function get($field, $index) {
-    // Get the name of selected field.
-    $field_option = $field->options['draggableviews']['draggableviews_handler_fieldapi']['field'];
-    list($field_table, $field_name) = explode(':', $field_option);
     // Current row.
     $row = $field->view->result[$index];
-    $alias = $field->view->query->get_field_alias($field_table, $field_name);
-    return ($alias) ? $row->{$alias} : NULL;
+
+    // Get the option of selected field.
+    $field_option = $field->options['draggableviews']['draggableviews_handler_fieldapi']['field'];
+
+    // Get the info of selected field.
+    $field_info = $this->field_info($field_option);
+
+    $field = $field_info['name'] . '_coalesce';
+    return (isset($row->{$field})) ? $row->{$field} : 0;
   }
 
   function set($form_state) {
@@ -94,7 +94,10 @@ class draggableviews_handler_fieldapi extends draggableviews_handler {
       $arguments += $view->exposed_raw_input;
       ksort($arguments);
       // Redirect view to the same page with exposed filters set.
-      $form_state['redirect'] = array(current_path(), array('query' => $view->exposed_raw_input));
+      $form_state['redirect'] = array(
+        current_path(),
+        array('query' => $view->exposed_raw_input)
+      );
     }
 
     $base_table = $view->field['draggableviews']->table;
@@ -108,21 +111,18 @@ class draggableviews_handler_fieldapi extends draggableviews_handler {
     }
 
     $options_field = $view->field['draggableviews']->options['draggableviews']['draggableviews_handler_fieldapi']['field'];
-    list($field_table, $field_column) = explode(':', $options_field);
-    // Remove '_value' from column name to get field name.
-    $field_name = drupal_substr($field_column, 0, drupal_strlen($field_column) - 6);
+    list(, $field_name) = explode(':', $options_field);
 
-    // Give other modules a chance to alter saved arguments.
-    drupal_alter('draggableviews_handler_fieldapi_arguments', $fv['draggableviews'], $view);
-
-    // Reorder the items by weight.
-    uasort($fv['draggableviews'], 'drupal_sort_weight');
+    // Reset keys and use them as the unique wieght value
+    $fv['draggableviews'] = array_values($fv['draggableviews']);
 
+    // Give other modules a chance to alter saved arguments.
+    // drupal_alter('draggableviews_handler_fieldapi_arguments', $fv['draggableviews'], $view);
     // Save the values of the field.
-    foreach ($fv['draggableviews'] as $item) {
+    foreach ($fv['draggableviews'] as $key => $item) {
       if (isset($item['id']) && isset($item['weight'])) {
         $entity_wrapper = entity_metadata_wrapper($entity_type, $item['id']);
-        $entity_wrapper->{$field_name} = $item['weight'];
+        $entity_wrapper->{$field_name} = $key;
         $entity_wrapper->save();
       }
     }
diff --git a/handlers/draggableviews_hierarchy_handler.inc b/handlers/draggableviews_hierarchy_handler.inc
index 1d5e6f2..10ef08a 100644
--- a/handlers/draggableviews_hierarchy_handler.inc
+++ b/handlers/draggableviews_hierarchy_handler.inc
@@ -53,6 +53,31 @@ class draggableviews_hierarchy_handler {
   public function option_definition() {}
 
   /**
+   * Get field info.
+   *
+   * @return array
+   *   Array with field specific info.
+   */
+  public function field_info($field_option) {
+    // Get the name of selected field.
+    list($field_table, $field_name) = explode(':', $field_option);
+
+    $field_info_field = field_info_field($field_name);
+
+    reset($field_info_field['columns']);
+    $column = key($field_info_field['columns']);
+
+    $field_info = array(
+      'table' => $field_table,
+      'name' => $field_name,
+      'type' => $field_info_field['type'],
+      'column' => $column,
+    );
+
+    return $field_info;
+  }
+
+  /**
    * Get "results" array index of and item with specific base field id.
    *
    * @param object $view
diff --git a/handlers/draggableviews_hierarchy_handler_native.inc b/handlers/draggableviews_hierarchy_handler_native.inc
index ed2db02..6a81a48 100644
--- a/handlers/draggableviews_hierarchy_handler_native.inc
+++ b/handlers/draggableviews_hierarchy_handler_native.inc
@@ -21,7 +21,7 @@ class draggableviews_hierarchy_handler_native extends draggableviews_hierarchy_h
   public function get_depth($field, $index) {
     // $index can be NULL for multiple reasons. Common problem
     // is after parent is deleted.
-    if (!isset($index) || !isset($field->view->result[$index])) {
+    if (!isset($index)) {
       return;
     }
     $row = $field->view->result[$index];
diff --git a/views/draggableviews_handler_sort.inc b/views/draggableviews_handler_sort.inc
index 981c97f..ac94521 100644
--- a/views/draggableviews_handler_sort.inc
+++ b/views/draggableviews_handler_sort.inc
@@ -13,23 +13,35 @@ class draggableviews_handler_sort extends views_handler_sort {
     $this->ensure_my_table();
     // If new items should be placed in the bottom.
     if ($this->options['draggableviews_setting_new_items_bottom_list']) {
-      // New items will get the biggest integer possible instead of NULL.
-      $field = "COALESCE($this->table_alias.$this->field, 2147483647)";
-      $alias = $this->table_alias . '_' . $this->field . '_coalesce';
+      //If using the field api sort by fields weight
+      if ($this->options['draggableviews_weight_field']) {
+        $handler = $this->view->field['draggableviews']->options['draggableviews']['handler'];
+        $handler_object = draggableviews_get_handler_class($handler, 'handler');
+        // Get the info of selected field.
+        $field_info = $handler_object->field_info($this->options['draggableviews_weight_field']);
 
-      // No need to call $this->query->add_field(), add_orderby() adds the field.
-      $this->query->add_orderby(NULL, $field, $this->options['order'], $alias);
-    }
-    else {
-      // New items will be placed at the top as have NULL value.
-      $this->query->add_orderby($this->table_alias, $this->real_field, $this->options['order']);
-    }
+        $field_table = $field_info['table'];
+        $field_column = $field_info['name'] . '_' . $field_info['column'];
+        // New items will get the biggest integer possible instead of NULL.
+        $field = "COALESCE($field_table.$field_column, 2147483647)";
+        $alias = $field_info['name'] . '_coalesce';
+      }
+      else {
+        // New items will get the biggest integer possible instead of NULL.
+        $field = "COALESCE($this->table_alias.$this->field, 2147483647)";
+        $alias = $this->table_alias . '_' . $this->field . '_coalesce';
+      }
+       // No need to call $this->query->add_field(), add_orderby() adds the field.
+       $this->query->add_orderby(NULL, $field, $this->options['order'], $alias);
+     }
   }
 
   function option_definition() {
     $options = parent::option_definition();
 
     $options['draggableviews_setting_view'] = array('default' => '');
+    $options['draggableviews_weight_field'] = array('default' => '');
+    $options['draggableviews_parent_field'] = array('default' => '');
     $options['draggableviews_setting_arguments'] = array('default' => 'all');
     $options['draggableviews_setting_arguments_php'] = array('default' => '');
     $options['draggableviews_setting_new_items_bottom_list'] = array('default' => TRUE);
@@ -69,6 +81,55 @@ class draggableviews_handler_sort extends views_handler_sort {
       }
     }
 
+    // Check all the sortings added to a view. Hope there is
+    // better way to determine them. Need to research.
+    $fields = $this->view->display_handler->display->display_options['fields'];
+    // If no sorts avaialble for current display, use sorts from default display.
+    if (empty($fields)) {
+      $fields = $this->view->display['default']->display_options['fields'];
+    }
+
+    foreach ($fields as $field_option) {
+      $field_name = $field_option['field'];
+      //dpm($field_name);
+      // Field should be like "field_name_value".
+      if (strpos($field_name, 'field_') === FALSE) {
+        continue;
+      }
+
+      if ($field_info = field_info_field($field_name)) {
+        if ($field_info['type'] == 'number_integer' || $field_info['type'] == 'list_integer' || $field_info['type'] == 'entityreference') {
+          $views_field_data = field_views_field_default_views_data($field_info);
+          $field_options[$field_option['table'] . ':' . $field_option['field']] = filter_xss($views_field_data[$field_option['table']][$field_option['field']]['title']);
+        }
+      }
+    }
+
+    // If options are emtpy, show warning message.
+    if (count($field_options) == 1) {
+      $form['field_warning'] = array(
+        '#markup' => '<div class="messages warning">' . t('Add the appropriate weight and parent to your draggableviews field.') . '</div>',
+      );
+    }
+
+    $form['draggableviews_weight_field'] = array(
+      '#type' => 'select',
+      '#title' => t('Weight Field'),
+      '#disabled' => TRUE,
+      '#options' => $field_options,
+      '#default_value' => $fields['draggableviews']['draggableviews']['draggableviews_handler_fieldapi']['field'],
+      '#description' => t('The weight field set within the DraggableViews field.'),
+    );
+
+    $form['draggableviews_parent_field'] = array(
+      '#type' => 'select',
+      '#title' => t('Parent Field'),
+      '#disabled' => TRUE,
+      '#options' => $field_options,
+      '#default_value' => $fields['draggableviews']['draggableviews']['draggableviews_hierarchy_handler_fieldapi']['field'],
+      '#description' => t('The parent field set within the DraggableViews field.'),
+    );
+
     $form['draggableviews_setting_arguments'] = array(
       '#title' => t('Arguments handling'),
       '#type' => 'radios',
diff --git a/views/draggableviews_join_handler.inc b/views/draggableviews_join_handler.inc
index dd7c0c4..5193a9f 100644
--- a/views/draggableviews_join_handler.inc
+++ b/views/draggableviews_join_handler.inc
@@ -21,7 +21,6 @@ class draggableviews_join_handler extends views_join {
     else {
       $right_table = $this->definition['table formula'];
     }
-
     if ($this->left_table) {
       $left = $view_query->get_table_info($this->left_table);
       $left_field = "$left[alias].$this->left_field";
@@ -73,13 +72,104 @@ class draggableviews_join_handler extends views_join {
       $arguments[':view_arguments'] = json_encode($view_arguments);
     }
 
-    $select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
+    // TODO: is this code above not needed anymore.
+    // TODO: not adding the join fixes multiple entries
+    //$select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
+
+    // Add empty arguments array.
+    $arguments = array();
 
     // Add also parent field.
     if ($order_view = _draggableviews_load_order_view($view)) {
-      if (isset($order_view->field['draggableviews']->options['draggableviews']['hierarchy_handler'])
-        && $order_view->field['draggableviews']->options['draggableviews']['hierarchy_handler'] == 'draggableviews_hierarchy_handler_native') {
-        $select_query->addField($table['alias'], 'parent', 'draggableviews_structure_parent');
+      $draggableviews = $order_view->field['draggableviews']->options['draggableviews'];
+      if (isset($draggableviews['handler'])) {
+        if ($draggableviews['handler'] == 'draggableviews_handler_native') {
+          $condition = "$left_field = $table[alias].$this->field";
+
+          // Check whether setting view is set.
+          $weight_key = _draggableviews_get_draggable_sort($view);
+
+          if (!empty($view->sort[$weight_key]->options['draggableviews_setting_view'])) {
+            $condition .= " AND $table[alias].view_name = :view_name";
+            $condition .= " AND $table[alias].view_display = :view_display";
+
+            // If it is setting view, set current view name and display name.
+            if (isset($view->field['draggableviews'])) {
+              // if ($view->sort[$weight_key]->options['draggableviews_setting_view'] == 'self') {
+              $arguments[':view_name'] = $view->name;
+              $arguments[':view_display'] = $view->current_display;
+            }
+            else {
+              list($setting_view_name, $setting_view_display) = explode(':', $view->sort[$weight_key]->options['draggableviews_setting_view']);
+              $arguments[':view_name'] = $setting_view_name;
+              $arguments[':view_display'] = $setting_view_display;
+            }
+
+            // Arguments passed to view (including exposed filters).
+            $view_arguments = $view->args;
+            if (isset($view->exposed_raw_input)) {
+              $view_arguments += $view->exposed_raw_input;
+              // Remove 'items_per_page' argument if added by exposed pager filter.
+              unset($view_arguments['items_per_page']);
+              ksort($view_arguments);
+            }
+            // Alter arguments according to sort criteria settings.
+            if ($view->sort[$weight_key]->options['draggableviews_setting_arguments'] == 'none') {
+              $view_arguments = array();
+            }
+            // If PHP arguments processing is set.
+            if ($view->sort[$weight_key]->options['draggableviews_setting_arguments'] == 'php') {
+              $clone_view = clone $view;
+              $view_arguments = _draggableviews_eval_return($view->sort[$weight_key]->options['draggableviews_setting_arguments_php'], $view_arguments, $clone_view);
+            }
+            $condition .= " AND $table[alias].args = :view_arguments";
+            $arguments[':view_arguments'] = json_encode($view_arguments);
+          }
+          $select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
+        }
+        else {
+          list($handler_table, $handler_field_name) = explode(':', $draggableviews[$draggableviews['handler']]['field']);
+          $handler_field_info = field_info_field($handler_field_name);
+
+          //dsm($field);
+          if ($handler_field_info['type'] == 'entityreference') {
+            $handler_field_type = 'target_id';
+          }
+          else {
+            $handler_field_type = 'value';
+          }
+
+          $field_key = $handler_table . '_' . $handler_field_name . '_' . $handler_field_type;
+          $field_column = $handler_field_name . '_' . $handler_field_type;
+
+          $condition = "$left_field = $handler_table.$this->field";
+
+          $select_query->addJoin($this->type, $handler_table, $handler_table, $condition, $arguments);
+        }
+      }
+      if (isset($draggableviews['hierarchy_handler'])) {
+        if ($draggableviews['hierarchy_handler'] == 'draggableviews_hierarchy_handler_native') {
+          $select_query->addField($table['alias'], 'parent', 'draggableviews_structure_parent');
+        }
+        else {
+          list($hierarchy_handler_table, $hierarchy_handler_field_name) = explode(':', $draggableviews[$draggableviews['hierarchy_handler']]['field']);
+          $field_info = field_info_field($hierarchy_handler_field_name);
+
+          //dsm($field);
+          if ($field_info['type'] == 'entityreference') {
+            $field_value_type = 'target_id';
+          }
+          else {
+            $field_value_type = 'value';
+          }
+
+          $field_key = $hierarchy_handler_table . '_' . $hierarchy_handler_field_name . '_' . $field_value_type;
+          $field_column = $hierarchy_handler_field_name . '_' . $field_value_type;
+
+          $condition = "$left_field = $hierarchy_handler_table.$this->field";
+
+          $select_query->addJoin($this->type, $hierarchy_handler_table, $hierarchy_handler_table, $condition, $arguments);
+        }
       }
     }
   }
