diff --git a/tac_lite/tac_lite.module b/tac_lite/tac_lite.module
index d69671d..b8d3e0e 100644
--- a/tac_lite/tac_lite.module
+++ b/tac_lite/tac_lite.module
@@ -103,6 +103,14 @@ function tac_lite_admin_settings() {
       '#multiple' => TRUE,
       '#required' => TRUE,
     );
+
+    $form['tac_lite_inheritance'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enable automatic inheritance of permissions'),
+      '#default_value' => variable_get('tac_lite_inheritance', false),
+      '#description' => t('If enabled, the permissions of a parent term apply to ALL of the children of that term. Choosing a child term directly will not automatically set permission on all of its parent terms (unless they are chosen too).'),
+    );
+
     $scheme_options = array();
     // Currently only view, edit, delete permissions possible, so 7
     // permutations will be more than enough.
@@ -410,6 +418,8 @@ function _tac_lite_get_terms_by_nid($nid) {
  * or because of the roles they have.
  */
 function _tac_lite_user_tids(&$account, $scheme) {
+  global $tac_lite_all_allowed_tids;
+
   // grant id 0 is reserved for nodes which were not given a grant id when they were created.  By adding 0 to the grant id, we let the user view those nodes.
   $grants = array(0);
   $config = _tac_lite_config($scheme);
@@ -417,8 +427,13 @@ function _tac_lite_user_tids(&$account, $scheme) {
   if (isset($account->$realm) && count($account->$realm)) {
     // $account->$realm is array.  Keys are vids, values are array of tids within that vocabulary, to which the user has access
     foreach ($account->$realm as $tids) {
-      if (count($tids)) {
-	$grants = array_merge($grants, $tids);
+      if (!isset($tids[''])) {
+		  if(variable_get('tac_lite_inheritance', false)){
+			  tac_lite_recursive_get_children_tids($tids);
+			  $grants = array_unique(array_merge($grants, $tids, $tac_lite_all_allowed_tids));
+		  }else{
+			  $grants = array_merge($grants, $tids);
+		  }
       }
     }
   }
@@ -426,13 +441,18 @@ function _tac_lite_user_tids(&$account, $scheme) {
   // add per-role grants in addition to per-user grants
   $defaults = variable_get('tac_lite_grants_scheme_' . $scheme, array());
   foreach ($account->roles as $rid => $role_name) {
-    if (count($defaults[$rid])) {
-      foreach ($defaults[$rid] as $tids) {
-        if (count($tids)) {
-          $grants = array_merge($grants, $tids);
-        }
-      }
-    }
+	if (count($defaults[$rid])) {
+	  foreach ($defaults[$rid] as $tids) {
+		if (!isset($tids[''])) {
+		  if(variable_get('tac_lite_inheritance', false)){
+			  tac_lite_recursive_get_children_tids($tids);
+			  $grants = array_unique(array_merge($grants, $tids, $tac_lite_all_allowed_tids));
+		  }else{
+			  $grants = array_merge($grants, $tids);
+		  }
+		}
+	  }
+	}
   }
   
   // Because of some flakyness in the form API and the form we insert under
@@ -499,3 +519,68 @@ function tac_lite_db_rewrite_sql($query, $primary_table, $primary_field, $args)
     }
   }
 }
+
+/**
+ * When passed an array of term ids, this function will add
+ * all of the children for all of the terms to the global
+ * variable $tac_lite_all_allowed_tids.
+ *
+ * @param $tids An array of term ids
+ **/
+function tac_lite_recursive_get_children_tids($tids){
+	global $tac_lite_all_allowed_tids;
+	$tac_lite_all_allowed_tids = array();
+
+	foreach($tids as $tid){
+		if($tid != 0){
+			//this will (eventually, through other functions) add the tids to a global variable
+			if(!in_array($tid, $tac_lite_all_allowed_tids)){
+				$children = tac_lite_get_children_tids($tid);
+			}
+		}
+	}
+	//nothing to return; the data is being written to $tac_lite_all_allowed_tids global variable
+}
+
+/**
+ * Gets ALL of the children of a taxonomy term (instead of only the direct descendants)
+ *
+ * @param integer $tid taxonomy term ID
+ * @return array an array of tid integers
+ **/
+function tac_lite_get_children_tids($tid){
+	$childTerm = tac_lite_get_children_custom($tid);
+	foreach ($childTerm as $termid){
+		$result[] = $termid;
+		$subterms = tac_lite_get_children_tids($termid);
+		if (!empty($subterms)) {
+			foreach ($subterms as $termid){
+				$result[] = (int)$termid;
+			}
+		}
+	}
+	return $result;
+}
+
+/**
+ * Gets all of the children terms for a given term id (not recursive)
+ * Looks a lot like taxonomy_get_children()
+ *
+ * Using a global variable, we can ensure that we don't run more SQL queries than are necessary.
+ * While testing, getting the children of 3 terms (8 terms total including parents and children)
+ * resulted in 29 queries; after using global variable it only runs 8 queries
+ *
+ * @param integer $tid taxonomy term ID
+ * @return array an array of tid strings
+ **/
+function tac_lite_get_children_custom($tid){
+	global $tac_lite_all_allowed_tids;
+	$children = array();
+		$tac_lite_all_allowed_tids[] = $tid;
+		$result = db_query("SELECT tid FROM {term_hierarchy} WHERE parent = %d ORDER BY 'tid'", $tid);
+		while($term = db_fetch_object($result)){
+			$children[] = (int)$term->tid;
+		}
+	return $children;
+}
+
