=== modified file 'includes/form.inc'
--- includes/form.inc	
+++ includes/form.inc	
@@ -102,8 +102,16 @@ function drupal_get_form($form_id, &$for
     $function($form_id, $form);
   }
 
+  $posted = !empty($_POST['edit']);
+  if (!$posted && isset($form['#cacheable']) && $form['#cacheable']) {
+    $cid = isset($form['#cache_id']) ? $form['#cache_id'] : "form_$form_id";
+    if ($cache = cache_get($cid)) {
+      return form_render($form, NULL, $cache->data);
+    }
+  }
+
   $form = form_builder($form_id, $form);
-  if (!empty($_POST['edit']) && (($_POST['edit']['form_id'] == $form_id) || ($_POST['edit']['form_id'] == $callback))) {
+  if ($posted && (($_POST['edit']['form_id'] == $form_id) || ($_POST['edit']['form_id'] == $callback))) {
     drupal_validate_form($form_id, $form, $callback);
     if ($form_submitted && !form_get_errors()) {
       $redirect = drupal_submit_form($form_id, $form, $callback);
@@ -130,7 +138,7 @@ function drupal_get_form($form_id, &$for
   elseif (theme_get_function($callback)) {
     $form['#theme'] = $callback;
   }
-  return form_render($form);
+  return form_render($form, $cid);
 }
 
 function drupal_validate_form($form_id, &$form, $callback = NULL) {
@@ -389,17 +397,22 @@ function form_builder($form_id, $form) {
  *
  * @param $elements
  *   The form tree describing the form.
+ * @param $cid
+ *   Optional cache id, if set, form_render saves the the rendered HTML
+ *   of the elements children to cache.
+ * @param $content
+ *   Optionally, the rendered HTML of the children of the element. Used
+ *   for caching.
  * @return
  *   The rendered HTML form.
  */
-function form_render(&$elements) {
+function form_render(&$elements, $cid = NULL, $content = '') {
   if (!isset($elements)) {
     return NULL;
   }
-  $content = '';
   uasort($elements, "_form_sort");
 
-  if (!isset($elements['#children'])) {
+  if (empty($content) && !isset($elements['#children'])) {
     /* render all the children using a theme function */
     if (isset($elements['#theme']) && !$elements['#theme_used']) {
       $elements['#theme_used'] = TRUE;
@@ -417,6 +430,9 @@ function form_render(&$elements) {
   }
   if ($content) {
     $elements['#children'] = $content;
+    if (isset($cid)) {
+      cache_set($cid, $content, time() + 86400);;
+    }
   }
 
   /* Call the form element renderer */
=== modified file 'modules/comment.module'
--- modules/comment.module	
+++ modules/comment.module	
@@ -1307,6 +1307,13 @@ function comment_form($edit, $title = NU
   $form['pid'] = array('#type' => 'value', '#value' => $edit['pid']);
   $form['nid'] = array('#type' => 'value', '#value' => $edit['nid']);
   $form['uid'] = array('#type' => 'value', '#value' => $edit['uid']);
+  if (!isset($edit['cid'])) {
+    $form['#cacheable'] = TRUE;
+    // the add comment form differs for anon and logged in users
+    if ($edit['uid']) {
+      $form['#cache_id'] = "form_comment_form_1";
+    }
+  }
 
   $form['preview'] = array('#type' => 'button', '#value' => t('Preview comment'), '#weight' => 19);
   $form['#token'] = 'comment' . $edit['nid'] . $edit['pid'];
=== modified file 'modules/poll.module'
--- modules/poll.module	
+++ modules/poll.module	
@@ -97,6 +97,7 @@ function poll_submit(&$node) {
   // Renumber fields
   $node->choice = array_values($node->choice);
   $node->teaser = poll_teaser($node);
+  cache_clear_all('poll_view_voting_'. $node->nid);
 }
 
 /**
@@ -308,7 +309,10 @@ function poll_view_voting(&$node, $tease
   $form['nid'] = array('#type' => 'hidden', '#value' => $node->nid);
   $form['vote'] = array('#type' => 'submit', '#value' => t('Vote'));
   $form['#action'] = url('node/'. $node->nid);
-  return drupal_get_form('poll_view_voting', $form);
+  $form['#cacheable'] = TRUE;
+  $form_id = 'poll_view_voting';
+  $form['#cache_id'] = $form_id .'_'. $node->nid;
+  return drupal_get_form($form_id, $form);
 }
 
 /**
=== modified file 'modules/system.module'
--- modules/system.module	
+++ modules/system.module	
@@ -1212,6 +1212,7 @@ function search_box($path = NULL) {
   $form['#action'] = is_null($path) ? url('search') : url($path);
   $form['keys'] = array('#type' => 'textfield', '#size'=> 15, '#value' => '', '#attributes' => array('alt' => t('Enter the terms you wish to search for.')));
   $form['submit'] = array('#type' => 'submit', '#value' => t('Search'));
+  $form['#cacheable'] = TRUE;
   return drupal_get_form('search_box', $form);
 }
 
=== modified file 'modules/user.module'
--- modules/user.module	
+++ modules/user.module	
@@ -544,6 +544,7 @@ function user_block($op = 'list', $delta
           }
           $items[] = l(t('Request new password'), 'user/password', array('title' => t('Request new password via e-mail.')));
           $form['links'] = array('#value' => theme('item_list', $items));
+          $form['#cacheable'] = TRUE;
 
           $output .= drupal_get_form('user_login_block', $form, 'user_login');
 
