diff --git a/dmemcache.inc b/dmemcache.inc
index 97b85cd..28dfc96 100644
--- a/dmemcache.inc
+++ b/dmemcache.inc
@@ -195,37 +195,51 @@ function dmemcache_flush($bin = 'cache') {
   }
 }
 
-function dmemcache_stats($bin = 'cache', $type = '') {
-  // resolve requests for 'default' type to ''
-  if ($type == 'default') {
-    $type = '';
-  }
-  // resolve requests for 'default' bin to 'cache'.
-  if ($bin == 'default') {
-    $bin = 'cache';
-  }
-  if ($mc = dmemcache_object($bin)) {
-    // The PHP Memcache extension 3.x version throws an error if the stats
-    // type is NULL or not in {reset, malloc, slabs, cachedump, items, sizes}.
-    // If $type is 'default', then no parameter should be passed to the 
-    // Memcache memcache_get_extended_stats() function.
-    if ($type == 'default' || $type == '') {
-      if ($mc instanceof Memcached) {
-        return $mc->getStats();
+function dmemcache_stats($type = 'default', $aggregate = FALSE) {
+  $memcache_bins = variable_get('memcache_bins', array('cache' => 'default'));
+
+  foreach ($memcache_bins as $bin) {
+    // resolve requests for 'default' bin to 'cache'.
+    if ($bin == 'default') {
+      $bin = 'cache';
+    }
+    if ($mc = dmemcache_object($bin)) {
+      // The PHP Memcache extension 3.x version throws an error if the stats
+      // type is NULL or not in {reset, malloc, slabs, cachedump, items, sizes}.
+      // If $type is 'default', then no parameter should be passed to the 
+      // Memcache memcache_get_extended_stats() function.
+      if ($type == 'default' || $type == '') {
+        if ($mc instanceof Memcached) {
+          $stats[$bin] = $mc->getStats();
+        }
+        elseif ($mc instanceof Memcache) {
+          $stats[$bin] = $mc->getExtendedStats();
+        }
       }
-      elseif ($mc instanceof Memcache) {
-        return $mc->getExtendedStats();
+      else {
+        if ($mc instanceof Memcached) {
+          $stats[$bin] = $mc->getStats();
+        }
+        elseif ($mc instanceof Memcache) {
+          $stats[$bin] = $mc->getExtendedStats($type);
+        }
       }
     }
-    else {
-      if ($mc instanceof Memcached) {
-        return $mc->getStats();        
-      }
-      elseif ($mc instanceof Memcache) {
-        return $mc->getExtendedStats($type);
+  }
+  if ($aggregate) {
+    // Ignore variables that don't logically aggregate
+    $no_aggregate = array('pid', 'uptime', 'time', 'version', 'pointer_size', 'accepting_conns', 'listen_disabled_num');
+    foreach($stats as $bin => $servers) {
+      foreach ($servers as $server) {
+        foreach ($server as $key => $value) {
+          if (!in_array($key, $no_aggregate)) {
+           $stats[$bin]['total'][$key] += $value;
+          }
+        }
       }
     }
   }
+  return $stats;
 }
 
 /**
@@ -290,7 +304,8 @@ function dmemcache_object($bin = NULL, $flush = FALSE) {
       $memcacheCache[$bin] = &$memcacheCache['cache'];
     }
     else {
-      // Create a new Memcache object. Each cluster gets its own Memcache object.
+      // Create a new Memcache object. Each cluster gets its own Memcache
+      // object.
       if ($extension == 'Memcached') {
         $memcache = new Memcached;
         $default_opts = array(
@@ -300,6 +315,8 @@ function dmemcache_object($bin = NULL, $flush = FALSE) {
         foreach ($default_opts as $key => $value) {
           $memcache->setOption($key, $value);
         }
+        // See README.txt for setting custom Memcache options when using the
+        // memcached PECL extension.
         $memconf = variable_get('memcache_options', array());
         foreach ($memconf as $key => $value) {
           $memcache->setOption($key, $value);
@@ -327,10 +344,8 @@ function dmemcache_object($bin = NULL, $flush = FALSE) {
               $init = TRUE;
             }
           }
-          else {
-            if ($memcache instanceof Memcached && $memcache->addServer($host, $port) && !$init) {
-              $init = TRUE;
-            }
+          else if ($memcache->addServer($host, $port) && !$init) {
+            $init = TRUE;
           }
         }
       }
diff --git a/memcache_admin/memcache_admin.module b/memcache_admin/memcache_admin.module
index 612ed17..aa0757e 100644
--- a/memcache_admin/memcache_admin.module
+++ b/memcache_admin/memcache_admin.module
@@ -70,6 +70,8 @@ function memcache_admin_menu() {
       );
       $count++;
 
+/*
+ * TODO: Determine the best way to display the various other statistics.
       $sub_count = 0;
       foreach (array('default', 'malloc', 'maps', 'slabs', 'items', 'sizes') as $type) {
         $items['admin/reports/memcache/'. $cluster .'/'. $type] = array(
@@ -82,6 +84,7 @@ function memcache_admin_menu() {
         );
         $sub_count++;
       }
+*/
     }
   }
 
@@ -100,56 +103,147 @@ function memcache_admin_admin_settings() {
   return system_settings_form($form);
 }
 
+function _memcache_admin_default_bin($bin) {
+  if ($bin == 'default') {
+    return 'cache';
+  }
+  return $bin;
+}
+
+function _memcache_admin_stats_connections($current, $total) {
+  return t('!current open of !total total', array('!current' => number_format($current), '!total' => number_format($total)));
+}
+
+function _memcache_admin_stats_sets($cmd_set, $cmd_get) {
+  return t('!set sets (!sets%) of !total commands', array('!sets' => number_format($cmd_set / ($cmd_set + $cmd_get) * 100, 2), '!set' => number_format($cmd_set), '!total' => number_format($cmd_set + $cmd_get)));
+}
+
+function _memcache_admin_stats_gets($cmd_set, $cmd_get, $get_hits, $get_misses) {
+  return t('!total gets (!gets%), !hit hits (!percent_hit%) !miss misses (!percent_miss%)', array('!gets' => number_format($cmd_get / ($cmd_set + $cmd_get) * 100, 2), '!hit' => number_format($get_hits), '!percent_hit' => ($cmd_get > 0 ? number_format($get_hits / $cmd_get * 100, 2) : '0.00'), '!miss' => number_format($get_misses), '!percent_miss' => ($cmd_get > 0 ? number_format($get_misses / $cmd_get * 100, 2) : '0.00'), '!total' => number_format($cmd_get)));
+}
+
+function _memcache_admin_stats_counters($incr_hits, $incr_misses, $dec_hits, $decr_misses) {
+  return t('!incr increments, !decr decrements', array('!incr' => number_format($incr_hits + $incr_misses), '!decr' => number_format($decr_hits + $decr_misses)));
+}
+
+function _memcache_admin_stats_transfer($bytes_read, $bytes_written) {
+  return t('!to:!from (!written% to cache)', array('!to' => format_size($bytes_read), '!from' => format_size($bytes_written), '!written' => number_format($bytes_read / $bytes_written * 100, 2)));
+}
+
+function _memcache_admin_stats_average($cmd_get, $total_connections, $cmd_set, $bytes_read, $bytes_written) {
+  return t('!read in !get gets, !write in !set sets', array('!get' => number_format($cmd_get / $total_connections, 2), '!set' => number_format($cmd_set / $total_connections, 2), '!read' => format_size(number_format($bytes_written / $total_connections, 2)), '!write' => format_size(number_format($bytes_read / $total_connections, 2))));
+}
+
+function _memcache_admin_stats_memory($limit_maxbytes, $bytes) {
+  return t('!available (!percent%) of !total', array('!available' => format_size($limit_maxbytes - $bytes), '!percent' => number_format(100 - $bytes / $limit_maxbytes * 100, 2), '!total' => format_size($limit_maxbytes)));
+}
+
 /**
  * Memcahe Stats page
  *
- * @param string $cluster - which cluster to view?
- * @param string $type - which type of stat, eg: default, malloc, maps, cachedump, slabs, items or sizes
  * @return string
  */
-function memcache_admin_stats($cluster = 'default', $type = 'default') {
-  $bin = _memcache_admin_get_bin_for_cluster($cluster);
-
-  if ($bin) {
-    $stats = dmemcache_stats($bin, $type);
-
-    if (is_array($stats) && count($stats)) {
-      $output = '';
-
-      foreach ($stats as $server => $values) {
-        if (is_array($values)) {
-          // Do some custome value tweaks for specific stat page types.
-          switch ($type) {
-            case 'default' :
-              $values['uptime'] = format_interval($values['uptime']);
-              $values['time'] = format_date($values['time']);
-              $values['bytes'] = format_size($values['bytes']);
-              $values['bytes_read'] = format_size($values['bytes_read']);
-              $values['bytes_written'] = format_size($values['bytes_written']);
-              $values['limit_maxbytes'] = format_size($values['limit_maxbytes']);
-
-              //Custom Entries
-              $values['hit_percentage'] = ($values['cmd_get'] > 0) 
-                ? number_format(100.0 * $values['get_hits'] / $values['cmd_get'], 2) . '%' 
-                : '0';
-
-              $mem_used = intval($values['bytes']) / (intval($values['limit_maxbytes']) * 1024);
-              $values['mem_used'] = number_format(100.0 * $mem_used, 2) . '%';
-              break;
-          }
-
-          $output .= theme('memcache_admin_stats_table', $server, $values);
-        }
-        else {
-          drupal_set_message(t('Unable to get statistic from server %server', array('%server' => $server)));
-        }
-      }
-    }
+function memcache_admin_stats($bin = 'cache') {
+  $stats = dmemcache_stats('default', TRUE);
+
+  // The default bin is 'cache'.
+  $bin = _memcache_admin_default_bin($bin);
+
+  $memcache_servers = variable_get('memcache_servers', array('127.0.0.1:11211' => 'default'));
+
+  if (is_array($stats[$bin]) && count($stats[$bin])) {
+    $stats = $stats[$bin];
 
+    $mc = dmemcache_object($bin);
+    if ($mc instanceof Memcached) {
+      $version = t('Memcached v!version', array('!version' => phpversion('Memcached')));
+    }
+    elseif ($mc instanceof Memcache) {
+      $version = t('Memcache v!version', array('!version' => phpversion('Memcache')));
+    }
     else {
-      $output = '';
-      drupal_set_message(t('No available statistics for this bin.'));
+      $version = t('Unknown');
+      $report['PECL extension'] = t('Unknown');
     }
+
+    $servers = array();
+    foreach ($memcache_servers as $server => $b) {
+      $b = _memcache_admin_default_bin($b);
+      if ($b == $bin) {
+        $servers[] = $server;
+        if (empty($stats[$server]['uptime'])) {
+          drupal_set_message(t('Failed to connect to server %server', array('%server' => $server)));
+        }
+        $data['server_overview'][$server] = t('v!version running !uptime', array('!version' => check_plain($stats[$server]['version']), '!uptime' => format_interval($stats[$server]['uptime'])));
+        $data['server_pecl'][$server] = t('n/a');
+        $data['server_time'][$server] = format_date($stats[$server]['time']);
+        $data['server_connections'][$server] = _memcache_admin_stats_connections($stats[$server]['curr_connections'], $stats[$server]['total_connections']);
+        $data['cache_sets'][$server] = _memcache_admin_stats_sets($stats[$server]['cmd_set'], $stats[$server]['cmd_get']);
+        $data['cache_gets'][$server] = _memcache_admin_stats_gets($stats[$server]['cmd_set'], $stats[$server]['cmd_get'], $stats[$server]['get_hits'], $stats[$server]['get_misses']);
+        $data['cache_counters'][$server] = _memcache_admin_stats_counters($stats[$server]['incr_hits'], $stats[$server]['incr_misses'], $stats[$server]['decr_hits'], $stats[$server]['decr_misses']);
+        $data['cache_transfer'][$server] = _memcache_admin_stats_transfer($stats[$server]['bytes_read'], $stats[$server]['bytes_written']);
+        $data['cache_average'][$server] = _memcache_admin_stats_average($stats[$server]['cmd_get'], $stats[$server]['total_connections'], $stats[$server]['cmd_set'], $stats[$server]['bytes_read'], $stats[$server]['bytes_written']);
+        $data['memory_available'][$server] = _memcache_admin_stats_memory($stats[$server]['limit_maxbytes'], $stats[$server]['bytes']);
+        $data['memory_evictions'][$server] = number_format($stats[$server]['evictions']);
+      }
+    }
+    $report = array(
+      'Server overview' => array(
+        array_merge(
+          array('header' => t('Uptime')),
+          array('total' => t('n/a')),
+          $data['server_overview']),
+        array_merge(
+          array('header' => t('PECL extension')),
+          array('total' => $version),
+          $data['server_pecl']),
+        array_merge(
+          array('header' => t('Time')),
+          array('total' => t('n/a')),
+          $data['server_time']),
+        array_merge(
+          array('header' => t('Connections')),
+          array('total' => _memcache_admin_stats_connections($stats['total']['curr_connections'], $stats['total']['total_connections'])),
+          $data['server_connections']),
+      ),
+      'Cache statistics' => array(
+        array_merge(
+          array('header' => t('Sets')),
+          array('total' => _memcache_admin_stats_sets($stats['total']['cmd_set'], $stats['total']['cmd_get'])),
+          $data['cache_sets']),
+        array_merge(
+          array('header' => t('Gets')),
+          array('total' => _memcache_admin_stats_gets($stats['total']['cmd_set'], $stats['total']['cmd_get'])),
+          $data['cache_gets']),
+        array_merge(
+          array('header' => t('Counters')),
+          array('total' => _memcache_admin_stats_counters($stats['total']['incr_hits'], $stats['total']['incr_misses'], $stats['total']['decr_hits'], $stats['total']['decr_misses'])),
+          $data['cache_counters']),
+        array_merge(
+          array('header' => t('Transferred')),
+          array('total' => _memcache_admin_stats_transfer($stats['total']['bytes_read'], $stats['total']['bytes_written'])),
+          $data['cache_transfer']),
+        array_merge(
+          array('header' => t('Per-page average')),
+          array('total' => _memcache_admin_stats_average($stats['total']['cmd_get'], $stats['total']['total_connections'], $stats['total']['cmd_set'], $stats['total']['bytes_read'], $stats['total']['bytes_written'])),
+          $data['cache_average']),
+      ),
+      'Memory overview' => array(
+        array_merge(
+          array('header' => t('Available memory')),
+          array('total' => _memcache_admin_stats_memory($stats['total']['limit_maxbytes'], $stats['total']['bytes'])),
+          $data['memory_available']),
+        array_merge(
+          array('header' => t('Evictions')),
+          array('total' => $stats['total']['evictions']),
+          $data['memory_evictions']),
+      ),
+    );
+    $output .= theme('memcache_admin_stats_table', $bin, $servers, $report);
+  }
+  else {
+    $output = '';
+    drupal_set_message(t('No available statistics for this bin.'));
   }
 
   return $output;
@@ -173,26 +267,20 @@ function memcache_admin_theme() {
  * @param array $stats - array of key/value string pairs for the table results
  * @return string
  */
-function theme_memcache_admin_stats_table($server, $stats) {
-  $rows = array();
-
-  foreach ($stats as $key => $value) {
-    if (is_array($value)) {
-      $rs = array();
-      foreach ($value as $k => $v) {
-        $rs[] = array($k, $v);
-      }
-      $rows[] = array($key, theme('table', array(), $rs));
-    }
-    else {
-      $rows[] = array($key, $value);
+function theme_memcache_admin_stats_table($bin, $servers, $stats) {
+  $headers = array_merge(array('', t('Totals')), $servers);
+  $output = '';
+  foreach ($stats as $table => $data) {
+    $rows = array();
+    foreach ($data as $row) {
+      $row[2] = implode(', ', $row[2]);
+      $rows[] = $row;
     }
+    $output .= theme('table', $headers, $rows, array(), $table);
   }
-
-  return theme('table', array(t('Property'), t('Value')), $rows, array(), $server);
+  return $output;
 }
 
-
 /**
  * Retrieve the cluster for any given bin
  *
