diff --git a/modules/translators_content/src/Plugin/views/filter/TranslationLanguageLimitedToTranslationSkills.php b/modules/translators_content/src/Plugin/views/filter/TranslationLanguageLimitedToTranslationSkills.php
index fdc8727..d096639 100644
--- a/modules/translators_content/src/Plugin/views/filter/TranslationLanguageLimitedToTranslationSkills.php
+++ b/modules/translators_content/src/Plugin/views/filter/TranslationLanguageLimitedToTranslationSkills.php
@@ -4,14 +4,85 @@ namespace Drupal\translators_content\Plugin\views\filter;
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\views\Plugin\views\PluginBase;
+use Drupal\Core\Session\AccountProxyInterface;
+use Drupal\translators\Services\TranslatorSkills;
+use Drupal\views\Plugin\views\filter\LanguageFilter;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Class TranslationLanguageLimitedToTranslationSkills.
  *
  * @package Drupal\translators_content\Plugin\views\filter
  */
-class TranslationLanguageLimitedToTranslationSkills extends TranslatorsViewsFiltersBase {
+class TranslationLanguageLimitedToTranslationSkills extends LanguageFilter implements ContainerFactoryPluginInterface {
+
+  /**
+   * User skills service.
+   *
+   * @var \Drupal\translators\Services\TranslatorSkills
+   */
+  protected $translatorSkills;
+  /**
+   * {@inheritdoc}
+   */
+  protected $valueOptions = [];
+  /**
+   * Current user account.
+   *
+   * @var \Drupal\Core\Session\AccountProxyInterface
+   */
+  protected $currentUser;
+
+  /**
+   * Constructs a new TranslationLanguageLimitedToTranslationSkills instance.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   Language manager.
+   * @param \Drupal\translators\Services\TranslatorSkills $translatorSkills
+   *   User skills service.
+   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
+   *   Current user.
+   */
+  public function __construct(
+    array $configuration,
+    $plugin_id,
+    $plugin_definition,
+    LanguageManagerInterface $language_manager,
+    TranslatorSkills $translatorSkills,
+    AccountProxyInterface $current_user
+  ) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $language_manager);
+    $this->translatorSkills = $translatorSkills;
+    $this->currentUser = $current_user;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(
+    ContainerInterface $container,
+    array $configuration,
+    $plugin_id,
+    $plugin_definition
+  ) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('language_manager'),
+      $container->get('translators.skills'),
+      $container->get('current_user')
+    );
+  }
 
   /**
    * {@inheritdoc}
@@ -29,20 +100,12 @@ class TranslationLanguageLimitedToTranslationSkills extends TranslatorsViewsFilt
    */
   public function buildOptionsForm(&$form, FormStateInterface $form_state) {
     parent::buildOptionsForm($form, $form_state);
-    // Remove the values list - we will handle them on a background basis.
-    // Only if limited option is checked.
     $form['value']['#states'] = [
       'visible' => [
         'input[name="options[limit]"]' => ['checked' => FALSE],
       ],
     ];
-    // Build values list independently in order to see all the options,
-    // while switching "limit" option without necessity to reload the form.
-    $form['value']['#options'] = $this->listLanguages(
-      LanguageInterface::STATE_ALL | LanguageInterface::STATE_SITE_DEFAULT | PluginBase::INCLUDE_NEGOTIATED,
-      array_keys($this->value)
-    );
-
+    $form['value']['#options'] = $this->getValueOptions();
     $end = $form['clear_markup_end'];
     unset($form['clear_markup_end']);
     $form['limit'] = [
@@ -53,7 +116,10 @@ class TranslationLanguageLimitedToTranslationSkills extends TranslatorsViewsFilt
     ];
     $form['column'] = [
       '#type'          => 'checkboxes',
-      '#options'       => $this->getFilterColumnsOptions(),
+      '#options'       => [
+        'source' => $this->t('Source languages'),
+        'target' => $this->t('Target languages'),
+      ],
       '#title'         => $this->t('Translation skills'),
       '#required'      => FALSE,
       '#default_value' => $this->options['column'],
@@ -64,6 +130,61 @@ class TranslationLanguageLimitedToTranslationSkills extends TranslatorsViewsFilt
       ],
     ];
     $form['clear_markup_end'] = $end;
+    $form['value']['#prefix'] = '<div class="views-group-box views-right-60">';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function valueForm(&$form, FormStateInterface $form_state) {
+    parent::valueForm($form, $form_state);
+
+    if (!empty($this->options['exposed']) && $this->options['limit']) {
+      $language_options = $this->buildLimitedLanguageOptions();
+      $identifier = $this->options['expose']['identifier'];
+      $user_input = $form_state->getUserInput();
+      $langcode = isset($user_input[$identifier]) ? $user_input[$identifier] : $this->value;
+      $valid_langcode = $this->getValidLangcode($langcode, $language_options);
+      $this->setExposedValue($identifier, $valid_langcode, $form_state);
+    }
+
+    if ($this->options['limit']) {
+      $form['value']['#options'] = $this->buildLimitedLanguageOptions();
+    }
+    else {
+      $form['value']['#options'] = $this->getValueOptions();
+    }
+  }
+
+  /**
+   * Special setter for exposed value in views.
+   */
+  protected function setExposedValue($identifier, $value, FormStateInterface $form_state) {
+    $user_input = $form_state->getUserInput();
+    $user_input[$identifier] = $value;
+
+    $form_state->setUserInput($user_input);
+    $this->view->setExposedInput($user_input);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildExposedForm(&$form, FormStateInterface $form_state) {
+    parent::buildExposedForm($form, $form_state);
+    $field =& $form[$this->field];
+
+    // Avoide validation error when list of allowed languages changes.
+    if (isset($field['#value']) && !isset($field['#options'][$field['#value']])) {
+      $field['#value'] = $field['#default_value'] = '';
+    }
+    // Show empty registered skills message inside this window.
+    if ($this->options['limit']
+      && empty($this->translatorSkills->getAllLangcodes())) {
+        $field['#options'] = ['All' => $this->t('- Any -')];
+        $field['#value'] = $field['#default_value'] = 'All';
+        $this->translatorSkills->showMissingTranslationSkillsWarning();
+    }
   }
 
   /**
@@ -80,29 +201,70 @@ class TranslationLanguageLimitedToTranslationSkills extends TranslatorsViewsFilt
   }
 
   /**
-   * {@inheritdoc}
+   * Provide options for langcode dropdown.
+   *
+   * @return array
+   *   Available options based on configurable languages.
    */
-  public function getValueOptions() {
-    if (!$this->options['limit']) {
-      $this->valueTitle = $this->t('Language');
-      // Pass the current values so options that are already selected do not get
-      // lost when there are changes in the language configuration.
-      $this->valueOptions = $this->listLanguages(LanguageInterface::STATE_ALL | LanguageInterface::STATE_SITE_DEFAULT | PluginBase::INCLUDE_NEGOTIATED, array_keys($this->value));
+  protected function buildLimitedLanguageOptions() {
+    $options = [];
+    $translators_languages = $this->translatorSkills->getTranslationSkills();
+    // Handle column options.
+    foreach ($this->options['column'] as $name => $column) {
+      if (!empty($column)) {
+        foreach ($translators_languages as $langs) {
+          $this->processColumnOption($langs, $name, $options);
+        }
+      }
     }
-    else {
-      $this->valueTitle = $this->t('Translator skills');
-      $this->valueOptions = parent::getValueOptions();
+    if($this->options['expose']['required']){
+      return $options;
     }
-    return array_merge(['All' => $this->t('- Any -')], $this->valueOptions);
+    return array_merge(['All' => $this->t('- Any -')], $options);
   }
 
   /**
-   * {@inheritdoc}
+   * Process column options.
+   *
+   * @param array $languages
+   *   Languages array.
+   * @param string $column
+   *   Column name.
    */
-  protected function resetOptionsForEmptySkills(array &$field) {
-    // Leave only "- Any -" option if there are no registered skills.
-    $field['#options'] = ['All' => $this->t('- Any -')];
-    $field['#value'] = $field['#default_value'] = 'All';
+  protected function processColumnOption(array $languages, $column, &$options) {
+    $key = "language_$column";
+    if (isset($languages[$key])) {
+      $key = $languages[$key];
+      $options[$key] = $this->languageManager
+        ->getLanguage($key)
+        ->getName();
+    }
   }
 
+  /**
+   * Get a valid langcode from language options.
+   *
+   * @param string $langcode
+   *   Language identifier.
+   * @param array $language_options
+   *   Available language options.
+   *
+   * @return string|null
+   *   A valid langcode, or NULL if no valid langcodes exist.
+   */
+  protected function getValidLangcode($langcode, array $language_options) {
+    if ($langcode === '***LANGUAGE_site_default***') {
+      $langcode = $this->languageManager->getDefaultLanguage()->getId();
+    }
+    elseif ($langcode === '***LANGUAGE_language_interface***') {
+      $langcode = $this->languageManager->getCurrentLanguage()->getId();
+    }
+    if (empty($language_options) || empty($langcode)) {
+      return NULL;
+    }
+    elseif (!empty($language_options) && !isset($language_options[$langcode])) {
+      return array_keys($language_options)[0];
+    }
+    return $langcode;
+  }
 }
diff --git a/modules/translators_content/src/Plugin/views/filter/TranslatorsViewsFiltersBase.php b/modules/translators_content/src/Plugin/views/filter/TranslatorsViewsFiltersBase.php
deleted file mode 100644
index 3bf6751..0000000
--- a/modules/translators_content/src/Plugin/views/filter/TranslatorsViewsFiltersBase.php
+++ /dev/null
@@ -1,285 +0,0 @@
-<?php
-
-namespace Drupal\translators_content\Plugin\views\filter;
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Language\LanguageManagerInterface;
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Core\Session\AccountProxyInterface;
-use Drupal\translators\Services\TranslatorSkills;
-use Drupal\views\Plugin\views\filter\LanguageFilter;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Class TranslatorsViewsFiltersBase.
- *
- * @package Drupal\translators_content\Plugin\views\filter
- */
-abstract class TranslatorsViewsFiltersBase extends LanguageFilter implements ContainerFactoryPluginInterface {
-
-  /**
-   * User skills service.
-   *
-   * @var \Drupal\translators\Services\TranslatorSkills
-   */
-  protected $translatorSkills;
-  /**
-   * Registered languages for the current user.
-   *
-   * @var array
-   */
-  protected $translationSkills = [];
-  /**
-   * {@inheritdoc}
-   */
-  protected $valueOptions = [];
-  /**
-   * Flag about registered skills emptiness.
-   *
-   * @var bool
-   */
-  protected $isEmptySkills = FALSE;
-  /**
-   * Current user account.
-   *
-   * @var \Drupal\Core\Session\AccountProxyInterface
-   */
-  protected $currentUser;
-  /**
-   * Disable the possibility to allow a exposed input to be optional.
-   *
-   * @var bool
-   */
-  protected $alwaysRequired = FALSE;
-
-  /**
-   * Constructs a new TranslatorsViewsFiltersBase instance.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
-   *   Language manager.
-   * @param \Drupal\translators\Services\TranslatorSkills $translatorSkills
-   *   User skills service.
-   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
-   *   Current user.
-   */
-  public function __construct(
-    array $configuration,
-    $plugin_id,
-    $plugin_definition,
-    LanguageManagerInterface $language_manager,
-    TranslatorSkills $translatorSkills,
-    AccountProxyInterface $current_user
-  ) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition, $language_manager);
-    $this->translatorSkills = $translatorSkills;
-    $this->currentUser = $current_user;
-    $this->loadTranslationSkills();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(
-    ContainerInterface $container,
-    array $configuration,
-    $plugin_id,
-    $plugin_definition
-  ) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('language_manager'),
-      $container->get('translators.skills'),
-      $container->get('current_user')
-    );
-  }
-
-  /**
-   * Helper method for initial call the translation skills service.
-   */
-  protected function loadTranslationSkills() {
-    $this->translationSkills = $this->translatorSkills->getTranslationSkills();
-    $this->isEmptySkills = (FALSE === $this->translationSkills
-      || empty($this->translationSkills));
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildExposedForm(&$form, FormStateInterface $form_state) {
-    parent::buildExposedForm($form, $form_state);
-    $this->postProcessExposedForm($form);
-    $this->setSelectedOption($form, $form_state);
-    $form[$this->field]['#required'] = $this->alwaysRequired;
-  }
-
-  /**
-   * Set selected option.
-   *
-   * @param array &$form
-   *   Form array.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   Form state object.
-   */
-  protected function setSelectedOption(array &$form, FormStateInterface $form_state) {
-    $identifier = $this->getIdentifier();
-    $user_input = $form_state->getUserInput();
-    if (isset($user_input[$identifier])) {
-      $form[$identifier]['#value']
-        = $form[$identifier]['#default_value']
-          = $user_input[$identifier];
-    }
-  }
-
-  /**
-   * Get filter identifier.
-   *
-   * @return string
-   *   Identifier string.
-   */
-  protected function getIdentifier() {
-    return $this->options['expose']['identifier'];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getValueOptions() {
-    $this->valueOptions = [];
-    // Leave empty languages list if no user skills are available.
-    if ($this->isEmptySkills) {
-      return $this->valueOptions;
-    }
-    // Handle column options.
-    foreach ($this->options['column'] as $name => $column) {
-      if (!empty($column)) {
-        foreach ($this->translationSkills as $langs) {
-          $this->processColumnOption($langs, $name);
-        }
-      }
-    }
-    return $this->valueOptions;
-  }
-
-  /**
-   * Process column options.
-   *
-   * @param array $languages
-   *   Languages array.
-   * @param string $column
-   *   Column name.
-   */
-  protected function processColumnOption(array $languages, $column) {
-    $key = "language_$column";
-    if (isset($languages[$key])) {
-      $key = $languages[$key];
-      $this->valueOptions[$key] = $this->languageManager
-        ->getLanguage($key)
-        ->getName();
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitOptionsForm(&$form, FormStateInterface $form_state) {
-    $form_state->setValue(['options', 'column', 'source'], $form['column']['source']['#value']);
-    $form_state->setValue(['options', 'column', 'target'], $form['column']['target']['#value']);
-    if ($this->isEmptySkills && $this->options['limit']) {
-      $form['value']['#value'] = [];
-      $this->translatorSkills->showMissingTranslationSkillsWarning();
-    }
-    parent::submitOptionsForm($form, $form_state);
-  }
-
-  /**
-   * Post processor of exposed form builder.
-   *
-   * @param array &$form
-   *   Form array.
-   */
-  protected function postProcessExposedForm(array &$form) {
-    $field =& $form[$this->field];
-    $this->resetElementValuesAndOptions($field);
-    // Show empty registered skills message inside this window.
-    if ($this->isEmptySkills && $this->options['limit']) {
-      $this->translatorSkills->showMissingTranslationSkillsWarning();
-      $this->resetOptionsForEmptySkills($field);
-    }
-    // Build languages list.
-    $field['#options'] += $this->getValueOptions();
-  }
-
-  /**
-   * Reset element's options, value and default_value to an empty array.
-   *
-   * @param array &$field
-   *   Field render-able array.
-   */
-  protected function resetElementValuesAndOptions(array &$field) {
-    $field['#default_value'] = $field['#value'] = $field['#options'] = [];
-  }
-
-  /**
-   * Leave only default option if there are no registered skills.
-   *
-   * @param array &$field
-   *   Filter's field render-able array.
-   */
-  abstract protected function resetOptionsForEmptySkills(array &$field);
-
-  /**
-   * Helper method to get the column options for filter's settings form.
-   *
-   * @return array
-   *   Column options for filter's settings form.
-   */
-  protected function getFilterColumnsOptions() {
-    return [
-      'source' => $this->t('Source languages'),
-      'target'   => $this->t('Target languages'),
-    ];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validate() {
-    // Handle missing translation skills specified for the user.
-    if ($this->isEmptySkills && $this->options['limit']) {
-      $this->translatorSkills->showMissingTranslationSkillsWarning();
-    }
-    return parent::validate();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheTags() {
-    $cache_tags = parent::getCacheTags();
-    // Additional cachetags to allow filters to rebuild
-    // after the user's skills gets changed.
-    if (!$this->currentUser->isAnonymous()) {
-      $cache_tags[] = "user:{$this->currentUser->id()}";
-    }
-    return $cache_tags;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function listLanguages($flags = LanguageInterface::STATE_ALL, array $current_values = NULL) {
-    return array_map(function ($language) {
-      return (string) $language;
-    }, parent::listLanguages($flags, $current_values));
-  }
-
-}
