diff --git a/core/lib/Drupal/Component/Gettext/PoHeader.php b/core/lib/Drupal/Component/Gettext/PoHeader.php
index 3136f2e..48d8010 100644
--- a/core/lib/Drupal/Component/Gettext/PoHeader.php
+++ b/core/lib/Drupal/Component/Gettext/PoHeader.php
@@ -90,7 +90,7 @@ public function __construct($langcode = NULL) {
    *   Plural form component from the header, for example:
    *   'nplurals=2; plural=(n > 1);'.
    */
-  function getPluralForms() {
+  public function getPluralForms() {
     return $this->_pluralForms;
   }
 
@@ -100,7 +100,7 @@ function getPluralForms() {
    * @param string $languageName
    *   Human readable language name.
    */
-  function setLanguageName($languageName) {
+  public function setLanguageName($languageName) {
     $this->_languageName = $languageName;
   }
 
@@ -110,7 +110,7 @@ function setLanguageName($languageName) {
    * @return string
    *   The human readable language name.
    */
-  function getLanguageName() {
+  public function getLanguageName() {
     return $this->_languageName;
   }
 
@@ -120,7 +120,7 @@ function getLanguageName() {
    * @param string $projectName
    *   Human readable project name.
    */
-  function setProjectName($projectName) {
+  public function setProjectName($projectName) {
     $this->_projectName = $projectName;
   }
 
@@ -130,7 +130,7 @@ function setProjectName($projectName) {
    * @return string
    *   The human readable project name.
    */
-  function getProjectName() {
+  public function getProjectName() {
     return $this->_projectName;
   }
 
@@ -195,7 +195,7 @@ public function __toString() {
    *
    * @throws Exception
    */
-  function parsePluralForms($pluralforms) {
+  public function parsePluralForms($pluralforms) {
     $plurals = array();
     // First, delete all whitespace.
     $pluralforms = strtr($pluralforms, array(" " => "", "\t" => ""));
diff --git a/core/tests/Drupal/Tests/Component/Gettext/PoHeaderTest.php b/core/tests/Drupal/Tests/Component/Gettext/PoHeaderTest.php
index d3fb940..78201f9 100644
--- a/core/tests/Drupal/Tests/Component/Gettext/PoHeaderTest.php
+++ b/core/tests/Drupal/Tests/Component/Gettext/PoHeaderTest.php
@@ -13,9 +13,8 @@
 /**
  * Unit tests for the Gettext PO file header handling features.
  *
- * @see Drupal\Component\Gettext\PoHeader.
- *
- * @group Gettext
+ * @coversDefaultClass \Drupal\Component\Gettext\PoHeader
+ * @group gettext
  */
 class PoHeaderTest extends UnitTestCase {
 
@@ -31,6 +30,7 @@ class PoHeaderTest extends UnitTestCase {
    *   Array of expected plural positions keyed by plural value.
    *
    * @dataProvider providerTestPluralsFormula
+   * @covers ::parsePluralForms
    */
   public function testPluralsFormula($plural, $expected) {
     $p = new PoHeader();
@@ -372,4 +372,54 @@ public function providerTestPluralsFormula() {
     );
   }
 
+  /**
+   * @covers ::getPluralForms
+   * @covers ::parseHeader
+   * @covers ::setFromString
+   * @covers ::__toString
+   */
+  public function testSetFromString() {
+    $header = "Project-Id-Version: Drupal core (7.11)\n"
+      . "POT-Creation-Date: 2012-02-12 22:59+0000\n"
+      . "PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
+      . "Language-Team: Catalan\n"
+      . "MIME-Version: 1.0\n"
+      . "Content-Type: text/plain; charset=utf-8\n"
+      . "Content-Transfer-Encoding: 8bit\n"
+      . "Plural-Forms: nplurals=2; plural=(n>1);\n";
+
+    $p = new PoHeader();
+    $p->setFromString($header);
+    $this->assertEquals('nplurals=2; plural=(n>1);', $p->getPluralForms());
+
+    $language = 'Spanish';
+    $project = 'Drupal core';
+    $p->setLanguageName($language);
+    $p->setProjectName($project);
+
+    $this->assertContains('Spanish translation of Drupal core', (string) $p);
+  }
+
+  /**
+   * @covers ::getLanguageName
+   * @covers ::setLanguageName
+   */
+  public function testGetSetLanguageName() {
+    $language = 'Spanish';
+    $p = new PoHeader();
+    $p->setLanguageName($language);
+    $this->assertEquals($language, $p->getLanguageName());
+  }
+
+  /**
+   * @covers ::getProjectName
+   * @covers ::setProjectName
+   */
+  public function testGetSetProjectName() {
+    $project = 'Drupal core';
+    $p = new PoHeader();
+    $p->setProjectName($project);
+    $this->assertEquals($project, $p->getProjectName());
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Component/Gettext/PoItemTest.php b/core/tests/Drupal/Tests/Component/Gettext/PoItemTest.php
new file mode 100644
index 0000000..a93cb24
--- /dev/null
+++ b/core/tests/Drupal/Tests/Component/Gettext/PoItemTest.php
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Component\Gettext\PoItemTest.
+ */
+
+namespace Drupal\Tests\Component\Gettext {
+
+  use Drupal\Component\Gettext\PoItem;
+  use Drupal\Tests\UnitTestCase;
+
+  /**
+   * Unit tests for the Gettext PO items.
+   *
+   * @coversDefaultClass \Drupal\Component\Gettext\PoItem
+   * @group gettext
+   */
+  class PoItemTest extends UnitTestCase {
+
+    /**
+     * @var \Drupal\Component\Gettext\PoItem
+     */
+    protected $poItem;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setUp() {
+      $this->poItem = new PoItem();
+    }
+
+    /**
+     * @covers ::getLangcode
+     * @covers ::setLangcode
+     */
+    public function testGetSetLangcode() {
+      $langcode = 'es';
+      $this->poItem->setLangcode($langcode);
+      $this->assertEquals($langcode, $this->poItem->getLangcode());
+    }
+
+    /**
+     * @covers ::getContext
+     * @covers ::setContext
+     */
+    public function testGetSetContext() {
+      $context = 'context';
+      $this->poItem->setContext($context);
+      $this->assertEquals($context, $this->poItem->getContext());
+    }
+
+    /**
+     * @covers ::getSource
+     * @covers ::setSource
+     */
+    public function testGetSetSource() {
+      $source = 'Source string';
+      $this->poItem->setSource($source);
+      $this->assertEquals($source, $this->poItem->getSource());
+    }
+
+    /**
+     * @covers ::getTranslation
+     * @covers ::setTranslation
+     */
+    public function testGetSetTranslation() {
+      $translation = 'Translated string';
+      $this->poItem->setTranslation($translation);
+      $this->assertEquals($translation, $this->poItem->getTranslation());
+    }
+
+    /**
+     * @covers ::isPlural
+     * @covers ::setPlural
+     */
+    public function testPlural() {
+      $this->poItem->setPlural(FALSE);
+      $this->assertFalse($this->poItem->isPlural());
+
+      $this->poItem->setPlural(TRUE);
+      $this->assertTrue($this->poItem->isPlural());
+    }
+
+    /**
+     * @covers ::getComment
+     * @covers ::setComment
+     */
+    public function testGetSetComment() {
+      $comment = 'Translation comment';
+      $this->poItem->setComment($comment);
+      $this->assertEquals($comment, $this->poItem->getComment());
+    }
+
+    /**
+     * @covers ::setFromArray
+     * @covers ::getContext
+     * @covers ::getSource
+     * @covers ::getTranslation
+     * @covers ::getComment
+     * @covers ::isPlural
+     * @covers ::__toString
+     * @covers ::formatItem
+     */
+    public function testSetFromArray() {
+      $values = [
+        'context' => 'context',
+        'source' => 'Source string',
+        'translation' => 'Translated string',
+        'comment' => 'A comment',
+      ];
+      $this->poItem->setFromArray($values);
+      $this->assertEquals($values['context'], $this->poItem->getContext());
+      $this->assertEquals($values['source'], $this->poItem->getSource());
+      $this->assertEquals($values['translation'], $this->poItem->getTranslation());
+      $this->assertEquals($values['comment'], $this->poItem->getComment());
+      // @todo shouldn't this default to return FALSE?
+      $this->assertNull($this->poItem->isPlural());
+      $expected = 'msgctxt "context"' . "\n" . 'msgid "Source string"' . "\n" . 'msgstr "Translated string"' . "\n\n";
+      $this->assertEquals($expected, (string) $this->poItem);
+
+
+      $plural = [
+        'context' => 'context',
+        'source' => 'Source string' . \LOCALE_PLURAL_DELIMITER . 'Source strings',
+        'translation' => 'Translated string' . \LOCALE_PLURAL_DELIMITER . 'Source translations',
+        'comment' => 'A comment',
+      ];
+      $this->poItem->setFromArray($plural);
+      $this->assertEquals($plural['context'], $this->poItem->getContext());
+      $this->assertArrayEquals(explode(LOCALE_PLURAL_DELIMITER, $plural['source']), $this->poItem->getSource());
+      $this->assertArrayEquals(explode(LOCALE_PLURAL_DELIMITER, $plural['translation']), $this->poItem->getTranslation());
+      $this->assertEquals($plural['comment'], $this->poItem->getComment());
+      $this->assertTrue($this->poItem->isPlural());
+      $expected = 'msgctxt "context"' . "\n" . 'msgid "Source string"' . "\n" . 'msgid_plural "Source strings"' . "\n" . 'msgstr[0] "Translated string"' . "\n" . 'msgstr[1] "Source translations"' . "\n\n";
+      $this->assertEquals($expected, (string) $this->poItem);
+    }
+  }
+}
+namespace {
+  if (!defined('LOCALE_PLURAL_DELIMITER')) {
+    define('LOCALE_PLURAL_DELIMITER', "\03");
+  }
+}
