I was able to get this working using a modified version of the code here http://dropbucket.org/node/204 The adjustments I made were to allow my table to be an element on a parent form and to repopulate the from my variables array... //TODO bubble checked boxes to top $rows = array(); $row_elements = array(); $data=array(); //$shared['articleFields'] values stored in variables table -- loaded in parent form //$key is name of my parent form this gets attached to $cc=-10; // fields from article fields array in article_form.inc foreach ($articleFields as $k =>$v) { // Build the table rows. $dv=""; $dv2=""; //if no values are defined use default weights from -10 up if(isset($shared['articleFields']['elements'][$k]['weight'])){ $dv=$shared['articleFields']['elements'][$k]['weight']; } else $dv=$cc++; //if no value is defined use 0 for enabled value (unchecked) if(isset($shared['articleFields']['elements'][$k]['enabled'])){ $dv2=$shared['articleFields']['elements'][$k]['enabled']; } else $dv2=0; $rows[$k] = array( 'data' => array( // Cell for the cross drag&drop element. array('class' => array('entry-cross')), // Weight item for the tabledrag. array('data' => array( '#type' => 'weight', '#title' => t('Weight'), '#title_display' => 'invisible', '#default_value' => $dv, '#attributes' => array( 'class' => array('entry-order-weight'), ), )), // Enabled checkbox. array('data' => array( '#type' => 'checkbox', '#title' => t('Enable'), '#title_display' => 'invisible', '#default_value' => t($dv2), )), // Name textfield. array('data' => array( '#type' => 'textfield', '#size' => 50, '#disabled' => TRUE, '#title' => t('Field'), '#title_display' => 'invisible', '#default_value' => t($v), )), ), 'class' => array('draggable'), ); // Build rows of the form elements in the table. $row_elements[$k] = array( 'weight' => &$rows[$k]['data'][1]['data'], 'enabled' => &$rows[$k]['data'][2]['data'], 'field' => &$rows[$k]['data'][3]['data'], ); } //sort both the rows and the row elements on the weight value uasort($rows, function($a, $b) { return $a['data'][1]['data']['#default_value'] <=> $b['data'][1]['data']['#default_value']; }); uasort($row_elements, function($a, $b) { return $a['weight']['#default_value'] <=> $b['weight']['#default_value']; }); $id=str_replace("shared_", "", $key); $id="form-item-shared-".$id."-articleFields"; // add this to parrent form $form[$key]['articleFields'] = array( '#prefix'=>'<div class='.$id.'>', '#theme' => 'table', // The row form elements need to be processed and build, // therefore pass them as element children. 'elements' => $row_elements, '#header' => array( // We need two empty columns for the weigth field and the cross. array('data' => NULL, 'colspan' => 2), t('Enabled'), t('Field'), ), '#rows' => $rows, '#empty' => t('There are no entries available.'), '#attributes' => array('id' => 'entry-order'), '#sufix'=>'</div>', ); drupal_add_tabledrag('entry-order', 'order', 'sibling', 'entry-order-weight'); [![enter image description here][1]][1] [1]: https://i.sstatic.net/rkWNp.png