diff --git a/taxonomy_list.module b/taxonomy_list.module
index 9d4b7ef..3f9ab73 100644
--- a/taxonomy_list.module
+++ b/taxonomy_list.module
@@ -300,6 +300,10 @@ function taxonomy_list_show($str_vids, $max_depth = 'all', $op = NULL, $columns
     'columns' => variable_get('taxonomy_list_cell_per_row', 2),
     'format' => variable_get('taxonomy_list_format', 'table'),
     'list_mode' => variable_get('taxonomy_list_list_mode', 0),
+    'class' => 'taxonomy-list',
+    'taxonomy_info' => TRUE,
+    'taxonomy_page' => TRUE,
+    'taxonomy_list_types' => variable_get('taxonomy_list_types', FALSE),
     );
   $params = array_merge($params, $_GET);
   unset($params['q']);
@@ -318,13 +322,20 @@ function taxonomy_list_show($str_vids, $max_depth = 'all', $op = NULL, $columns
 
   array_walk($params, 'check_plain');
   
-  if ($params['max_depth'] == 'all') {
-    $params['max_depth'] = 9999999;
+  $vids = _taxonomy_list_vids_from_str($str_vids);
+  if (count($vids) <= 0) {
+    drupal_not_found();
+    return;
   }
- 
+  $output = _taxonomy_list_show($vids, $params);
+  $output = theme('taxonomy_list_admin_links', $vids) . $output;
+  return $output;
+}
+
+function _taxonomy_list_vids_from_str($str_vids) {
+  $vids = array();
   if ($str_vids == 'all') {
     $vocs = taxonomy_get_vocabularies();
-    $vids = array();
     foreach ($vocs as $vid => $vocab) {
       $vids[] = $vid;
     }
@@ -338,10 +349,12 @@ function taxonomy_list_show($str_vids, $max_depth = 'all', $op = NULL, $columns
       $vids = array($str_vids);
     }
   }
+  return $vids;
+}
 
-  if (count($vids) <= 0) {
-    drupal_not_found();
-    return;
+function _taxonomy_list_show($vids, $params) {
+  if ($params['max_depth'] == 'all') {
+    $params['max_depth'] = 9999999;
   }
 
   // Do we want to list the nodes?
@@ -352,7 +365,7 @@ function taxonomy_list_show($str_vids, $max_depth = 'all', $op = NULL, $columns
   $vocab_titles = array();
   $total_terms  = 0;
 
-  $output = '<div class="taxonomy-list">';
+  $output = '<div class="' . $params['class'] . '">';
 
   foreach ($vids as $vid) {
     $vocab = taxonomy_vocabulary_load($vid);
@@ -368,21 +381,23 @@ function taxonomy_list_show($str_vids, $max_depth = 'all', $op = NULL, $columns
     $total_terms += $c;
 
     $output .= '<div id="taxonomy-list-' . drupal_strtolower(form_clean_id($vocab->name)) . '">';
-    $output .= theme('taxonomy_list_vocabulary', $vocab, variable_get('taxonomy_list_types', FALSE), (count($vids) > 1));
+    if ($params['taxonomy_info']) {
+      $output .= theme('taxonomy_list_vocabulary', $vocab, $params['taxonomy_list_types'], (count($vids) > 1));
+    }
     $output .= theme(array('taxonomy_list_'. $params['format'], 'taxonomy_list_table'), $terms, $params['columns'], $params['list_mode']);
     $output .= '</div>';
   }
 
   $output .= '</div>'; // class="taxonomy-list"
 
-  if ($total_terms == 0) {
-    drupal_not_found();
-    return;
+  if ($params['taxonomy_page']) {
+    if ($total_terms == 0) {
+      drupal_not_found();
+      return;
+    }
+    drupal_set_title(filter_xss_admin(implode(variable_get('taxonomy_list_title_separator', ' & '), $vocab_titles)));
   }
 
-  drupal_set_title(filter_xss_admin(implode(variable_get('taxonomy_list_title_separator', ' & '), $vocab_titles)));
-  $output = theme('taxonomy_list_admin_links', $vids) . $output;
-
   return $output;
 }
 
@@ -815,17 +830,29 @@ function taxonomy_list_block($op = 'list', $delta = 0, $edit = array()) {
       return $blocks;
 
     case 'view':
-      // $delta is the vid.
-//      $block['content'] = taxonomy_list_show($delta, 'all', 'block', 1);
-      $tree = taxonomy_list_get_tree($delta);
-      $block['content'] = theme_taxonomy_list_block($tree);
+      $block_list_mode_id = 'taxonomy_list_block_' . $delta . '_list_mode';
+      
+      $params = array(
+        'max_depth' => 'all',
+        'op' => 'block',
+        'type' => NULL,
+        'columns' => '1',
+        'format' => 'list',
+        'list_mode' => variable_get($block_list_mode_id, 1),
+        'class' => 'taxonomy-list-block',
+        'taxonomy_info' => FALSE,
+        'taxonomy_list_types' => FALSE,
+        );
+      // $delta is the vid string; convert it to an array of vids.
+      $block['content'] = _taxonomy_list_show(_taxonomy_list_vids_from_str($delta), $params);
       return $block;
 
     case 'configure':
-      $form = array();
+      $form = taxonomy_list_block_configure($delta);
       return $form;
 
     case 'save':
+      taxonomy_list_block_save($delta, $edit);
       return;
   } // end switch($op)
 }
@@ -1078,3 +1105,36 @@ function taxonomy_list_admin_settings() {
 
   return system_settings_form($form);
 }
+
+/**
+ * Implements hook_block_configure
+ */
+function taxonomy_list_block_configure($delta = '') {
+  // The $delta parameter is the $vid of the block that is being configured.
+  $block_list_mode_id = 'taxonomy_list_block_' . $delta . '_list_mode';
+
+  $form = array();
+  // All we need to provide is the specific configuration options for our
+  // block. Drupal will take care of the standard block configuration options
+  // (block title, page visibility, etc.) and the save button.
+  $form['taxonomy_list_block_list_mode'] = array(
+    '#type' => 'radios',
+    '#title' => t('List Mode'),
+    '#options' => array(
+        '0' => t("Hierarchical - Subcategories set off to show the hierarchy."),
+        '1' => t('Flat - All terms are listed as the same level in the grid.'),
+      ),
+    '#default_value' => variable_get($block_list_mode_id, 1),
+    '#description' => t('Whether Taxonomy List displays the hierarchy of the terms.'),
+  );
+  return $form;
+}
+
+/**
+ * Implements hook_block_save().
+ */
+function taxonomy_list_block_save($delta = '', $edit = array()) {
+  $block_list_mode_id = 'taxonomy_list_block_' . $delta . '_list_mode';
+
+  variable_set($block_list_mode_id, $edit['taxonomy_list_block_list_mode']);
+}
