diff --git a/reference_option_limit.module b/reference_option_limit.module
index f165109..f0b2f58 100644
--- a/reference_option_limit.module
+++ b/reference_option_limit.module
@@ -246,6 +246,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;
@@ -574,18 +575,30 @@ function reference_option_limit_get_match_columns($field) {
  * Ajax callback for the updated term reference field.
  */
 function reference_option_limit_js($form, $form_state) {
-  // We stored the path of the form element we need to return earlier on.
-  $form_return_element = drupal_array_get_nested_value($form, $form_state['reference_option_limit_ajax_return']);
+  $field_name_triggering = $form_state['triggering_element']['#parents'][0];
 
+  $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')) {
-    $form_return_element['messages'] = array(
-      '#markup' => '<div class="views-messages">' . $messages . '</div>',
-    );
+    $selector = '#' . $form[$field_name_triggering]['messages']['#attributes']['id'];
+    $html = '<div class="views-messages">' . $messages . '</div>';
+    $return['#commands'][] = ajax_command_replace($selector, $html);
   }
-
-  return $form_return_element;
+  // next add the rendered fields
+   foreach ($form_state['reference_option_limit'] as $settings) {
+    _reference_option_limit_recursive_add_fields($return, $form, $settings, $form_state['reference_option_limit'], $field_name_triggering);
+   }
+  return $return;
 }
 
+
 /**
  * Get all instances of a field on an entity type which have an option limit.
  *
@@ -619,3 +632,28 @@ function reference_option_limit_views_api() {
     'path' => drupal_get_path('module', 'reference_option_limit'),
   );
 }
+
+/**
+ * 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);
+   }
+ 
+  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);
+  }
+ }
