diff --git a/webform.module b/webform.module
index 56f4b17..0954945 100644
--- a/webform.module
+++ b/webform.module
@@ -2265,7 +2265,7 @@ function webform_block_view($delta = '') {
         '#node' => $node,
         '#sid' => $_SESSION['webform_confirmation'][$nid]['sid'],
       );
-    }
+    }
     elseif (strlen(trim(strip_tags($node->webform['confirmation'])))) {
       // Display confirmation link drupal status messages, but in the block.
       $message = webform_replace_tokens($node->webform['confirmation'],
@@ -3010,6 +3010,20 @@ function _webform_client_form_validate(&$elements, &$form_state, $form_id = NULL
         form_error($elements, t('!name field is required.', array('!name' => $elements['#title'])));
       }

+      // Server validation of webform grids
+      if ( $elements['#type'] === 'webform_grid' ) {
+        if ( count($elements['#value']) !== count(element_children($elements)) ) {
+          form_error($elements, t('Missing answer to required items'));
+        }
+        if ( ! empty($elements['#value']) ) {
+          foreach ( $elements['#value'] as $item ) {
+            if ( $item === '' ) {
+              form_error($elements, t('Missing answer to required items'));
+            }
+          }
+        }
+      }
+
       // Verify that the value is not longer than #maxlength.
       if (isset($elements['#maxlength']) && drupal_strlen($elements['#value']) > $elements['#maxlength']) {
         form_error($elements, t('!name cannot be longer than %max characters but is currently %length characters long.', array('!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'], '%max' => $elements['#maxlength'], '%length' => drupal_strlen($elements['#value']))));
