diff --git a/core/modules/language/lib/Drupal/language/Plugin/Core/Condition/Language.php b/core/modules/language/lib/Drupal/language/Plugin/Core/Condition/Language.php
new file mode 100644
index 0000000..dbe6d28
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Plugin/Core/Condition/Language.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\language\Plugin\Core\Condition\Language.
+ */
+
+namespace Drupal\language\Plugin\Core\Condition;
+
+use Drupal\Core\Condition\ConditionPluginBase;
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Provides a 'Language' condition.
+ *
+ * @Plugin(
+ *   id = "language",
+ *   label = @Translation("Language"),
+ *   module = "language"
+ * )
+ */
+class Language extends ConditionPluginBase {
+
+  /**
+   * Overrides \Drupal\Core\Condition\ConditionPluginBase::buildForm().
+   */
+  public function buildForm(array $form, array &$form_state) {
+    if (language_multilingual()) {
+      $configurable_language_types = language_types_get_configurable();
+
+      // Fetch languages.
+      $languages = language_list(LANGUAGE_ALL);
+      foreach ($languages as $language) {
+        // @todo $language->name is not wrapped with t(), it should be replaced
+        //   by CMI translation implementation.
+        $langcodes_options[$language->langcode] = $language->name;
+      }
+      // If there are multiple configurable language types, let the user pick
+      // which one should be applied to this condition.
+      $language_types = language_types_info();
+      $language_type_options = array();
+      foreach ($configurable_language_types as $type_key) {
+        $language_type_options[$type_key] = $language_types[$type_key]['name'];
+      }
+      $form['language_type'] = array(
+        '#type' => 'radios',
+        '#title' => t('Language type'),
+        '#options' => $language_type_options,
+        '#default_value' => !empty($this->configuration['language_type']) ? $this->configuration['language_type'] : $configurable_language_types[0],
+        '#access' => count($language_type_options) > 1,
+      );
+      $form['langcodes'] = array(
+        '#type' => 'checkboxes',
+        '#title' => t('Show this block only for specific languages'),
+        '#default_value' => !empty($this->configuration['langcodes']) ? $this->configuration['langcodes'] : array(),
+        '#options' => $langcodes_options,
+        '#description' => t('Show this block only for the selected language(s). If you select no languages, the block will be visibile in all languages.'),
+      );
+    }
+    else {
+      $form['language']['langcodes'] = array(
+        '#type' => 'value',
+        '#value' => !empty($this->configuration['langcodes']) ? $this->configuration['langcodes'] : array()
+      );
+      $form['language']['language_type'] = array(
+        '#type' => 'value',
+        '#value' => !empty($this->configuration['language_type']) ? $this->configuration['language_type'] : NULL
+      );
+    }
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * Overrides \Drupal\Core\Condition\ConditionPluginBase::submitForm().
+   */
+  public function submitForm(array &$form, array &$form_state) {
+    $this->configuration['langcodes'] = array_filter($form_state['values']['langcodes']);
+    $this->configuration['language_type'] = $form_state['values']['language_type'];
+    parent::submitForm($form, $form_state);
+  }
+
+  /**
+   * Implements \Drupal\Core\Executable\ExecutableInterface::summary().
+   */
+  public function summary() {
+    $language_list = language_list(LANGUAGE_ALL);
+    $selected = $this->configuration['langcodes'];
+    // Reduce the language list to an array of language names.
+    $language_names = array_reduce($language_list, function(&$result, $item) use ($selected) {
+      if (!empty($selected[$item->langcode])) {
+        $result[$item->langcode] = $item->name;
+      }
+      return $result;
+    }, array());
+
+    // Collate language type names.
+    $language_types = language_types_info();
+    $language_type_options = array();
+    foreach ($language_types as $type_key => $info) {
+      if (!empty($info['name'])) {
+        $language_type_options[$type_key] = $info['name'];
+      }
+    }
+    if (count($this->configuration['langcodes']) > 1) {
+      $last = array_pop($language_names);
+      $languages = implode(', ', $language_names);
+      return t('The @type language is @not@languages or @last.',
+        array(
+          '@type' => $language_type_options[$this->configuration['language_type']],
+          '@languages' => $languages,
+          '@last' => $last,
+          '@not' => !empty($this->configuration['negate']) ? 'not ' : ''
+        )
+      );
+    }
+    $language = array_pop($language_names);
+    return t('The @type language is @not@language.',
+      array(
+        '@type' => $language_type_options[$this->configuration['language_type']],
+        '@language' => $language,
+        '@not' => !empty($this->configuration['negate']) ? 'not ' : ''
+      )
+    );
+  }
+
+  /**
+   * Implements \Drupal\condition\ConditionInterface::evaluate().
+   */
+  public function evaluate() {
+    // Language visibility settings.
+    if (!empty($this->configuration['langcodes'])) {
+      if (empty($this->configuration['langcodes'][language($this->configuration['language_type'])->langcode])) {
+        return FALSE;
+      }
+    }
+    return TRUE;
+  }
+
+}
diff --git a/core/modules/language/lib/Drupal/language/Tests/Condition/LanguageConditionTest.php b/core/modules/language/lib/Drupal/language/Tests/Condition/LanguageConditionTest.php
new file mode 100644
index 0000000..7bb532c
--- /dev/null
+++ b/core/modules/language/lib/Drupal/language/Tests/Condition/LanguageConditionTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\language\Tests\Condition\LanguageConditionTest.
+ */
+
+namespace Drupal\language\Tests\Condition;
+
+use Drupal\simpletest\DrupalUnitTestBase;
+use Drupal\Core\Condition\ConditionManager;
+use Drupal\Core\Language\Language;
+
+
+/**
+ * Tests the language condition.
+ */
+class LanguageConditionTest extends DrupalUnitTestBase {
+
+  /**
+   * The condition plugin manager.
+   *
+   * @var \Drupal\Core\Condition\ConditionManager
+   */
+  protected $manager;
+
+  public static $modules = array('system', 'language');
+
+  /**
+   * Defines test information.
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Language Condition Plugin',
+      'description' => 'Tests that the language condition, provided by the language module, is working properly.',
+      'group' => 'Condition API',
+    );
+  }
+
+  /**
+   * Sets up the tests.
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('language', 'language');
+    // This is needed for language_default().
+    // @todo remove this when language_default() no longer needs variable_get().
+    $this->installSchema('system', 'variable');
+
+    // Setup English.
+    $default_language = language_save(language_default());
+
+    // Setup Italian.
+    $language = new Language(array(
+      'langcode' => 'it',
+      'name' => 'Italian',
+      'direction' => '0',
+    ));
+    language_save($language);
+
+    $this->manager = new ConditionManager($this->container->getParameter('container.namespaces'));
+  }
+
+  /**
+   * Tests conditions.
+   */
+  public function testConditions() {
+    // Grab the language condition and configure it to check the content
+    // language.
+    $condition = $this->manager->createInstance('language')
+      ->setConfig('langcodes', array('en' => 'en', 'it' => 'it'))
+      ->setConfig('language_type', LANGUAGE_TYPE_CONTENT);
+    $this->assertTRUE($condition->execute(), 'Language condition passes as expected.');
+    // Check for the proper summary.
+    $this->assertEqual('The Content language is English or Italian.', $condition->summary());
+  }
+
+}
