diff --git a/sources/node/ui/tmgmt_node_ui.module b/sources/node/ui/tmgmt_node_ui.module
index cd93a65..e118b66 100644
--- a/sources/node/ui/tmgmt_node_ui.module
+++ b/sources/node/ui/tmgmt_node_ui.module
@@ -53,21 +53,6 @@ function tmgmt_node_ui_page_alter(&$page) {
 }
 
 /**
- * Implements hook_node_operations().
- */
-function tmgmt_node_ui_node_operations() {
-  if (module_exists('tmgmt_node')) {
-    $operations = array(
-      'tmgmt_translate' => array(
-        'label' => t('Translate selected content'),
-        'callback' => 'tmgmt_node_ui_translate_node_multiple',
-      ),
-    );
-    return $operations;
-  }
-}
-
-/**
  * Node operations callback for translation multiple nodes.
  */
 function tmgmt_node_ui_translate_node_multiple($nodes) {
diff --git a/sources/node/ui/tmgmt_node_ui.rules_defaults.inc b/sources/node/ui/tmgmt_node_ui.rules_defaults.inc
new file mode 100644
index 0000000..578355a
--- /dev/null
+++ b/sources/node/ui/tmgmt_node_ui.rules_defaults.inc
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * @file
+ * Contains default rules.
+ */
+
+/**
+ * Implements hook_default_rules_configuration().
+ */
+function tmgmt_node_ui_default_rules_configuration() {
+  $data = '{ "tmgmt_node_ui_request_translation" : {
+      "LABEL" : "Request translation",
+      "PLUGIN" : "rule",
+      "REQUIRES" : [ "tmgmt" ],
+      "USES VARIABLES" : { "nodes" : { "label" : "Nodes", "type" : "list\u003Cnode\u003E" } },
+      "DO" : [
+        { "tmgmt_get_first_from_node_list" : {
+            "USING" : { "list" : [ "nodes" ] },
+            "PROVIDE" : { "first_node" : { "first_node" : "Node" } }
+          }
+        },
+        { "tmgmt_rules_create_job" : {
+            "USING" : { "source_language" : [ "first-node:language" ] },
+            "PROVIDE" : { "job" : { "job" : "Job" } }
+          }
+        },
+        { "LOOP" : {
+            "USING" : { "list" : [ "nodes" ] },
+            "ITEM" : { "node" : "Node" },
+            "DO" : [
+              { "tmgmt_rules_job_add_item" : {
+                  "job" : [ "job" ],
+                  "plugin" : "node",
+                  "item_type" : "node",
+                  "item_id" : [ "node:nid" ]
+                }
+              }
+            ]
+          }
+        },
+        { "tmgmt_rules_job_checkout" : { "job" : [ "job" ] } }
+      ]
+    }
+  }';
+  $rule = rules_import($data);
+  $configs[$rule->name] = $rule;
+  return $configs;
+}
diff --git a/sources/node/ui/tmgmt_node_ui.test b/sources/node/ui/tmgmt_node_ui.test
index 25d73e9..3e035fd 100644
--- a/sources/node/ui/tmgmt_node_ui.test
+++ b/sources/node/ui/tmgmt_node_ui.test
@@ -253,3 +253,97 @@ class TMGMTNodeSourceUITestCase extends TMGMTBaseTestCase {
   }
 }
 
+/**
+ * Content Overview Tests
+ */
+class TMGMTNodeSourceUIOverviewTestCase extends TMGMTBaseTestCase {
+
+  /**
+   * Implements getInfo().
+   */
+  static function getInfo() {
+    return array(
+      'name' => t('Node Source UI Overview tests'),
+      'description' => t('Tests the user interface for node overviews.'),
+      'group' => t('Translation Management'),
+      'dependencies' => array('rules'),
+    );
+  }
+
+  /**
+   * Overrides SimplenewsTestCase::setUp()
+   */
+  function setUp() {
+    parent::setUp(array('tmgmt_node', 'translation', 'tmgmt_node_ui', 'rules'));
+    variable_set('language_content_type_page', TRANSLATION_ENABLED);
+
+    $this->drupalLogin($this->admin_user);
+    $this->setEnvironment('de');
+    $this->setEnvironment('fr');
+    $this->setEnvironment('es');
+    $this->setEnvironment('el');
+
+    variable_set('tmgmt_auto_accept', TRUE);
+
+    // Allow auto-accept.
+    $default_translator = tmgmt_translator_load('test_translator');
+    $default_translator->settings = array(
+      'auto_accept' => TRUE,
+    );
+    $default_translator->save();
+  }
+
+  /**
+   * Tests translating through the content source overview.
+   */
+  function testNodeSourceOverview() {
+    // Create a user that is allowed to translate nodes.
+    // @todo: Use granular permission once available.
+    $translater = $this->drupalCreateUser(array('translate content', 'administer tmgmt', 'edit any page content', 'create page content'));
+    $this->drupalLogin($translater);
+
+    // Create a bunch of english nodes.
+    $node1 = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
+    $node2 = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
+    $node3 = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
+    $node4 = $this->drupalCreateNode(array('type' => 'page', 'language' => 'en', 'body' => array('en' => array(array()))));
+
+    // Go to the overview page and make sure the nodes are there.
+    $this->drupalGet('admin/config/regional/tmgmt/node');
+
+    $this->assertText($node1->title);
+    $this->assertText($node2->title);
+    $this->assertText($node3->title);
+    $this->assertText($node4->title);
+
+    // Now translate them.
+    $edit = array(
+      'views_bulk_operations[0]' => TRUE,
+      'views_bulk_operations[1]' => TRUE,
+      'views_bulk_operations[2]' => TRUE,
+    );
+    $this->drupalPost(NULL, $edit, t('Request translation'));
+
+    // Some assertions on the submit form.
+    $this->assertText(t('From English to ? (Unprocessed)'));
+    $this->assertText(t('Translation for @title', array('@title' => $node1->title)));
+    $this->assertText(t('Translation for @title', array('@title' => $node2->title)));
+    $this->assertText(t('Translation for @title', array('@title' => $node3->title)));
+    $this->assertNoText(t('Translation for @title', array('@title' => $node4->title)));
+
+    // Translate
+    $edit = array(
+      'target_language' => 'de',
+    );
+    $this->drupalPost(NULL, $edit, t('Submit to translator'));
+    $this->assertText(t('The translation for @title is finished and can now be reviewed.', array('@title' => $node1->title)));
+    $this->assertText(t('The translation for @title is finished and can now be reviewed.', array('@title' => $node2->title)));
+    $this->assertText(t('The translation for @title is finished and can now be reviewed.', array('@title' => $node3->title)));
+
+    // Check the translated node.
+    $this->clickLink($node1->title);
+    $this->clickLink(t('Translate'));
+    $this->assertText('de_' . $node1->title);
+  }
+}
+
diff --git a/sources/node/views/tmgmt_node_source_overview.view.inc b/sources/node/views/tmgmt_node_source_overview.view.inc
index 5aac609..2649624 100644
--- a/sources/node/views/tmgmt_node_source_overview.view.inc
+++ b/sources/node/views/tmgmt_node_source_overview.view.inc
@@ -163,6 +163,12 @@ $handler->display->display_options['fields']['views_bulk_operations']['vbo']['op
     'override_label' => 0,
     'label' => '',
   ),
+  'rules_component::tmgmt_node_ui_request_translation' => array(
+    'selected' => 1,
+    'skip_confirmation' => 1,
+    'override_label' => 0,
+    'label' => '',
+  ),
   'action::node_save_action' => array(
     'selected' => 0,
     'use_queue' => 0,
@@ -193,7 +199,7 @@ $handler->display->display_options['fields']['views_bulk_operations']['vbo']['op
   ),
 );
 $handler->display->display_options['fields']['views_bulk_operations']['vbo']['enable_select_all_pages'] = 1;
-$handler->display->display_options['fields']['views_bulk_operations']['vbo']['display_type'] = '0';
+$handler->display->display_options['fields']['views_bulk_operations']['vbo']['display_type'] = '1';
 $handler->display->display_options['fields']['views_bulk_operations']['vbo']['display_result'] = 1;
 $handler->display->display_options['fields']['views_bulk_operations']['vbo']['merge_single_action'] = 0;
 $handler->display->display_options['fields']['views_bulk_operations']['vbo']['force_single'] = 0;
@@ -390,6 +396,28 @@ $handler->display->display_options['filters']['source_translation']['field'] = '
 $handler->display->display_options['filters']['source_translation']['ui_name'] = 'Source translation';
 $handler->display->display_options['filters']['source_translation']['operator'] = '1';
 $handler->display->display_options['filters']['source_translation']['group'] = 1;
+/* Filter criterion: Content translation: Language */
+$handler->display->display_options['filters']['language']['id'] = 'language';
+$handler->display->display_options['filters']['language']['table'] = 'node';
+$handler->display->display_options['filters']['language']['field'] = 'language';
+$handler->display->display_options['filters']['language']['operator'] = 'not in';
+$handler->display->display_options['filters']['language']['value'] = array(
+  'und' => 'und',
+);
+/* Filter criterion: Content translation: Language */
+$handler->display->display_options['filters']['language_1']['id'] = 'language_1';
+$handler->display->display_options['filters']['language_1']['table'] = 'node';
+$handler->display->display_options['filters']['language_1']['field'] = 'language';
+$handler->display->display_options['filters']['language_1']['value'] = array(
+  '***DEFAULT_LANGUAGE***' => '***DEFAULT_LANGUAGE***',
+);
+$handler->display->display_options['filters']['language_1']['exposed'] = TRUE;
+$handler->display->display_options['filters']['language_1']['expose']['operator_id'] = 'language_1_op';
+$handler->display->display_options['filters']['language_1']['expose']['label'] = 'Source Language';
+$handler->display->display_options['filters']['language_1']['expose']['operator'] = 'language_1_op';
+$handler->display->display_options['filters']['language_1']['expose']['identifier'] = 'language_1';
+$handler->display->display_options['filters']['language_1']['expose']['required'] = 1;
+$handler->display->display_options['filters']['language_1']['expose']['reduce'] = 0;
 
 /* Display: Page */
 $handler = $view->new_display('page', 'Page', 'page');
@@ -420,5 +448,6 @@ $translatables['tmgmt_node_source_overview'] = array(
   t('Updated date'),
   t('Published'),
   t('Translatable types'),
+  t('Source Language'),
   t('Page'),
 );
diff --git a/tmgmt.rules.inc b/tmgmt.rules.inc
index 43c19db..008a543 100755
--- a/tmgmt.rules.inc
+++ b/tmgmt.rules.inc
@@ -48,8 +48,36 @@ function tmgmt_rules_action_info() {
       ),
     ),
   );
-  $info['tmgmt_rules_get_job_for_language'] = array(
-    'label' => t('Get a job for the defined language combination'),
+  $info['tmgmt_rules_job_checkout'] = array(
+    'label' => t('Checkout a job'),
+    'group' => t('Translation Management'),
+    'parameter' => array(
+      'job' => array(
+        'type' => 'tmgmt_job',
+        'label' => t('Translation Job'),
+        'description' => t('The translation job that should be checked out.'),
+      ),
+    ),
+  );
+  $info['tmgmt_get_first_from_node_list'] = array(
+    'label' => t('Get first item from a list of nodes'),
+    'group' => t('Data'),
+    'parameter' => array(
+      'list' => array(
+        'type' => 'list<node>',
+        'label' => t('List'),
+        'restriction' => 'selector',
+      ),
+    ),
+    'provides' => array(
+      'first_node' => array(
+        'type' => 'node',
+        'label' => t('Node'),
+      ),
+    ),
+  );
+  $info['tmgmt_rules_create_job'] = array(
+    'label' => t('Create a job for a given source language'),
     'group' => t('Translation Management'),
     'parameter' => array(
       'source_language' => array(
@@ -58,17 +86,6 @@ function tmgmt_rules_action_info() {
         'description' => t('The language from which should be translated'),
         'options list' => 'entity_metadata_language_list',
       ),
-      'target_language' => array(
-        'type' => 'text',
-        'label' => t('Target Language'),
-        'description' => t('The language into which should be translated'),
-        'options list' => 'entity_metadata_language_list',
-      ),
-      'account' => array(
-        'type' => 'user',
-        'label' => t('Account'),
-        'description' => t('Owner of the job'),
-      ),
     ),
     'provides' => array(
       'job' => array(
@@ -136,11 +153,26 @@ function tmgmt_rules_job_cancel_translation(TMGMTJob $job) {
 }
 
 /**
+ * Rules callback to redirect to a translation job.
+ */
+function tmgmt_rules_job_checkout(TMGMTJob $job) {
+  $redirects = tmgmt_ui_job_checkout_multiple(array($job));
+  // If necessary, do a redirect.
+  if ($redirects) {
+    tmgmt_ui_redirect_queue_set($redirects, current_path());
+    drupal_goto(tmgmt_ui_redirect_queue_dequeue());
+
+    // Count of the job messages is one less due to the final redirect.
+    drupal_set_message(format_plural(count($redirects), t('One job needs to be checked out.'), t('@count jobs need to be checked out.')));
+  }
+}
+
+/**
  * Rules callback to get the job for a specific language combination.
  */
-function tmgmt_rules_get_job_for_language($source_language, $target_language, $account) {
+function tmgmt_rules_create_job($source_language) {
   return array(
-    'job' => tmgmt_job_match_item($source_language, $target_language, $account),
+    'job' => tmgmt_job_create($source_language, ''),
   );
 }
 
@@ -150,3 +182,12 @@ function tmgmt_rules_get_job_for_language($source_language, $target_language, $a
 function tmgmt_rules_job_add_item(TMGMTJob $job, $plugin, $item_type, $item_id) {
   $job->addItem($plugin, $item_type, $item_id);
 }
+
+/**
+ * Rules action to extract the first node from a node list.
+ */
+function tmgmt_get_first_from_node_list($list) {
+  return array(
+    'first_node' => reset($list),
+  );
+}
\ No newline at end of file
diff --git a/ui/includes/tmgmt_ui.pages.inc b/ui/includes/tmgmt_ui.pages.inc
index 6dc25c8..24a488b 100644
--- a/ui/includes/tmgmt_ui.pages.inc
+++ b/ui/includes/tmgmt_ui.pages.inc
@@ -270,22 +270,32 @@ function tmgmt_job_form($form, &$form_state, TMGMTJob $job, $op = 'edit') {
   drupal_set_title($job->label() . ' (' . $wrapper->state->label() . ')');
   // Check if the translator entity is completely new or not.
   $old = empty($job->is_new) && $op != 'clone';
-  // Find pre-selected values.
-  foreach (array('source_language', 'target_language') as $key) {
-    // Retrieve a list of available languages per dropdown.
-    $available[$key] = tmgmt_available_languages();
-    // We need this information because we will lock down the language dropdown
-    // fields if these values have been predefined.
-    $preselected[$key] = !empty($job->{$key});
-    $job->{$key} = isset($form_state['values'][$key]) ? $form_state['values'][$key] : $job->{$key};
-  }
-  // Remove impossible combinations so we don't end up with the same source and
+  // Handle source language.
+  $available['source_language'] = tmgmt_available_languages();
+  // We need this information because we will lock down the language dropdown
+  // fields if these values have been predefined.
+  $preselected['source_language'] = !empty($job->source_language);
+  $job->source_language = isset($form_state['values']['source_language']) ? $form_state['values']['source_language'] : $job->source_language;
+
+  // Handle target language.
+  $available['target_language'] = tmgmt_available_languages();
+  // We need this information because we will lock down the language dropdown
+  // fields if these values have been predefined.
+  $preselected['target_language'] = $job->isActive();
+  $job->target_language = isset($form_state['values']['target_language']) ? $form_state['values']['target_language'] : $job->target_language;
+
+// Remove impossible combinations so we don't end up with the same source and
   // target language in the dropdowns.
   foreach (array('source_language' => 'target_language', 'target_language' => 'source_language') as $key => $opposite) {
     if (!empty($job->{$key})) {
       unset($available[$opposite][$job->{$key}]);
     }
   }
+
+  if (empty($job->target_language)) {
+    $job->target_language = key($available['target_language']);
+  }
+
   // Show a list of translators tagged by availability for the selected source
   // and target language combination.
   if (!$translators = tmgmt_translator_labels_flagged($job)) {
diff --git a/ui/tmgmt_ui.rules_defaults.inc b/ui/tmgmt_ui.rules_defaults.inc
index bd5df07..89b11b4 100644
--- a/ui/tmgmt_ui.rules_defaults.inc
+++ b/ui/tmgmt_ui.rules_defaults.inc
@@ -28,50 +28,5 @@ function tmgmt_ui_default_rules_configuration() {
     }
   }';
   $rule = rules_import($data);
-  $configs[$rule->name] = $rule;
-  $data = '{ "rules_tmgmt_source_node_add_to_job" : {
-      "LABEL" : "Add to Translation Job",
-      "PLUGIN" : "rule",
-      "REQUIRES" : [ "tmgmt" ],
-      "USES VARIABLES" : {
-        "nodes" : { "label" : "Nodes", "type" : "list\u003Cnode\u003E" },
-        "target_languages" : { "label" : "Target language", "type" : "list\u003Ctoken\u003E" }
-      },
-      "DO" : [
-        { "LOOP" : {
-            "USING" : { "list" : [ "target-languages" ] },
-            "ITEM" : { "target_language" : "Target Language" },
-            "DO" : [
-              { "LOOP" : {
-                  "USING" : { "list" : [ "nodes" ] },
-                  "ITEM" : { "node" : "Node" },
-                  "DO" : [
-                    { "tmgmt_rules_get_job_for_language" : {
-                        "USING" : {
-                          "source_language" : [ "node:language" ],
-                          "target_language" : [ "target_language" ],
-                          "account" : [ "site:current-user" ]
-                        },
-                        "PROVIDE" : { "job" : { "job" : "Job" } }
-                      }
-                    },
-                    { "tmgmt_rules_job_add_item" : {
-                        "job" : [ "job" ],
-                        "plugin" : "node",
-                        "item_type" : "node",
-                        "item_id" : [ "node:nid" ]
-                      }
-                    }
-                  ]
-                }
-              }
-            ]
-          }
-        }
-      ]
-    }
-  }';
-  $rule = rules_import($data);
-  $configs[$rule->name] = $rule;
   return $configs;
 }
