diff --git a/.gitignore b/.gitignore
index cac762f1d47dd2ec606f4d3fccc831e713c9da6b..408b1a22e06866a20f17ee48109b062f1dbdc6a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 /vendor/
 /.idea/
+/.php_cs*cache
+.phpunit.result.cache
diff --git a/.php_cs.dist b/.php_cs.dist
new file mode 100644
index 0000000000000000000000000000000000000000..1cc83a0223199f51eac76d6e705177ea6debdc55
--- /dev/null
+++ b/.php_cs.dist
@@ -0,0 +1,12 @@
+<?php
+
+$finder = PhpCsFixer\Finder::create()
+    ->exclude('vendor')
+    ->files()
+    ->name('*.php')
+    ->in('.');
+
+return Irstea\CS\Config::create()
+    ->setIndent('    ')
+    ->setLineEnding("\n")
+    ->setFinder($finder);
diff --git a/composer.json b/composer.json
index dd63782c05795b8195f572134a0a1f228045ea93..2a023a4f89928473d0e9b8c0eb6261f5fe8a30a6 100644
--- a/composer.json
+++ b/composer.json
@@ -33,12 +33,12 @@
     },
     "autoload": {
         "psr-4": {
-            "\\Irstea\\MyProject\\": "src/"
+            "Irstea\\MyProject\\": "src/"
         }
     },
     "autoload-dev": {
         "psr-4": {
-            "\\Irstea\\MyProject\\": "tests/"
+            "Irstea\\MyProject\\Tests\\": "tests/"
         }
     },
     "scripts": {
@@ -52,9 +52,10 @@
             "@test:phpcpd",
             "@test:phpmd",
             "@test:phpstan",
+            "@test:phpunit",
+            "@test:composer-validate",
             "@test:composer-require",
-            "@test:security",
-            "@test:phpunit"
+            "@test:security"
         ],
         "phploc": [
             "vendor/bin/phploc src tests"
@@ -70,10 +71,16 @@
             "vendor/bin/phpcpd --fuzzy src tests"
         ],
         "test:phpmd": [
-            "vendor/bin/phpmd src,tests text vendor/irstea/phpmd-config/strict.xml"
+            "vendor/bin/phpmd src,tests text ./phpmd-ruleset.xml"
         ],
         "test:phpstan": [
-            "vendor/bin/phpstan analyse"
+            "vendor/bin/phpstan analyse --ansi --no-progress src tests"
+        ],
+        "test:phpunit": [
+            "vendor/bin/phpunit"
+        ],
+        "test:composer-validate": [
+            "composer validate"
         ],
         "test:composer-require": [
             "vendor/bin/composer-require-checker check"
@@ -83,14 +90,16 @@
         ]
     },
     "scripts-descriptions": {
-        "test": "Exécute tous les tests en série.",
         "fix-cs": "Applique les corrections automatiques de style.",
         "phploc": "Calcule des stats sur les sources.",
+        "test": "Exécute tous les tests en série.",
         "test:lint": "Vérifie la syntaxe et le style des sources.",
         "test:phpcpd": "Détecte les blocs de code similaires.",
-        "test:phpmd": "Détecte des défauts de ",
+        "test:phpmd": "Détecte des défauts de codage.",
         "test:phpstan": "Détecte des erreurs de programmation grâce au typage.",
+        "test:phpunit": "Exécute les tests dynamiques.",
+        "test:composer-validate": "Vérifie la validité du composer.json.",
         "test:composer-require": "Vérifie que les sources n'utilise que des librairies listés dans les dépendances directes.",
-        "test:security": "Vérifie qu'aucun paquet utilisé n'ait de faille de sécurité signalée."
+        "test:securit": "Vérifie qu'aucun paquet utilisé n'ait de faille de sécurité signalée."
     }
 }
diff --git a/phpmd-ruleset.xml b/phpmd-ruleset.xml
new file mode 100644
index 0000000000000000000000000000000000000000..96ca0fa73801f0bb8db0919ba665974930ec5624
--- /dev/null
+++ b/phpmd-ruleset.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<ruleset name="SYGADE PHPMD rule set"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+
+    <rule ref="vendor/irstea/phpmd-config/strict.xml"/>
+</ruleset>
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 0000000000000000000000000000000000000000..d1a1435aa96cd0c3cfd3e6c71542c6073d3506c2
--- /dev/null
+++ b/phpstan.neon
@@ -0,0 +1,5 @@
+includes:
+    - vendor/irstea/phpstan-config/strict.neon
+    - vendor/irstea/phpstan-config/phpunit.neon
+
+
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3f2207ac71b1faed027b5cb04381eb1fa9aa8a6a
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd"
+         bootstrap="vendor/autoload.php"
+         executionOrder="depends,defects"
+         forceCoversAnnotation="true"
+         beStrictAboutCoversAnnotation="true"
+         beStrictAboutOutputDuringTests="true"
+         beStrictAboutTodoAnnotatedTests="true"
+         verbose="true">
+    <testsuites>
+        <testsuite name="default">
+            <directory suffix="Test.php">tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">src</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/src/.gitkeep b/src/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/MyClass.php b/src/MyClass.php
new file mode 100644
index 0000000000000000000000000000000000000000..a6f632377c3400adb51c4b31c5fd404b84c43f60
--- /dev/null
+++ b/src/MyClass.php
@@ -0,0 +1,20 @@
+<?php declare(strict_types=1);
+/*
+ * Create and customize a file named .docheader at the root of the project to change this message.
+ */
+
+namespace Irstea\MyProject;
+
+/**
+ * La classe MyClass.
+ */
+class MyClass
+{
+    /**
+     * @return int
+     */
+    public function getResponse(): int
+    {
+        return 42;
+    }
+}
diff --git a/tests/.gitkeep b/tests/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/tests/MyClassTest.php b/tests/MyClassTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b222ee60040a386b6724b4338f35cd5f6159cbe
--- /dev/null
+++ b/tests/MyClassTest.php
@@ -0,0 +1,22 @@
+<?php declare(strict_types=1);
+/*
+ * Create and customize a file named .docheader at the root of the project to change this message.
+ */
+
+namespace Irstea\MyProject\Tests;
+
+use Irstea\MyProject\MyClass;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Les tests de la classe MyClass.
+ */
+class MyClassTest extends TestCase
+{
+    public function testGetResponse(): void
+    {
+        $subject = new MyClass();
+
+        self::assertEquals(42, $subject->getResponse());
+    }
+}