$form_state['values'] AJAX
The reason it's not working is because the &lt;div&gt; with an ID of replace_model_div doesn't exist when the form is first built. So when the AJAX replace happens, there's no target container to append it to.

All you need to do is re-structure you form slightly (and remove the second #options array added to the second select):

$form['model_wrapper_container'] = array(
  '#type' =&gt; 'container',
  '#prefix' =&gt; '&lt;div id="replace_model_div"&gt;',
  '#suffix' =&gt; '&lt;/div&gt;',
);

if (isset($form_state['values']['platform'])) {
  $platform_value = $form_state['values']['platform'];
  $sqlmodel = "SELECT tid, name FROM {taxonomy_term_data} WHERE vid = $platform_value";
  $result = db_query($sqlmodel);
  $model_options = array();
  foreach ($result as $row) {
    $model_options[$row-&gt;vid] = t($row-&gt;name);
  }

  $form['model_wrapper_container']['model_wrapper'] = array(
    '#type' =&gt; 'select',
    '#title' =&gt; t('Select a Model'),
    '#options' =&gt; $model_options,
  );
}


And a small change to the callback:

function ajax_select_callback($form, $form_state) {
  return $form['model_wrapper_container'];
}