diff --git jquery_countdown_block/jquery_countdown_block.admin.inc jquery_countdown_block/jquery_countdown_block.admin.inc
new file mode 100644
index 0000000..65cfb07
--- /dev/null
+++ jquery_countdown_block/jquery_countdown_block.admin.inc
@@ -0,0 +1,118 @@
+<?php
+/**
+ * @file
+ * Provides infrequently used functions for jquery_countdown_block.
+ */
+
+/**
+ * Form builder for the countdown block deletion form.
+ */
+function jquery_countdown_block_delete(&$form_state, $delta = 0) {
+  $title = variable_get("jquery_countdown_block_{$delta}_admin_title", 'Countdown Block ' . $delta);
+  $form['block_title'] = array('#type' => 'value', '#value' => $title);
+  $form['delta'] = array('#type' => 'value', '#value' => $delta);
+
+  return confirm_form($form, t('Are you sure you want to delete the "%name" block?', array('%name' => $title)), 'admin/build/block', NULL, t('Delete'), t('Cancel'));
+}
+
+/**
+ * Form submission handler for jquery_countdown_block_delete().
+ */
+function jquery_countdown_block_delete_submit($form, &$form_state) {
+  // Remove the menu block configuration variables.
+  $delta = $form_state['values']['delta'];
+  $block_ids = variable_get('jquery_countdown_block_ids', array());
+  unset($block_ids[array_search($delta, $block_ids)]);
+  sort($block_ids);
+  variable_set('jquery_countdown_block_ids', $block_ids);
+  variable_del("jquery_countdown_block_{$delta}_admin_title");
+  variable_del("jquery_countdown_block_{$delta}_date");
+  variable_del("jquery_countdown_block_{$delta}_format");
+  variable_del("jquery_countdown_block_{$delta}_until");
+  variable_del("jquery_countdown_block_{$delta}_caption");
+
+  db_query("DELETE FROM {blocks} WHERE module = 'jquery_countdown_block' AND delta = %d", $delta);
+  db_query("DELETE FROM {blocks_roles} WHERE module = 'jquery_countdown_block' AND delta = %d", $delta);
+  drupal_set_message(t('The "%name" block has been deleted.', array('%name' => $form_state['values']['block_title'])));
+  cache_clear_all();
+  $form_state['redirect'] = 'admin/build/block';
+  return;
+}
+
+/**
+ * Returns the 'list' $op info for hook_block().
+ */
+function _jquery_countdown_block_block_list() {
+  $blocks = array();
+  foreach (variable_get('jquery_countdown_block_ids', array()) as $delta) {
+    $title = variable_get("jquery_countdown_block_{$delta}_admin_title", 'Countdown Block ' . $delta);
+    $blocks[$delta]['info'] = $title;
+    $blocks[$delta]['cache'] = BLOCK_CACHE_GLOBAL;
+  }
+  return $blocks;
+}
+
+/**
+ * Returns the 'configure' $op info for hook_block().
+ */
+function _jquery_countdown_block_block_configure($delta) {
+  $form['admin_title'] = array(
+    '#type' => 'textfield',
+    '#default_value' => variable_get("jquery_countdown_block_{$delta}_admin_title", NULL),
+    '#title' => t('Administrative title'),
+    '#description' => t('This title will be used administratively to identify this block. If blank, a default title will be used.'),
+  );
+
+  $datetype = module_exists('date_popup') ? 'date_popup' : 'date_select';
+  $form['date'] = array(
+    '#type' => $datetype,
+    '#title' => t('Countdown date'),
+    '#required' => TRUE,
+    '#default_value' => variable_get("jquery_countdown_block_{$delta}_date", NULL),
+    '#date_format' => 'Y-m-d g:i a',
+  );
+  $form['until'] = array(
+    '#type' => 'radios',
+    '#title' => t('Counter type'),
+    '#required' => TRUE,
+    '#options' => array(
+      'until' => 'Count down to date',
+      'since' => 'Count up since date',
+    ),
+    '#default_value' => variable_get("jquery_countdown_block_{$delta}_until", NULL),
+    '#description' => t('Whether the counter should count down to a date in the future or up from a date in the past.'),
+  );
+  $form['format'] = array(
+    '#type' => 'select',
+    '#title' => t('Granularity'),
+    '#required' => TRUE,
+    '#multiple' => TRUE,
+    '#options' => array('Y' => 'Years', 'O' => 'Months', 'W' => 'Weeks', 'D' => 'Days', 'H' => 'Hours', 'M' => 'Minutes', 'S' => 'Seconds'),
+    '#default_value' => variable_get("jquery_countdown_block_{$delta}_format", array('D', 'H', 'M', 'S')),
+    '#description' => t('Which elements of the time to show. Default value is Days, Hours, Minutes, and Seconds.'),
+  );
+  $form['caption'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Counter description'),
+    '#default_value' => variable_get("jquery_countdown_block_{$delta}_caption", NULL),
+    '#description' => t('This text is shown beneath the counter.'),
+  );
+  return $form;
+}
+
+/**
+ * Returns the 'save' $op info for hook_block().
+ */
+function _jquery_countdown_block_block_save($delta, $edit) {
+  if ($edit['admin_title']) {
+    variable_set("jquery_countdown_block_{$delta}_admin_title", $edit['admin_title']);
+  }
+  else {
+    variable_del("jquery_countdown_block_{$delta}_admin_title");
+  }
+  variable_set("jquery_countdown_block_{$delta}_caption", $edit['caption']);
+  variable_set("jquery_countdown_block_{$delta}_date", $edit['date']);
+  variable_set("jquery_countdown_block_{$delta}_until", $edit['until']);
+  variable_set("jquery_countdown_block_{$delta}_format", $edit['format']);
+}
+
diff --git jquery_countdown_block/jquery_countdown_block.info jquery_countdown_block/jquery_countdown_block.info
new file mode 100644
index 0000000..6740684
--- /dev/null
+++ jquery_countdown_block/jquery_countdown_block.info
@@ -0,0 +1,8 @@
+name = jQuery countdown block
+description = Provides configurable blocks displaying jQuery countdowns.
+core = 6.x
+package = User interface
+dependencies[] = jquery_countdown
+dependencies[] = date_api
+
+
diff --git jquery_countdown_block/jquery_countdown_block.module jquery_countdown_block/jquery_countdown_block.module
new file mode 100644
index 0000000..f99db58
--- /dev/null
+++ jquery_countdown_block/jquery_countdown_block.module
@@ -0,0 +1,150 @@
+<?php
+/**
+ * @file
+ * Provides configurable blocks of countdown timers.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function jquery_countdown_block_menu() {
+  $items['admin/build/block/add-jquery-countdown-block'] = array(
+    'title' => 'Add countdown block',
+    'description' => 'Add a new Countdown block.',
+    'access arguments' => array('administer blocks'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('jquery_countdown_block_add_block_form'),
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['admin/build/block/delete-jquery-countdown-block'] = array(
+    'title' => 'Delete menu block',
+    'access arguments' => array('administer blocks'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('jquery_countdown_block_delete'),
+    'type' => MENU_CALLBACK,
+    'file' => 'jquery_countdown_block.admin.inc',
+  );
+  return $items;
+}
+
+/**
+ * Implements hook_help().
+ */
+function jquery_countdown_block_help($path, $arg) {
+  switch ($path) {
+    case 'admin/build/block/configure':
+      if ($arg[4] != 'jquery_countdown_block') {
+        break;
+      }
+    case 'admin/help#jquery-countdown-block':
+    case 'admin/build/block':
+    case 'admin/build/block/add-jquery-countdown-block':
+      //return _jquery_countdown_block_help($path, $arg);
+  }
+}
+
+/**
+ * Form builder for the countdown block addition form.
+ */
+function jquery_countdown_block_add_block_form(&$form_state) {
+  // Load block.admin.inc from block module.
+  module_load_include('inc', 'block', 'block.admin');
+  // Mimic block_add_block_form(), which is also just a wrapper.
+  return block_admin_configure($form_state, 'jquery_countdown_block', NULL);
+}
+
+/**
+ * Form submission handler for jquery_countdown_block_add_block_form().
+ */
+function jquery_countdown_block_add_block_form_submit($form, &$form_state) {
+  // Determine the delta of the new block.
+  $block_ids = variable_get('jquery_countdown_block_ids', array());
+  $delta = empty($block_ids) ? 1 : max($block_ids) + 1;
+
+  // Save the new array of blocks IDs.
+  $block_ids[] = $delta;
+  variable_set('jquery_countdown_block_ids', $block_ids);
+
+  // Save the block configuration.
+  _jquery_countdown_block_block_save($delta, $form_state['values']);
+
+  // Run the normal new block submission (borrowed from block_add_block_form_submit).
+  foreach (list_themes() as $key => $theme) {
+    if ($theme->status) {
+      db_query("INSERT INTO {blocks} (visibility, pages, custom, title, module, theme, status, weight, delta, cache) VALUES(%d, '%s', %d, '%s', '%s', '%s', %d, %d, %d, %d)",
+        $form_state['values']['visibility'],
+        trim($form_state['values']['pages']),
+        $form_state['values']['custom'],
+        $form_state['values']['title'],
+        $form_state['values']['module'],
+        $theme->name,
+        0,
+        0,
+        $delta,
+        BLOCK_CACHE_GLOBAL
+      );
+    }
+  }
+
+  foreach (array_filter($form_state['values']['roles']) as $rid) {
+    db_query("INSERT INTO {blocks_roles} (rid, module, delta) VALUES (%d, '%s', '%s')", $rid, $form_state['values']['module'], $delta);
+  }
+
+  drupal_set_message(t('The block has been created.'));
+  cache_clear_all();
+
+  $form_state['redirect'] = 'admin/build/block';
+  return;
+}
+
+/**
+ * Implements hook_block().
+ */
+function jquery_countdown_block_block($op = 'list', $delta = NULL, $edit = NULL) {
+  $function = '_jquery_countdown_block_block_' . $op;
+  switch ($op) {
+    case 'view':
+      return $function($delta, $edit);
+    default:
+      // Ops besides "view" are seldom used, so are in a separate file.
+      module_load_include('inc', 'jquery_countdown_block', 'jquery_countdown_block.admin');
+      return $function($delta, $edit);
+  }
+}
+
+/**
+ * Returns the 'view' $op info for hook_block().
+ *
+ * @param $delta
+ *   string The id of the block to render.
+ */
+function _jquery_countdown_block_block_view($delta) {
+  $data = array();
+
+  $caption = variable_get("jquery_countdown_block_{$delta}_caption", NULL);
+  $date = variable_get("jquery_countdown_block_{$delta}_date", NULL);
+  $until = variable_get("jquery_countdown_block_{$delta}_until", NULL);
+  $format = implode('', variable_get("jquery_countdown_block_{$delta}_format", array('D', 'H', 'M', 'S')));
+  // Pass in 'en_US' as the language, as translation breaks the settings we
+  // pass to theme_jquery_countdown() and thus the countdown script.
+  $formated_date = date_format_date(date_make_date($date), 'custom', 'F d, Y g:i a', 'en_US');
+  $data['subject'] = '';
+  $data['content'] = theme('jquery_countdown', array(
+    $until => $formated_date,
+    'format' => $format,
+    'description' => $caption,
+  ));
+
+  return $data;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter() for block_admin_display_form.
+ *
+ * Alters the block admin form to add delete links next to countdown blocks.
+ */
+function jquery_countdown_block_form_block_admin_display_form_alter(&$form, $form_state) {
+  foreach (variable_get('jquery_countdown_block_ids', array()) as $delta) {
+    $form['jquery_countdown_block_' . $delta]['delete'] = array('#value' => l(t('delete'), 'admin/build/block/delete-jquery-countdown-block/' . $delta));
+  }
+}
