diff --git a/classes/buttons/POS_Button_Modal_Field.php b/classes/buttons/POS_Button_Modal_Field.php
new file mode 100644
index 0000000..bb76d14
--- /dev/null
+++ b/classes/buttons/POS_Button_Modal_Field.php
@@ -0,0 +1,34 @@
+<?php
+
+class POS_Button_Modal_Field extends POS_Button_Modal {
+
+  public function access(CommercePOS $pos, $input) {
+    if($field = field_info_field($this->config['field_name'])) {
+      if($order = $pos->getState()->getOrder()) {
+        return field_access('edit', $field, 'commerce_order', $pos->getState()->getOrder(), $pos->getState()->getCashier());
+      }
+    }
+    return FALSE;
+  }
+
+  public function modalPage(CommercePOS $pos, $js) {
+
+
+    $field_name = $this->config['field_name'];
+
+
+    $form_state = array(
+      'title' => drupal_get_title(),
+      'build_info' => array('args' => array($pos->getState()->getOrder(), $field_name)),
+      'ajax' => $js,
+    );
+
+    if (!$js) {
+      return drupal_build_form('commerce_pos_commerce_order_field_edit_form', $form_state);
+    }
+
+    $output = ctools_modal_form_wrapper('commerce_pos_commerce_order_field_edit_form', $form_state);
+
+    return $output && !$form_state['executed'] ? $output : FALSE;
+  }
+}
diff --git a/commerce_pos.info b/commerce_pos.info
index bf06065..e54529a 100644
--- a/commerce_pos.info
+++ b/commerce_pos.info
@@ -18,6 +18,7 @@ files[] = classes/buttons/POS_Button_Command.php
 files[] = classes/buttons/POS_Button_Modal.php
 files[] = classes/buttons/POS_Button_Modal_View.php
 files[] = classes/buttons/POS_Button_Payment.php
+files[] = classes/buttons/POS_Button_Modal_Field.php
 
 files[] = classes/commands/POS_Command.php
 files[] = classes/commands/POSCommand_AddProduct.php
diff --git a/commerce_pos.module b/commerce_pos.module
index d149c51..772137d 100644
--- a/commerce_pos.module
+++ b/commerce_pos.module
@@ -321,6 +321,23 @@ function commerce_pos_commerce_pos_buttons() {
       );
     }
   }
+  foreach (field_info_instances('commerce_order', 'commerce_order') as $instance) {
+    // Exclude fields that already have POS functionality.
+    $exclude = array(
+      'commerce_line_items',
+    );
+    if (in_array($instance['field_name'], $exclude)) {
+      continue;
+    }
+    $buttons['field_' . $instance['field_name']] = array(
+      'title' => $instance['label'],
+      'handler' => 'POS_Button_Modal_Field',
+      'handler_options' => array(
+        'field_name' => $instance['field_name'],
+      )
+    );
+  }
+
   $buttons['user_modal'] = array(
     'title' => t('Customer'),
     'handler' => 'POS_Button_Modal_View',
@@ -380,4 +397,38 @@ function commerce_pos_commerce_pos_panes() {
     'weight' => 10,
   );
   return $panes;
-}
\ No newline at end of file
+}
+
+/**
+ * Form callback to build an edit form for a single field on a commerce order.
+ */
+function commerce_pos_commerce_order_field_edit_form($form, &$form_state, $order, $field_name) {
+  $field = field_info_field($field_name);
+  list(, ,$bundle) = entity_extract_ids('commerce_order', $order);
+  $instance = field_info_instance('commerce_order', $field_name, $bundle);
+  $langcode = field_language('commerce_order', $order, $field_name);
+  $items = field_get_items('commerce_order', $order, $field_name, $langcode);
+
+  $form['#parents'] = array();
+  $form_state['order'] = $order;
+  $form_state['field'] = $field;
+  $form_state['instance'] = $instance;
+  $form_state['langcode'] = $langcode;
+  $form_state['items'] = $items;
+
+  $form += field_default_form('commerce_order', $order, $field, $instance, $langcode, $items, $form, $form_state);
+
+  $form['actions'] = array(
+    '#type' => 'actions'
+  );
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+  return $form;
+}
+
+function commerce_pos_commerce_order_field_edit_form_submit($form, &$form_state) {
+  entity_form_submit_build_entity('commerce_order', $form_state['order'], $form, $form_state);
+  commerce_order_save($form_state['order']);
+}
