diff --git a/composer.json b/composer.json
index c934ceb0..2d7ea4e2 100644
--- a/composer.json
+++ b/composer.json
@@ -37,22 +37,22 @@
     "require": {
         "authbucket/oauth2-php": "~4.2",
         "php": ">=5.5.9",
-        "symfony/framework-bundle": "~2.8|~3.0",
-        "symfony/monolog-bundle": "~2.8|~3.0",
-        "symfony/security-bundle": "~2.8|~3.0"
+        "symfony/framework-bundle": "~2.8 || ~3.0 || ~4.0",
+        "symfony/monolog-bundle": "~2.8 || ~3.0",
+        "symfony/security-bundle": "~2.8 || ~3.0 || ~4.0"
     },
     "require-dev": {
         "doctrine/doctrine-bundle": "~1.4|~1.6",
         "doctrine/doctrine-fixtures-bundle": "~2.3",
-        "doctrine/orm": "~2.4|~2.5",
+        "doctrine/orm": "~2.4",
         "ext-pdo_sqlite": "*",
         "phpunit/phpunit": "~5.7",
         "satooshi/php-coveralls": "~1.0",
-        "sensio/distribution-bundle": "~4.0|~5.0",
-        "sensio/framework-extra-bundle": "~3.0",
-        "symfony/phpunit-bridge": "~2.8|~3.0",
-        "symfony/swiftmailer-bundle": "~2.3",
-        "symfony/symfony": "~2.8|~3.0",
+        "sensio/distribution-bundle": "~4.0 || ~5.0",
+        "sensio/framework-extra-bundle": "~3.0 || ~5.0",
+        "symfony/phpunit-bridge": "~2.8 || ~3.0 || ~4.0",
+        "symfony/swiftmailer-bundle": "~2.3 || ~3.0",
+        "symfony/symfony": "~2.8 || ~3.0 || ~4.0",
         "twig/extensions": "~1.0"
     },
     "scripts": {
diff --git a/src/DependencyInjection/Security/Factory/ResourceFactory.php b/src/DependencyInjection/Security/Factory/ResourceFactory.php
index 6906b708..bf1a2ee0 100644
--- a/src/DependencyInjection/Security/Factory/ResourceFactory.php
+++ b/src/DependencyInjection/Security/Factory/ResourceFactory.php
@@ -13,6 +13,7 @@
 
 use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface;
 use Symfony\Component\Config\Definition\Builder\NodeDefinition;
+use Symfony\Component\DependencyInjection\ChildDefinition;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\DefinitionDecorator;
 
@@ -28,14 +29,14 @@ public function create(ContainerBuilder $container, $id, $config, $userProvider,
 
         $providerId = 'security.authentication.provider.resource.'.$id;
         $container
-            ->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.resource'))
+            ->setDefinition($providerId, $this->decorate('security.authentication.provider.resource'))
             ->replaceArgument(0, $id)
             ->replaceArgument(2, $config['resource_type'])
             ->replaceArgument(3, $config['scope'])
             ->replaceArgument(4, $config['options']);
 
         $listenerId = 'security.authentication.listener.resource.'.$id;
-        $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.resource'))
+        $container->setDefinition($listenerId, $this->decorate('security.authentication.listener.resource'))
             ->replaceArgument(0, $id);
 
         return [$providerId, $listenerId, $defaultEntryPoint];
@@ -73,4 +74,13 @@ public function addConfiguration(NodeDefinition $node)
                 ->end()
             ->end();
     }
+
+    private function decorate($definitionId)
+    {
+        if (class_exists(ChildDefinition::class)) {
+            return new ChildDefinition($definitionId);
+        }
+
+        return new DefinitionDecorator($definitionId);
+    }
 }
diff --git a/src/DependencyInjection/Security/Factory/TokenFactory.php b/src/DependencyInjection/Security/Factory/TokenFactory.php
index 6aa12de7..8b74a187 100644
--- a/src/DependencyInjection/Security/Factory/TokenFactory.php
+++ b/src/DependencyInjection/Security/Factory/TokenFactory.php
@@ -13,6 +13,7 @@
 
 use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface;
 use Symfony\Component\Config\Definition\Builder\NodeDefinition;
+use Symfony\Component\DependencyInjection\ChildDefinition;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\DefinitionDecorator;
 
@@ -21,11 +22,11 @@ class TokenFactory implements SecurityFactoryInterface
     public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
     {
         $providerId = 'security.authentication.provider.token.'.$id;
-        $container->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.token'))
+        $container->setDefinition($providerId, $this->decorate('security.authentication.provider.token'))
             ->replaceArgument(0, $id);
 
         $listenerId = 'security.authentication.listener.token.'.$id;
-        $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.token'))
+        $container->setDefinition($listenerId, $this->decorate('security.authentication.listener.token'))
             ->replaceArgument(0, $id);
 
         return [$providerId, $listenerId, $defaultEntryPoint];
@@ -44,4 +45,13 @@ public function getKey()
     public function addConfiguration(NodeDefinition $node)
     {
     }
+
+    private function decorate($definitionId)
+    {
+        if (class_exists(ChildDefinition::class)) {
+            return new ChildDefinition($definitionId);
+        }
+
+        return new DefinitionDecorator($definitionId);
+    }
 }