diff --git uc_recurring_subscription_ui/uc_recurring_subscription_ui.admin.inc uc_recurring_subscription_ui/uc_recurring_subscription_ui.admin.inc
new file mode 100644
index 0000000..0ed8bd4
--- /dev/null
+++ uc_recurring_subscription_ui/uc_recurring_subscription_ui.admin.inc
@@ -0,0 +1,391 @@
+<?php
+// $Id:$
+
+/**
+ * @file
+ * Uc recurring subscription UI.
+ */
+
+/**
+ * 
+ */
+function uc_recurring_subscription_ui_overview() {
+  $header = array(
+    array('data' => t('Name'), 'field' => 'n.title'),
+    array('data' => t('Role')),
+    array('data' => t('Interval')),
+    array('data' => t('Cost')),
+    array('data' => t('Duration')),
+    '');
+ 
+  $product_class = variable_get('uc_recurring_subscription_product_class', 'uc_recurring_subscription');
+
+  $sql = db_rewrite_sql("SELECT n.nid, n.title FROM {node} n WHERE n.type = '%s'");
+  $sql_count = db_rewrite_sql("SELECT COUNT(n.nid) FROM {node} n WHERE n.type = '%s'", $product_class);
+
+  $result = pager_query($sql, 20, 0, $sql_count, $product_class);
+
+  while($product = db_fetch_object($result)) {
+    $row = array();
+    $row['title'] = l($product->title, 'node/'. $product->nid);
+    $row['role'] = '';
+    $row['interval'] = '';
+    $row['cost'] = '';
+    $row['duration'] = '';
+    $row['weight'] = drupal_render($form['rows'][$id]['weight-'.$sid]);
+    $row['operations'] = l('edit', 'subscriptions/'. $product->nid .'/edit');
+    $rows[] = array('data' => $row); 
+  }
+
+  return theme('table', $header, $rows, array('id' => 'uc-recurring-subscriptions-ui-overview'));
+}
+
+/**
+ * 
+ */
+function uc_recurring_subscription_ui_product_form($form_state, $product_id = -1) {
+  drupal_add_js(drupal_get_path('module', 'uc_recurring_subscription_ui') .'/uc_recurring_subscription_ui.js', 'module');
+
+  $form = array();
+  if ($product_id != -1) {
+    $form['product_id'] = array(
+      '#type' => 'hidden',
+      '#value' => $product_id,
+    );
+    $node = node_load($product_id);
+  }
+
+  $form['product'] = array(
+    '#type' => 'fieldset',
+    '#title' => 'Step One: Product Details',
+  );
+  $form['product']['title'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Title',
+    '#required' => TRUE,
+    '#default_value' => $node->title,
+  );
+  $form['product']['body'] = array(
+    '#type' => 'textarea',
+    '#title' => 'Description',
+    '#default_value' => $node->body,
+  );
+
+  $form['recurring'] = array(
+    '#type' => 'fieldset',
+    '#title' => 'Step Two: Define Subscription Details',
+    '#description' => t('By adding other payment options, users will be given the option to choose from one of these payment options, this allows you to specify different prices and payment plans for this subscription product'),
+  );
+  $form['recurring']['add'] = array(
+    '#type' => 'button',
+    '#value' => 'Add a payment option',
+    '#ahah' => array(
+      'event' => 'click',
+      'path' => 'subscriptions/ahah/add_interval',
+      'wrapper' => 'recurring_intervals',
+      'method' => 'append',
+      'effect' => 'fade',
+    ),
+    '#prefix' => '<div style="clear:both"></div>',
+  );
+
+  $form['recurring']['recurring_intervals'] = array(
+    '#value' => t(' '),
+    '#prefix' => '<div id="recurring_intervals">',
+    '#suffix' => '</div>',
+  );
+
+  if (isset($form_state['recurring_count'])) {
+    $recurring_count = $form_state['recurring_count'];
+  }
+  else {
+    $recurring_count = db_result(db_query("SELECT count(pfid) from {uc_recurring_products} WHERE nid = '%d'", $product_id));
+    $result = db_query("SELECT pfid from {uc_recurring_products} WHERE nid = '%d'", $product_id);
+    while ($p = db_fetch_object($result)) {
+      $product[] = uc_recurring_fee_product_load($p->pfid);
+    }
+  }
+  for ($delta = 0; $delta < $recurring_count; $delta++) {
+    $form['recurring']['recurring_intervals'][$delta] = _uc_recurring_subscription_ui_add_interval_form($delta, $product[$delta]);
+  }
+  
+  $form['role'] = array(
+    '#type' => 'fieldset',
+    '#title' => 'Step Three: Role Assignment',
+    '#description' => t('Select the role(s) which are assigned to members who subscribe to this subscription product. You can setup user roles on the user administrations page <a href="@role_link">here</a>.', array('@role_link' => url('admin/user/roles'))),
+  );
+  $roles = user_roles(TRUE);
+  unset($roles[2]); //authenticated role
+  $form['role']['subscribe'] = array(
+    '#type' => 'select',
+    '#title' => 'Role awarded at subscription purchase',
+    '#options' => $roles,
+    '#multiple' => TRUE,
+  );
+
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  if ($product_id != -1) {
+    $form['delete'] = array('#type' => 'submit', '#value' => t('Delete'));
+  }
+
+
+  return $form;
+}
+
+/**
+ *
+ */
+function uc_recurring_subscription_ui_ahah($context) {
+  $func = '_uc_recurring_subscription_ui_ahah_'. $context;
+  $form_state['values'] = $_POST;
+  if (function_exists($func)) {
+    $func($form_state);
+  }
+//  print "here";
+  exit();
+}
+
+/**
+ *
+ */
+function _uc_recurring_subscription_ui_add_interval_form($delta, $product = NULL) {
+  $form = array(
+    '#tree' => TRUE,
+  );
+
+  $form['pfid'] = array(
+    '#type' => 'hidden',
+    '#value' => $product->pfid,
+    '#parents' => array('recurring', $delta, 'pfid'),
+    '#prefix' => '<div style="clear: both;">',
+  );
+
+  $form['interval_value'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Subscription Length',
+    '#default_value' => $product->regular_interval_value,
+    '#required' => TRUE,
+    '#size' => 10,
+    '#prefix' => '<div style="float: left; padding: 0 0 0 20px; text-align: right">',
+    '#suffix' => '</div>',
+    '#parents' => array('recurring', $delta, 'interval_value'),
+  );
+  $form['interval_unit'] = array(
+    '#type' => 'select',
+    '#options' => array(
+      'days' => t('day(s)'),
+      'weeks' => t('week(s)'),
+      'months' => t('month(s)'),
+      'years' => t('year(s)'),
+    ),
+    '#default_value' => $product->regular_interval_unit,
+    '#prefix' => '<div style="float: left; padding: 1.6em 20px 0 0;">',
+    '#suffix' => '</div>',
+    '#parents' => array('recurring', $delta, 'interval_unit'),
+  );
+  $form['amount'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Renewal Cost',
+    '#default_value' => $product->fee_amount,
+    '#size' => 10,
+    '#prefix' => '<div style="float: left; padding: 0 20px;">',
+    '#suffix' => '</div>',
+    '#parents' => array('recurring', $delta, 'amount'),
+  );
+  $form['number_intervals'] = array(
+    '#type' => 'textfield',
+    '#title' => 'Billing Cycles',
+    '#default_value' => $product->number_intervals < 0 ? '' : $product->number_intervals,
+    '#attributes' => $product->number_intervals < 0 ? array('disabled' => 'disabled') : array(),
+    '#size' => 10,
+    '#prefix' => '<div style="float: left; padding: 0 0 0 20px;">',
+    '#suffix' => '</div>',
+    '#parents' => array('recurring', $delta, 'number_intervals'),
+  );
+  $attributes['class'] = 'unlimited-checkbox';
+  if ($product->number_intervals < 0) {
+    $attributes['checked'] = 'checked';
+  }
+  $form['unlimited'] = array(
+    '#type' => 'checkbox',
+    '#title' => 'Unlimited',
+    '#attributes' => $attributes,
+    '#prefix' => '<div style="float: left; padding: 1.8em 0 0;">',
+    '#suffix' => '</div>',
+    '#parents' => array('recurring', $delta, 'unlimited'),
+  );
+  $form['operations'] = array(
+    '#type' => 'button',
+    '#value' => t('remove'),
+    '#attributes' => array('style' => 'margin: 2.6em 0 0 2em;'),
+    '#suffix' => '</div>',
+    '#parents' => array('recurring', $delta, 'operations'),
+    '#ahah' => array(
+      'event' => 'click',
+      'path' => 'subscriptions/ahah/remove_interval',
+      'wrapper' => 'recurring_intervals',
+      'method' => 'append',
+    ),
+  );
+  return $form;
+}
+
+/**
+ *
+ */
+function _uc_recurring_subscription_ui_ahah_add_interval() {
+  $delta = sizeof($_POST['recurring']) ? max(array_keys($_POST['recurring']))+1 : 0;
+  $fields = _uc_recurring_subscription_ui_add_interval_form($delta);
+
+  $form_state = array('submitted' => FALSE);
+  $form_build_id = $_POST['form_build_id'];
+  // Add the new element to the stored form. Without adding the element to the
+  // form, Drupal is not aware of this new elements existence and will not
+  // process it. We retreive the cached form, add the element, and resave.
+  $form = form_get_cache($form_build_id, $form_state);
+  $form['recurring']['recurring_intervals'][$delta] = $fields;
+  form_set_cache($form_build_id, $form, $form_state);
+  $form += array(
+    '#post' => $_POST,
+    '#programmed' => FALSE,
+  );
+  // Rebuild the form.
+  $form = form_builder($_POST['form_id'], $form, $form_state);
+
+  // Render the new output.
+  $new_form = $form['recurring']['recurring_intervals'][$delta];
+  $output = drupal_render($new_form);
+
+  print drupal_to_js(array('data' => $output, 'status' => true));
+}
+
+function _uc_recurring_subscription_ui_ahah_remove_interval() {
+//  print_r($_POST);
+  $form_state = array('submitted' => FALSE);
+  $form_build_id = $_POST['form_build_id'];
+
+  $form = form_get_cache($form_build_id, $form_state);
+  // Rebuild the form.
+  $form = form_builder($_POST['form_id'], $form, $form_state);
+  print '';
+}
+
+/**
+ *
+ */
+function uc_recurring_subscription_ui_product_form_validate(&$form, &$form_state) {
+  // Make the changes we want to the form state.
+  if ($form_state['values']['recurring']) {
+    $form_state['recurring_count'] = count($form_state['values']['recurring']);
+  }
+
+  if ($form_state['recurring_count'] <= 0) {
+    form_set_error('recurring', t('You must specify at least one subscription/payment interval'));
+  }
+}
+/**
+ *
+ */
+function uc_recurring_subscription_ui_product_form_submit(&$form, &$form_state) {
+  global $user;
+  switch ($form_state['values']['op']) {
+    case 'Delete':
+      // @todo add confirmation page
+      node_delete($form_state['values']['product_id']); 
+      break;
+    case 'Save':
+      if (empty($form_state['values']['product_id'])) {
+        $node = new stdClass(); 
+        $node->type = variable_get('uc_recurring_subscription_product_class', 'uc_recurring_subscription');
+        $node->uid = $user->uid;
+        $node->status = 1;
+      }
+      else {
+        $node = node_load($form_state['values']['product_id']);
+      }
+    
+      if (!empty($node)) {
+        $node->title = $form_state['values']['title'];
+        $node->body = $form_state['values']['body'];
+        $node->list_price = $node->sell_price = $form_state['values']['recurring'][0]['amount'];
+    
+        node_save($node);
+    
+        $features = array();
+        // add/update the recurring features
+        foreach ($form_state['values']['recurring'] as $index => $value) {
+          $product->pfid = $value['pfid'];
+    
+          // @todo based on the subscription intervals we need to set up an attribute for this product
+    //      $product->model = $form_state['values']['model'];
+    
+          $product->fee_amount = $value['amount'];
+          $product->initial_charge = $value['interval_value'] .' '. $value['interval_unit'];
+          $product->regular_interval = $value['interval_value'] .' '. $value['interval_unit'];
+          // If number intervals is negative, it means that it's unlimited intervals.
+          $product->number_intervals = !empty($value['number_intervals']) ? $value['number_intervals'] : -1;
+          $product->nid = $node->nid;
+    
+          uc_recurring_product_feature_save($product);
+          $features[] = $product->pfid;
+    
+          // add/update the role feature for this payment option
+          // uc_roles does not expose any good API's so we need to hack out a solution using drupal_execute 
+        }
+        
+    
+        // remove and features deleted
+        $result = db_query("SELECT * FROM {uc_product_features} WHERE nid = %d", $product->nid);
+        while ($feature = db_fetch_object($result)) {
+          if (!in_array($feature->pfid, $features)) {
+    
+          }
+        }
+      }
+      break;
+  }
+  $form_state['redirect'] = 'subscriptions';
+}
+
+/**
+ * 
+ */
+function uc_recurring_subscription_ui_subscriber_list($form_state, $product_id = -1) {
+  $form = array();
+  return $form;
+}
+
+/**
+ * 
+ */
+function uc_recurring_subscription_ui_settings_form($form_state) {
+  $form = array();
+
+  $options = array();
+  $result = db_query("SELECT * FROM {uc_product_classes}");
+  while ($class = db_fetch_array($result)) {
+    $options[$class['pcid']] = $class['name']; 
+  }
+  $form['uc_recurring_subscription_product_class'] = array(
+    '#type' => 'select',
+    '#title' => 'Product Class',
+    '#description' => 'Only products from this class will be managed as subscription.',
+    '#options' => $options,
+    '#default_value' => variable_get('uc_recurring_subscription_product_class', 'uc_recurring_subscription'),
+  );
+
+  $options = array();
+  $attributes = uc_class_get_attributes(variable_get('uc_recurring_subscription_product_class', 'uc_recurring_subscription'));
+  foreach($attributes as $id => $value) {
+    $options[$id] = $value->name;
+  }
+  $form['uc_recurring_subscription_attribute'] = array(
+    '#type' => 'select',
+    '#title' => 'Payment Attribute',
+    '#description' => 'The attribute used to provide the payment options to users.',
+    '#options' => $options,
+    '#default_value' => variable_get('uc_recurring_subscription_attributes', ''),
+  );
+
+  return system_settings_form($form);
+}
diff --git uc_recurring_subscription_ui/uc_recurring_subscription_ui.info uc_recurring_subscription_ui/uc_recurring_subscription_ui.info
new file mode 100644
index 0000000..6775149
--- /dev/null
+++ uc_recurring_subscription_ui/uc_recurring_subscription_ui.info
@@ -0,0 +1,9 @@
+; $Id:$
+name = Subscription UI
+description = Implements a simple unified UI for managing recurring subscription products.
+dependencies[] = uc_recurring
+dependencies[] = uc_roles
+dependencies[] = uc_attribute
+package = Ubercart - extra
+core = 6.x
+php = 5.0
diff --git uc_recurring_subscription_ui/uc_recurring_subscription_ui.install uc_recurring_subscription_ui/uc_recurring_subscription_ui.install
new file mode 100644
index 0000000..b6916a4
--- /dev/null
+++ uc_recurring_subscription_ui/uc_recurring_subscription_ui.install
@@ -0,0 +1,35 @@
+<?php
+
+
+function uc_recurring_subscription_ui_install() {
+  _uc_recurring_subscription_ui_setup();
+}
+
+function uc_recurring_subscription_ui_uninstall() {
+}
+
+function uc_recurring_subscription_ui_update_1() {
+  _uc_recurring_subscription_ui_setup();
+}
+
+/**
+ * Create a product class for subscriptions.
+ * @todo - This code is clumpsy and really needs an api in uc_product for
+ *         creating a product class.
+ */
+function _uc_recurring_subscription_ui_setup() {
+  $pcid = 'uc_recurring_subscription';
+  db_query("INSERT INTO {uc_product_classes} (pcid, name, description) VALUES ('%s', 'Recurring Subscription', 'A recurring subscription product used by the recurring subscription ui module to manage your subscription products')", $pcid);
+  uc_product_node_info(TRUE);
+  node_types_rebuild();
+  menu_rebuild();
+
+  variable_set('node_options_'. $pcid, variable_get('node_options_product', array('status', 'promote')));
+  variable_set('uc_recurring_subscription_product_class', $pcid);
+
+  db_query("INSERT INTO {uc_attributes} (name, label, ordering, required, display, description) VALUES ('payment_options', 'Payment Options', 0, 1, 1, 'The subscription payment options.')");
+  $aid = db_last_insert_id('uc_attributes', 'aid');
+  variable_set('uc_recurring_subscription_attribute', $aid);
+
+  db_query("INSERT INTO {uc_class_attributes} (pcid, aid, label, ordering, required, display) VALUES ('%s', %d, 'Payment Options', 0, 1, 1)", $pcid, $aid);
+}
diff --git uc_recurring_subscription_ui/uc_recurring_subscription_ui.js uc_recurring_subscription_ui/uc_recurring_subscription_ui.js
new file mode 100644
index 0000000..d911429
--- /dev/null
+++ uc_recurring_subscription_ui/uc_recurring_subscription_ui.js
@@ -0,0 +1,25 @@
+/**
+ * Disable and enable fields in the recurring fee feature form.
+ */
+Drupal.behaviors.UcRecurringSubscriptionForm = function (context) {
+  // Toggle the fee amount field according to "Set the recurring fee amount as
+  // Selling price field state.
+  $("#recurring_intervals input.form-submit").click(function() {
+    $(this).parent().remove();
+  });
+
+
+  $(".unlimited-checkbox").change(function() {
+    var id = $(this).attr('id');
+    text_id = id.replace('unlimited', 'number-intervals');
+    if ($("#"+id).attr("checked")) {
+      $("#"+text_id).attr("disabled","disabled");
+      $("#"+text_id).val('');
+    }
+    else {
+      $("#"+text_id).removeAttr("disabled");
+    }
+  });
+};
+
+
diff --git uc_recurring_subscription_ui/uc_recurring_subscription_ui.module uc_recurring_subscription_ui/uc_recurring_subscription_ui.module
new file mode 100644
index 0000000..32c45e3
--- /dev/null
+++ uc_recurring_subscription_ui/uc_recurring_subscription_ui.module
@@ -0,0 +1,81 @@
+<?php
+// $Id:$
+
+/**
+ * @file
+ * Uc recurring subscription UI.
+ */
+
+/**
+ * Implementation of hook_perm().
+ */
+function uc_recurring_subscription_ui_perm() {
+  return array('manage subscriptions');
+}
+
+/**
+ * Implementation of hook_menu().
+ */
+function uc_recurring_subscription_ui_menu() {
+  $items = array();
+
+  $items['subscriptions'] = array(
+    'title' => 'Subscription Dashboard',
+    'description' => 'Manage recurring subscription products.',
+    'page callback' => 'uc_recurring_subscription_ui_overview',
+    'access arguments' => array('manage subscriptions'),
+    'type' => MENU_NORMAL_ITEM,
+    'file' => 'uc_recurring_subscription_ui.admin.inc',
+  );
+  $items['subscriptions/overview'] = array(
+    'title' => 'Overview',
+    'weight' => -10,
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+  );
+  $items['subscriptions/create'] = array(
+    'title' => 'Create Subscription',
+    'description' => '.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('uc_recurring_subscription_ui_product_form'),
+    'access arguments' => array('manage subscriptions'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'uc_recurring_subscription_ui.admin.inc',
+  );
+  $items['subscriptions/%/edit'] = array(
+    'title' => 'Edit Subscription',
+    'description' => '.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('uc_recurring_subscription_ui_product_form', 1),
+    'access arguments' => array('manage subscriptions'),
+    'type' => MENU_CALLBACK,
+    'file' => 'uc_recurring_subscription_ui.admin.inc',
+  );
+  $items['subscriptions/subscribers'] = array(
+    'title' => 'Manage Subscribers',
+    'description' => '.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('uc_recurring_subscription_ui_subscriber_list'),
+    'access arguments' => array('manage subscriptions'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'uc_recurring_subscription_ui.admin.inc',
+  );
+  $items['subscriptions/settings'] = array(
+    'title' => 'Subscription Settings',
+    'description' => '.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('uc_recurring_subscription_ui_settings_form'),
+    'access arguments' => array('manage subscriptions'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'uc_recurring_subscription_ui.admin.inc',
+  );
+  $items['subscriptions/ahah/%'] = array(
+    'page callback' => 'uc_recurring_subscription_ui_ahah',
+    'page arguments' => array(2),
+    'access arguments' => array('manage subscriptions'),
+    'type' => MENU_CALLBACK,
+    'file' => 'uc_recurring_subscription_ui.admin.inc',
+  );
+
+  return $items;
+}
+
