diff --git tweetmeme.admin.inc tweetmeme.admin.inc
index 2c6186e..237f27d 100644
--- tweetmeme.admin.inc
+++ tweetmeme.admin.inc
@@ -29,5 +29,15 @@ function tweetmeme_admin_settings() {
     ),
     '#default_value' => variable_get('tweetmeme_style', 'normal'),
   );
+  $form['tweetmeme_api'] = array(
+    '#type' => 'select',
+    '#title' => t('API'),
+    '#description' => t('The method of fetching the data.'),
+    '#options' => array(
+      'iframe' => t('iFrame'),
+      'json' => t('JSON'),
+    ),
+    '#default_value' => variable_get('tweetmeme_api', 'iframe'),
+  );
   return system_settings_form($form);
 }
diff --git tweetmeme.css tweetmeme.css
index b1b7aae..a090d79 100644
--- tweetmeme.css
+++ tweetmeme.css
@@ -10,4 +10,65 @@
  */
 .tweetmeme-button {
   float: right;
+  width: 90px;
+}
+.tweetmeme-tweets,
+.tweetmeme-retweet,
+.tweetmeme-number,
+.tweetmeme-wording {
+  display: block;
+  font-family: Helvetica,Arial,Verdana;
+}
+.tweetmeme-tweets {
+  background: url("http://zulu.tweetmeme.com/widget.gif") no-repeat scroll 0 0 transparent;
+  padding: 5px 0;
+  height: 34px;
+}
+.tweetmeme-number {
+  font-size: 17px;
+}
+.tweetmeme-wording {
+  font-size: 10px;
+}
+.tweetmeme-retweet {
+  background: url("http://zulu.tweetmeme.com/widget.gif") no-repeat scroll 0 -45px transparent;
+  font-size: 11px;
+  height: 16px;
+}
+.tweetmeme a,
+.tweetmeme a:link,
+.tweetmeme a:visited {
+  color: #444;
+  line-height: 16px;
+  text-align: center;
+  text-decoration: none;
+  width: 50px;
+}
+.tweetmeme a:hover {
+  text-decoration: none;
+}
+a.tweetmeme-retweet,
+a.tweetmeme-retweet:link,
+a.tweetmeme-retweet:visited {
+  color: #FFF;
+}
+a.tweetmeme-retweet:hover {
+  background-position: 0 -61px;
+  color: #80B62A;
+}
+.tweetmeme-compact .tweetmeme-tweets,
+.tweetmeme-compact .tweetmeme-retweet,
+.tweetmeme-compact .tweetmeme-number {
+  float: left;
+}
+.tweetmeme-compact a .tweetmeme-number {
+  font-size: 14px;
+  font-weight: bold;
+}
+.tweetmeme-compact a.tweetmeme-tweets {
+  background: none;
+  height: auto;
+  margin-right: 5px;
+  padding: 0;
+  width: auto;
 }
diff --git tweetmeme.module tweetmeme.module
index 3d1728a..7211b37 100644
--- tweetmeme.module
+++ tweetmeme.module
@@ -57,19 +57,21 @@ function tweetmeme_nodeapi(&$node, $op, $teaser = NULL, $a4 = NULL) {
     // Retrieve the location where we should show it, the style and the URL of the button.
     $location = variable_get('tweetmeme_location', array());
     $style = variable_get('tweetmeme_style', 'normal');
+    $api = variable_get('tweetmeme_api', 'iframe');
     $url = url('node/' . $node->nid, array('absolute' => TRUE));
+    $url = 'http://buytaert.net/christina-aguilera-using-drupal';
 
     // Check in the teaser view.
     if ($teaser && !empty($location['teasers'])) {
       $node->content['tweetmeme'] = array(
-        '#value' => theme('tweetmeme_button', $url, $style),
+        '#value' => theme('tweetmeme_button', $url, $style, $api),
         '#weight' => -10,
       );
     }
     // Check in the full view.
     else if(!$teaser && !empty($location['content'])) {
       $node->content['tweetmeme'] = array(
-        '#value' => theme('tweetmeme_button', $url, $style),
+        '#value' => theme('tweetmeme_button', $url, $style, $api),
         '#weight' => -10,
       );
     }
@@ -85,6 +87,7 @@ function tweetmeme_theme($existing, $type, $theme, $path) {
       'arguments' => array(
         'url' => NULL,
         'style' => NULL,
+        'api' => NULL,
       ),
     ),
   );
@@ -93,12 +96,43 @@ function tweetmeme_theme($existing, $type, $theme, $path) {
 /**
  * Displays the TweetMeme button
  */
-function theme_tweetmeme_button($url, $style = 'normal') {
+function theme_tweetmeme_button($url, $style = 'normal', $api = 'iframe') {
   drupal_add_css(drupal_get_path('module', 'tweetmeme') . '/tweetmeme.css');
-  $output = '<div class="tweetmeme tweetmeme-button"><script type="text/javascript">tweetmeme_url = "' . $url . '";';
-  if ($style != 'normal') {
-    $output .= "tweetmeme_style = '$style';";
+  if ($api == 'json' && $tweetmeme = tweetmeme_get_json($url)) {
+    $output = '<div id="tweetmeme-' . $tweetmeme->id . '" class="tweetmeme tweetmeme-button tweetmeme-' . $style . '">';
+    $inner = '<span class="tweetmeme-number">' . $tweetmeme->url_count . '</span>';
+    if ($style == 'normal') {
+      $inner .= '<span class="tweetmeme-wording">' . t('tweets') . '</span>';
+    }
+    $output .= l($inner, $tweetmeme->tm_link, array('html' => TRUE, 'attributes' => array('title' => t('View details on TweetMeme'), 'class' => 'tweetmeme-tweets')));
+    $output .= l(t('retweet'), 'http://api.tweetmeme.com/share', array('attributes' => array('title' => t('Retweet this'), 'class' => 'tweetmeme-retweet'), 'query' => array('url' => $tweetmeme->url)));
+  }
+  else {
+    $output = '<div class="tweetmeme tweetmeme-button">';
+    $output .= '<script type="text/javascript">tweetmeme_url = "' . $url . '";';
+    if ($style != 'normal') {
+      $output .= "tweetmeme_style = '$style';";
+    }
+    $output .= '</script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script>';
   }
-  $output .= '</script><script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js"></script></div>';
+  $output .= '</div>';
   return $output;
 }
+
+/**
+ * Grabs the data from the TweetMeme JSON API.
+ */
+function tweetmeme_get_json($url) {
+  $api = url('http://api.tweetmeme.com/url_info.json', array('query' => array('url' => $url)));
+  $request = drupal_http_request($api);
+  $response = json_decode($request->data);
+  if ($response->status != 'failure') {
+    // Why they don't add the ID separately is beyond me
+    $response->story->id = str_replace('http://tweetmeme.com/story/', '', $response->story->tm_link);
+    return $response->story;
+  }
+  else {
+    // Perhaps a watchdog log entry using $response->comment?
+    return FALSE;
+  }
+}
