diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 2076707..a05bfaa 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -12,6 +12,7 @@
 use Drupal\Core\DependencyInjection\Compiler\RegisterMatchersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterRouteFiltersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterSerializationClassesPass;
+use Drupal\Core\DependencyInjection\Compiler\RegisterParamConvertersPass;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
@@ -174,6 +175,15 @@ public function build(ContainerBuilder $container) {
     $container->register('mime_type_matcher', 'Drupal\Core\Routing\MimeTypeMatcher')
       ->addTag('route_filter');
 
+    $container->register('paramconverter_manager', 'Drupal\Core\ParamConverter\ParamConverterManager')
+      ->addMethodCall('setContainer', array(new Reference('service_container')));
+    $container->register('paramconverter.entity_alias', 'Drupal\Core\ParamConverter\EntityAliasConverter')
+      ->addTag('paramconverter', array('weight' => 0));
+    $container->register('paramconverter.entity', 'Drupal\Core\ParamConverter\EntityConverter')
+      ->addTag('paramconverter', array('weight' => 10));
+    $container->register('paramconverter.variable_map', 'Drupal\Core\ParamConverter\VariableMapConverter')
+      ->addTag('paramconverter', array('weight' => 20));
+
     $container->register('router_processor_subscriber', 'Drupal\Core\EventSubscriber\RouteProcessorSubscriber')
       ->addTag('event_subscriber');
     $container->register('router_listener', 'Symfony\Component\HttpKernel\EventListener\RouterListener')
@@ -245,6 +255,9 @@ public function build(ContainerBuilder $container) {
     // Add a compiler pass for registering event subscribers.
     $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
     $container->addCompilerPass(new RegisterAccessChecksPass());
+    // Add a compiler pass for upcasting of entity route parameters.
+    $container->addCompilerPass(new RegisterParamConvertersPass());
+
   }
 
   /**
@@ -268,7 +281,9 @@ protected function registerRouting(ContainerBuilder $container) {
     $container->register('router.dynamic', 'Symfony\Cmf\Component\Routing\DynamicRouter')
       ->addArgument(new Reference('router.request_context'))
       ->addArgument(new Reference('router.matcher'))
-      ->addArgument(new Reference('router.generator'));
+      ->addArgument(new Reference('router.generator'))
+      ->addMethodCall('addRouteEnhancer', array(new Reference('paramconverter_manager')));
+
 
     $container->register('legacy_generator', 'Drupal\Core\Routing\NullGenerator');
     $container->register('legacy_url_matcher', 'Drupal\Core\LegacyUrlMatcher');
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterParamConvertersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterParamConvertersPass.php
new file mode 100644
index 0000000..f02b6c9
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterParamConvertersPass.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\DependencyInjection\Compiler\RegisterParamConvertersPass.
+ */
+
+namespace Drupal\Core\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+/**
+ * Registers EntityConverter services with the ParamConverterManager.
+ */
+class RegisterParamConvertersPass implements CompilerPassInterface {
+
+  /**
+   * Adds services tagged with "paramconverter" to the param converter service.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+   *   The container to process.
+   */
+  public function process(ContainerBuilder $container) {
+    if (!$container->hasDefinition('paramconverter_manager')) {
+      return;
+    }
+
+    $manager = $container->getDefinition('paramconverter_manager');
+
+    $services = array();
+    foreach ($container->findTaggedServiceIds('paramconverter') as $id => $attributes) {
+      $weight = $attributes[0]['weight'] ? $attributes[0]['weight'] : 0;
+
+      $services[$weight][] = $id;
+    }
+
+    ksort($services);
+
+    foreach($services as $bucket) {
+      foreach($bucket as $service_id) {
+        $manager->addMethodCall('addConverterService', array($service_id));
+      }
+    }
+  }
+}
diff --git a/core/lib/Drupal/Core/ParamConverter/EntityAliasConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityAliasConverter.php
new file mode 100644
index 0000000..08e60c0
--- /dev/null
+++ b/core/lib/Drupal/Core/ParamConverter/EntityAliasConverter.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\ParamConverter\EntityAliasConverter.
+ */
+
+namespace Drupal\Core\ParamConverter;
+
+/**
+ * This class allows the upcasting of entity ids to an entity type defined in
+ * the route options.
+ */
+class EntityAliasConverter implements ParamConverterInterface {
+
+  /**
+   * Tries to upcast every variable with a converter option defined in the
+   * route definition. If there is no option with the name of the variable
+   * it simply skips it.
+   *
+   * Example:
+   *
+   * pattern: '/some/{pattern}'
+   * options:
+   *   converters:
+   *    pattern: 'node'
+   *
+   * This will convert the node id given in $defaults['pattern'] to a entity of
+   * type node.
+   *
+   * It will not process variables which are marked as converted. It will mark
+   * any variable it processes as converted.
+   *
+   * @param array $defaults
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request.
+   *
+   * @return array The modified defaults.
+   */
+  public function process($defaults, $request) {
+    $variables = $defaults['_route_object']->compile()->getVariables();
+    $options = $defaults['_route_object']->getOptions();
+
+    // Early exit because there are no converters defined in the route options.
+    if (! isset($options['converters'])) {
+      return $defaults;
+    }
+    $converters = $options['converters'];
+
+    $types = array_keys(entity_get_info());
+
+    foreach ($variables as $var) {
+
+      if (array_key_exists($var, $converters)) {
+        $dealiased_var = $converters[$var];
+      } else {
+        continue;
+      }
+
+      // If there was NULL defined as converter for this variable, do not
+      // convert but mark this variable as converted to prevent following
+      // converters from further processing.
+      if (null === $dealiased_var) { $defaults['_converted'][] = $var; continue; }
+
+      // Only upcast if there is a type with the name of the dealiased variable
+      // and the variable hasn't been upcast yet.
+      if (in_array($dealiased_var, $types) && ! in_array($var, $defaults['_converted'])) {
+        $value = $defaults[$var];
+
+        $entity = entity_get_controller($dealiased_var)->load(array($value));
+
+        // Make sure $entity is null, if upcasting fails.
+        if ($entity) { $entity = reset($entity); } else { $entity = null; }
+        $defaults[$var] = $entity;
+        $defaults['_converted'][] = $var;
+      }
+    }
+    return $defaults;
+  }
+}
diff --git a/core/lib/Drupal/Core/ParamConverter/EntityConverter.php b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
new file mode 100644
index 0000000..00cf775
--- /dev/null
+++ b/core/lib/Drupal/Core/ParamConverter/EntityConverter.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\ParamConverter\EntityConverter.
+ */
+
+namespace Drupal\Core\ParamConverter;
+
+/**
+ * This class allows the upcasting of entity ids to the respective entity
+ * object.
+ */
+class EntityConverter implements ParamConverterInterface {
+  /**
+   * Tries to upcast every variable to a entity type of the same name. If there
+   * is no entity type with the name of the variable it simply skips it.
+   *
+   * It will not process variables which are marked as converted. It will mark
+   * any variable it processes as converted.
+   *
+   * @param array $defaults
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request.
+   *
+   * @return array The modified defaults.
+   */
+  public function process($defaults, $request) {
+    $variables = $defaults['_route_object']->compile()->getVariables();
+
+    $types = array_keys(entity_get_info());
+
+    foreach ($variables as $var) {
+      // Only upcast if there is a type with the name of the variable
+      // and the variable hasn't been upcast yet.
+      if (in_array($var, $types) && ! in_array($var, $defaults['_converted'])) {
+        $value = $defaults[$var];
+
+        $entity = entity_get_controller($var)->load(array($value));
+
+        // Make sure $entity is null, if upcasting fails.
+        if ($entity) { $entity = reset($entity); } else { $entity = null; }
+        $defaults[$var] = $entity;
+        $defaults['_converted'][] = $var;
+      }
+    }
+    return $defaults;
+  }
+}
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
new file mode 100644
index 0000000..6fa667b
--- /dev/null
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\ParamConverter\ParamConverterInterface.
+ */
+
+namespace Drupal\Core\ParamConverter;
+
+/**
+ * Interface for parameter converters.
+ */
+interface ParamConverterInterface {
+
+  /**
+   * Allows to alter the defaults of the current request.
+   *
+   * @param array $defaults
+   *
+   * @return array The modified defaults. Each enhancer MUST return the
+   *   $defaults but may add, remove or alter values.
+   */
+  public function process($defaults, $request);
+  // I know this resembles the RouteEnhancerInterface and could be replaced by
+  // it right now. But it is likely that some of the paramconverter services
+  // will need to be container aware sooner or later, so we will have to
+  // touch this anyway.
+
+}
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
new file mode 100644
index 0000000..852a529
--- /dev/null
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\ParamConverter\ParamConverterManager.
+ */
+
+namespace Drupal\Core\ParamConverter;
+
+use Symfony\Component\DependencyInjection\ContainerAware;
+use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * This class provides a service which allows to enhance (say alter) the
+ * arguments coming from the URL. A typical use case for this would be
+ * upcasting a node id to a node object.
+ *
+ * This class will not enhance any of the arguments itself, but allow other
+ * services to register to do so.
+ */
+class ParamConverterManager extends ContainerAware implements RouteEnhancerInterface {
+
+  protected $converters;
+
+  /**
+   * Adds services to the paramconverter service.
+   *
+   * @see \Drupal\Core\DependencyInjection\Compiler\RegisterParamConvertersPass
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+   *   The container to process.
+   */
+  public function addConverterService($service) {
+    $this->converters[] = $service;
+    return $this;
+  }
+
+  /**
+   * Implements \Symfony\Cmf\Component\Routing\Enhancer\ŖouteEnhancerIterface.
+   *
+   * Iterates over all registered converters and allows them to alter the
+   * defaults.
+   *
+   * @param array $defaults the getRouteDefaults array
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request.
+   *
+   * @return array The modified defaults.
+   */
+  public function enhance(array $defaults, Request $request) {
+    // This array will collect the names of all variables which have been
+    // altered by a converters.
+    // This serves two purposes:
+    //  1. It might prevent converters later in the pipeline to process
+    //     a variable again.
+    //  2. To check if upcasting was successfull after all the converter had
+    //     a go. See below.
+    $defaults['_converted'] = array();
+
+    foreach ($this->converters as $converter) {
+      $defaults = $this->container->get($converter)->process($defaults, $request);
+    }
+
+    // Check if all upcasting yielded a result.
+    // If an upcast value is NULL do a 404.
+    foreach ($defaults['_converted'] as $variable) {
+      if (empty($defaults[$variable])) {
+        throw new NotFoundHttpException();
+      }
+    }
+
+    return $defaults;
+  }
+}
diff --git a/core/lib/Drupal/Core/ParamConverter/VariableMapConverter.php b/core/lib/Drupal/Core/ParamConverter/VariableMapConverter.php
new file mode 100644
index 0000000..f359113
--- /dev/null
+++ b/core/lib/Drupal/Core/ParamConverter/VariableMapConverter.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\ParamConverter\VariableMapConverter.
+ */
+
+namespace Drupal\Core\ParamConverter;
+
+/**
+ * This class allows the mapping of route pattern names to controller parameter
+ * names.
+ * The main use case of this is to glue route pattern argument names to
+ * controller parameter names.
+ */
+class VariableMapConverter implements ParamConverterInterface {
+
+  /**
+   * This converter will copy all variables which have a map entry in the route
+   * options to the respective name.
+   *
+   * Example:
+   *
+   * pattern: '/some/{pattern}'
+   * options:
+   *   map:
+   *    pattern: 'stuff'
+   *
+   * This will copy the value of $defaults['pattern'] to defaults['stuff'].
+   *
+   * @param array $defaults
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request.
+   *
+   * @return array The modified defaults.
+   */
+  public function process($defaults, $request) {
+    $options = $defaults['_route_object']->getOptions();
+
+    // Early exit because there are no mappings defined in the route options.
+    if (! isset($options['map'])) {
+      return $defaults;
+    }
+
+    foreach ($options['map'] as $arg => $param) {
+      $defaults[$param] = $defaults[$arg];
+    }
+
+    return $defaults;
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php b/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php
new file mode 100644
index 0000000..7495cd1
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/ParamConverter/UpcastingTest.php
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\system\Tests\ParamConverter\UpcastingTest.
+ */
+
+namespace Drupal\system\Tests\ParamConverter;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Web tests for the upcasting.
+ */
+class UpcastingTest extends WebTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Upcasting tests',
+      'description' => 'Tests upcasting of url arguments to entities.',
+      'group' => 'ParamConverter',
+    );
+  }
+
+  public static $modules = array('paramconverter_test');
+
+  /**
+   * Confirms that all parameters are converted as expected.
+   *
+   * All of these requests end up being proccessed by a controller with this
+   * the signature: f($user, $node, $foo) returning either values or labels
+   * like "user: Dries, node: First post, foo: bar"
+   *
+   * The tests shuffle the parameters around an checks if the right thing is
+   * happening.
+   */
+  public function testUpcasting() {
+    $node = $this->drupalCreateNode(array('title' => $this->randomName(8)));
+    $user = $this->drupalCreateUser(array('access content'));
+    $foo = 'bar';
+
+    // paramconverter_test/test_user_node_foo/{user}/{node}/{foo}
+    $this->drupalGet("paramconverter_test/test_user_node_foo/"
+            . $user->uid
+      . "/" . $node->nid
+      . "/" . $foo
+    );
+    $this->assertRaw("user: " . $user->label()
+            . ", " . "node: " . $node->label()
+                  . ", foo: " . $foo
+      , 'user and node upcast by entity name.');
+
+    // paramconverter_test/test_foo_node_user/{foo}/{node}/{user}
+    // converters:
+    //   user: ~
+    //   foo: 'user'
+    $this->drupalGet("paramconverter_test/test_foo_node_user/"
+            . $user->uid
+      . "/" . $node->nid
+      . "/" . $foo
+    );
+    $this->assertRaw("user: " . $foo
+            . ", " . "node: " . $node->label()
+                  . ", foo: " . $user->label()
+      , 'user is prevented from upcasting, foo converted to user');
+
+    // paramconverter_test/test_user_a_b/{user}/{a}/{b}/
+    // map:
+    //   a: 'node'
+    //   b: 'foo'
+    $this->drupalGet("paramconverter_test/test_user_a_b/"
+            . $user->uid
+      . "/" . $node->nid
+      . "/" . $foo
+    );
+    $this->assertRaw("user: " . $user->label()
+            . ", " . "node: " . $node->nid
+                  . ", foo: " . $foo
+      , 'user is upcast, a is mapped to node (but not upcast), b is mapped to foo');
+
+    // paramconverter_test/test_a_node_b/{a}/{node}/{b}'
+    // converters:
+    //   a: 'user'
+    //   node: ~
+    //   b: 'node'
+    // map:
+    //   a: 'user'
+    //   b: 'foo'
+    $this->drupalGet("paramconverter_test/test_a_node_b/"
+            . $user->uid
+      . "/" . $foo
+      . "/" . $node->nid
+    );
+    $this->assertRaw("user: " . $user->label()
+            . ", " . "node: " . $foo
+                  . ", foo: " . $node->label()
+      , 'a is upcast and mapped to user, node is prevented from upcasting, b is upcast to node and mapped to foo');
+
+    // paramconverter_test/test_node_node_foo/{user}/{node}/{foo}
+    // converters:
+    //   user: 'node'
+    $this->drupalGet("paramconverter_test/test_node_node_foo/"
+            . $node->nid
+      . "/" . $node->nid
+      . "/" . $foo
+    );
+    $this->assertRaw("user: " . $node->label()
+            . ", " . "node: " . $node->label()
+                  . ", foo: " . $foo
+      , 'user is upcast to node (rather than to user)');
+  }
+
+  /**
+   * Confirms we can upcast to controller arguments of the same type.
+   */
+  public function testSameTypes() {
+    $node = $this->drupalCreateNode(array('title' => $this->randomName(8)));
+    $parent = $this->drupalCreateNode(array('title' => $this->randomName(8)));
+    // paramconverter_test/node/{node}/set/parent/{parent}
+    // converters:
+    //   parent: 'node'
+    $this->drupalGet(
+      "paramconverter_test/node/" . $node->nid . "/set/parent/" . $parent->nid
+    );
+    $this->assertRaw(
+      "Setting '" . $parent->title . "' as parent of '" . $node->title . "'."
+    );
+
+    // pattern: '/paramconverter_test/node/{node}/add/child/{child}'
+    // converters:
+    //   child: 'node'
+    // map:
+    //   node: 'parent'
+    //   child: 'node'
+    $this->drupalGet(
+      "paramconverter_test/node/" . $parent->nid . "/add/child/" . $node->nid
+    );
+    $this->assertRaw(
+      "Setting '" . $parent->title . "' as parent of '" . $node->title . "'."
+    );
+  }
+
+}
diff --git a/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php b/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php
new file mode 100644
index 0000000..bf54534
--- /dev/null
+++ b/core/modules/system/tests/modules/paramconverter_test/lib/Drupal/paramconverter_test/TestControllers.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\paramconverter_test\TestControllers.
+ */
+
+namespace Drupal\paramconverter_test;
+
+use Drupal\node\Plugin\Core\Entity\Node;
+/**
+ * Controller routine for testing the paramconverter.
+ */
+class TestControllers {
+  public function test_user_node_foo($user, $node, $foo) {
+    return "user: " . (is_object($user)?$user->label():$user)
+         . ", node: " . (is_object($node)?$node->label():$node)
+         . ", foo: " . (is_object($foo)?$foo->label():$foo);
+  }
+
+  public function test_node_set_parent(Node $node, Node $parent) {
+    return "Setting '" . $parent->title . "' as parent of '" . $node->title . "'.";
+  }
+}
diff --git a/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.info b/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.info
new file mode 100644
index 0000000..3db382a
--- /dev/null
+++ b/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.info
@@ -0,0 +1,6 @@
+name = "ParamConverter test"
+description = "Support module for paramconverter testing."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.module b/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.module
new file mode 100644
index 0000000..4398a1a
--- /dev/null
+++ b/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.module
@@ -0,0 +1,3 @@
+<?php
+
+/* Intentionally blank file. */
diff --git a/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.routing.yml b/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.routing.yml
new file mode 100644
index 0000000..b693b28
--- /dev/null
+++ b/core/modules/system/tests/modules/paramconverter_test/paramconverter_test.routing.yml
@@ -0,0 +1,78 @@
+paramconverter_test_user_node_foo:
+  pattern: '/paramconverter_test/test_user_node_foo/{user}/{node}/{foo}'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_user_node_foo'
+  requirements:
+    _access: 'TRUE'
+
+paramconverter_test_foo_node_user:
+  pattern: '/paramconverter_test/test_foo_node_user/{foo}/{node}/{user}'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_user_node_foo'
+  requirements:
+    _access: 'TRUE'
+  options:
+    converters:
+      user: ~
+      foo: 'user'
+
+paramconverter_test_user_a_b:
+  pattern: '/paramconverter_test/test_user_a_b/{user}/{a}/{b}'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_user_node_foo'
+  requirements:
+    _access: 'TRUE'
+  options:
+    map:
+      a: 'node'
+      b: 'foo'
+
+paramconverter_test_a_node_b:
+  pattern: '/paramconverter_test/test_a_node_b/{a}/{node}/{b}'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_user_node_foo'
+  requirements:
+    _access: 'TRUE'
+  options:
+    map:
+      a: 'user'
+      b: 'foo'
+    converters:
+      a: 'user'
+      node: ~
+      b: 'node'
+
+paramconverter_test_node_node_foo:
+  pattern: '/paramconverter_test/test_node_node_foo/{user}/{node}/{foo}'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_user_node_foo'
+  requirements:
+    _access: 'TRUE'
+  options:
+    converters:
+      user: 'node'
+
+
+paramconverter_test_node_set_parent:
+  pattern: '/paramconverter_test/node/{node}/set/parent/{parent}'
+  requirements:
+    _access: 'TRUE'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_node_set_parent'
+  options:
+    converters:
+      parent: 'node'
+
+paramconverter_test_node_add_child:
+  pattern: '/paramconverter_test/node/{node}/add/child/{child}'
+  requirements:
+    _access: 'TRUE'
+  defaults:
+    _content: '\Drupal\paramconverter_test\TestControllers::test_node_set_parent'
+  options:
+    converters:
+      child: 'node'
+    map:
+      node: 'parent'
+      child: 'node'
+
