diff --git a/reference_option_limit.module b/reference_option_limit.module
index 271cadc..92506a1 100644
--- a/reference_option_limit.module
+++ b/reference_option_limit.module
@@ -243,6 +243,7 @@ function reference_option_limit_field_widget_form_alter(&$element, &$form_state,
     'entity_type'   => $context['instance']['entity_type'],
     'entity_bundle' => $context['instance']['bundle'],
     'empty_behaviour' => !empty($context['instance']['options_limit_empty_behaviour']),
+    'ajax_wrapper' => 'reference-options-limit-' . str_replace('_', '-', $field_name),
   );
   // Allow for settings for more than one field.
   $form_state['reference_option_limit'][$field_name] = $settings;
@@ -302,7 +303,6 @@ function reference_option_limit_form_alter(&$form, &$form_state, $form_id) {
     $field_instance_option_limited = field_info_instance($settings['entity_type'], $field_name_option_limited, $settings['entity_bundle']);
 
     // Add a wrapper div to the limited field for the ajax to work on.
-    $settings['ajax_wrapper'] = 'reference-options-limit-' . str_replace('_', '-', $field_name_option_limited);
     $form[$field_name_option_limited]['#prefix'] = '<div id="' . $settings['ajax_wrapper'] . '">';
     $form[$field_name_option_limited]['#suffix'] = '</div>';
     //dsm($settings, 'settings');
@@ -321,6 +321,17 @@ function reference_option_limit_form_alter(&$form, &$form_state, $form_id) {
         'effect' => 'fade',
         'event' => 'change',
       );
+      // Add a div for ajax to put any messages.
+      // html_tag defined in system_element_info() wraps theme_html_tag()
+      $form[$field_name_matching]['messages'] = array(
+        '#tag' => 'div',
+        '#value' => '',
+        '#attributes' => array(
+          'id' => 'reference-option-limit-messages-' . str_replace('_', '-', $field_name_matching),
+        ),
+        '#type' => 'html_tag',
+        '#weight' => -100,
+      );
 
       $field_info_matching = field_info_field($field_name_matching);
       //dsm($field_info_matching, '$field_info_matching');
@@ -510,21 +521,50 @@ function reference_option_limit_js($form, $form_state) {
   $field_name_triggering = $form_state['triggering_element']['#parents'][0];
 
   // Find which option limited field we should be returning the element for.
-  // @todo: I have no idea how to make this work if the triggering field affects
-  // more than one option limited field!
+  $return = array(
+    '#type' => 'ajax',
+    '#commands' => array(),
+  );
+
+  // building ajax commands.
+  // see https://api.drupal.org/api/drupal/includes!ajax.inc/group/ajax_commands/7
+  //
+  // first add the messages to the triggering element
+  if ($messages = theme('status_messages')) {
+    $selector = '#' . $form[$field_name_triggering]['messages']['#attributes']['id'];
+    $html = '<div class="views-messages">' . $messages . '</div>';
+    $return['#commands'][] = ajax_command_replace($selector, $html);
+  }
+  // next add the rendered fields
   foreach ($form_state['reference_option_limit'] as $settings) {
-    if (isset($settings['fields_match'][$field_name_triggering])) {
-      $field_name_dependent = $settings['field'];
-    }
+    _reference_option_limit_recursive_add_fields($return, $form, $settings, $form_state['reference_option_limit'], $field_name_triggering);
   }
+  return $return;
+}
 
-  if ($messages = theme('status_messages')) {
-    $form[$field_name_dependent]['messages'] = array(
-      '#markup' => '<div class="views-messages">' . $messages . '</div>',
-    );
+/**
+ * Recursively adds the rendered fields.
+ *
+ * This function will add referenced fields, and recursively check if the
+ * referenced field has other referenced field, and it will add it.
+ */
+function _reference_option_limit_recursive_add_fields(&$return, $form, $settings, $all_fields, $field_name_triggering) {
+  if (!empty($settings['fields_match'][$field_name_triggering])) {
+    $field_triggered = $settings['field'];
+    foreach ($all_fields as $k => $v) {
+      if (!empty($v['fields_match'][$field_triggered])) {
+        $field_triggered_key = $k;
+      }
+    }
+    $selector = '#' . $settings['ajax_wrapper'];
+    $html = render($form[$settings['field']]);
+    $return['#commands'][] = ajax_command_replace($selector, $html);
   }
 
-  return $form[$field_name_dependent];
+  if (isset($field_triggered) && isset($field_triggered_key)) {
+    // Recursive call.
+    _reference_option_limit_recursive_add_fields($return, $form, $all_fields[$field_triggered_key], $all_fields, $field_triggered);
+  }
 }
 
 /**
