diff --git a/js/lingotek.admin.js b/js/lingotek.admin.js
index eaf6297..8dbd2ef 100644
--- a/js/lingotek.admin.js
+++ b/js/lingotek.admin.js
@@ -9,11 +9,11 @@ Drupal.behaviors.lingotekAdminForm = {
   attach: function (context) {
 
     //when a content type checkbox is clicked
-    $('td:first-child .form-checkbox', context).click( function() {
-      isChecked = $(this).attr('checked');
+    $('.form-select', context).change( function() {
+      isEnabled = $(this).val() != 'DISABLED';
       $(this).parents('tr').find('.form-checkbox').each( function() {
-        if(isChecked) {
-          $(this).attr('checked', isChecked);
+        if(isEnabled) {
+          $(this).attr('checked', isEnabled);
         } else {
           $(this).removeAttr('checked');
         }
@@ -48,10 +48,10 @@ Drupal.behaviors.lingotekAdminForm = {
         return Drupal.t($('#account_summary').val() + ' / ' + $('#connection_summary').val());
       });
 
-      $('fieldset.lingotek-translate-content', context).drupalSetSummary(function (context) {
+      $('fieldset.lingotek-translate-nodes', context).drupalSetSummary(function (context) {
         $list = [];
         total = 0;
-        $('#edit-node-translation select').each(function( index ) {
+        $('fieldset.lingotek-translate-nodes select').each(function( index ) {
           var name = $(this).attr('name');
           if(name && name.substring(0, 7) == 'profile') {
             
@@ -68,14 +68,36 @@ Drupal.behaviors.lingotekAdminForm = {
         }
       });
 
+      if ($('fieldset.lingotek-translate-field-collections').length) {
+        $('fieldset.lingotek-translate-field-collections', context).drupalSetSummary(function (context) {
+          $list = [];
+          total = 0;
+          $('fieldset.lingotek-translate-field-collections select').each(function( index ) {
+            var name = $(this).attr('name');
+            if(name && name.substring(0, 7) == 'profile') {
+
+              if($(this).val() != 'DISABLED') {
+                $list.push($(this).val());
+              }
+              total++;
+            }
+          });
+          if($list.length == 0) {
+            return '<span style="color:red;">' + Drupal.t('Disabled') + '</span>';
+          } else {
+            return '<span style="color:green;">' + Drupal.t('Enabled') + '</span>: ' + $list.length + '/' + total + ' ' + Drupal.t('content types');
+          }
+        });
+      }
+
       $('fieldset.lingotek-translate-comments', context).drupalSetSummary(function (context) {
         $list = [];
         total = 0;
         $('#edit-lingotek-translate-comments-node-types input').each(function( index ) {
           if($(this).attr('checked') ==  'checked' || $(this).attr('checked') == '1') {
-            $list.push($(this).val());
-          }
-          total++;
+              $list.push($(this).val());
+            }
+            total++;
         });
         if($list.length == 0) {
           return '<span style="color:red;">' + Drupal.t('Disabled') + '</span>';
@@ -133,4 +155,4 @@ Drupal.behaviors.lingotekAdminForm = {
   }
 };
 
-})(jQuery);
+})(jQuery);
\ No newline at end of file
diff --git a/lib/Drupal/lingotek/LingotekLog.php b/lib/Drupal/lingotek/LingotekLog.php
index 5bbd34e..9c34a0a 100644
--- a/lib/Drupal/lingotek/LingotekLog.php
+++ b/lib/Drupal/lingotek/LingotekLog.php
@@ -80,8 +80,8 @@ class LingotekLog {
       }
     }
     watchdog
-        ('lingotek', format_string($msg, $data_array) . ' <div style="word-break: break-all; padding-top: 10px; color: #666;"><b>FUNCTION:</b> %function<br /><b>ARGS:</b> %args<br /><b>FILE:</b> %location<br /><b>MESSAGE:</b> %msg <br /><b>DATA:</b> %data <br /></div>', array(
-      '%msg' => ($tag ? $tag . ": " . $msg : $msg),
+        ('lingotek', format_string((empty($tag) ? $msg : '[' . $tag . '] ' . $msg), $data_array) . ' <div style="word-break: break-all; padding-top: 10px; color: #666;"><b>FUNCTION:</b> %function<br /><b>ARGS:</b> %args<br /><b>FILE:</b> %location<br /><b>MESSAGE:</b> %msg <br /><b>DATA:</b> %data <br /></div>', array(
+      '%msg' => $msg,
       '%data' => $data_output,
       '%location' => $location,
       '%function' => $function,
diff --git a/lingotek.admin.inc b/lingotek.admin.inc
index a58557e..436d77a 100644
--- a/lingotek.admin.inc
+++ b/lingotek.admin.inc
@@ -98,13 +98,16 @@ function lingotek_admin_account_status_form_submit($form, &$form_state) {
 /**
  * Content translation form
  */
-function lingotek_admin_node_translation_settings_form($form, &$form_state, $show_fieldset = FALSE) {
+function lingotek_admin_node_translation_settings_form($form, &$form_state, $entity_type,  $show_fieldset = FALSE) {
 
   //$setup_complete = variable_get('lingotek_setup_complete', 0);
   $setup_complete = (!lingotek_is_config_missing());
-  $raw_types = node_type_get_types();
+  $entity_type_info = entity_get_info($entity_type);
+  $bundles = $entity_type_info['bundles'];
+
   $types = array();
-  $translate = variable_get('lingotek_translate_fields', array());
+  $translate = variable_get('lingotek_enabled_fields', array());
+  $translate = isset($translate[$entity_type]) ? $translate[$entity_type] : array();
   $profiles = lingotek_get_profiles();
 
   $profile_options = array();
@@ -114,14 +117,27 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
   $profile_options[LingotekSync::PROFILE_CUSTOM] = 'Custom';
   $profile_options[LingotekSync::PROFILE_DISABLED] = 'Disabled';
 
+  if ($entity_type == 'field_collection_item') {
+    $profile_options = array(
+      'ENABLED' => 'Enabled',
+      LingotekSync::PROFILE_DISABLED => 'Disabled',
+    );
+    $entity_type_info['label'] = 'Field Collection';
+  }
+
   $entity_profiles = variable_get('lingotek_entity_profiles');
 
   // What types of fields DO we translate?
   $translatable_field_types = lingotek_get_translatable_field_types();
 
+  $form['entity_type'] = array(
+    '#type' => 'hidden',
+    '#value' => $entity_type,
+  );
+
   $form['node_translation'] = array(
     '#type' => $show_fieldset ? 'fieldset' : 'item',
-    '#title' => ($setup_complete ? t('Translate Content') : t('Which content types do you want translated?')),
+    '#title' => ($setup_complete ? t('Translate @types', array('@type' => $entity_type_info['label'])) : t('Which content types do you want translated?')),
     '#collapsible' => TRUE,
     '#collapsed' => TRUE,
     '#group' => 'administrative_settings',
@@ -134,15 +150,15 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
   if ($setup_complete) {
     $form['node_translation'][] = array(
       '#type' => 'item',
-      '#description' => t('Choose the content types to be translated:'),
+      '#description' => t('Choose what you want translated:'),
     );
   }
 
   $rows = array();
 
-  foreach ($raw_types as $value) {
+  foreach ($bundles as $bundle_name => $bundle) {
     $fr = array();
-    foreach (field_info_instances('node', $value->type) as $field) {
+    foreach (field_info_instances($entity_type, $bundle_name) as $field) {
       $field_label = $field['label'];
       $field_machine_name = $field['field_name'];
       $field_type = $field['widget']['type'];
@@ -151,33 +167,42 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
           '#type' => 'checkbox',
           '#title' => $field_label,
           '#attributes' => array(
-            'id' => array('edit-form-item-' . $value->type . '-seperator-' . $field_machine_name),
-            'name' => $value->type . '_SEPERATOR_' . $field_machine_name,
+            'id' => array('edit-form-item-' . $bundle_name . '-seperator-' . $field_machine_name),
+            'name' => $bundle_name . '_SEPERATOR_' . $field_machine_name,
             'class' => array('field'),
-          ),
-          '#id' => 'edit-form-item-' . $value->type . '-seperator-' . $field_machine_name,
+          ),  
+          '#id' => 'edit-form-item-' . $bundle_name . '-seperator-' . $field_machine_name,
           '#states' => array(
             'invisible' => array(
-              ':input[name="profile_' . $value->type . '"]' => array('value' => 'DISABLED'),
+              ':input[name="profile_' . $bundle_name . '"]' => array('value' => 'DISABLED'),
             ),
           ),
         );
 
-        $is_enabled = !empty($translate[$value->type]) && array_search($field_machine_name, $translate[$value->type]) !== FALSE;
+        $is_enabled = !empty($translate[$bundle_name]) && array_search($field_machine_name, $translate[$bundle_name]) !== FALSE;
         if (!$setup_complete || $is_enabled) {
           $fr[$field_machine_name]['#attributes']['checked'] = 'checked';
         }
       }
     }
-    if (!isset($fr['title_field'])) {
+    $missing_title = !isset($fr['title_field']) && $entity_type == 'node';
+    $missing_subject = !isset($fr['subject_field']) && $entity_type == 'comment';
+    if ($missing_title || $missing_subject) {
+      $message = $entity_type == 'node' ? 'Title (Note: field will be created.)' : 'Subject (Note: field will be created.)';
       $fr['title_field'] = array(
         '#type' => 'checkbox',
-        '#title' => 'Title (Note: field will be created.)',
+        '#title' => $message,
         '#attributes' => array(
-          'id' => array('edit-form-item-' . $value->type . '-seperator-' . $field_machine_name),
-          'name' => 'title_swap_' . $value->type,
+          'id' => array('edit-form-item-' . $bundle_name . '-seperator-title'),
+          'name' => 'title_swap_' . $bundle_name,
           'class' => array('field'),
         ),
+        '#id' => 'edit-form-item-' . $bundle_name . '-seperator-title',
+        '#states' => array(
+          'invisible' => array(
+            ':input[name="profile_' . $bundle_name . '"]' => array('value' => 'DISABLED'),
+          ),
+        ),
       );
       if (!$setup_complete) {
         $fr['title_field']['#attributes']['checked'] = 'checked';
@@ -187,18 +212,18 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
     $default_profile = $setup_complete ? LingotekSync::PROFILE_DISABLED : 0;
     
     $fr2 = array();
-    $fr2['profile_' . $value->name] = array(
+    $fr2['profile_' . $bundle_name] = array(
       '#type' => 'select',
       '#options' => $profile_options,
-      '#value' => isset($entity_profiles['node'][$value->type]) ? $entity_profiles['node'][$value->type] : $default_profile,
+      '#value' => isset($entity_profiles[$entity_type][$bundle_name]) ? $entity_profiles[$entity_type][$bundle_name] : $default_profile,
       '#attributes' => array(
-        'id' => array('edit-form-item-profile-' . $value->type),
-        'name' => 'profile_' . $value->type,
+        'id' => array('edit-form-item-profile-' . $bundle_name),
+        'name' => 'profile_' . $bundle_name,
         'class' => array('field'),
       ),
     );
-    $rows[$value->type] = array(
-      array('data' => $value->name, 'width' => '20%'),
+    $rows[$bundle_name] = array(
+      array('data' => $bundle['label'], 'width' => '20%'),
       array('data' => drupal_render($fr2)),
       array('data' => drupal_render($fr), 'width' => '65%'),
     );
@@ -206,6 +231,10 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
 
   $header = array(t('Content Type'), t('Translation Profile *'), t('Fields'));
 
+  if ($entity_type == 'field_collection_item') {
+    $header = array(t('Collection Name'), t('Status *'), t('Fields'));
+  }
+
   $variables = array(
     'header' => $header,
     'rows' => $rows,
@@ -218,16 +247,8 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
     '#suffix' => '* Note: changing the profile will update existing nodes for all settings except the project, workflow, vault, and method (e.g. node/field)',
   );
 
-  foreach (array_keys($translate) as $content_type) {
-    $form['node_translation']['types']['#default_value'][$content_type] = 1;
-  }
-
-  if (!$setup_complete) {
-    $defaults = array();
-    foreach ($raw_types as $content_type) {
-      $defaults[$content_type->type] = 1;
-    }
-    $form['node_translation']['types']['#default_value'] = $defaults;
+  if ($entity_type == 'field_collection_item') {
+    $form['node_translation']['types']['#suffix'] = '* Note: Field collections will be uploaded and downloaded at the same time as their parent.';
   }
 
   $form['node_translation']['actions']['submit'] = array(
@@ -243,13 +264,17 @@ function lingotek_admin_node_translation_settings_form($form, &$form_state, $sho
  */
 function lingotek_admin_node_translation_settings_form_submit($form, &$form_state) {
 
-  //this is needed for the setup because of the field/node method selector.
-  system_settings_form_submit($form, $form_state);
+  $entity_type = $form_state['input']['entity_type'];
+
+  if (isset($form_state['values']['lingotek_nodes_translation_method'])) {
+    variable_set('lingotek_nodes_translation_method', $form_state['values']['lingotek_nodes_translation_method']);
+  }
 
-  $translate = array();
+  $translate = variable_get('lingotek_enabled_fields', array());
+  unset($translate[$entity_type]);
   $operations = array();
 
-  $entity_profiles = array();
+  $entity_profiles = variable_get('lingotek_entity_profiles', array());
 
   foreach ($form_state['input'] as $key => $value) {
 
@@ -263,7 +288,7 @@ function lingotek_admin_node_translation_settings_form_submit($form, &$form_stat
 
         //check to make sure that the content type is enabled
         if ($form_state['input']['profile_' . $content_type] != LingotekSync::PROFILE_DISABLED) {
-          $translate[$content_type][] = $content_field;
+          $translate[$entity_type][$content_type][] = $content_field;
 
           // Set this content type to be Lingotek translated.
           variable_set('language_content_type_' . $content_type, '1');
@@ -284,16 +309,15 @@ function lingotek_admin_node_translation_settings_form_submit($form, &$form_stat
         //check to make sure that the content type is enabled
         if ($form_state['input']['profile_' . $content_type] != LingotekSync::PROFILE_DISABLED) {
           // Do the actual title replacement
-          $entity_type = 'node';
           $bundle = $content_type;
-          $legacy_field = 'title';
+          $legacy_field = $entity_type == 'node' ? 'title' : 'subject';
 
           // Use the Title module to migrate the content.
           if (title_field_replacement_toggle($entity_type, $bundle, $legacy_field)) {
             //title_field_replacement_batch_set($title_entity, $title_bundle, $title_field);
             $operations[] = array('title_field_replacement_batch', array($entity_type, $bundle, $legacy_field));
-            $translate[$content_type][] = 'title_field';
-            $field = field_info_field('title_field');
+            $translate[$entity_type][$content_type][] = $legacy_field . '_field';
+            $field = field_info_field($legacy_field . '_field');
             $field['translatable'] = 1;
             $operations[] = array('field_update_field', array($field)); //field_update_field($field);
           }
@@ -303,11 +327,11 @@ function lingotek_admin_node_translation_settings_form_submit($form, &$form_stat
     // Look for any profiles
     if (FALSE !== strpos($key, 'profile_')) {
       $content_type = substr($key, strlen('profile_'));
-      $entity_profiles['node'][$content_type] = $value;
+      $entity_profiles[$entity_type][$content_type] = $value;
     }
   }
   $_SESSION['lingotek_setup_path'][] = 'admin/config/lingotek/node-translation-settings';
-  variable_set('lingotek_translate_fields', $translate);
+  variable_set('lingotek_enabled_fields', $translate);
   variable_set('lingotek_entity_profiles', $entity_profiles);
   drupal_set_message(t('Your content types have been updated.'));
 
@@ -621,6 +645,9 @@ function lingotek_admin_additional_translation_settings_form_submit($form, &$for
   if (variable_get('lingotek_translate_config_builtins')) {
     lingotek_admin_prepare_builtins($additional_operations);
   }
+  else {
+    lingotek_admin_setup_nonbuiltins_batch($additional_operations);
+  }
 
   // if this function is being called as part of the setup process, continue to
   // the dashboard to make sure they get a language configured.  Otherwise,
@@ -640,6 +667,18 @@ function lingotek_admin_additional_translation_settings_form_submit($form, &$for
   }
 }
 
+function lingotek_admin_setup_nonbuiltins_batch($operations) {
+  $batch = array(
+    'operations' => $operations,
+    'title' => 'Identifying translatable content',
+    'init_message' => t('Completing setup process'),
+    'progress_message' => t('Processed @current out of @total.'),
+    'error_message' => t('An error has occurred during setup.  Please review the log for more information.'),
+    'file' => drupal_get_path('module', 'lingotek') . '/lingotek.admin.inc',
+  );
+  batch_set($batch);
+}
+
 function lingotek_admin_load_l10n_update_batch($modules) {
 
     // attempt to pull translations using l10n_update module
@@ -791,6 +830,10 @@ function lingotek_admin_module_indexing_finished($success, $results) {
     // Summarize results of added, updated, deleted and skiped translations.
     // Added, updated and deleted are summarized per language to be displayed accordingly.
     foreach ($results as $result) {
+      // convert to array as needed
+      if (is_a($result, 'stdClass')) {
+        $result = get_object_vars($result);
+      }
       if (isset($result['fail'])) {
         // Collect project names of the failed imports.
         $project_fail[$result['file']->name] = $result['file']->name;
@@ -1092,7 +1135,14 @@ function lingotek_admin_prefs_form($form, &$form_state, $show_fieldset = FALSE)
     '#type' => 'checkbox',
     '#title' => t('Show links to edit translations in views'),
     '#default_value' => variable_get('lingotek_views_edit_links'),
-    '#description' => 'The user must have the "Translation" or "Manage Projects" permission'
+    '#description' => t('The user must have the "Translation" or "Manage Projects" permission'),
+  );
+
+  $form[$fkey]['lingotek_account_plan_type'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable Enterprise Features'),
+    '#default_value' => (variable_get('lingotek_account_plan_type') == 'enterprise' ? 1 : 0),
+    '#description' => t('Some features may not be available without an ') . '&nbsp;<a href="http://www.lingotek.com/drupal_pricing" target="_blank">enterprise license</a>&nbsp;' . t(' of the Lingotek TMS. Call 801.331.7777 for details.'),
   );
 
   return $form;
@@ -1100,6 +1150,7 @@ function lingotek_admin_prefs_form($form, &$form_state, $show_fieldset = FALSE)
 
 function lingotek_admin_prefs_form_submit($form, &$form_state) {
   lingotek_admin_language_switcher_form_submit($form, $form_state);
+  $form_state['values']['lingotek_account_plan_type'] = ($form['prefs']['lingotek_account_plan_type']['#checked'] ? 'enterprise' : 'standard');
   system_settings_form_submit($form, $form_state);
   menu_rebuild();
 }
@@ -1229,6 +1280,7 @@ function lingotek_admin_profiles_form($form, &$form_state, $show_fieldset = FALS
     'Actions',
   );
 
+  $total_count_with_profiles = 0;
   $rows = array();
 
   foreach ($profiles as $key => $profile) {
@@ -1236,6 +1288,7 @@ function lingotek_admin_profiles_form($form, &$form_state, $show_fieldset = FALS
 
     $count = lingotek_admin_profile_usage($key);
     $count_types = lingotek_admin_profile_usage_by_types($key);
+    $total_count_with_profiles += $count;
 
     $rows[] = array($profile['name'], $count . ' ' . format_plural($count, 'node', 'nodes') . ' &sdot;  ' . $count_types . ' ' . format_plural($count_types, 'content type', 'content types') . '', $edit_link);
   }
@@ -1244,7 +1297,8 @@ function lingotek_admin_profiles_form($form, &$form_state, $show_fieldset = FALS
   $custom_count_types = lingotek_admin_profile_usage_by_types(LingotekSync::PROFILE_CUSTOM);
   $rows[] = array(t('Custom'), $custom_count . ' ' . format_plural($custom_count, 'node', 'nodes') . ' &sdot; ' . $custom_count_types . ' ' . format_plural($count_types, 'content type', 'content types'), '');
 
-  $disabled_count = lingotek_admin_profile_usage(LingotekSync::PROFILE_DISABLED);
+  $total_node_count = current(db_query("SELECT COUNT(DISTINCT(n.nid)) FROM {node} n WHERE n.status=1")->fetchCol());
+  $disabled_count = ($total_node_count - ($total_count_with_profiles + $custom_count)); // lingotek_admin_profile_usage(LingotekSync::PROFILE_DISABLED);
   $disabled_count_types = lingotek_admin_profile_usage_by_types(LingotekSync::PROFILE_DISABLED);
   $rows[] = array(t('Disabled'), $disabled_count . ' ' . format_plural($disabled_count, 'node', 'nodes') . ' &sdot; ' . $disabled_count_types . ' ' . format_plural($disabled_count_types, 'content type', 'content types'), '');
 
@@ -1539,14 +1593,18 @@ function lingotek_admin_profile_form($form, &$form_state, $show_fieldset = FALSE
     '#value' => 'Save',
   );
   $profile_id = $form_state['values']['profile_id'];
-  if(lingotek_admin_profile_usage($profile_id) == 0 && lingotek_admin_profile_usage_by_types($profile_id) == 0) {
+  $first_custom_id = 2;
+  $is_custom_profile_id = $profile_id >= $first_custom_id;
+  if (lingotek_admin_profile_usage($profile_id) == 0 && lingotek_admin_profile_usage_by_types($profile_id) == 0 && $is_custom_profile_id) {
     $form['defaults']['delete'] = array(
       '#type' => 'submit',
       '#value' => 'Delete',
     );
-  } else {
+  }
+  else {
+    $markup = $is_custom_profile_id ? t('You can only delete this profile when there are no nodes or content types using it.') : t('This profile cannot be deleted.');
     $form['delete'] = array(
-      '#markup' => 'You can only delete this profile when there are no nodes or content types using it.',
+      '#markup' => '<span class="ltk-muted" style="font-style: italic;">' . $markup . '</span>',
     );
   }
   $form['defaults']['cancel'] = array(
@@ -1798,14 +1856,23 @@ function lingotek_admin_configuration_view($form_short_id = NULL, $show_fieldset
   $connected = $api->testAuthentication();
 
   if ($connected) {
-    $arr = array(
+    /*$arr = array(
       drupal_get_form('lingotek_admin_node_translation_settings_form', $show_fieldset),
     );
     if ($is_enterprise) {
       $arr[] = drupal_get_form('lingotek_admin_advanced_parsing_form', TRUE);
+    }*/
+
+    foreach (lingotek_managed_entity_types() as $machine_name => $entity_type) {
+      $entity_types[] = $machine_name;
+      $entity_settings = drupal_get_form('lingotek_admin_node_translation_settings_form', $machine_name, $show_fieldset);
+      $output['lingotek'][] = lingotek_wrap_in_fieldset($entity_settings, t('Translate @types', array('@type' => $entity_type['label'])));
     }
 
-    $output['lingotek'][] = lingotek_wrap_in_fieldset($arr, 'Translate Content');
+    $arr['lingotek'][] = lingotek_wrap_in_fieldset(drupal_get_form('lingotek_admin_advanced_parsing_form', TRUE), 'Advanced Content Parsing');
+
+    //$output['lingotek'][] = lingotek_wrap_in_fieldset($arr, 'Translate Content');
+    
     $output['lingotek'][] = lingotek_wrap_in_fieldset(drupal_get_form('lingotek_admin_comment_translation_settings_form', $show_fieldset), 'Translate Comments');
     $output['lingotek'][] = lingotek_wrap_in_fieldset(drupal_get_form('lingotek_admin_additional_translation_settings_form', $show_fieldset), 'Translate Configuration');
     $output['lingotek'][] = lingotek_wrap_in_fieldset(drupal_get_form('lingotek_admin_profiles_form', $show_fieldset), 'Translation Profiles');
diff --git a/lingotek.api.inc b/lingotek.api.inc
index 8627e25..31e1c4e 100644
--- a/lingotek.api.inc
+++ b/lingotek.api.inc
@@ -46,8 +46,8 @@ function lingotek_get_translated_node($node, $drupal_language_code) {
     $localized_node->status = $node->status;
     $localized_node->create_lingotek_document = FALSE;
     
-    $lingotek_fields = variable_get('lingotek_translate_fields');
-    foreach ($lingotek_fields[$localized_node->type] as $field_name) {
+    $lingotek_fields = variable_get('lingotek_enabled_fields');
+    foreach ($lingotek_fields['node'][$localized_node->type] as $field_name) {
       $field = $node->$field_name;
       $f = array();
       if(isset($field[$node->language])) {
@@ -101,7 +101,7 @@ function lingotek_download_document(&$source_node, $lingotek_locale, $sync_succe
 
   //Get the finished document
   $text = $_lingotek_client->download("downloadDocument", $params);
-
+  
   try {
     $xml = new SimpleXMLElement($text);
   } catch (Exception $e) {
@@ -208,26 +208,22 @@ function lingotek_process_entity_xml($xml, $node, $entity_type, $drupal_language
         $field_names = array('field_revision_' . $field['field_name'], 'field_data_' . $field['field_name']);
 
         if (module_exists('field_collection') && $field['type'] == 'field_collection') {
-          $entity = (object) array(
-            'type' => $drupal_field_name,
-            'nid' => $node_field[$node->language][$delta]['value'],
-            'vid' => $node_field[$node->language][$delta]['revision_id'],
-          );
-          lingotek_process_entity_xml($content, $entity, 'field_collection_item', $drupal_language_code);
+          $default = language_default();
+          $default_language = $default->language;
+          $field_collection_id = isset($node_field['und'][$delta]['value']) ? $node_field['und'][$delta]['value'] : $node_field[$default_language][$delta]['value'];
+          $field_collection_item = lingotek_entity_load_single('field_collection_item', $field_collection_id);
+          $field_collection_item->type = $field['field_name'];
+          $field_collection_item->language = $node->language;
+          $field_collection_item->nid = $field_collection_item->item_id;
+          $field_collection_item->vid = $field_collection_item->revision_id;
+
+          lingotek_process_entity_xml($content, $field_collection_item, 'field_collection_item', $drupal_language_code);
           $db_field_name = $field['field_name'] . '_value';
           $db_revision_field_name = $field['field_name'] . '_revision_id';
           $insert_array['language'] = $drupal_language_code;
-          $insert_array[$db_field_name] = $node_field[$node->language][$delta]['value'];
-          $insert_array[$db_revision_field_name] = $node_field[$node->language][$delta]['revision_id'];
-          foreach ($field_names as $table) {
-            db_update($table)
-              ->fields(array(
-                'language' => $node->language,
-              ))
-              ->condition('entity_id', $node->nid)
-              ->condition('language', 'und')
-              ->execute();
-          }
+          $lang = isset($node_field[$node->language][$delta]['value']) ? $node->language : 'und';
+          $insert_array[$db_field_name] = $node_field[$lang][$delta]['value'];
+          $insert_array[$db_revision_field_name] = $node_field[$lang][$delta]['revision_id'];
         }
         else {
           foreach ($content as $text) {
@@ -239,7 +235,7 @@ function lingotek_process_entity_xml($xml, $node, $entity_type, $drupal_language
             $db_field_name = $field['field_name'] . '_' . $array_key;
             $insert_array[$db_field_name] = decode_entities($text);
             //$node_field[$drupal_language_code][$delta][$array_key] = decode_entities($text);
-            if (array_key_exists($node->language, $node_field)) {
+            if (isset($node->language) && array_key_exists($node->language, $node_field)) {
               if (array_key_exists('format', $node_field[$node->language][0])) {
                 //$node_field[$drupal_language_code][$index]['format'] = $node_field[$node->language][0]['format'];
                 $format_db_field_name = $field['field_name'] . '_format';
@@ -248,13 +244,15 @@ function lingotek_process_entity_xml($xml, $node, $entity_type, $drupal_language
             }
             $index++;
           }
+          
+          // put fields into both field_data_ and field_revision_ tables
+          // if published version (in node table) is as current as most current revision (in node_revision table)
+          if (isset($node->workbench_moderation) && isset($node->workbench_moderation['published']) && $node->workbench_moderation['published']->vid != $node->workbench_moderation['current']->vid) {
+            $only_write_revisions = 1;
+            unset($field_names[$only_write_revisions]);
+          }
         }
-        // put fields into both field_data_ and field_revision_ tables
-        // if published version (in node table) is as current as most current revision (in node_revision table)
-        if (isset($node->workbench_moderation) && isset($node->workbench_moderation['published']) && $node->workbench_moderation['published']->vid != $node->workbench_moderation['current']->vid) {
-          $only_write_revisions = 1;
-          unset($field_names[$only_write_revisions]);
-        }
+
         foreach ($field_names as $field_name) {
           // using drupal_write_record to avoid node_save - node_save overwrites publications unless called on both revised and published versions of the node (i.e. workbench_moderation)
           try {
@@ -271,6 +269,19 @@ function lingotek_process_entity_xml($xml, $node, $entity_type, $drupal_language
             drupal_write_record($field_name, $insert_array, $primary_keys);
           }
         }
+
+        if ($entity_type == 'field_collection_item') {
+          $field_names = array('field_revision_' . $field['field_name'], 'field_data_' . $field['field_name']);
+          foreach ($field_names as $table) {
+            db_update($table)
+                ->fields(array(
+                  'language' => $node->language,
+                ))
+                ->condition('entity_id', $node->nid)
+                ->condition('language', 'und')
+                ->execute();
+          }
+        }
       }
 
       cache_clear_all('field:' . $entity_type . ':' . $node->nid, 'cache_field');
diff --git a/lingotek.install b/lingotek.install
index 28ccde3..6a7a940 100644
--- a/lingotek.install
+++ b/lingotek.install
@@ -568,4 +568,16 @@ function lingotek_update_7404(&$sandbox) {
 
     variable_set('lingotek_entity_profiles', $entity_profiles);
   }
+}
+
+/**
+ * Makes lingotek handle entities better.
+ */
+function lingotek_update_7406(&$sandbox) {
+  $translate_fields = variable_get('lingotek_translate_fields');
+
+  $enabled_fields = array('node' => $translate_fields);
+
+  variable_set('lingotek_enabled_fields', $enabled_fields);
+  variable_del('lingotek_translate_fields');
 }
\ No newline at end of file
diff --git a/lingotek.module b/lingotek.module
index efe1ce2..1f5fe85 100644
--- a/lingotek.module
+++ b/lingotek.module
@@ -1111,6 +1111,21 @@ function lingotek_node_delete($node) {
   LingotekSync::removeNodeInfoByNodeId($node->nid);
 }
 
+/*
+ * The function entity_load_single is not in core but rather in the entity module
+ * which we currently do not have as a dependency.
+ */
+function lingotek_entity_load_single($entity_type, $entity_id) {
+  if ($entity_type == 'node') {
+    $entity = lingotek_node_load_default($entity_id);
+  } else {
+    $entities = entity_load($entity_type, array($entity_id));
+    $entity = $entities[$entity_id];
+  }
+
+  return $entity;
+}
+
 /**
  * Implements hook_node_load().
  */
@@ -1227,9 +1242,13 @@ function lingotek_upload_document($node) {
   }
 
   if (isset($node->lingotek['document_id'])) {
-    $old_node = node_load($node->nid);
-    $diff = lingotek_node_compare($node, $old_node);
-    if(empty($diff) && $node->lingotek['node_sync_status'] == 'CURRENT') {
+    $xml = lingotek_xml_node_body($node);
+    $hash = md5($xml);
+    $oldhash = lingotek_lingonode($node->nid, 'hash');
+    lingotek_lingonode($node->nid, 'hash', $hash);
+    $diff = strcmp($hash, $oldhash);
+
+    if($diff == 0 && $node->lingotek['node_sync_status'] == 'CURRENT') {
       return; //node has no changes.
     }
   }
@@ -1441,7 +1460,7 @@ function lingotek_is_config_missing() {
     'lingotek_project',
     'lingotek_workflow',
     'lingotek_vault',
-    'lingotek_translate_fields',
+    'lingotek_enabled_fields',
     'lingotek_translate_comments_node_types',
     'lingotek_oauth_consumer_id',
     'lingotek_oauth_consumer_secret',
@@ -1458,7 +1477,7 @@ function lingotek_is_config_missing() {
       elseif ($required_variable == 'lingotek_project' || $required_variable == 'lingotek_workflow' || $required_variable == 'lingotek_vault') {
         return 'admin/config/lingotek/community-settings-select';
       }
-      elseif ($required_variable == 'lingotek_translate_fields') {
+      elseif ($required_variable == 'lingotek_enabled_fields') {
         return 'admin/config/lingotek/node-translation-settings';
       }
       elseif ($required_variable == 'lingotek_translate_comments_node_types') {
@@ -1858,8 +1877,8 @@ function lingotek_form_alter(&$form, &$form_state, $form_id) {
 
     if (isset($form['#entity']->tnid) && $form['#entity']->tnid != 0 && $form['#entity']->nid != $form['#entity']->tnid) {
       $content_type = $form['type']['#value'];
-      $lingotek_fields = variable_get('lingotek_translate_fields');
-      foreach ($lingotek_fields[$content_type] as $field) {
+      $lingotek_fields = variable_get('lingotek_enabled_fields');
+      foreach ($lingotek_fields['node'][$content_type] as $field) {
         $form[$field]['#disabled'] = TRUE;
       }
 
diff --git a/lingotek.setup.inc b/lingotek.setup.inc
index f578e8d..8de90be 100644
--- a/lingotek.setup.inc
+++ b/lingotek.setup.inc
@@ -739,7 +739,7 @@ function lingotek_setup_node_translation_settings_form($form, $form_state) {
 
   $fs['values'] = lingotek_get_global_profile();
   $fs['values']['profile_id'] = LingotekSync::PROFILE_CUSTOM;
-  $form = lingotek_admin_node_translation_settings_form($form, $form_state);
+  $form = lingotek_admin_node_translation_settings_form($form, $form_state, 'node');
   $content_defaults = lingotek_admin_profile_form($form, $fs);
   $form['lingotek_nodes_translation_method'] = $content_defaults['defaults']['lingotek_nodes_translation_method'];
   $form['lingotek_nodes_translation_method']['#weight'] = -3;
diff --git a/lingotek.sync.inc b/lingotek.sync.inc
index 41392bb..7f9b80d 100644
--- a/lingotek.sync.inc
+++ b/lingotek.sync.inc
@@ -95,7 +95,7 @@ function lingotek_notifications() {
       }
     }
 
-    LingotekLog::info('[notify] <br/><b>code:</b> @lingotek_locale <br/><b>doc_id:</b> @document_id<br/><b>project:</b> @project_id <br/><b>node:</b> @node_id (@target_drupal_language_code) <br/><b>completed</b>: @completed', array(
+    LingotekLog::info('<b>code:</b> @lingotek_locale <br/><b>doc_id:</b> @document_id<br/><b>project:</b> @project_id <br/><b>node:</b> @node_id (@target_drupal_language_code) <br/><b>completed</b>: @completed', array(
         '@document_id' => $document_id,
         '@lingotek_locale' => $lingotek_locale,
         '@project_id' => $project_id,
diff --git a/lingotek.util.inc b/lingotek.util.inc
index e3775df..aa776e3 100644
--- a/lingotek.util.inc
+++ b/lingotek.util.inc
@@ -223,14 +223,6 @@ function watchdog_format_object($object) {
   return '<pre>' . htmlspecialchars(var_export($object, TRUE)) . '</pre>';
 }
 
-function lingotek_oneoff_translate($node) {
-  // TODO: Run checks on this if necessary
-  // (It appears this is currently unnecessary, as all nodes
-  // that make it to this point are already requested for
-  // translation.)
-  return TRUE;
-}
-
 function lingotek_get_translatable_field_types() {
   // What types of fields DO we translate?
   $included_fields = array('text', 'text_long', 'text_textfield', 'text_textarea', 'text_textarea_with_summary', 'field_collection_embed');
@@ -252,6 +244,17 @@ function lingotek_get_translatable_fields_by_content_type($type) {
   return $desired_fields;
 }
 
+function lingotek_get_enabled_fields($entity_type, $bundle) {
+  $translate = variable_get('lingotek_enabled_fields', array());
+  $fields_desired = isset($translate[$entity_type][$bundle]) ? $translate[$entity_type][$bundle] : array();
+  if (empty($fields_desired)) {
+    //this won't work for anything more than nodes yet
+    $fields_desired = lingotek_get_translatable_fields_by_content_type($bundle);
+  }
+
+  return $fields_desired;
+}
+
 /**
  * Return the xml representation of the source content for a node.
  *
@@ -264,11 +267,7 @@ function lingotek_get_translatable_fields_by_content_type($type) {
 function lingotek_xml_node_body($node) {
   $translatable = array();
 
-  $translate = variable_get('lingotek_translate_fields', array());
-  $fields_desired = isset($translate[$node->type]) ? $translate[$node->type] : array();
-  if (empty($fields_desired) && lingotek_oneoff_translate($node)) {
-    $fields_desired = lingotek_get_translatable_fields_by_content_type($node->type);
-  }
+  $fields_desired = lingotek_get_enabled_fields('node', $node->type);
 
   foreach ($fields_desired as $value) {
     $field = field_info_field($value);
@@ -344,12 +343,13 @@ function lingotek_xml_fields($node, $translatable, $language) {
           $element_name = $field;
           if ($target_key == 'value' && isset($delta['revision_id']) && module_exists('field_collection')) {
             $current_field = '<' . $element_name . '>';
-            $entity = entity_load_single('field_collection_item', $delta['value']);
+            $enabled_fields = variable_get('lingotek_enabled_fields');
+            $entity = lingotek_entity_load_single('field_collection_item', $delta['value']);
             $sub_fields = field_info_instances('field_collection_item', $field);
             $translatable_field_types = lingotek_get_translatable_field_types();
             $translatable_sub_fields = array();
             foreach ($sub_fields as $sub_field => $f) {
-              if (in_array($f['widget']['type'], $translatable_field_types)) {
+              if (in_array($f['widget']['type'], $translatable_field_types) && isset($enabled_fields['field_collection_item'][$field]) && in_array($sub_field, $enabled_fields['field_collection_item'][$field])) {
                 $translatable_sub_fields[] = $sub_field;
               }
             }
@@ -570,6 +570,22 @@ function lingotek_get_source_language() {
 
 // END:  lingotek_get_source_language()
 
+
+function lingotek_managed_entity_types() {
+  $types = entity_get_info();
+//  $exclude = array('i18n_translation', 'file', 'user', 'taxonomy_vocabulary', 'taxonomy_term');
+//  $exclude = array_flip($exclude);
+//  return array_diff_key($types, $exclude);
+  $enabled = array('node', 'field_collection_item');
+  $enabled = array_flip($enabled);
+
+  if (module_exists('field_collection') && $types['field_collection_item']) {
+    $types['field_collection_item']['label'] = 'Field Collection';
+  }
+
+  return array_intersect_key($types, $enabled);
+}
+
 /**
  * Content node types linked to 'translatable' fields.
  */
@@ -918,7 +934,8 @@ function lingotek_get_target_languages($codes_only = TRUE) {
  */
 
 function lingotek_get_content_types() {
-  return array_keys(variable_get('lingotek_translate_fields'));
+  $fields = variable_get('lingotek_enabled_fields');
+  return array_keys($fields['node']);
 }
 
 /*
@@ -1158,10 +1175,10 @@ function lingotek_migration_3() {
 function lingotek_profile_condition($node_table, $table_auto_upload, $table_profile, $profile_id) {
   $or = db_or();
   
-  $fields = variable_get('lingotek_translate_fields');
+  $fields = variable_get('lingotek_enabled_fields');
   $types = array();
   foreach(lingotek_load_profile_defaults('node') as $content_type => $profile) {
-    if($profile['profile'] == (string)$profile_id && isset($fields[$content_type])) {
+    if($profile['profile'] == (string)$profile_id && isset($fields['node'][$content_type])) {
       $types[] = $content_type;
     }
   }
@@ -1208,23 +1225,4 @@ function lingotekArrayRecursiveDiff($aArray1, $aArray2) {
     }
   }
   return $aReturn;
-} 
-
-function lingotek_node_compare($node1, $node2) {
-  if ($node1->type != $node2->type)
-    return array('different_types');
-  
-  $fields = variable_get('lingotek_translate_fields');
-  $fields = $fields[$node1->type];
-  
-  foreach ($fields as $field) {
-    $diff1 = lingotekArrayRecursiveDiff($node1->{$field}, $node2->{$field});
-    $diff2 = lingotekArrayRecursiveDiff($node2->{$field}, $node1->{$field});
-    if(!empty($diff1))
-      return $diff1;
-    if(!empty($diff2))
-      return $diff2;
-  }
-  
-  return array();
-}
\ No newline at end of file
+}
