diff --git a/salsa_advocacy/salsa_advocacy.module b/salsa_advocacy/salsa_advocacy.module
index 31b05ce..5a15f64 100644
--- a/salsa_advocacy/salsa_advocacy.module
+++ b/salsa_advocacy/salsa_advocacy.module
@@ -409,6 +409,7 @@ function salsa_advocacy_petition_form_submit($form, &$form_state) {
  * Salsa targeted action form callback.
  */
 function salsa_advocacy_targeted_form($form, &$form_state, $action) {
+  $form_state['salsa_object'] = $action;
   $action_content = reset(entity_load('salsa_action_content', FALSE, array('action_KEY' => $action->action_KEY)));
   $action_content_detail = reset(entity_load('salsa_action_content_detail', FALSE, array('action_content_KEY' => $action_content->key)));
   $action_target = reset(entity_load('salsa_action_target', FALSE, array('action_KEY' => $action->action_KEY)));
@@ -504,6 +505,23 @@ function salsa_advocacy_targeted_form($form, &$form_state, $action) {
       }
     }
 
+    // Check if progress bar is enabled.
+    $field_name = variable_get('salsa_advocacy_goal_field');
+    if (!empty($action->{$field_name})) {
+      // Add the corresponding CSS to the form.
+      $form['#attached'] = array(
+        'css' => array(
+          array(
+            'data' => drupal_get_path('module', 'salsa_entity') . '/theme/salsa_progress_bar.css'
+          ),
+        ),
+      );
+      // Add the progress bar.
+      $form['progress'] = array(
+        '#markup' => salsa_advocacy_get_barometer($action),
+      );
+    }
+
     // Action content fieldset.
     $form['action_content'] = array(
       '#type' => 'fieldset',
@@ -566,9 +584,6 @@ function salsa_advocacy_targeted_form($form, &$form_state, $action) {
     // Add hidden fields.
     salsa_advocacy_targeted_form_hidden_fields($form, $form_state);
 
-    // Submit this form directly to salsa page.
-    $form['#action'] = variable_get('salsa_api_url') . '/o/' . $action->organization_KEY . '/action/wrapperProcessAction2.jsp';
-
     // Submit button.
     $form['submit'] = array(
       '#type' => 'submit',
@@ -586,6 +601,39 @@ function salsa_advocacy_targeted_form($form, &$form_state, $action) {
 }
 
 /**
+ * Submit handler for the single target action form.
+ *
+ * Necessary to clear the cache for the supporter actions count and for the
+ * mollom captcha validation.
+ */
+function salsa_advocacy_targeted_form_submit($form, &$form_state) {
+  $action = $form_state['salsa_object'];
+  // Clear the cached count of supporter actions on this action.
+  cache_clear_all('salsa_advocacy_supporter_action_count:' . $action->action_KEY, 'cache');
+
+  // Eventually submit the data to the salsa page.
+  $salsa_url = variable_get('salsa_api_url') . '/o/' . $action->organization_KEY . '/action/wrapperProcessAction2.jsp';
+  // Get data from raw request body instead of using http_build_query() as
+  // fields with same names get missing that way.
+  $options = array(
+    'method' => 'POST',
+    'data' => file_get_contents('php://input'),
+    'headers' => array(
+      'Content-Type' => 'application/x-www-form-urlencoded',
+    ),
+  );
+  drupal_http_request($salsa_url, $options);
+
+  // Redirect the the configured uri or the frontpage otherwise.
+  if (!empty($action->redirect_path)) {
+    $form_state['redirect'] = $action->redirect_path;
+  }
+  else {
+    $form_state['redirect'] = '<front>';
+  }
+}
+
+/**
  * Hidden fields for targeted actions form.
  */
 function salsa_advocacy_targeted_form_hidden_fields(&$form, $form_state) {
@@ -1044,6 +1092,27 @@ function salsa_advocacy_fetch_action_targets($action_key) {
  *   A form array set for theming by theme_salsa_advocacy_settings_form()
  */
 function salsa_advocacy_settings_form($form, &$form_state) {
+  $form['progress'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Progress bar'),
+  );
+
+  // Custom fields used as goal for progress bars on action forms.
+  $custom_fields = salsa_entity_custom_fields('action');
+  if (!empty($custom_fields)) {
+    foreach ($custom_fields as $field_name => $field) {
+      $options[$field_name] = $field['label'];
+    }
+    $form['progress']['salsa_advocacy_goal_field'] = array(
+      '#type' => 'select',
+      '#title' => t('Salsa Advocacy Goal Field'),
+      '#description' => t('Salsa custom field that contains the submission goal for actions.'),
+      '#options' => $options,
+      '#default_value' => variable_get('salsa_advocacy_goal_field'),
+      '#empty_option' => t('- None -'),
+    );
+  }
+
   $form['items']['#tree'] = TRUE;
 
   // Fetch custom fields.
@@ -1152,19 +1221,73 @@ function theme_salsa_advocacy_settings_form($variables) {
  * Submit handler for advocacy settings form.
  */
 function salsa_advocacy_settings_form_submit($form, &$form_state) {
-  $custom_fields_settings = array();
-  foreach ($form_state['values']['items'] as $item) {
-    $custom_fields_settings[$item['name']] = array(
-      'weight' => $item['weight'],
-      'fixed_value' => $item['fixed'],
-      'default_value' => $item['default_value'],
-      'default_value_callback' => '',
-      'enabled' => $item['enabled'] ? TRUE : FALSE,
-    );
+  if (isset($form_state['values']['items'])) {
+    $custom_fields_settings = array();
+    foreach ($form_state['values']['items'] as $item) {
+      $custom_fields_settings[$item['name']] = array(
+        'weight' => $item['weight'],
+        'fixed_value' => $item['fixed'],
+        'default_value' => $item['default_value'],
+        'default_value_callback' => '',
+        'enabled' => $item['enabled'] ? TRUE : FALSE,
+      );
+    }
+    variable_set('salsa_advocacy_custom_fields', $custom_fields_settings);
   }
-  variable_set('salsa_advocacy_custom_fields', $custom_fields_settings);
+
+  // Set the field for the barometer goal.
+  variable_set('salsa_advocacy_goal_field', $form_state['values']['salsa_advocacy_goal_field']);
+
   cache_clear_all('salsa_advocacy_mapping', 'cache');
   cache_clear_all('salsa_advocacy_filters', 'cache');
   cache_clear_all('salsa_advocacy_custom_fields', 'cache');
   drupal_set_message(t('Settings have been saved.'));
 }
+
+/**
+ * Wrapper function to get the markup of the barometer.
+ *
+ * @param object $action
+ *   Salsa entity of type action.
+ *
+ * @return string
+ *   The markup for the barometer.
+ */
+function salsa_advocacy_get_barometer($action) {
+  $field_name = variable_get('salsa_advocacy_goal_field');
+
+  // Get total supporter actions (submissions) on for the given action.
+  $total = salsa_advocacy_get_supporter_actions_total($action);
+
+  $goal = $action->{$field_name};
+  $value = (($total / $goal) < 1) ? ($total / $goal) : 1;
+  return theme('salsa_entity_progress_bar', array(
+    'goal' => $goal,
+    'value' => min(round($value * 100), 100),
+    'total' => $total,
+  ));
+}
+
+/**
+ * Retrieves the supporter action objects related to a given action.
+ *
+ * Caches the data that is fetched from Salsa if the count isn't cached yet,
+ * otherwise cached data is returned.
+ *
+ * @param object $action
+ *   The Salsa entity of type action.
+ *
+ * @return int
+ *   The amount ob supporter actions for the given action.
+ */
+function salsa_advocacy_get_supporter_actions_total($action) {
+  $cache = cache_get('salsa_advocacy_supporter_action_count:' . $action->action_KEY);
+  if (!$cache) {
+    $salsa_api = salsa_api();
+    $count = $salsa_api->getCount('supporter_action', array('action_KEY' => $action->action_KEY));
+    cache_set('salsa_advocacy_supporter_action_count:' . $action->action_KEY, $count);
+    return $count;
+  }
+
+  return $cache->data;
+}
diff --git a/salsa_donate_page/includes/salsa_donate_page.css b/salsa_donate_page/includes/salsa_donate_page.css
deleted file mode 100644
index 7ebcf7a..0000000
--- a/salsa_donate_page/includes/salsa_donate_page.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @file
- * CSS style definitions for salsa donate page module.
- */
-
-.donate-page-barometer-progress {
-  background-color: #598EDE;
-  position: absolute;
-  height: 22px;
-}
-
-.donate-page-barometer {
-  background-color: #C3C3C3;
-  border: 1px solid #000;
-  width: 30%;
-  position: relative;
-  height: 22px;
-}
-
-.donate-page-donation-goal {
-  font-weight: bold;
-  margin-bottom: 10px;
-}
-
-.donate-page-barometer-label {
-  position: absolute;
-  height: 20px;
-  z-index: 1;
-  font-weight: bold;
-  padding: 2px 0px 2px 6px;
-}
-
-.donate-page-barometer-wrapper {
-  margin-bottom: 1em;
-}
\ No newline at end of file
diff --git a/salsa_donate_page/salsa_donate_page.module b/salsa_donate_page/salsa_donate_page.module
index 7e07ad4..e316fe0 100644
--- a/salsa_donate_page/salsa_donate_page.module
+++ b/salsa_donate_page/salsa_donate_page.module
@@ -45,13 +45,6 @@ function salsa_donate_page_menu() {
  */
 function salsa_donate_page_theme() {
   return array(
-    'salsa_donate_page_progress_bar' => array(
-      'variables' => array(
-        'goal' => NULL,
-        'value' => NULL,
-        'total' => NULL,
-      ),
-    ),
     'salsa_donate_page_donors_list' => array(
       'variables' => array(
         'row_values' => array(),
@@ -112,7 +105,7 @@ function salsa_donate_page_form($form, &$form_state, $donate_page, $view_mode) {
     ),
     'css' => array(
       array(
-        'data' => drupal_get_path('module', 'salsa_donate_page') . '/includes/salsa_donate_page.css'
+        'data' => drupal_get_path('module', 'salsa_entity') . '/theme/salsa_progress_bar.css'
       ),
     ),
   );
@@ -1014,20 +1007,6 @@ function salsa_donate_page_get_latest_donations($donate_page_key, $limit) {
 }
 
 /**
- * Theme function for the donation barometer.
- */
-function theme_salsa_donate_page_progress_bar($vars) {
-  $output =  '<div class="donate-page-barometer-wrapper">';
-  $output .=   '<div class="donate-page-donation-goal">' . t('Donation goal:') . '&nbsp;' . $vars['goal'] . '</div>';
-  $output .=   '<div class="donate-page-barometer">';
-  $output .=     '<span class="donate-page-barometer-label">' . t('Donated:') . '&nbsp;' . $vars['total'] . '</span>';
-  $output .=     '<div class="donate-page-barometer-progress" style="width:' . min($vars['value'], 100) . '%;"></div>';
-  $output .=   '</div>';
-  $output .= '</div>';
-  return $output;
-}
-
-/**
  * Theme function for the donors list.
  */
 function theme_salsa_donate_page_donors_list($vars) {
@@ -1081,10 +1060,10 @@ function salsa_donate_page_get_barometer($donate_page) {
   $total = salsa_donate_page_total_donation_amount($donate_page->donate_page_KEY);
   $goal = $donate_page->{$field_name};
   $value = (($total / $goal) < 1) ? ($total / $goal) : 1;
-  return theme('salsa_donate_page_progress_bar', array(
+  return theme('salsa_entity_progress_bar', array(
     'goal' => salsa_entity_get_amount($goal, TRUE),
     'value' => min(round($value * 100), 100),
-    'total' => salsa_entity_get_amount(salsa_donate_page_total_donation_amount($donate_page->donate_page_KEY), TRUE),
+    'total' => salsa_entity_get_amount($total, TRUE),
   ));
 }
 
diff --git a/salsa_entity.module b/salsa_entity.module
index 8f39734..da699bb 100644
--- a/salsa_entity.module
+++ b/salsa_entity.module
@@ -66,6 +66,13 @@ function salsa_entity_theme() {
         'title' => NULL,
       ),
     ),
+    'salsa_entity_progress_bar' => array(
+      'variables' => array(
+        'goal' => NULL,
+        'value' => NULL,
+        'total' => NULL,
+      ),
+    ),
   );
 }
 
@@ -853,3 +860,17 @@ function _salsa_entity_filter_replace_callback($matches) {
     }
   }
 }
+
+/**
+ * Theme function for the progress barometer.
+ */
+function theme_salsa_entity_progress_bar($vars) {
+  $output =  '<div class="salsa-barometer-wrapper">';
+  $output .=   '<div class="salsa-barometer-goal">' . t('Donation goal:') . '&nbsp;' . $vars['goal'] . '</div>';
+  $output .=   '<div class="salsa-barometer">';
+  $output .=     '<span class="salsa-barometer-label">' . t('Donated:') . '&nbsp;' . $vars['total'] . '</span>';
+  $output .=     '<div class="salsa-barometer-progress" style="width:' . min($vars['value'], 100) . '%;"></div>';
+  $output .=   '</div>';
+  $output .= '</div>';
+  return $output;
+}
diff --git a/salsa_my_donate_page/salsa_my_donate_page.module b/salsa_my_donate_page/salsa_my_donate_page.module
index a124b15..e5142e1 100644
--- a/salsa_my_donate_page/salsa_my_donate_page.module
+++ b/salsa_my_donate_page/salsa_my_donate_page.module
@@ -617,7 +617,7 @@ function salsa_my_donate_page_form($form, &$form_state, $supporter_my_donate_pag
   );
 
   $form['progress']['progressbar'] = array(
-    '#theme' => 'salsa_donate_page_progress_bar',
+    '#theme' => 'salsa_entity_progress_bar',
     '#goal' => salsa_entity_get_amount($total, TRUE),
     '#total' => salsa_entity_get_amount($current, TRUE),
     '#value' => $percent,
diff --git a/theme/salsa_progress_bar.css b/theme/salsa_progress_bar.css
new file mode 100644
index 0000000..b676ef7
--- /dev/null
+++ b/theme/salsa_progress_bar.css
@@ -0,0 +1,35 @@
+/**
+ * @file
+ * CSS style definitions for salsa barometer/progress bar.
+ */
+
+.salsa-barometer-progress {
+  background-color: #598EDE;
+  position: absolute;
+  height: 22px;
+}
+
+.salsa-barometer {
+  background-color: #C3C3C3;
+  border: 1px solid #000;
+  width: 30%;
+  position: relative;
+  height: 22px;
+}
+
+.salsa-donation-goal {
+  font-weight: bold;
+  margin-bottom: 10px;
+}
+
+.salsa-barometer-label {
+  position: absolute;
+  height: 20px;
+  z-index: 1;
+  font-weight: bold;
+  padding: 2px 0px 2px 6px;
+}
+
+.salsa-barometer-wrapper {
+  margin-bottom: 1em;
+}
