diff --git a/css/tmgmt.admin.source_search_form.css b/css/tmgmt.admin.source_search_form.css
new file mode 100644
index 0000000..3d8db65
--- /dev/null
+++ b/css/tmgmt.admin.source_search_form.css
@@ -0,0 +1,8 @@
+.tmgmt-sources-wrapper .form-item {
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.tmgmt-sources-wrapper #edit-search-submit {
+  margin: 26px 10px 0 10px;
+}
diff --git a/sources/content/css/tmgmt_content.admin.entity_source_search_form.css b/sources/content/css/tmgmt_content.admin.entity_source_search_form.css
deleted file mode 100644
index 4840f5a..0000000
--- a/sources/content/css/tmgmt_content.admin.entity_source_search_form.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.tmgmt-entity-sources-wrapper .form-item {
-  float: left;
-  margin: 0 10px 0 0;
-}
-
-.tmgmt-entity-sources-wrapper #edit-search-submit {
-  margin: 26px 10px 0 10px;
-}
diff --git a/sources/content/src/ContentEntitySourcePluginUi.php b/sources/content/src/ContentEntitySourcePluginUi.php
index 66bb5af..7d9bf82 100644
--- a/sources/content/src/ContentEntitySourcePluginUi.php
+++ b/sources/content/src/ContentEntitySourcePluginUi.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\tmgmt_content;
 
-use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
@@ -16,9 +15,11 @@ use Drupal\tmgmt\SourcePluginUiBase;
 use Drupal\tmgmt\TMGMTException;
 
 /**
- * Abstract entity ui controller class for source plugin that provides
- * getEntity() method to retrieve list of entities of specific type. It also
- * allows to implement alter hook to alter the entity query for a specific type.
+ * Content entity source plugin UI.
+ *
+ * Provides getEntity() method to retrieve list of entities of specific type.
+ * It also allows to implement alter hook to alter the entity query for a
+ * specific type.
  *
  * @ingroup tmgmt_source
  */
@@ -32,46 +33,10 @@ class ContentEntitySourcePluginUi extends SourcePluginUiBase {
   public $pagerLimit = 25;
 
   /**
-   * Builds search form for entity sources overview.
-   *
-   * @param array $form
-   *   Drupal form array.
-   * @param $form_state
-   *   Drupal form_state array.
-   * @param string $type
-   *   Entity type.
-   *
-   * @return array
-   *   Drupal form array.
+   * {@inheritdoc}
    */
   public function overviewSearchFormPart(array $form, FormStateInterface $form_state, $type) {
-
-    // Add search form specific styling.
-    $form['#attached']['library'][] = 'tmgmt_content/entity_source_search_form';
-
-    // Add entity type value into form array so that it is available in
-    // the form alter hook.
-    $form_state->set('entity_type', $type);
-
-    $form['search_wrapper'] = array(
-      '#prefix' => '<div class="tmgmt-sources-wrapper tmgmt-entity-sources-wrapper">',
-      '#suffix' => '</div>',
-      '#weight' => -15,
-    );
-    $form['search_wrapper']['search'] = array(
-      '#tree' => TRUE,
-    );
-
-    $form['search_wrapper']['search_submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Search'),
-      '#weight' => 10,
-    );
-    $form['search_wrapper']['search_cancel'] = array(
-      '#type' => 'submit',
-      '#value' => t('Cancel'),
-      '#weight' => 11,
-    );
+    $form = parent::overviewSearchFormPart($form, $form_state, $type);
 
     $entity_type = \Drupal::entityManager()->getDefinition($type);
 
@@ -151,54 +116,12 @@ class ContentEntitySourcePluginUi extends SourcePluginUiBase {
   }
 
   /**
-   * Performs redirect with search params appended to the uri.
-   *
-   * In case of triggering element is edit-search-submit it redirects to
-   * current location with added query string containing submitted search form
-   * values.
-   *
-   * @param array $form
-   *   Drupal form array.
-   * @param $form_state
-   *   Drupal form_state array.
-   * @param $type
-   *   Entity type.
-   *
-   * @return bool
-   *   Returns true, if redirect has been set.
-   */
-  public function overviewSearchFormRedirect(array $form, FormStateInterface $form_state, $type) {
-    if ($form_state->getTriggeringElement()['#id'] == 'edit-search-cancel') {
-      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => 'content', 'item_type' => $type));
-      return TRUE;
-    }
-    elseif ($form_state->getTriggeringElement()['#id'] == 'edit-search-submit') {
-      $query = array();
-
-      foreach ($form_state->getValue('search') as $key => $value) {
-        $query[$key] = $value;
-      }
-      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => 'content', 'item_type' => $type), array('query' => $query));
-      return TRUE;
-    }
-    return FALSE;
-  }
-
-
-  /**
    * Gets overview form header.
    *
    * @return array
    *   Header array definition as expected by theme_tablesort().
    */
   public function overviewFormHeader($type) {
-    $languages = array();
-    foreach (\Drupal::languageManager()->getLanguages() as $langcode => $language) {
-      $languages['langcode-' . $langcode] = array(
-        'data' => SafeMarkup::checkPlain($language->getName()),
-      );
-    }
-
     $entity_type = \Drupal::entityManager()->getDefinition($type);
 
     $header = array(
@@ -210,7 +133,7 @@ class ContentEntitySourcePluginUi extends SourcePluginUiBase {
       $header['bundle'] = array('data' => $this->t('@entity_name type', array('@entity_name' => $entity_type->getLabel())));
     }
 
-    $header += $languages;
+    $header += $this->getLanguagesFromHeader();
 
     return $header;
   }
@@ -283,16 +206,7 @@ class ContentEntitySourcePluginUi extends SourcePluginUiBase {
    * {@inheritdoc}
    */
   public function overviewForm(array $form, FormStateInterface $form_state, $type) {
-    $form += $this->overviewSearchFormPart($form, $form_state, $type);
-
-    $form['#attached']['library'][] = 'tmgmt/admin';
-
-    $form['items'] = array(
-      '#type' => 'tableselect',
-      '#header' => $this->overviewFormHeader($type),
-      '#empty' => $this->t('No entities matching given criteria have been found.'),
-      '#attributes' => array('id' => 'tmgmt-entities-list'),
-    );
+    $form = parent::overviewForm($form, $form_state, $type);
 
     // Load search property params which will be passed into
     $search_property_params = array();
diff --git a/sources/content/src/Tests/ContentEntitySourceListTest.php b/sources/content/src/Tests/ContentEntitySourceListTest.php
index 6b481c1..8aa8b34 100644
--- a/sources/content/src/Tests/ContentEntitySourceListTest.php
+++ b/sources/content/src/Tests/ContentEntitySourceListTest.php
@@ -116,7 +116,7 @@ class ContentEntitySourceListTest extends EntityTestBase {
     // Check if we are at comments page.
     $this->assertText(t('Comment overview (Content Entity)'));
     // No comments yet - empty message is expected.
-    $this->assertText(t('No entities matching given criteria have been found.'));
+    $this->assertText(t('No source items matching given criteria have been found.'));
 
     $this->drupalGet('admin/tmgmt/sources/content/node');
     // Check if we are at nodes page.
@@ -135,8 +135,8 @@ class ContentEntitySourceListTest extends EntityTestBase {
 
     // Test statuses: Source, Missing.
     $this->drupalGet('admin/tmgmt/sources/content/node');
-    $langstatus_en = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr[1]/td[@class="langstatus-en"]/img/@title');
-    $langstatus_de = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr[1]/td[@class="langstatus-de"]/img/@title');
+    $langstatus_en = $this->xpath('//table[@id="edit-items"]/tbody/tr[1]/td[@class="langstatus-en"]/img/@title');
+    $langstatus_de = $this->xpath('//table[@id="edit-items"]/tbody/tr[1]/td[@class="langstatus-de"]/img/@title');
 
     $this->assertEqual($langstatus_en[0]['title'], t('Source language'));
     $this->assertEqual($langstatus_de[0]['title'], t('Not translated'));
@@ -151,7 +151,7 @@ class ContentEntitySourceListTest extends EntityTestBase {
     $job->requestTranslation();
 
     $this->drupalGet('admin/tmgmt/sources/content/node');
-    $langstatus_de = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr[1]/td[@class="langstatus-de"]/a');
+    $langstatus_de = $this->xpath('//table[@id="edit-items"]/tbody/tr[1]/td[@class="langstatus-de"]/a');
 
     $items = $job->getItems();
     $states = JobItem::getStates();
@@ -165,7 +165,7 @@ class ContentEntitySourceListTest extends EntityTestBase {
     }
 
     $this->drupalGet('admin/tmgmt/sources/content/node');
-    $langstatus_de = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr[1]/td[@class="langstatus-de"]/img/@title');
+    $langstatus_de = $this->xpath('//table[@id="edit-items"]/tbody/tr[1]/td[@class="langstatus-de"]/img/@title');
 
     $this->assertEqual($langstatus_de[0]['title'], t('Translation up to date'));
   }
@@ -265,7 +265,7 @@ class ContentEntitySourceListTest extends EntityTestBase {
     $this->assertText("$title_part_1 $title_part_2 $title_part_3", 'Searching on partial node title must return the result.');
 
     // Check if there is only one result in the list.
-    $search_result_rows = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr');
+    $search_result_rows = $this->xpath('//table[@id="edit-items"]/tbody/tr');
     $this->assert(count($search_result_rows) == 1, 'The search result must return only one row.');
 
     // To test if other entity types work go for simple comment search.
diff --git a/sources/content/tmgmt_content.libraries.yml b/sources/content/tmgmt_content.libraries.yml
deleted file mode 100644
index b50949b..0000000
--- a/sources/content/tmgmt_content.libraries.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-entity_source_search_form:
-  css:
-    theme:
-      css/tmgmt_content.admin.entity_source_search_form.css: {}
diff --git a/sources/locale/src/LocaleSourcePluginUi.php b/sources/locale/src/LocaleSourcePluginUi.php
index 3329e6f..f363a13 100644
--- a/sources/locale/src/LocaleSourcePluginUi.php
+++ b/sources/locale/src/LocaleSourcePluginUi.php
@@ -13,9 +13,9 @@ use Drupal\Core\Url;
 use Drupal\tmgmt\SourcePluginUiBase;
 
 /**
- * Class TMGMTI18nStringDefaultSourceUIController
+ * Locale source plugin UI.
  *
- * UI Controller fo i18n strings translation jobs.
+ * Plugin UI for i18n strings translation jobs.
  */
 class LocaleSourcePluginUi extends SourcePluginUiBase {
 
@@ -98,18 +98,11 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
    * Implements TMGMTSourceUIControllerInterface::overviewForm().
    */
   public function overviewForm(array $form, FormStateInterface $form_state, $type) {
-    $form += $this->overviewSearchFormPart($form, $form_state, $type);
-
-    $form['items'] = array(
-      '#type' => 'tableselect',
-      '#header' => $this->overviewFormHeader($type),
-      '#empty' => t('No strings matching given criteria have been found.')
-    );
-
-    $form['#attached']['library'][] = 'tmgmt/admin';
-
+    $form = parent::overviewForm($form, $form_state, $type);
     $search_data = $this->getSearchFormSubmittedParams();
 
+    $form['items']['#empty'] = $this->t('No strings matching given criteria have been found.');
+
     $strings = $this->getStrings($search_data['label'], $search_data['missing_target_language']);
 
     foreach ($this->getTranslationData($strings, $type) as $id => $data) {
@@ -146,7 +139,7 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
 
       $objects[$id] = array(
         'id' => $id,
-        'object' => $string
+        'object' => $string,
       );
       // Load entity translation specific data.
       foreach ($this->getLanguages() as $langcode => $language) {
@@ -169,19 +162,10 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
   }
 
   /**
-   * Builds search form for entity sources overview.
-   *
-   * @param array $form
-   *   Drupal form array.
-   * @param $form_state
-   *   Drupal form_state array.
-   * @param $type
-   *   Entity type.
-   *
-   * @return array
-   *   Drupal form array.
+   * {@inheritdoc}
    */
   public function overviewSearchFormPart(array $form, FormStateInterface $form_state, $type) {
+    $form = parent::overviewSearchFormPart($form, $form_state, $type);
 
     $options = array();
     foreach (\Drupal::languageManager()->getLanguages() as $langcode => $language) {
@@ -190,14 +174,6 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
 
     $default_values = $this->getSearchFormSubmittedParams();
 
-    $form['search_wrapper'] = array(
-      '#prefix' => '<div class="tmgmt-sources-wrapper tmgmt-i18n_string-sources-wrapper">',
-      '#suffix' => '</div>',
-      '#weight' => -15,
-    );
-    $form['search_wrapper']['search'] = array(
-      '#tree' => TRUE,
-    );
     $form['search_wrapper']['search']['label'] = array(
       '#type' => 'textfield',
       '#title' => t('Source text'),
@@ -214,16 +190,6 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
       '#empty_option' => '--',
       '#default_value' => isset($default_values['missing_target_language']) ? $default_values['missing_target_language'] : NULL,
     );
-    $form['search_wrapper']['search_submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Search'),
-    );
-    $form['search_wrapper']['search_cancel'] = array(
-      '#type' => 'submit',
-      '#value' => t('Cancel'),
-      '#submit' => array('tmgmt_submit_redirect'),
-      '#redirect' => 'admin/tmgmt/sources/locale/default',
-    );
 
     return $form;
   }
@@ -310,34 +276,6 @@ class LocaleSourcePluginUi extends SourcePluginUiBase {
   }
 
   /**
-   * Performs redirect with search params appended to the uri.
-   *
-   * In case of triggering element is edit-search-submit it redirects to
-   * current location with added query string containing submitted search form
-   * values.
-   *
-   * @param array $form
-   *   Drupal form array.
-   * @param $form_state
-   *   Drupal form_state array.
-   * @param $type
-   *   Entity type.
-   */
-  public function overviewSearchFormRedirect(array $form, FormStateInterface $form_state, $type) {
-    if ($form_state->getTriggeringElement()['#id'] == 'edit-search-submit') {
-
-      $query = array();
-
-      foreach ($form_state->getValue('search') as $key => $value) {
-        $query[$key] = $value;
-      }
-
-      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => 'locale', 'item_type' => $type), array('query' => $query));
-      return TRUE;
-    }
-  }
-
-  /**
    * Returns languages, ensures that english is first.
    *
    * @return array
diff --git a/sources/tmgmt_config/src/ConfigSourcePluginUi.php b/sources/tmgmt_config/src/ConfigSourcePluginUi.php
index 814181a..0904286 100644
--- a/sources/tmgmt_config/src/ConfigSourcePluginUi.php
+++ b/sources/tmgmt_config/src/ConfigSourcePluginUi.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\tmgmt_config;
 
-use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
@@ -17,9 +16,11 @@ use Drupal\tmgmt\TMGMTException;
 use Drupal\tmgmt_config\Plugin\tmgmt\Source\ConfigSource;
 
 /**
- * Abstract entity ui controller class for source plugin that provides
- * getEntity() method to retrieve list of entities of specific type. It also
- * allows to implement alter hook to alter the entity query for a specific type.
+ * Config source plugin UI.
+ *
+ * That provides getEntity() method to retrieve list of entities
+ * of specific type. It also allows to implement alter hook to alter
+ * the entity query for a specific type.
  *
  * @ingroup tmgmt_source
  */
@@ -33,45 +34,10 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
   public $pagerLimit = 25;
 
   /**
-   * Builds search form for entity sources overview.
-   *
-   * @param array $form
-   *   Drupal form array.
-   * @param $form_state
-   *   Drupal form_state array.
-   * @param string $type
-   *   Entity type.
-   *
-   * @return array
-   *   Drupal form array.
+   * {@inheritdoc}
    */
   public function overviewSearchFormPart(array $form, FormStateInterface $form_state, $type) {
-
-    // Add search form specific styling.
-    $form['#attached']['library'][] = 'tmgmt_content/entity_source_search_form';
-
-    // Add entity type value into form array so that it is available in
-    // the form alter hook.
-    $form_state->set('entity_type', $type);
-    $form['search_wrapper'] = array(
-      '#prefix' => '<div class="tmgmt-sources-wrapper tmgmt-entity-sources-wrapper">',
-      '#suffix' => '</div>',
-      '#weight' => -15,
-    );
-    $form['search_wrapper']['search'] = array(
-      '#tree' => TRUE,
-    );
-
-    $form['search_wrapper']['search_submit'] = array(
-      '#type' => 'submit',
-      '#value' => t('Search'),
-      '#weight' => 10,
-    );
-    $form['search_wrapper']['search_cancel'] = array(
-      '#type' => 'submit',
-      '#value' => t('Cancel'),
-      '#weight' => 11,
-    );
+    $form = parent::overviewSearchFormPart($form, $form_state, $type);
 
     if ($type == ConfigSource::SIMPLE_CONFIG) {
       $label_key = 'name';
@@ -84,7 +50,6 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
       $label = $entity_type->getLabel();
     }
 
-
     if (!empty($label_key)) {
       $form['search_wrapper']['search'][$label_key] = array(
         '#type' => 'textfield',
@@ -138,59 +103,17 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
   }
 
   /**
-   * Performs redirect with search params appended to the uri.
-   *
-   * In case of triggering element is edit-search-submit it redirects to
-   * current location with added query string containing submitted search form
-   * values.
-   *
-   * @param array $form
-   *   Drupal form array.
-   * @param $form_state
-   *   Drupal form_state array.
-   * @param $type
-   *   Entity type.
-   *
-   * @return bool
-   *   Returns true, if redirect has been set.
-   */
-  public function overviewSearchFormRedirect(array $form, FormStateInterface $form_state, $type) {
-    if ($form_state->getTriggeringElement()['#id'] == 'edit-search-cancel') {
-      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => 'config', 'item_type' => $type));
-      return TRUE;
-    }
-    elseif ($form_state->getTriggeringElement()['#id'] == 'edit-search-submit') {
-      $query = array();
-
-      foreach ($form_state->getValue('search') as $key => $value) {
-        $query[$key] = $value;
-      }
-      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => 'config', 'item_type' => $type), array('query' => $query));
-      return TRUE;
-    }
-    return FALSE;
-  }
-
-
-  /**
    * Gets overview form header.
    *
    * @return array
    *   Header array definition as expected by theme_tablesort().
    */
   public function overviewFormHeader($type) {
-    $languages = array();
-    foreach (\Drupal::languageManager()->getLanguages() as $langcode => $language) {
-      $languages['langcode-' . $langcode] = array(
-        'data' => SafeMarkup::checkPlain($language->getName()),
-      );
-    }
-
     $header = array(
       'title' => array('data' => $this->t('Title (in source language)')),
     );
 
-    $header += $languages;
+    $header += $this->getLanguagesFromHeader();
 
     return $header;
   }
@@ -313,16 +236,7 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
    * {@inheritdoc}
    */
   public function overviewForm(array $form, FormStateInterface $form_state, $type) {
-    $form += $this->overviewSearchFormPart($form, $form_state, $type);
-
-    $form['#attached']['library'][] = 'tmgmt/admin';
-
-    $form['items'] = array(
-      '#type' => 'tableselect',
-      '#header' => $this->overviewFormHeader($type),
-      '#empty' => $this->t('No entities matching given criteria have been found.'),
-      '#attributes' => array('id' => 'tmgmt-entities-list'),
-    );
+    $form = parent::overviewForm($form, $form_state, $type);
 
     // Load search property params which will be passed into
     $search_property_params = array();
@@ -500,4 +414,5 @@ class ConfigSourcePluginUi extends SourcePluginUiBase {
     }
     return $entities;
   }
+
 }
diff --git a/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php b/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php
index 762d96c..ac066d9 100644
--- a/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php
+++ b/sources/tmgmt_config/src/Tests/ConfigSourceListTest.php
@@ -183,7 +183,7 @@ class ConfigSourceListTest extends EntityTestBase {
       'search[target_language]' => '',
     );
     $this->drupalPostForm('admin/tmgmt/sources/config/node_type', $filters, t('Search'));
-    $this->assertText(t('No entities matching given criteria have been found.'));
+    $this->assertText(t('No source items matching given criteria have been found.'));
 
     // Searching for article.
     $filters = array(
@@ -260,7 +260,7 @@ class ConfigSourceListTest extends EntityTestBase {
     $this->assertText('The translation of System information to German is finished and can now be reviewed.');
 
     // Verify that the pending translation is shown.
-    $review = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr[@class="even"][1]/td[@class="langstatus-de"]/a/@href');
+    $review = $this->xpath('//table[@id="edit-items"]/tbody/tr[@class="even"][1]/td[@class="langstatus-de"]/a/@href');
     $destination = $this->getAbsoluteUrl($review[0]['href']);
     $this->drupalGet($destination);
     $this->drupalPostForm(NULL, array(), t('Save'));
@@ -280,7 +280,7 @@ class ConfigSourceListTest extends EntityTestBase {
     $this->assertUrl('admin/tmgmt/sources/config/_simple_config');
 
     // Translated languages should now be listed as Needs review.
-    $links = $this->xpath('//table[@id="tmgmt-entities-list"]/tbody/tr/td/a/@href');
+    $links = $this->xpath('//table[@id="edit-items"]/tbody/tr/td/a/@href');
     $counter = 0;
     foreach ($links as $subarray) {
       $counter += count($subarray);
diff --git a/src/SourcePluginUiBase.php b/src/SourcePluginUiBase.php
index a0ee22e..6f80bca 100644
--- a/src/SourcePluginUiBase.php
+++ b/src/SourcePluginUiBase.php
@@ -7,11 +7,9 @@
 
 namespace Drupal\tmgmt;
 
-use Drupal\Core\Form\FormState;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
-use Drupal\tmgmt\Entity\JobItem;
-use Drupal\tmgmt\SourcePluginUiInterface;
+use Drupal\Component\Utility\SafeMarkup;
 
 /**
  * Default ui controller class for source plugin.
@@ -52,6 +50,16 @@ class SourcePluginUiBase extends PluginBase implements SourcePluginUiInterface {
    * {@inheritdoc}
    */
   public function overviewForm(array $form, FormStateInterface $form_state, $type) {
+    $form += $this->overviewSearchFormPart($form, $form_state, $type);
+
+    $form['#attached']['library'][] = 'tmgmt/admin';
+
+    $form['items'] = array(
+      '#type' => 'tableselect',
+      '#header' => $this->overviewFormHeader($type),
+      '#empty' => $this->t('No source items matching given criteria have been found.'),
+    );
+
     return $form;
   }
 
@@ -76,4 +84,99 @@ class SourcePluginUiBase extends PluginBase implements SourcePluginUiInterface {
     return array();
   }
 
+  /**
+   * Builds search form for entity sources overview.
+   *
+   * @param array $form
+   *   Drupal form array.
+   * @param FormStateInterface $form_state
+   *   Drupal form_state array.
+   * @param string $type
+   *   Entity type.
+   *
+   * @return array
+   *   Drupal form array.
+   */
+  public function overviewSearchFormPart(array $form, FormStateInterface $form_state, $type) {
+    // Add entity type and plugin_id value into form array
+    // so that it is available in the form alter hook.
+    $form_state->set('entity_type', $type);
+    $form_state->set('plugin_id', $this->pluginId);
+
+    // Add search form specific styling.
+    $form['#attached']['library'][] = 'tmgmt/source_search_form';
+
+    $form['search_wrapper'] = array(
+      '#prefix' => '<div class="tmgmt-sources-wrapper">',
+      '#suffix' => '</div>',
+      '#weight' => -15,
+    );
+    $form['search_wrapper']['search'] = array(
+      '#tree' => TRUE,
+    );
+    $form['search_wrapper']['search_submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Search'),
+      '#weight' => 90,
+    );
+    $form['search_wrapper']['search_cancel'] = array(
+      '#type' => 'submit',
+      '#value' => t('Cancel'),
+      '#weight' => 100,
+    );
+
+    return $form;
+  }
+
+  /**
+   * Gets languages form header.
+   *
+   * @return array
+   *   Array with the languages from the header.
+   */
+  protected function getLanguagesFromHeader() {
+    $languages = array();
+    foreach (\Drupal::languageManager()->getLanguages() as $langcode => $language) {
+      $languages['langcode-' . $langcode] = array(
+        'data' => SafeMarkup::checkPlain($language->getName()),
+      );
+    }
+
+    return $languages;
+  }
+
+  /**
+   * Performs redirect with search params appended to the uri.
+   *
+   * In case of triggering element is edit-search-submit it redirects to
+   * current location with added query string containing submitted search form
+   * values.
+   *
+   * @param array $form
+   *   Drupal form array.
+   * @param FormStateInterface $form_state
+   *   Drupal form_state array.
+   * @param $type
+   *   Entity type.
+   *
+   * @return bool
+   *   Returns true, if redirect has been set.
+   */
+  public function overviewSearchFormRedirect(array $form, FormStateInterface $form_state, $type) {
+    if ($form_state->getTriggeringElement()['#id'] == 'edit-search-cancel') {
+      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => $this->pluginId, 'item_type' => $type));
+      return TRUE;
+    }
+    elseif ($form_state->getTriggeringElement()['#id'] == 'edit-search-submit') {
+      $query = array();
+
+      foreach ($form_state->getValue('search') as $key => $value) {
+        $query[$key] = $value;
+      }
+      $form_state->setRedirect('tmgmt.source_overview', array('plugin' => $this->pluginId, 'item_type' => $type), array('query' => $query));
+      return TRUE;
+    }
+    return FALSE;
+  }
+
 }
diff --git a/tmgmt.libraries.yml b/tmgmt.libraries.yml
index aaaa3f4..327906c 100644
--- a/tmgmt.libraries.yml
+++ b/tmgmt.libraries.yml
@@ -13,3 +13,8 @@ drupal.tmgmt.toolbar:
   css:
     theme:
       css/tmgmt.icons.css: {}
+
+source_search_form:
+  css:
+    theme:
+      css/tmgmt.admin.source_search_form.css: {}
