diff --git a/plugins/FeedsTermProcessor.inc b/plugins/FeedsTermProcessor.inc
index 28577a87e2f1837df20a045ecf8425ee754b76b2..83183b05e9aa027c7f9de52eb19d50eb37b267c7 100644
--- a/plugins/FeedsTermProcessor.inc
+++ b/plugins/FeedsTermProcessor.inc
@@ -54,8 +54,19 @@ class FeedsTermProcessor extends FeedsProcessor {
 
   /**
    * Saves a term.
+   *
+   * We de-array parent fields with only one item.
+   * This stops leftandright module from freaking out.
    */
   protected function entitySave($term) {
+    if (isset($term->parent)) {
+      if (is_array($term->parent) && count($term->parent) == 1) {
+        $term->parent = reset($term->parent);
+      }
+      if (isset($term->tid) && ($term->parent == $term->tid || (is_array($term->parent) && in_array($term->tid, $term->parent)))) {
+        throw new FeedsValidationException(t("A term can't be its own child. GUID:@guid", array('@guid' => $term->feeds_item->guid)));
+      }
+    }
     taxonomy_term_save($term);
   }
 
@@ -74,6 +85,7 @@ class FeedsTermProcessor extends FeedsProcessor {
   public function configDefaults() {
     return array(
       'vocabulary' => 0,
+      'force_update' => TRUE,
     ) + parent::configDefaults();
   }
 
@@ -93,6 +105,12 @@ class FeedsTermProcessor extends FeedsProcessor {
       '#options' => $options,
       '#default_value' => $this->config['vocabulary'],
     );
+    $form['force_update'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Force update'),
+      '#description' => t('Force update of imported terms even if no data change. For import of <strong>term parents</strong> you need to import twice and set this in the second pass.'),
+      '#default_value' => $this->config['force_update'],
+    );
     return $form;
   }
 
@@ -105,6 +123,57 @@ class FeedsTermProcessor extends FeedsProcessor {
     }
   }
 
+
+ /**
+  * Override setTargetElement to operate on a target item that is a term.
+  */
+  public function setTargetElement(FeedsSource $source, $target_node, $target_element, $value) {
+
+    switch ($target_element) {
+      case 'parent':
+        if (!empty($value)) {
+          $terms = taxonomy_get_term_by_name($value);
+          $parent_tid = '';
+          foreach ($terms as $term) {
+            if ($term->vid == $target_node->vid) {
+              $parent_tid = $term->tid;
+            }
+          }
+          if (!empty($parent_tid)) {
+            $target_node->parent[] = $parent_tid;
+          }
+          else {
+            $target_node->parent[] = 0;
+          }
+        }
+        else {
+          $target_node->parent[] = 0;
+        }
+        break;
+      case 'parentguid':
+        // value is parent_guid field value
+        $query = db_select('feeds_item')
+          ->fields('feeds_item', array('entity_id'))
+          ->condition('entity_type', $this->entityType());
+        $parent_tid = $query->condition('guid', $value)->execute()->fetchField();
+        $target_node->parent[] = ($parent_tid) ? $parent_tid : 0;
+
+        break;
+      case 'weight':
+        if (!empty($value)) {
+          $weight = intval($value);
+        }
+        else {
+          $weight = 0;
+        }
+        $target_node->weight = $weight;
+        break;
+      default:
+        parent::setTargetElement($source, $target_node, $target_element, $value);
+        break;
+    }
+  }
+
   /**
    * Return available mapping targets.
    */
@@ -116,6 +185,21 @@ class FeedsTermProcessor extends FeedsProcessor {
         'description' => t('Name of the taxonomy term.'),
         'optional_unique' => TRUE,
        ),
+      'parent' => array(
+        'name' => t('Parent Term Name'),
+        'description' => t('Name of the Parent Term.'),
+        'optional_unique' => TRUE,
+      ),
+      'parentguid' => array(
+        'name' => t('Parent GUID'),
+        'description' => t('The globally unique identifier of the item\'s parent term.'),
+        'optional_unique' => TRUE,
+      ),
+      'weight' => array(
+        'name' => t('Term Weight'),
+        'description' => t('Weight of the Term.'),
+        'optional_unique' => TRUE,
+      ),
       'description' => array(
         'name' => t('Term description'),
         'description' => t('Description of the taxonomy term.'),
@@ -147,6 +231,12 @@ class FeedsTermProcessor extends FeedsProcessor {
         if ($tid = db_query("SELECT tid FROM {taxonomy_term_data} WHERE name = :name AND vid = :vid", array(':name' => $value, ':vid' => $vocabulary->vid))->fetchField()) {
           return $tid;
         }
+      } else if($target == 'guid') {
+        $query = db_select('feeds_item')
+          ->fields('feeds_item', array('entity_id'))
+          ->condition('entity_type', 'taxonomy_term');
+        $tid = $query->condition('guid', $value)->execute()->fetchField();
+        return ($tid) ? $tid : 0;
       }
     }
     return 0;
@@ -163,4 +253,17 @@ class FeedsTermProcessor extends FeedsProcessor {
     }
     throw new Exception(t('No vocabulary defined for Taxonomy Term processor.'));
   }
+
+  /**
+   * Override getHash()
+   *
+   * @return string
+   */
+  protected function getHash($entity_id) {
+    if($this->config['force_update']) {
+      return ''; // dummy to always update
+    } else {
+      return parent::getHash($entity_id);
+    }
+  }
 }