diff --git a/site_map.css b/site_map.css
deleted file mode 100644
index a71cc45..0000000
--- a/site_map.css
+++ /dev/null
@@ -1,27 +0,0 @@
-
-#site-map .description {
-  margin-bottom: 0.5em;
-}
-
-#site-map .site-map-box {
-  margin-bottom: 1em;
-}
-
-#site-map .site-map-box ul {
-  padding-left: 1.5em;
-}
-
-/* Styles when RSS icons are displayed on the left. */
-#site-map .site-map-rss-left ul {
-  padding-left: 0;
-}
-#site-map .site-map-rss-left li {
-  list-style-type: none;
-  list-style-image: none;
-  background-image: none;
-  margin: 0;
-  padding: 0;
-}
-#site-map .site-map-rss-left ul li li {
-  padding-left: 1.5em;
-}
diff --git a/site_map.module b/site_map.module
index d225b2f..30426d8 100644
--- a/site_map.module
+++ b/site_map.module
@@ -40,7 +40,7 @@ function site_map_theme() {
       'file' => 'site_map.theme.inc',
     ),
     'site_map_box' => array(
-      'variables' => array('title' => NULL, 'content' => NULL, 'class' => NULL),
+      'variables' => array('title' => NULL, 'content' => NULL, 'attributes' => array()),
       'file' => 'site_map.theme.inc',
     ),
     'site_map_feed_icon' => array(
@@ -133,7 +133,7 @@ function site_map_page() {
   drupal_set_title(variable_get('site_map_page_title', t('Site map')));
 
   if (variable_get('site_map_css', 0) != 1) {
-    drupal_add_css(drupal_get_path('module', 'site_map') . '/site_map.css');
+    drupal_add_css(drupal_get_path('module', 'site_map') . '/site_map.theme.css');
   }
 
   return theme('site_map');
@@ -141,7 +141,7 @@ function site_map_page() {
 
 function _site_map_front_page() {
   $output = '';
-  $class = '';
+  $class = array();
   $title = t('Front page');
   $output = l(t('Front page of %sn', array('%sn' => variable_get('site_name', 'Drupal'))), '<front>', array('html' => TRUE));
 
@@ -154,12 +154,15 @@ function _site_map_front_page() {
       $output .= ' ' . $rss_link;
     }
     else {
-      $class = ' site-map-rss-left';
+      $class[] = 'site-map-rss-left';
       $output = $rss_link . ' ' . $output;
     }
   }
 
-  return theme('site_map_box', array('title' => $title, 'content' => $output, 'class' => 'site-map-front-box' . $class));
+  $class[] = 'site-map-box-front';
+  $attributes = array('class' => $class);
+
+  return theme('site_map_box', array('title' => $title, 'content' => $output, 'attributes' => $attributes));
 }
 
 /**
@@ -167,7 +170,7 @@ function _site_map_front_page() {
  */
 function _site_map_blogs() {
   $output = '';
-  $class = '';
+  $class = array();
   if (module_exists('blog')) {
     $title = t('Blogs');
     $output = '<div class="description">' . t('Community blog and recent blog authors at %sn.', array('%sn' => variable_get('site_name', 'Drupal'))) . '</div>';
@@ -179,7 +182,7 @@ function _site_map_blogs() {
         $blog_link .= ' ' . $rss_link;
       }
       else {
-        $class = ' site-map-rss-left';
+        $class[] = 'site-map-rss-left';
         $blog_link = $rss_link . ' ' . $blog_link;
       }
     }
@@ -206,8 +209,12 @@ function _site_map_blogs() {
       }
       $blogs[] = $blog_item;
     }
+
+    $class[] = 'site-map-box-blog';
+    $attributes = array('class' => $class);
+
     $output .= theme('item_list', array('items' => $blogs));
-    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'class' => 'site-map-blog-box' . $class));
+    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'attributes' => $attributes));
   }
 
   return $output;
@@ -215,7 +222,7 @@ function _site_map_blogs() {
 
 function _site_map_audio() {
   $output = '';
-  $class = '';
+  $class = array();
   if (module_exists('audio')) {
     $title = t('Audio');
     $output = l(t('Audio content'), 'audio');
@@ -225,11 +232,15 @@ function _site_map_audio() {
         $output .= ' ' . $rss_link;
       }
       else {
-        $class = ' site-map-rss-left';
+        $class[] = 'site-map-rss-left';
         $output = $rss_link . ' ' . $output;
       }
     }
-    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'class' => 'site-map-audio-box' . $class));
+
+    $class[] = 'site-map-box-audio';
+    $attributes = array('class' => $class);
+
+    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'attributes' => $attributes));
   }
 
   return $output;
@@ -237,7 +248,7 @@ function _site_map_audio() {
 
 function _site_map_video() {
   $output = '';
-  $class = '';
+  $class = array();
   if (module_exists('video')) {
     $title = t('Video');
     $output = l(t('Video content'), 'video');
@@ -247,11 +258,15 @@ function _site_map_video() {
         $output .= ' ' . $rss_link;
       }
       else {
-        $class = ' site-map-rss-left';
+        $class[] = 'site-map-rss-left';
         $output = $rss_link . '  ' . $output;
       }
     }
-    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'class' => 'site-map-video-box' . $class));
+
+    $class[] = 'site-map-box-video';
+    $attributes = array('class' => $class);
+
+    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'attributes' => $attributes));
   }
 
   return $output;
@@ -278,7 +293,9 @@ function _site_map_books() {
     }
 
     if (!empty($output)) {
-      $output = theme('site_map_box', array('title' => $title, 'content' => $description . $output, 'class' => 'site-map-book-box'));
+      $attributes = array('class' => array('site-map-box-book'));
+
+      $output = theme('site_map_box', array('title' => $title, 'content' => $description . $output, 'attributes' => $attributes));
     }
   }
 
@@ -290,6 +307,7 @@ function _site_map_books() {
  */
 function _site_map_menus() {
   $output = '';
+  $class = array();
   $mids = array_filter(variable_get('site_map_show_menus', array()));
 
   if (!empty($mids)) {
@@ -304,7 +322,10 @@ function _site_map_menus() {
       $menu_html = drupal_render($menu_display);
       if (!empty($menu_html)) {
         $title = $menu['title'];
-        $output .= theme('site_map_box', array('title' => $title, 'content' => $menu_html, 'class' => 'site-map-menu-box'));
+        $class[] = 'site-map-box-menu';
+        $class[] = 'site-map-box-menu-' . $mid;
+        $attributes = array('class' => $class);
+        $output .= theme('site_map_box', array('title' => $title, 'content' => $menu_html, 'attributes' => $attributes));
       }
     }
   }
@@ -316,8 +337,9 @@ function _site_map_faq() {
   $output = '';
   if (module_exists('faq')) {
     $title = variable_get('faq_title', t('Frequently Asked Questions'));
+    $attributes = array('class' => array('site-map-box-faq'));
     $output = faq_get_faq_list();
-    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'class' => 'site-map-faq-box'));
+    $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'attributes' => $attributes));
   }
 
   return $output;
@@ -357,7 +379,7 @@ function _site_map_taxonomys() {
  */
 function _site_map_taxonomy_tree($vid, $name = NULL, $description = NULL) {
   $output = '';
-  $class = '';
+  $class = array();
   if ($vid == variable_get('forum_nav_vocabulary', '')) {
     $title = l($name, 'forum');
     $threshold = variable_get('site_map_forum_threshold', -1);
@@ -426,7 +448,7 @@ function _site_map_taxonomy_tree($vid, $name = NULL, $description = NULL) {
         $term_item .= ' ' . $rss_link;
       }
       else {
-        $class = ' site-map-rss-left';
+        $class[] = 'site-map-rss-left';
         $term_item = $rss_link . ' ' . $term_item;
       }
     }
@@ -443,7 +465,12 @@ function _site_map_taxonomy_tree($vid, $name = NULL, $description = NULL) {
       $output .= "</li>\n</ul>\n";
     }
   }
-  $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'class' => 'site-map-terms-box site-map-terms-box-' . $vid . $class));
+
+  $class[] = 'site-map-box-terms';
+  $class[] = 'site-map-box-terms-' . $vid;
+  $attributes = array('class' => $class);
+
+  $output = theme('site_map_box', array('title' => $title, 'content' => $output, 'attributes' => $attributes));
 
   return $output;
 }
diff --git a/site_map.theme.css b/site_map.theme.css
new file mode 100644
index 0000000..a71cc45
--- /dev/null
+++ b/site_map.theme.css
@@ -0,0 +1,27 @@
+
+#site-map .description {
+  margin-bottom: 0.5em;
+}
+
+#site-map .site-map-box {
+  margin-bottom: 1em;
+}
+
+#site-map .site-map-box ul {
+  padding-left: 1.5em;
+}
+
+/* Styles when RSS icons are displayed on the left. */
+#site-map .site-map-rss-left ul {
+  padding-left: 0;
+}
+#site-map .site-map-rss-left li {
+  list-style-type: none;
+  list-style-image: none;
+  background-image: none;
+  margin: 0;
+  padding: 0;
+}
+#site-map .site-map-rss-left ul li li {
+  padding-left: 1.5em;
+}
diff --git a/site_map.theme.inc b/site_map.theme.inc
index 4d9c19e..fecc91d 100644
--- a/site_map.theme.inc
+++ b/site_map.theme.inc
@@ -20,24 +20,34 @@ function theme_site_map_rss_legend() {
 }
 
 /**
+ * Preprocesses the variables for theme_site_map_box().
+ */
+function template_preprocess_site_map_box(&$variables) {
+  $variables['attributes']['class'][] = 'site-map-box';
+}
+
+/**
  * Returns HTML for a themed site map box.
  *
  * @param $variables
  *   An associative array containing:
  *   - title: The subject of the box.
  *   - content: The content of the box.
- *   - class:  Optional extra class for the box.
+ *   - attributes:  Optional attributes for the box.
  */
 function theme_site_map_box($variables) {
+  $title = $variables['title'];
+  $content = $variables['content'];
+  $attributes = $variables['attributes'];
+
   $output = '';
-  if (($variables['title'] || $variables['content'])) {
-    $class = $variables['class'] ? 'site-map-box ' . $variables['class'] : 'site-map-box';
-    $output .= '<div class="' . $variables['class'] . '">';
-    if ($variables['title']) {
-      $output .= '<h2 class="title">' . $variables['title'] . '</h2>';
+  if (!empty($title) || !empty($content)) {
+    $output .= '<div' . drupal_attributes($attributes) . '>';
+    if (!empty($title)) {
+      $output .= '<h2 class="title">' . $title . '</h2>';
     }
-    if ($variables['content']) {
-      $output .= '<div class="content">' . $variables['content'] . '</div>';
+    if (!empty($content)) {
+      $output .= '<div class="content">' . $content . '</div>';
     }
     $output .= '</div>';
   }
@@ -113,7 +123,7 @@ function theme_site_map_menu_tree($variables) {
 }
 
 /**
- * This is a one by one clone of the core theme_menu_item() function that allows
+ * This is a one by one clone of the core theme_menu_link() function that allows
  * custom theming of the site map page items.
  *
  * Returns HTML for a menu link and submenu.
@@ -136,7 +146,7 @@ function theme_site_map_menu_link(array $variables) {
 }
 
 /**
- * Process variables for site-map.tpl.php.
+ * Preprocesses the variables for site-map.tpl.php.
  *
  * @see site-map.tpl.php
  */
