diff --git a/README.md b/README.md
index 1f8ab3e..07074c0 100644
--- a/README.md
+++ b/README.md
@@ -44,6 +44,19 @@ themes, as a choice to be applied.
 Each module can have its own style for paragraphs defined as YAML based
 configuration schema. See *paragraphs_collection.api.php* for more information.
 
+## Visibility per language
+Allows specific paragraphs to be hidden for certain languages.
+
+For each individual paragraph entity, a set of languages can be selected. For
+these languages the paragraph entity is not displayed. (Alternatively, you can
+chose to show the paragraph exclusively for the selected set of languages.)
+
+In order for this plugin's UI to work correctly, you will need to download the
+required files of the [Select2](https://select2.github.io/) library and copy
+them into your Drupal installation. You will need:
+  - \<Drupal_8_(web)_root\>/libraries/select2/dist/js/select2.full.min.js
+  - \<Drupal_8_(web)_root\>/libraries/select2/dist/css/select2.min.css
+
 REQUIREMENTS
 ------------
 This module requires the following modules:
diff --git a/config/schema/paragraphs_collection.schema.yml b/config/schema/paragraphs_collection.schema.yml
index 55a3225..533c1e8 100644
--- a/config/schema/paragraphs_collection.schema.yml
+++ b/config/schema/paragraphs_collection.schema.yml
@@ -15,3 +15,6 @@ paragraphs.behavior.settings.grid_layout:
       sequence:
        type: string
       label: Available grid layouts
+paragraphs.behavior.settings.language:
+  type: paragraphs.behavior.settings_base
+  mapping: {}
diff --git a/css/language.css b/css/language.css
new file mode 100644
index 0000000..f83d594
--- /dev/null
+++ b/css/language.css
@@ -0,0 +1,13 @@
+.paragraphs-behavior-language-behavior-form .paragraphs-behavior-language-behavior-form-languages {
+  width: 100%;
+}
+
+.paragraphs-behavior-language-behavior-form > .fieldset-wrapper {
+  width: 100%;
+  display: inline-flex;
+}
+
+.paragraphs-behavior-language-behavior-form > .fieldset-wrapper div:nth-child(2n) {
+  width: 100%;
+  margin-left: 0.5em;
+}
diff --git a/js/language.js b/js/language.js
new file mode 100644
index 0000000..f01cfa5
--- /dev/null
+++ b/js/language.js
@@ -0,0 +1,21 @@
+/**
+ * @file language.js
+ */
+(function ($, Drupal) {
+
+  "use strict";
+
+  /**
+   * Registers behaviours related to the Language behavior plugin.
+   */
+
+  Drupal.behaviors.language = {
+    attach: function (context) {
+      // Use Select2 for better "select multiple languages" UI.
+      $('.paragraphs-behavior-language-behavior-form-languages').select2({
+        placeholder: 'Select a language.',
+      });
+    }
+  };
+
+}(jQuery, Drupal));
diff --git a/modules/paragraphs_collection_demo/paragraphs_collection_demo.install b/modules/paragraphs_collection_demo/paragraphs_collection_demo.install
index 1d3f65a..9a858d5 100644
--- a/modules/paragraphs_collection_demo/paragraphs_collection_demo.install
+++ b/modules/paragraphs_collection_demo/paragraphs_collection_demo.install
@@ -263,6 +263,25 @@ function _paragraphs_collection_demo_create_demo_article() {
 
   $paragraphs[] = _paragraphs_collection_demo_create_accordion_paragraph($accordion_children);
 
+  // PARAHGRAPH DEMO ITEM: language.
+  // Enable the Language plugin for the 'text' paragraphs type from the
+  // paragraphs_demo module.
+  /** @var ParagraphsType $paragraphs_type */
+  $paragraphs_type = paragraphs_type_load('text');
+  $paragraphs_type->getBehaviorPlugin('language')->setConfiguration(['enabled' => TRUE]);
+  $paragraphs_type->save();
+
+  // Language paragraph.
+  $language_paragraph = _paragraphs_collection_demo_create_text_paragraph('<h2>Language behavior</h2><p>This paragraphs is only visible in English.</p>');
+  $language_paragraph->setBehaviorSettings('language', [
+    'container' => [
+      'visibility' => 'show',
+      'languages' => ['en'],
+    ],
+  ]);
+  $language_paragraph->save();
+  $paragraphs[] = $language_paragraph;
+
   // Create the demo node.
   return _paragraphs_collection_demo_create_node('Paragraphs Collection Demo Article!', $paragraphs);
 }
diff --git a/modules/paragraphs_collection_demo/src/Tests/ParagraphsCollectionDemoTest.php b/modules/paragraphs_collection_demo/src/Tests/ParagraphsCollectionDemoTest.php
index bbd5d5d..07a6c01 100644
--- a/modules/paragraphs_collection_demo/src/Tests/ParagraphsCollectionDemoTest.php
+++ b/modules/paragraphs_collection_demo/src/Tests/ParagraphsCollectionDemoTest.php
@@ -40,6 +40,9 @@ class ParagraphsCollectionDemoTest extends ParagraphsExperimentalTestBase {
     $this->assertFieldById('edit-behavior-plugins-style-settings-group', '');
     // @todo When other plugins are available, add assertion.
 
+    $this->drupalGet('admin/structure/paragraphs_type/text');
+    $this->assertFieldChecked('edit-behavior-plugins-language-enabled');
+
     // Check that demo content has paragraph with enabled plugins.
     $this->drupalGet('admin/content');
     $this->clickLink('Paragraphs Collection Demo Article!');
diff --git a/paragraphs_collection.libraries.yml b/paragraphs_collection.libraries.yml
index 95217dc..9adafb2 100644
--- a/paragraphs_collection.libraries.yml
+++ b/paragraphs_collection.libraries.yml
@@ -18,3 +18,25 @@ plugin_admin:
   css:
     theme:
       css/plugin.admin.css: {}
+
+language:
+  js:
+    js/language.js: {}
+  css:
+    component:
+      css/language.css: {}
+
+select2:
+  remote: https://github.com/ivaynberg/select2
+  version: 4.0.3
+  license:
+    name: MIT
+    url: https://github.com/select2/select2/blob/master/LICENSE.md
+    gpl-compatible: true
+  js:
+    /libraries/select2/dist/js/select2.full.min.js: {}
+  css:
+    component:
+      /libraries/select2/dist/css/select2.min.css: {}
+  dependencies:
+    - core/jquery
diff --git a/src/Plugin/paragraphs/Behavior/ParagraphsLanguagePlugin.php b/src/Plugin/paragraphs/Behavior/ParagraphsLanguagePlugin.php
new file mode 100644
index 0000000..7b2d68f
--- /dev/null
+++ b/src/Plugin/paragraphs/Behavior/ParagraphsLanguagePlugin.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace Drupal\paragraphs_collection\Plugin\paragraphs\Behavior;
+
+use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
+use Drupal\Core\Entity\EntityFieldManager;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Render\Element;
+use Drupal\paragraphs\Entity\Paragraph;
+use Drupal\paragraphs\ParagraphInterface;
+use Drupal\paragraphs\ParagraphsBehaviorBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a way to hide specific paragraphs depending on the current language.
+ *
+ * @ParagraphsBehavior(
+ *   id = "language",
+ *   label = @Translation("Visibility per language"),
+ *   description = @Translation("Restricts visibility of a paragraph per language."),
+ *   weight = 0
+ * )
+ */
+class ParagraphsLanguagePlugin extends ParagraphsBehaviorBase {
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * ParagraphsLanguagePlugin constructor.
+   *
+   * @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\Entity\EntityFieldManager $entity_field_manager
+   *   The entity field manager.
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityFieldManager $entity_field_manager, LanguageManagerInterface $language_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_field_manager);
+
+    $this->languageManager = $language_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static($configuration, $plugin_id, $plugin_definition,
+      $container->get('entity_field.manager'),
+      $container->get('language_manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildBehaviorForm(ParagraphInterface $paragraph, array &$form, FormStateInterface $form_state) {
+    foreach ($this->languageManager->getLanguages() as $language_code => $language) {
+      $options[$language_code] = $language->getName();
+    }
+
+    $form['container'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Visibility per language'),
+    ];
+
+    $form['container']['visibility'] = [
+      '#type' => 'select',
+      '#options' => [
+        'always' => $this->t('- Always visible -'),
+        'hide' => $this->t('Hide for'),
+        'show' => $this->t('Show for'),
+      ],
+      '#default_value' => $paragraph->getBehaviorSetting($this->getPluginId(), ['container', 'visibility']),
+      '#multiple' => FALSE,
+      '#attributes' => [
+        'id' => ['paragraphs-behavior-language-behavior-form-visibility-' . $paragraph->id()],
+      ],
+    ];
+
+    $form['container']['languages'] = [
+      '#type' => 'select',
+      '#options' => $options,
+      '#empty_option' => $this->t('- None -'),
+      '#empty_value' => 'none',
+      '#default_value' => $paragraph->getBehaviorSetting($this->getPluginId(), ['container', 'languages']),
+      '#states' => [
+        'invisible' => [
+          ':input[id="paragraphs-behavior-language-behavior-form-visibility-' . $paragraph->id() . '"]' => ['value' => 'always'],
+        ],
+      ],
+      '#multiple' => TRUE,
+      '#attached' => ['library' => ['paragraphs_collection/select2', 'paragraphs_collection/language']],
+      '#attributes' => [
+        'class' => ['paragraphs-behavior-language-behavior-form-languages'],
+      ],
+    ];
+
+    $form['container']['#attributes']['class'] = 'paragraphs-behavior-language-behavior-form';
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function view(array &$build, Paragraph $paragraphs_entity, EntityViewDisplayInterface $display, $view_mode) {
+    $visibility = $paragraphs_entity->getBehaviorSetting($this->getPluginId(), ['container', 'visibility']);
+    $languages = $paragraphs_entity->getBehaviorSetting($this->getPluginId(), ['container', 'languages']);
+    $current_language = $this->languageManager->getCurrentLanguage();
+
+    // In the 'always' visibility mode: Do not hide the paragraph.
+    if (!$visibility || $visibility == 'always') {
+      return $build;
+    }
+
+    $show = TRUE;
+
+    // In the 'show' visibility mode: Hide the paragraph, if the current
+    // language is not among the selected ones.
+    if ($visibility == 'show' && !in_array($current_language->getId(), $languages)) {
+      $show = FALSE;
+    }
+
+    // In the 'hide' visibility mode: Hide the paragraph, if the current
+    // language is among the selected ones.
+    if ($visibility == 'hide' && in_array($current_language->getId(), $languages)) {
+      $show = FALSE;
+    }
+
+    if (!$show) {
+      foreach (Element::children($build) as $children) {
+        $build[$children]['#access'] = FALSE;
+      }
+    }
+
+    return $build;
+  }
+
+}
diff --git a/src/Tests/ParagraphsLanguagePluginTest.php b/src/Tests/ParagraphsLanguagePluginTest.php
new file mode 100644
index 0000000..a415fca
--- /dev/null
+++ b/src/Tests/ParagraphsLanguagePluginTest.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Drupal\paragraphs_collection\Tests;
+
+use Drupal\field_ui\Tests\FieldUiTestTrait;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\paragraphs\Tests\Experimental\ParagraphsExperimentalTestBase;
+
+/**
+ * Tests the Language plugin.
+ *
+ * @group paragraphs_collection
+ * @requires module paragraphs
+ */
+class ParagraphsLanguagePluginTest extends ParagraphsExperimentalTestBase {
+
+  use FieldUiTestTrait;
+
+  /**
+   * Modules to be enabled.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'paragraphs_collection',
+    'language',
+    'link',
+  ];
+
+  /**
+   * Tests the Language plugin settings and functionality.
+   */
+  public function testVisibilityForLanguageSelection() {
+    // Create a content type with a paragraphs field.
+    $content_type = 'test_content_type';
+    $paragraphs_field = 'test_paragraphs_field';
+    $this->addParagraphedContentType($content_type, $paragraphs_field);
+    $this->loginAsAdmin([
+      'create ' . $content_type . ' content',
+      'edit any ' . $content_type . ' content',
+      'edit behavior plugin settings',
+    ]);
+
+    // Create a paragraphs type with a text field.
+    $paragraphs_type = 'test_paragraphs_type';
+    $this->addParagraphsType($paragraphs_type);
+    static::fieldUIAddNewField('admin/structure/paragraphs_type/' . $paragraphs_type, 'test_text_field', 'Text', 'text_long', [], []);
+
+    // Add a second language (German) to the site.
+    ConfigurableLanguage::createFromLangcode('de')->save();
+
+    // Enable the Language plugin.
+    $this->drupalGet('admin/structure/paragraphs_type/' . $paragraphs_type);
+    $edit = [
+      'behavior_plugins[language][enabled]' => TRUE,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save'));
+
+    // Create a paragraphed content node.
+    $this->drupalGet('node/add/' . $content_type);
+    $this->drupalPostAjaxForm(NULL, [], $paragraphs_field . '_' . $paragraphs_type . '_add_more');
+    $node_title = 'Test Node';
+    $node_text = 'This is a text.';
+    $edit = [
+      'title[0][value]' => $node_title,
+      $paragraphs_field . '[0][subform][field_test_text_field][0][value]' => $node_text,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and publish'));
+
+    // Check that we are on the node page and the text field content is visible.
+    $this->assertTitle($node_title . ' | Drupal');
+    $this->assertText($node_text);
+
+    // Hide the text field with the Language plugin for English.
+    $node_id = $this->drupalGetNodeByTitle($node_title)->id();
+    $this->drupalGet('node/' . $node_id . '/edit');
+    $edit = [
+      $paragraphs_field . '[0][behavior_plugins][language][container][visibility]' => 'hide',
+      $paragraphs_field . '[0][behavior_plugins][language][container][languages][]' => ['en'],
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
+
+    // Check that we are on the node page and the text field content is not
+    // visible.
+    $this->drupalGet('node/' . $node_id);
+    $this->assertTitle($node_title . ' | Drupal');
+    $this->assertNoText($node_text);
+
+    // Hide the text field with the Language plugin for all languages but
+    // German.
+    $this->drupalGet('node/' . $node_id . '/edit');
+    $edit = [
+      $paragraphs_field . '[0][behavior_plugins][language][container][visibility]' => 'show',
+      $paragraphs_field . '[0][behavior_plugins][language][container][languages][]' => ['de'],
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save and keep published'));
+
+    // Check that we are on the node page and the text field content is again
+    // not visible.
+    $this->drupalGet('node/' . $node_id);
+    $this->assertTitle($node_title . ' | Drupal');
+    $this->assertNoText($node_text);
+  }
+
+}
