diff --git a/webform_paypal.module b/webform_paypal.module
index e36dd47..7c608be 100644
--- a/webform_paypal.module
+++ b/webform_paypal.module
@@ -8,11 +8,25 @@ function webform_paypal_webform_component_info() {
   $components['paypal'] = array(
     'label' => 'Paypal Button',
     'description' => 'Paypal button to replace the submit button for this form',
+    'features' => array(
+      'title_display' => FALSE,
+    ),
   );
   return $components;
 }
 
 /**
+ * Implements hook_permission().
+ */
+function webform_paypal_permission() {
+  return array(
+    'update payment status' =>  array(
+      'title' => t('Update PayPal Payment Status'),
+    ),
+  );
+}
+
+/**
  * Implements _webform_defaults_component().
  */
 function _webform_defaults_paypal() {
@@ -24,19 +38,25 @@ function _webform_defaults_paypal() {
     'value' => '',
     'mandatory' => 0,
     'extra' => array(
-      'width' => '',
-      'maxlength' => '',
-      'field_prefix' => '',
-      'field_suffix' => '',
       'disabled' => 0,
       'unique' => 0,
-      'title_display' => 0,
-      'description' => '',
+      'private' => TRUE,
       'attributes' => array(),
     ),
   );
 }
 
+/**
+ * Implements _webform_theme_component().
+ */
+function _webform_theme_paypal() {
+  return array(
+    'webform_display_paypal' => array(
+      'render element' => 'element',
+    ),
+  );
+}
+
 
 /**
  * Generate the form for editing a component.
@@ -58,6 +78,17 @@ function _webform_edit_paypal($component) {
   return $form;
 }
 
+/**
+ * Implementation of hook_form_FORM_ID_alter().
+ */
+
+function webform_paypal_form_webform_component_edit_form_alter(&$form, &$form_state, $form_id) {
+  if ($form['type']['#value'] == 'paypal') {
+    // Remove unnecessary elements that could confuse the user when editing the component
+    $form['display']['#access'] = FALSE;
+    $form['extra']['description']['#access'] = FALSE;
+  }
+}
 
 /**
  * Element validate handler
@@ -69,48 +100,115 @@ function _webform_edit_paypal_validate($form, &$form_state) {
   }
 }
 
-
 /**
  * Render a Webform component to be part of a form.
  * This function allows you to define how your webform component will be rendered when a "regular" user is filling it out.
  */
 function _webform_render_paypal($component, $value = NULL, $filter = TRUE) {
-  $form_item = array(
-    '#type' => 'hidden',
-    '#default_value' => $component['value'],
-  );
+  // adjust the form element based on where the user is
+  $item = menu_get_item();
+  $value = ($value['status'] == 'paid') ? 1 : 0;
+  if (strpos($item['path'], 'edit') && user_access('update payment status')) {
+    $element = array(
+      '#title' => 'Mark Status as Paid',
+      '#type' => 'checkbox',
+      '#theme_wrappers' => array('webform_element'),
+      '#webform_component' => $component,
+      '#default_value' => $value,
+    );
+  }
+  else {
+    $element = array(
+      '#type' => 'hidden',
+      '#default_value' => $component['value'],
+      '#theme_wrappers' => array('webform_element'),
+      '#webform_component' => $component,
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * A hook for changing the input values before saving to the database.
+ *
+ * Note that Webform will save the result of this function directly into the
+ * database.
+ *
+ * @param $component
+ *   A Webform component array.
+ * @param $value
+ *   The POST data associated with the user input.
+ * @return
+ *   An array of values to be saved into the database. Note that this should be
+ *   a numerically keyed array.
+ */
+function _webform_submit_paypal($component, $value) {
+  $return = array();
+  dsm($value);
+  dsm($component);
+  $return['id'] = $component['value'];
+  $return['status'] = 'unpaid';
+  if (is_int($value) && $value == 1) {
+    $return['status'] = 'paid';
+  }
+  return $return;
+}
+
 
-  return $form_item;
+/**
+ * Implements _webform_display_component().
+ */
+function _webform_display_paypal($component, $value) {
+  if (!empty($value['status']) && $value['status'] == 'unpaid') {
+    $value = t('Submitted to PayPal - Not Paid');
+  }
+  if (!empty($value['status']) && $value['status'] == 'paid') {
+    $value = t('Submitted to PayPal - Payment Complete');
+  }
+  
+  return array(
+    '#title' => t('PayPal Status'),
+    '#weight' => $component['weight'],
+    '#theme' => 'webform_display_paypal',
+    '#theme_wrappers' => array('webform_element'),
+    '#value' => $value,
+    '#webform_component' => $component,
+  );
 }
 
 /**
- * Display the result of a submission for a component.
- * You can view the results of a webform by clicking on the "results" tab of your webform.
- * This function defines how your custom component is rendered when you view the results of a particular submission.
+ * Format the output of data for this component.
  */
-function _webform_display_paypal($component, $value, $format = 'html') {
-  //TODO: this doesn't look like its actually working yet
-  return 'Submitted to Paypal';
+function theme_webform_display_paypal($variables) {
+  $element = $variables['element'];
+  return empty($element['#value']) ? '' : $element['#value'];
 }
 
+
 /**
- * Implementation of hook_form_alter().
+ * Implements of hook_form_alter().
  */
 function webform_paypal_form_alter(&$form, &$form_state, $form_id) {
-  if(!empty($form_state['webform'])) {
-    $webform_components = $form_state['webform']['component_tree']['children'];
-    foreach ($webform_components as $key => $value) {
-      if ($value['type'] == 'paypal') {
-        $form['actions']['submit']['#theme_wrappers'] = array("image_button");
-        $form['actions']['submit']['#button_type'] = "image";
-        $form['actions']['submit']['#src'] =  "https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif";
-        $form['#submit'][] = 'webform_paypal_submit';
+  if (strpos($form_id, 'webform_client_form_') !== FALSE) {
+    // adjust the form for "edit" screens so people don't resubmit to PayPal
+    if (strpos($form['#action'], 'edit')) {
+      $form['actions']['submit']['#value'] = t('Update');
+    }
+    else {
+      $webform_components = $form_state['webform']['component_tree']['children'];
+      foreach ($webform_components as $key => $value) {
+        if ($value['type'] == 'paypal') {
+          $form['actions']['submit']['#theme_wrappers'] = array("image_button");
+          $form['actions']['submit']['#button_type'] = "image";
+          $form['actions']['submit']['#src'] =  "https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif";
+          $form['#submit'][] = 'webform_paypal_submit';
+        }
       }
     }
   }
 }
 
-
 /**
  * Submit function to send user to paypal after form values saved.
  */
@@ -138,9 +236,34 @@ function webform_paypal_submit(&$form, &$form_state) {
 
   $post_data = array();
   $post_data['cmd'] = '_s-xclick';
-  $post_data['hosted_button_id'] = $form_state['values']['submitted_tree'][$paypal_component_name]; 
+  $post_data['hosted_button_id'] = $form_state['values']['submitted_tree'][$paypal_component_name]['id']; 
   //send return path to submission for better tracking
   $post_data['custom'] = $submission_url;
 
   drupal_goto($url, array('query'=> $post_data));
 }
+
+/**
+ * Implements _webform_table_component().
+ */
+function _webform_table_paypal($component, $value) {
+  return empty($value['status']) ? '' : ucfirst($value['status']);
+}
+
+/**
+ * Implements _webform_csv_headers_component().
+ */
+function _webform_csv_headers_paypal($component, $export_options) {
+  $header = array();
+  $header[0] = '';
+  $header[1] = '';
+  $header[2] = $component['name'];
+  return $header;
+}
+
+/**
+ * Implements _webform_csv_data_component().
+ */
+function _webform_csv_data_paypal($component, $export_options, $value) {
+  return empty($value['status']) ? '' : ucfirst($value['status']);
+}
