diff --git a/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php b/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php
new file mode 100644
index 0000000000..93892965c4
--- /dev/null
+++ b/core/modules/rest/src/Plugin/Deriver/SimpleConfigDeriver.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace Drupal\rest\Plugin\Deriver;
+
+use Drupal\Core\Config\TypedConfigManagerInterface;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class SimpleConfigDeriver implements ContainerDeriverInterface {
+
+  /**
+   * List of derivative definitions.
+   *
+   * @var array
+   */
+  protected $derivatives;
+
+  /**
+   * The typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected $typedConfigManager;
+
+  /**
+   * SimpleConfigDeriver constructor.
+   *
+   * @param \Drupal\Core\Config\TypedConfigManagerInterface $typedConfigManager
+   *   The typed config manager.
+   */
+  public function __construct(TypedConfigManagerInterface $typedConfigManager) {
+    $this->typedConfigManager = $typedConfigManager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $container->get('config.typed')
+    );
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
+    if (!isset($this->derivatives)) {
+      $this->getDerivativeDefinitions($base_plugin_definition);
+    }
+    if (isset($this->derivatives[$derivative_id])) {
+      return $this->derivatives[$derivative_id];
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    if (isset($this->derivatives)) {
+      return $this->derivatives;
+    }
+
+    // Get all simple config and create plugin definition for them.
+    $config_schemas = $this->typedConfigManager->getDefinitions();
+    $simple_config_schemas = array_filter($config_schemas, function ($config_schema) use ($config_schemas) {
+      return $this->isConfigSchema($config_schema, $config_schemas);
+    });
+
+    foreach ($simple_config_schemas as $name => $simple_config_schema) {
+      $this->derivatives[$name] = [
+        'id' => 'config:' . $name,
+        'config_name' => $name,
+        'serialization_class' => '@fixme',
+        'label' => isset($simple_config_schema['label']) ? $simple_config_schema['label'] : 'Config: ' . $name,
+      ];
+    }
+    return $this->derivatives;
+  }
+
+  protected function isConfigSchema(array $schema, array $all_schemas) {
+    if ($schema['type'] === 'config_object') {
+      return TRUE;
+    }
+    elseif (isset($all_schemas[$schema['type']])) {
+      return $this->isConfigSchema($all_schemas[$schema['type']], $all_schemas);
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+}
diff --git a/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php b/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php
new file mode 100644
index 0000000000..1bac4f2627
--- /dev/null
+++ b/core/modules/rest/src/Plugin/rest/resource/SimpleConfigResource.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace Drupal\rest\Plugin\rest\resource;
+
+use Drupal\Component\Plugin\DependentPluginInterface;
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Config\StorableConfigBase;
+use Drupal\Core\Config\StorageException;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\rest\Plugin\ResourceBase;
+use Drupal\rest\ResourceResponse;
+use Psr\Log\LoggerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\rest\ModifiedResourceResponse;
+use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+
+/**
+ * Represents simple config as resources.
+ *
+ * @see \Drupal\rest\Plugin\Deriver\SimpleConfigDeriver
+ *
+ * @RestResource(
+ *   id = "simple_config",
+ *   label = @Translation("Simple config"),
+ *   deriver = "\Drupal\rest\Plugin\Deriver\SimpleConfigDeriver",
+ *   uri_paths = {
+ *     "canonical" = "/config/{simple_config}",
+ *   }
+ * )
+ */
+class SimpleConfigResource extends ResourceBase implements DependentPluginInterface {
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * The link relation type manager used to create HTTP header links.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $linkRelationTypeManager;
+
+  /**
+   * Constructs a Drupal\rest\Plugin\rest\resource\EntityResource object.
+   *
+   * @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\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager
+   * @param array $serializer_formats
+   *   The available serialization formats.
+   * @param \Psr\Log\LoggerInterface $logger
+   *   A logger instance.
+   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
+   *   The config factory.
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $link_relation_type_manager
+   *   The link relation type manager.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, $serializer_formats, LoggerInterface $logger, ConfigFactoryInterface $config_factory, PluginManagerInterface $link_relation_type_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);
+    $this->entityType = $entity_type_manager->getDefinition($plugin_definition['entity_type']);
+    $this->configFactory = $config_factory;
+    $this->linkRelationTypeManager = $link_relation_type_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_type.manager'),
+      $container->getParameter('serializer.formats'),
+      $container->get('logger.factory')->get('rest'),
+      $container->get('config.factory'),
+      $container->get('plugin.manager.link_relation_type')
+    );
+  }
+
+  /**
+   * Responds to entity GET requests.
+   *
+   * @param \Drupal\Core\Config\StorableConfigBase $config
+   * @return \Drupal\rest\ResourceResponse
+   *   The response containing the entity with its accessible fields.
+   */
+  public function get(StorableConfigBase $config) {
+    // @fixme access checking?
+
+    $response = new ResourceResponse($config, 200);
+    $response->addCacheableDependency($config);
+
+    return $response;
+  }
+
+  /**
+   * Responds toconfig PATCH requests.
+   *
+   * @param \Drupal\Core\Config\StorableConfigBase $original_config
+   *   The original config object.
+   * @param \Drupal\Core\Config\StorableConfigBase $config
+   *   The config.
+   *
+   * @return \Drupal\rest\ModifiedResourceResponse
+   *   The HTTP response object.
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
+   */
+  public function patch(StorableConfigBase $original_config, StorableConfigBase $config = NULL) {
+    if ($config == NULL) {
+      throw new BadRequestHttpException('No config received.');
+    }
+    $definition = $this->getPluginDefinition();
+    if ($config->getName() !== $definition['config_name']) {
+      throw new BadRequestHttpException('Invalid config');
+    }
+    // @fixme access checking?
+
+    // Overwrite the received fields.
+//    foreach ($entity->_restSubmittedFields as $field_name) {
+//    }
+
+    // @fixme validation?
+
+    try {
+      $config->save(TRUE);
+      $this->logger->notice('Updated config %name', ['%name' => $config->getName()]);
+
+      // Return the updated entity in the response body.
+      return new ModifiedResourceResponse($config, 200);
+    }
+    catch (StorageException $e) {
+      throw new HttpException(500, 'Internal Server Error', $e);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function permissions() {
+    // @todo how to implement this?
+    // @see https://www.drupal.org/node/2664780
+    if ($this->configFactory->get('rest.settings')->get('bc_entity_resource_permissions')) {
+      // The default Drupal 8.0.x and 8.1.x behavior.
+      return parent::permissions();
+    }
+    return parent::permissions();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getBaseRoute($canonical_path, $method) {
+    $route = parent::getBaseRoute($canonical_path, $method);
+    $definition = $this->getPluginDefinition();
+
+    $parameters = $route->getOption('parameters') ?: [];
+    // @todo Add a config param converter?
+    $parameters[$definition['config_name']]['type'] = 'config:' . $definition['config_name'];
+    $route->setOption('parameters', $parameters);
+
+    return $route;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function availableMethods() {
+    $methods = parent::availableMethods();
+    $unsupported_methods = ['POST', 'PUT', 'DELETE'];
+    $methods = array_diff($methods, $unsupported_methods);
+    return $methods;
+  }
+
+}
