diff --git a/tablefield.css b/tablefield.css
index 515a0dd..00cecf0 100644
--- a/tablefield.css
+++ b/tablefield.css
@@ -35,3 +35,9 @@
 .form-tablefield fieldset {
   margin: 0.5em 0;
 }
+.form-tablefield input.tablefield-modify-col {
+  width:10%;
+  margin:0;
+  font-size:10px;
+  padding:2px 5px;
+}
diff --git a/tablefield.module b/tablefield.module
index 9ac208a..be4fa47 100644
--- a/tablefield.module
+++ b/tablefield.module
@@ -543,6 +543,7 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $
 
   // Default table cell values.
   $default_value = NULL;
+  $col_insert = NULL;
 
   // If there's a triggering element get the values from form state.
   if (isset($form_state['triggering_element'])) {
@@ -564,6 +565,17 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $
         $default_value['rebuild'] = $default_size;
       }
     }
+    elseif (substr($form_state['triggering_element']['#name'], 0, 11) == 'col_insert_') {
+      $col_insert = substr($form_state['triggering_element']['#name'], 13);
+      $pos = substr($form_state['triggering_element']['#name'], 11, 1);
+      tablefield_insert_col($form, $form_state, $langcode, $col_insert, $pos, $tablefield_parents);
+      $default_value = drupal_array_get_nested_value($form_state['input'], $tablefield_parents);
+    }
+    elseif (substr($form_state['triggering_element']['#name'], 0, 11) == 'col_delete_') {
+      $col_delete = substr($form_state['triggering_element']['#name'], 11);
+      tablefield_delete_col($form, $form_state, $langcode, $col_delete, $tablefield_parents);
+      $default_value = drupal_array_get_nested_value($form_state['input'], $tablefield_parents);
+    }
     else {
       // The triggering element is neither a rebuild nor an import
       // e.g. a file upload.
@@ -647,6 +659,67 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $
     '#markup' => '<table id="tablefield-editor">',
   );
 
+  $element['tablefield']['a_header'] = array(
+    '#prefix' => '<th>',
+    '#suffix' => '<td></td></th>',
+  );
+  for ($a = 0; $a <= $count_cols; $a++) {
+    $colid = $a;
+    $element['tablefield']['a_header']['col_insert_b_' . $colid] = array(
+      '#type' => 'button',
+      '#validate' => array(),
+      '#limit_validation_errors' => array(),
+      '#executes_submit_callback' => TRUE,
+      '#submit' => array('tablefield_rebuild_form'),
+      '#value' => '<-',
+      '#name' => 'col_insert_b_' . $colid,
+      '#attributes' => array(
+        'class' => array('tablefield-modify-col', 'insert-before')
+      ),
+      '#ajax' => array(
+        'callback' => 'tablefield_rebuild_form_ajax',
+        'wrapper' => $ajax_wrapper_id,
+        'effect' => 'fade',
+      ),
+      '#prefix' => '<td>',
+    );
+    $element['tablefield']['a_header']['col_delete_' . $colid] = array(
+      '#type' => 'button',
+      '#validate' => array(),
+      '#limit_validation_errors' => array(),
+      '#executes_submit_callback' => TRUE,
+      '#submit' => array('tablefield_rebuild_form'),
+      '#value' => 'X',
+      '#name' => 'col_delete_' . $colid,
+      '#attributes' => array(
+        'class' => array('tablefield-modify-col', 'delete')
+      ),
+      '#ajax' => array(
+        'callback' => 'tablefield_rebuild_form_ajax',
+        'wrapper' => $ajax_wrapper_id,
+        'effect' => 'fade',
+      ),
+    );
+    $element['tablefield']['a_header']['col_insert_a_' . $colid] = array(
+      '#type' => 'button',
+      '#validate' => array(),
+      '#limit_validation_errors' => array(),
+      '#executes_submit_callback' => TRUE,
+      '#submit' => array('tablefield_rebuild_form'),
+      '#value' => '->',
+      '#name' => 'col_insert_a_' . $colid,
+      '#attributes' => array(
+        'class' => array('tablefield-modify-col', 'insert-after')
+      ),
+      '#ajax' => array(
+        'callback' => 'tablefield_rebuild_form_ajax',
+        'wrapper' => $ajax_wrapper_id,
+        'effect' => 'fade',
+      ),
+      '#suffix' => '</td>',
+    );
+  }
+
   // Loop over all the rows.
   for ($i = 0; $i < $count_rows; $i++) {
     $zebra = $i % 2 == 0 ? 'even' : 'odd';
@@ -986,6 +1059,91 @@ function tablefield_import_pasted($form, &$form_state, $langcode, $pasted_form_f
 }
 
 /**
+ * Helper function to insert columnt
+ * @param  array $form
+ * @param  array &$form_state
+ * @param  string $langcode
+ * @param  string $col_insert
+ * @param  string $pos
+ * @param  array $tablefield_parents
+ */
+function tablefield_insert_col($form, &$form_state, $langcode, $col_insert, $pos, $tablefield_parents) {
+  $default_value = drupal_array_get_nested_value($form_state['input'], $tablefield_parents);
+
+  if (is_numeric($col_insert)) {
+    if ($pos == 'b') {
+      $col_insert = $col_insert - 1;
+    }
+    if ($col_insert < 0) $col_insert = 0;
+
+    ++$default_value['rebuild']['count_cols'];
+    foreach ($default_value as $key => $value) {
+      if (substr($key, 0, 4) == 'cell') {
+        $id = substr($key, 5);
+        $id_arr = explode('_', $id);
+        $r_id = $id_arr[0];
+        $c_id = $id_arr[1];
+        if (is_numeric($c_id)) {
+
+          if ($c_id == $col_insert) {
+            $new_key = 'cell_' . $r_id . '_' . ($c_id + 1);
+            $default_value[$key] = $value;
+            $default_value[$new_key] = '';
+            if ($pos == 'b' && $col_insert == 0) {
+              $default_value[$key] = '';
+              $default_value[$new_key] = $value;
+            }
+          }
+          elseif ($c_id > $col_insert) {
+            $new_key = 'cell_' . $r_id . '_' . ($c_id + 1);
+            $default_value[$new_key] = $value;
+          }
+        }
+      }
+    }
+  }
+  drupal_array_set_nested_value($form_state['values'], $tablefield_parents, $default_value);
+  drupal_array_set_nested_value($form_state['input'], $tablefield_parents, $default_value);
+}
+
+/**
+ * Helper function to delete columnt
+ * @param  array $form
+ * @param  array &$form_state
+ * @param  string $langcode
+ * @param  string $col_delete
+ * @param  array $tablefield_parents
+ */
+function tablefield_delete_col($form, &$form_state, $langcode, $col_delete, $tablefield_parents) {
+  $default_value = drupal_array_get_nested_value($form_state['input'], $tablefield_parents);
+
+  if (is_numeric($col_delete)) {
+    $default_value['rebuild']['count_cols'] = $default_value['rebuild']['count_cols'] - 1;
+    foreach ($default_value as $key => $value) {
+      if (substr($key, 0, 4) == 'cell') {
+        $id = substr($key, 5);
+        $id_arr = explode('_', $id);
+        $r_id = $id_arr[0];
+        $c_id = $id_arr[1];
+        if (is_numeric($c_id)) {
+          if ($c_id == $col_delete) {
+            unset($default_value[$key]);
+          }
+          elseif ($c_id > $col_delete) {
+            $new_key = 'cell_' . $r_id . '_' . ($c_id-1);
+            $default_value[$new_key] = $value;
+          }
+        }
+      }
+    }
+  }
+
+  // Rebuild the table if necessary, and save.
+  drupal_array_set_nested_value($form_state['values'], $tablefield_parents, $default_value);
+  drupal_array_set_nested_value($form_state['input'], $tablefield_parents, $default_value);
+}
+
+/**
  * Helper function to remove all values in a particular table.
  *
  * @param array $tablefield
