diff --git a/core/lib/Drupal/Core/Annotation/Translation.php b/core/lib/Drupal/Core/Annotation/Translation.php
index e1cc845..ae1adf8 100644
--- a/core/lib/Drupal/Core/Annotation/Translation.php
+++ b/core/lib/Drupal/Core/Annotation/Translation.php
@@ -26,17 +26,12 @@
  * Remove spaces after @ in your actual plugin - these are put into this sample
  * code so that it is not recognized as annotation.
  *
- * To provide replacement values for placeholders, use the "arguments" array:
- * @code
- *   title = @ Translation("Bundle !title", arguments = {"!title" = "Foo"}),
- * @endcode
- *
  * It is also possible to provide a context with the text, similar to t():
  * @code
  *   title = @ Translation("Bundle", context = "Validation"),
  * @endcode
- * Other t() arguments like language code are not valid to pass in. Only
- * context is supported.
+ * Other t() options like language code are not valid to pass in. Only context
+ * is supported.
  *
  * @see i18n
  * @see annotation
@@ -73,20 +68,17 @@ class Translation extends AnnotationBase {
    * @param array $values
    *   Possible array keys:
    *   - value (required): the string that is to be translated.
-   *   - arguments (optional): an array with placeholder replacements, keyed by
-   *     placeholder.
    *   - context (optional): a string that describes the context of "value";
    */
   public function __construct(array $values) {
     $string = $values['value'];
-    $arguments = isset($values['arguments']) ? $values['arguments'] : array();
     $options = array();
     if (!empty($values['context'])) {
       $options = array(
         'context' => $values['context'],
       );
     }
-    $this->translation = new TranslationWrapper($string, $arguments, $options);
+    $this->translation = new TranslationWrapper($string, $options);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/Annotation/ConfigEntityType.php b/core/lib/Drupal/Core/Entity/Annotation/ConfigEntityType.php
index 4720b35..0df0c2e 100644
--- a/core/lib/Drupal/Core/Entity/Annotation/ConfigEntityType.php
+++ b/core/lib/Drupal/Core/Entity/Annotation/ConfigEntityType.php
@@ -37,7 +37,7 @@ class ConfigEntityType extends EntityType {
    * {@inheritdoc}
    */
   public function get() {
-    $this->definition['group_label'] = new TranslationWrapper('Configuration', array(), array('context' => 'Entity type group'));
+    $this->definition['group_label'] = new TranslationWrapper('Configuration', array('context' => 'Entity type group'));
 
     return parent::get();
   }
diff --git a/core/lib/Drupal/Core/Entity/Annotation/ContentEntityType.php b/core/lib/Drupal/Core/Entity/Annotation/ContentEntityType.php
index 34363a5..3e4f9d8 100644
--- a/core/lib/Drupal/Core/Entity/Annotation/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/Annotation/ContentEntityType.php
@@ -37,7 +37,7 @@ class ContentEntityType extends EntityType {
    * {@inheritdoc}
    */
   public function get() {
-    $this->definition['group_label'] = new TranslationWrapper('Content', array(), array('context' => 'Entity type group'));
+    $this->definition['group_label'] = new TranslationWrapper('Content', array('context' => 'Entity type group'));
 
     return parent::get();
   }
diff --git a/core/lib/Drupal/Core/StringTranslation/TranslationWrapper.php b/core/lib/Drupal/Core/StringTranslation/TranslationWrapper.php
index 3a36db5..f7d83ce 100644
--- a/core/lib/Drupal/Core/StringTranslation/TranslationWrapper.php
+++ b/core/lib/Drupal/Core/StringTranslation/TranslationWrapper.php
@@ -16,6 +16,10 @@
  * system is ready. This is useful for using translation in very low level
  * subsystems like entity definition and stream wrappers.
  *
+ * Because this class is for low-level strings defined in places like
+ * annotations, there is no support for arguments since those would be fixed
+ * strings that should simply be included in the string.
+ *
  * @see \Drupal\Core\Annotation\Translation
  */
 class TranslationWrapper implements SafeStringInterface {
@@ -29,13 +33,6 @@ class TranslationWrapper implements SafeStringInterface {
   protected $string;
 
   /**
-   * The translation arguments.
-   *
-   * @var array
-   */
-  protected $arguments;
-
-  /**
    * The translation options.
    *
    * @var array
@@ -50,14 +47,11 @@ class TranslationWrapper implements SafeStringInterface {
    *
    * @param string $string
    *   The string that is to be translated.
-   * @param array $arguments
-   *   (optional) An array with placeholder replacements, keyed by placeholder.
    * @param array $options
    *   (optional) An array of additional options.
    */
-  public function __construct($string, array $arguments = array(), array $options = array()) {
+  public function __construct($string, array $options = []) {
     $this->string = $string;
-    $this->arguments = $arguments;
     $this->options = $options;
   }
 
@@ -85,6 +79,16 @@ public function getOption($name) {
   }
 
   /**
+   * Gets all options from this translation wrapper.
+   *
+   * @return array
+   *   The array of options.
+   */
+  public function getOptions() {
+    return $this->options;
+  }
+
+  /**
    * Implements the magic __toString() method.
    */
   public function __toString() {
@@ -98,14 +102,14 @@ public function __toString() {
    *   The translated string.
    */
   public function render() {
-    return $this->t($this->string, $this->arguments, $this->options);
+    return $this->t($this->string, [], $this->options);
   }
 
   /**
    * Magic __sleep() method to avoid serializing the string translator.
    */
   public function __sleep() {
-    return array('string', 'arguments', 'options');
+    return array('string', 'options');
   }
 
 }
diff --git a/core/modules/locale/src/LocaleConfigManager.php b/core/modules/locale/src/LocaleConfigManager.php
index d96c758..f0e9620 100644
--- a/core/modules/locale/src/LocaleConfigManager.php
+++ b/core/modules/locale/src/LocaleConfigManager.php
@@ -173,7 +173,7 @@ protected function getTranslatableData(TypedDataInterface $element) {
         if (isset($definition['translation context'])) {
           $options['context'] = $definition['translation context'];
         }
-        return new TranslationWrapper($element->getValue(), array(), $options);
+        return new TranslationWrapper($element->getValue(), $options);
       }
     }
     return $translatable;
diff --git a/core/tests/Drupal/Tests/Core/Annotation/TranslationTest.php b/core/tests/Drupal/Tests/Core/Annotation/TranslationTest.php
index be8cca3..4536d27 100644
--- a/core/tests/Drupal/Tests/Core/Annotation/TranslationTest.php
+++ b/core/tests/Drupal/Tests/Core/Annotation/TranslationTest.php
@@ -41,13 +41,12 @@ public function testGet(array $values, $expected) {
     $container->set('string_translation', $this->translationManager);
     \Drupal::setContainer($container);
 
-    $arguments = isset($values['arguments']) ? $values['arguments'] : array();
     $options = isset($values['context']) ? array(
       'context' => $values['context'],
     ) : array();
     $this->translationManager->expects($this->once())
       ->method('translate')
-      ->with($values['value'], $arguments, $options);
+      ->with($values['value'], [], $options);
 
     $annotation = new Translation($values);
 
@@ -65,19 +64,12 @@ public function providerTestGet() {
       ),
       'Foo'
     );
-    $random = $this->randomMachineName();
-    $random_html_entity = '&' . $random;
     $data[] = array(
       array(
-        'value' => 'Foo !bar @baz %qux',
-        'arguments' => array(
-          '!bar' => $random,
-          '@baz' => $random_html_entity,
-          '%qux' => $random_html_entity,
-        ),
+        'value' => 'Foo',
         'context' => $this->randomMachineName(),
       ),
-      'Foo ' . $random . ' &amp;' . $random . ' <em class="placeholder">&amp;' . $random . '</em>',
+      'Foo',
     );
 
     return $data;
diff --git a/core/tests/Drupal/Tests/Core/StringTranslation/TranslationWrapperTest.php b/core/tests/Drupal/Tests/Core/StringTranslation/TranslationWrapperTest.php
new file mode 100644
index 0000000..91eeaf3
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/StringTranslation/TranslationWrapperTest.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\StringTranslation\TranslationManagerTest.
+ */
+
+namespace Drupal\Tests\Core\StringTranslation;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\StringTranslation\TranslationWrapper;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\StringTranslation\TranslationWrapper
+ * @group StringTranslation
+ */
+class TranslationWrapperTest extends UnitTestCase {
+
+  /**
+   * The translation manager used for testing.
+   *
+   * @var \Drupal\Core\StringTranslation\TranslationInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $translationManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->translationManager = $this->getStringTranslationStub();
+    $container = new ContainerBuilder();
+    $container->set('string_translation', $this->translationManager);
+    \Drupal::setContainer($container);
+  }
+
+  /**
+   * @covers ::__construct
+   * @covers ::__toString
+   * @covers ::render
+   *
+   * @dataProvider providerTestConstruction
+   */
+  public function testConstruction($expected, $string, $options = []) {
+
+    $this->translationManager->expects($this->exactly(2))
+      ->method('translate')
+      ->with($string, [], $options);
+
+    $wrapper = new TranslationWrapper($string, $options);
+
+    $this->assertSame($expected, (string) $wrapper);
+    $this->assertSame($expected, $wrapper->render());
+  }
+
+  /**
+   * Provides data to self::testConstruction().
+   */
+  public function providerTestConstruction() {
+    $data = array();
+    $data[] = array(
+      'Foo',
+      'Foo',
+    );
+
+    $data[] = array(
+      'Foo',
+      'Foo',
+      ['context' => 'Bar'],
+    );
+
+    return $data;
+  }
+
+}
