diff --git a/modal_forms.module b/modal_forms.module
index 3afdc01..1185aae 100644
--- a/modal_forms.module
+++ b/modal_forms.module
@@ -59,6 +59,23 @@ function modal_forms_menu() {
     'file' => 'modal_forms.pages.inc',
     'type' => MENU_CALLBACK,
   );
+  $items['modal_forms/%ctools_js/webform/%node'] = array(
+    'title' => 'Webform view',
+    'page callback' => 'modal_forms_view_webform',
+    'page arguments' => array(1, 3),
+    'access callback' => 'node_access',
+    'access arguments' => array('view', 3),
+    'file' => 'modal_forms.pages.inc',
+    'type' => MENU_CALLBACK,
+  );
+  $items['modal_forms/%ctools_js/dismiss'] = array(
+    'title' => 'Webform view',
+    'page callback' => 'modal_forms_dismiss',
+    'page arguments' => array(1),
+    'access callback' => TRUE,
+    'file' => 'modal_forms.pages.inc',
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
diff --git a/modal_forms.pages.inc b/modal_forms.pages.inc
index 964ffd7..d743cb6 100644
--- a/modal_forms.pages.inc
+++ b/modal_forms.pages.inc
@@ -133,3 +133,72 @@ function modal_forms_contact($js = NULL) {
   print ajax_render($output);
   exit;
 }
+
+/**
+ * Modal display of the node's webform.
+ *
+ * @param $node
+ *   A node object.
+ */
+function modal_forms_view_webform($js = NULL, $node) {
+  $output = array();
+
+  // Fall back if $js is not set.
+  if (!$js) {
+    return drupal_get_form('webform_client_form_' . $node->nid, $node, FALSE);
+  }
+  ctools_include('modal');
+  ctools_include('ajax');
+  if (empty($node->webform['components'])) {
+    // No webform or no components.
+    $output[] = ctools_modal_command_display(t('Webform'), t('No webform found.'));
+    print ajax_render($output);
+    exit;
+  }
+  // Get webform defaults.
+  $title = check_plain($node->title);
+  $text = check_markup($node->webform['confirmation'], $node->webform['confirmation_format'], '', TRUE);
+  $form_state = array(
+    'title' => $title,
+    'ajax' => TRUE,
+  );
+  // Prevent webform redirect.
+  $GLOBALS['conf']['webform_blocks']['client-block-' . $node->nid]['pages_block'] = 1;
+  $node->webform_block = TRUE;
+  // Pass required parameters.
+  $form_state['build_info']['args'] = array($node, FALSE);
+  $output = ctools_modal_form_wrapper('webform_client_form_' . $node->nid, $form_state);
+
+  if (!empty($form_state['executed'])) {
+    if (!isset($form_state['storage'])) {
+      ctools_add_js('ajax-responder');
+      $output[] = ctools_modal_command_display($title, $text . ctools_ajax_text_button(t('Close'), 'modal_forms/nojs/dismiss', t('Close')));
+      // @todo Add support for redirect. Require some magic.
+      // Copied from webform_client_form_submit().
+      // $redirect_url = trim($node->webform['redirect_url']);
+      // $redirect_url = _webform_filter_values($redirect_url, $node, NULL, NULL, FALSE, TRUE);
+      // $output[] = ctools_ajax_command_redirect($redirect_url);
+    }
+    else {
+      // We are on a multistep form step.
+      $form_state['executed'] = array();
+      $output = ctools_modal_form_wrapper('webform_client_form_' . $node->nid, $form_state);
+    }
+  }
+  print ajax_render($output);
+  exit;
+}
+
+/**
+ * Closes modal windows.
+ */
+function modal_forms_dismiss($js) {
+  if (!$js) {
+    return ;
+  }
+  ctools_include('modal');
+  ctools_include('ajax');
+
+  $commands = array(ctools_modal_command_dismiss());
+  print ajax_render($commands);
+}
