diff --git a/css/webform.css b/css/webform.css
index 036d199..fd4a3a0 100644
--- a/css/webform.css
+++ b/css/webform.css
@@ -28,3 +28,13 @@ html.js input.webform-calendar {
 .webform-container-inline div.ajax-progress-bar div {
   display: inherit;
 }
+.webform-progress-bar-inner {
+  height: 1em;
+  background-color: #000088;
+}
+.webform-progress-bar-outer {
+  border: 1px solid #000000;
+  width: 100%;
+  height: 1em;
+  margin:0.35em 5px 0;
+}
diff --git a/includes/webform.admin.inc b/includes/webform.admin.inc
index a3be128..ac7f856 100644
--- a/includes/webform.admin.inc
+++ b/includes/webform.admin.inc
@@ -162,6 +162,25 @@ function webform_admin_settings() {
     '#description' => t('By default, the configuration form for each webform allows the administrator to choose which roles may submit the form. You may want to allow users to always submit the form if you are using a separate node access module to control access to webform nodes themselves.'),
   );
 
+  $form['progress_bar'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Progress bar'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['progress_bar']['webform_progress_bar_style']  = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Progress bar style'),
+    '#options' => array(
+      'progress_bar_page_number' => t('Show page number as number of completed (i.e. Page 1 of 10)'),
+      'progress_bar_percent' => t('Show percentage completed (i.e. 10%)'),
+      'progress_bar_bar' => t('Show percentage completed bar.'),
+      'progress_bar_pagebreak_label' => t('Show the page break label in each page.'),
+    ),
+    '#default_value' => variable_get('webform_progress_bar_style', array()),
+    '#description' => t('Choose how the progress bar should be displayed for multi-page forms.'),
+  );
+
   $form = system_settings_form($form);
   $form['#theme'] = 'webform_admin_settings';
   array_unshift($form['#submit'], 'webform_admin_settings_submit');
diff --git a/includes/webform.pages.inc b/includes/webform.pages.inc
index f7eefce..611933b 100644
--- a/includes/webform.pages.inc
+++ b/includes/webform.pages.inc
@@ -13,6 +13,8 @@ function webform_configure_form($form, &$form_state, $node) {
   $form['#attached']['library'][] = array('webform', 'admin');
 
   $form['#node'] = $node;
+  //var_dump ($node->webform);
+  //def();
 
   $form['#submit'] = array(
     'webform_configure_form_submit',
@@ -233,6 +235,37 @@ function webform_configure_form($form, &$form_state, $node) {
   );
   /* End Advanced Settings Form */
 
+  /* Start Progress Bar Settings Form*/
+  $progress_bar_defaults = variable_get('webform_progress_bar_style', array());
+  $form['progress_bar'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Progress bar'),
+    '#description' => t('Choose how the progress bar should be displayed for multi-page forms.'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['progress_bar']['progress_bar_page_number']  = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show page number as number of completed (i.e. Page 1 of 10)'),
+    '#default_value' => isset($node->webform['progress_bar_page_number']) ? $node->webform['progress_bar_page_number'] : $progress_bar_defaults['progress_bar_page_number'],
+  );
+  $form['progress_bar']['progress_bar_percent']  = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show percentage completed (i.e. 10%)'),
+    '#default_value' => isset($node->webform['progress_bar_percent']) ? $node->webform['progress_bar_percent'] : $progress_bar_defaults['progress_bar_percent'],
+  );
+  $form['progress_bar']['progress_bar_bar']  = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show percentage completed bar.'),
+    '#default_value' => isset($node->webform['progress_bar_bar']) ? $node->webform['progress_bar_bar'] : $progress_bar_defaults['progress_bar_bar'],
+  );
+  $form['progress_bar']['progress_bar_pagebreak_label']  = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show the page break label in each page.'),
+    '#default_value' => isset($node->webform['progress_bar_pagebreak_label']) ? $node->webform['progress_bar_pagebreak_label'] : $progress_bar_defaults['progress_bar_pagebreak_label'],
+  );
+  /* End Progress Bar Settings Form*/
+
   $form['actions'] = array(
     '#type' => 'actions',
     '#weight' => 300,
@@ -339,6 +372,12 @@ function webform_configure_form_submit($form, &$form_state) {
 
   // Set submit button text.
   $node->webform['submit_text'] = $form_state['values']['submit_text'];
+
+  //Set the progress bar preference
+  $node->webform['progress_bar_page_number'] = $form_state['values']['progress_bar_page_number'];
+  $node->webform['progress_bar_percent'] = $form_state['values']['progress_bar_percent'];
+  $node->webform['progress_bar_bar'] = $form_state['values']['progress_bar_bar'];
+  $node->webform['progress_bar_pagebreak_label'] = $form_state['values']['progress_bar_pagebreak_label'];
 }
 
 /**
diff --git a/templates/webform-form.tpl.php b/templates/webform-form.tpl.php
index d839083..194028d 100644
--- a/templates/webform-form.tpl.php
+++ b/templates/webform-form.tpl.php
@@ -18,6 +18,9 @@
  */
 ?>
 <?php
+  //Print out the progress bar at the top of the page
+  print drupal_render($form['progress_bar']);
+
   // Print out the main part of the form.
   // Feel free to break this up and move the pieces within the array.
   print drupal_render($form['submitted']);
diff --git a/templates/webform-progress-bar.tpl.php b/templates/webform-progress-bar.tpl.php
new file mode 100644
index 0000000..90ad117
--- /dev/null
+++ b/templates/webform-progress-bar.tpl.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Display the progress bar for multipage forms
+ *
+ * Available variables:
+ * - $webform: The webform array
+ * - $progress_bar_page_number: TRUE if the actual page number should be displayed
+ * - $progress_bar_percent: TRUE if the percentage complete should be displayed
+ * - $progress_bar_bar: TRUE if the bar should be displayed
+ * - $progress_bar_pagebreak_label: TRUE if the page break label shoud be displayed
+
+ * - $page_number: The current page number
+ * - $page_count: The total number of pages in this form
+ * - $page_label: The label for the page
+ * - $percent: The percentage complete
+ */
+?>
+
+<div class="webform-progress-bar">
+<?php if ($progress_bar_pagebreak_label) { //Show the page break label in each page ?>
+  <div class="webform-progress-bar-label">
+  <?php print $page_label; ?>
+  </div>
+<?php } ?>
+
+<?php if ($progress_bar_percent) { //Show percentage completed (i.e. 10%) ?>
+  <div class="webform-progress-bar-number">
+  <?php print number_format($percent, 0); print '%'; ?>
+  </div>
+<?php } ?>
+
+<?php if ($progress_bar_page_number) { //Show page number as number of completed (i.e. Page 1 of 10) ?>
+  <div class="webform-progress-bar-number">
+  <?php print t('Page @start of @end', array('@start' => $page_number, '@end' => $page_count)); ?>
+  </div>
+<?php } ?>
+
+<?php if ($progress_bar_bar) { //Show percentage completed bar ?>
+  <div class="webform-progress-bar-outer">
+    <div class="webform-progress-bar-inner" style="width: <?php print number_format($percent, 0); print '%'; ?>">&nbsp;</div>
+  </div>
+<?php } ?>
+
+</div>
diff --git a/webform.install b/webform.install
index 333ef4b..e05da8e 100644
--- a/webform.install
+++ b/webform.install
@@ -109,6 +109,30 @@ function webform_schema() {
         'not null' => TRUE,
         'default' => -1,
       ),
+      'progress_bar_page_number' => array(
+        'description' => 'Should the the page number be shown as part of the progress bar?',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'progress_bar_percent' => array(
+        'description' => 'Should the percentage complete be shown as part of the progress bar?',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'progress_bar_bar' => array(
+        'description' => 'Should the bar be shown as part of the progress bar?',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
+      'progress_bar_pagebreak_label' => array(
+        'description' => 'Should the pagebreak label be shown as part of the progress bar?',
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
     ),
     'primary key' => array('nid'),
   );
@@ -1330,3 +1354,36 @@ function webform_update_7404() {
     _webform_delete_file(NULL, array($fid));
   }
 }
+
+
+/**
+ * Add progress bar display on/off fields
+ */
+function webform_update_7406() {
+  // In case someone used a dev patch before, drop old columns
+  // We're not migrating any settings, you'll just have to reapply them
+  if (db_field_exists('webform', 'progressbar_page_number')) {
+    db_drop_field('webform', 'progressbar_page_number');
+  }
+  if (db_field_exists('webform', 'progressbar_percent')) {
+    db_drop_field('webform', 'progressbar_percent');
+  }
+  if (db_field_exists('webform', 'progressbar_bar')) {
+    db_drop_field('webform', 'progressbar_bar');
+  }
+  if (db_field_exists('webform', 'progressbar_pagebreak_label')) {
+    db_drop_field('webform', 'progressbar_pagebreak_label');
+  }
+  if (!db_field_exists('webform', 'progress_bar_page_number')) {
+    db_add_field('webform', 'progress_bar_page_number', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
+  }
+  if (!db_field_exists('webform', 'progress_bar_percent')) {
+    db_add_field('webform', 'progress_bar_percent', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
+  }
+  if (!db_field_exists('webform', 'progress_bar_bar')) {
+    db_add_field('webform', 'progress_bar_bar', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
+  }
+  if (!db_field_exists('webform', 'progress_bar_pagebreak_label')) {
+    db_add_field('webform', 'progress_bar_pagebreak_label', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
+  }
+}
diff --git a/webform.module b/webform.module
index 973fd65..996b726 100644
--- a/webform.module
+++ b/webform.module
@@ -641,6 +641,10 @@ function webform_theme() {
     'webform_inline_radio' => array(
       'render element' => 'element',
     ),
+    'webform_progress_bar' => array(
+      'variables' => array('webform' => NULL, 'progress_bar_pagebreak_label' => FALSE, 'progress_bar_percent' => FALSE, 'progress_bar_page_number' => FALSE, 'progress_bar_bar' => FALSE, 'page_number' => NULL, 'page_count' => NULL, 'page_label' => NULL),
+      'template' => 'templates/webform-progress-bar',
+    ),
     'webform_mail_message' => array(
       'variables' => array('node' => NULL, 'submission' => NULL, 'email' => NULL),
       'template' => 'templates/webform-mail',
@@ -835,6 +839,14 @@ function webform_element_info() {
     '#process' => array('webform_conditional_expand'),
   );
 
+  $elements['webform_progress_bar'] = array(
+    '#input' => FALSE,
+    '#theme' => 'webform_progress_bar',
+    '#page_num' => 0,
+    '#page_count' => 0,
+    '#page_label' => '',
+  );
+
   return $elements;
 }
 
@@ -2112,6 +2124,18 @@ function webform_client_form($form, &$form_state, $node, $submission, $is_draft
       }
     }
 
+    if ($page_count > 1) {
+      $form['progress_bar'] = array(
+        '#type' => 'webform_progress_bar',
+        '#webform' => $node->webform,
+        '#progress_bar_page_number' => TRUE,
+        '#page_number' => $page_num,
+        '#page_count' => $page_count,
+        '#page_label' => webform_page_label($node->webform, $page_num),
+        '#weight' => -100
+      );
+    }
+
     // Recursively add components to the form. The unfiltered version of the
     // form (typically used in Form Builder), includes all components.
     foreach ($component_tree['children'] as $cid => $component) {
@@ -2948,6 +2972,17 @@ function template_preprocess_webform_confirmation(&$vars) {
 }
 
 /**
+ * Prepare for theming of the webform progress bar.
+ */
+function template_preprocess_webform_progress_bar(&$vars) {
+  $settings = array ('progress_bar_page_number', 'progress_bar_percent', 'progress_bar_bar', 'progress_bar_pagebreak_label');
+  foreach ($settings as $key) {
+    $vars[$key] = isset ($vars['webform'][$key]) ? $vars['webform'][$key] : FALSE;
+  }
+  $vars['percent'] = $vars['page_number'] / $vars['page_count'] * 100;
+}
+
+/**
  * Prepare to theme the contents of e-mails sent by webform.
  */
 function template_preprocess_webform_mail_message(&$vars) {
@@ -3999,3 +4034,26 @@ function webform_mollom_form_info($form_id) {
 
   return $form_info;
 }
+
+/**
+ * Find the label of a page
+ *
+ * @param $webform
+ *     The webform object
+ * @param $page_number
+ *     The page number of the page in question
+ * @return string
+ *     The label of the page
+ */
+function webform_page_label($webform, $page_number) {
+  $page_count = 1;
+  foreach($webform['components'] as $component) {
+    if ($component['type'] == 'pagebreak') {
+      $page_count++;
+      if ($page_count == $page_number) {
+        return $component['name'];
+      }
+    }
+  }
+  return ''; //The default for the first page
+}
