diff --git a/core/Test/TemplateControllerTest.php b/core/Test/TemplateControllerTest.php
new file mode 100755
index 0000000000000000000000000000000000000000..4cbeb291d7a045291ffe229ad632c3d81b504c34
--- /dev/null
+++ b/core/Test/TemplateControllerTest.php
@@ -0,0 +1,314 @@
+<?php
+
+/**
+* Copyright Maarch since 2008 under licence GPLv3.
+* See LICENCE.txt file at the root folder for more details.
+* This file is part of Maarch software.
+*
+*/
+
+use PHPUnit\Framework\TestCase;
+
+class TemplateControllerTest extends TestCase
+{
+    private static $id = null;
+    private static $idDuplicated = null;
+
+    public function testCreate()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        //  CREATE
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $aArgs = [
+            'template_label'            => 'TEST TEMPLATE',
+            'template_comment'          => 'DESCRIPTION OF THIS TEMPLATE',
+            'template_target'           => 'sendmail',
+            'template_attachment_type'  => 'all',
+            'template_type'             => 'HTML',
+            'template_content'          => 'Content of this template',
+            'template_datasource'       => 'letterbox_attachment',
+            'entities'                  => ['DGS', 'COU']
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request);
+
+        $response     = $templates->create($fullRequest, new \Slim\Http\Response());
+        $responseBody = json_decode((string)$response->getBody());
+
+        self::$id = $responseBody->template;
+        $this->assertInternalType("int", self::$id);
+
+        // CREATE FAIL
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $aArgs = [
+            'template_label'            => '',
+            'template_comment'          => '',
+            'template_target'           => 'sendmail',
+            'template_attachment_type'  => 'all',
+            'template_type'             => 'HTML',
+            'template_content'          => 'Content of this template',
+            'template_datasource'       => 'letterbox_attachment'
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request);
+
+        $response     = $templates->create($fullRequest, new \Slim\Http\Response());
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame('Bad Request', $responseBody->errors);
+    }
+
+    public function testRead()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        //  READ
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+        $response       = $templates->getDetailledById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody   = json_decode((string)$response->getBody());
+
+        $this->assertInternalType('int', $responseBody->template->template_id);
+        $this->assertSame('TEST TEMPLATE', $responseBody->template->template_label);
+        $this->assertSame('DESCRIPTION OF THIS TEMPLATE', $responseBody->template->template_comment);
+        $this->assertSame('sendmail', $responseBody->template->template_target);
+        $this->assertSame('all', $responseBody->template->template_attachment_type);
+        $this->assertSame('HTML', $responseBody->template->template_type);
+        $this->assertSame('Content of this template', $responseBody->template->template_content);
+        $this->assertSame('letterbox_attachment', $responseBody->template->template_datasource);
+        $this->assertNotNull($responseBody->templatesModels);
+        $this->assertNotNull($responseBody->templatesModels[0]->fileName);
+        $this->assertNotNull($responseBody->templatesModels[0]->fileExt);
+        $this->assertNotNull($responseBody->templatesModels[0]->filePath);
+        $this->assertNotNull($responseBody->attachmentTypes);
+        $this->assertNotNull($responseBody->attachmentTypes[0]->label);
+        $this->assertNotNull($responseBody->attachmentTypes[0]->id);
+        $this->assertNotNull($responseBody->datasources);
+        $this->assertNotNull($responseBody->datasources[0]->id);
+        $this->assertNotNull($responseBody->datasources[0]->label);
+        $this->assertNotNull($responseBody->datasources[0]->script);
+        $this->assertNotNull($responseBody->datasources[0]->target);
+        $this->assertNotNull($responseBody->entities);
+        $this->assertNotNull($responseBody->entities[0]->entity_id);
+        $this->assertNotNull($responseBody->entities[0]->entity_label);
+
+        //  READ FAIL
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+        $response       = $templates->getDetailledById($request, new \Slim\Http\Response(), ['id' => '11119999']);
+        $responseBody   = json_decode((string)$response->getBody());
+        $this->assertSame('Template does not exist', $responseBody->errors);
+    }
+
+    public function testUpdate()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        ########## UPDATE ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $aArgs = [
+            'template_label'            => 'TEST TEMPLATE UPDATE',
+            'template_comment'          => 'DESCRIPTION OF THIS TEMPLATE UPDATE',
+            'template_target'           => 'sendmail',
+            'template_attachment_type'  => 'all',
+            'template_type'             => 'HTML',
+            'template_content'          => 'Content of this template',
+            'template_datasource'       => 'letterbox_attachment',
+            'entities'                  => []
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request);
+
+        $response     = $templates->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame("success", $responseBody->success);
+
+        //  READ
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+        $response       = $templates->getDetailledById($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody   = json_decode((string)$response->getBody());
+
+        $this->assertInternalType('int', $responseBody->template->template_id);
+        $this->assertSame('TEST TEMPLATE UPDATE', $responseBody->template->template_label);
+        $this->assertSame('DESCRIPTION OF THIS TEMPLATE UPDATE', $responseBody->template->template_comment);
+        $this->assertSame('sendmail', $responseBody->template->template_target);
+        $this->assertSame('all', $responseBody->template->template_attachment_type);
+        $this->assertSame('HTML', $responseBody->template->template_type);
+        $this->assertSame('Content of this template', $responseBody->template->template_content);
+        $this->assertSame('letterbox_attachment', $responseBody->template->template_datasource);
+
+        ########## UPDATE FAIL MISSING PARAMETERS ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $aArgs = [
+            'template_label'            => '',
+            'template_comment'          => '',
+            'template_target'           => 'sendmail',
+            'template_attachment_type'  => 'all',
+            'template_type'             => 'HTML',
+            'template_content'          => 'Content of this template',
+            'template_datasource'       => 'letterbox_attachment',
+            'entities'                  => []
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request);
+
+        $response     = $templates->update($fullRequest, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame("Bad Request", $responseBody->errors);
+
+        ########## UPDATE FAIL WRONG ID ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $aArgs = [
+            'template_label'            => '',
+            'template_comment'          => '',
+            'template_target'           => 'sendmail',
+            'template_attachment_type'  => 'all',
+            'template_type'             => 'HTML',
+            'template_content'          => 'Content of this template',
+            'template_datasource'       => 'letterbox_attachment',
+            'entities'                  => []
+        ];
+        $fullRequest = \httpRequestCustom::addContentInBody($aArgs, $request);
+
+        $response     = $templates->update($fullRequest, new \Slim\Http\Response(), ['id' => '1235789']);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame('Template does not exist', $responseBody->errors);
+    }
+
+    public function testDuplicate()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        ########## DUPLICATE ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $templates->duplicate($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        self::$idDuplicated = $responseBody->id;
+        $this->assertInternalType("int", self::$idDuplicated);
+
+        //  READ
+        $environment  = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request      = \Slim\Http\Request::createFromEnvironment($environment);
+        $response     = $templates->getDetailledById($request, new \Slim\Http\Response(), ['id' => self::$idDuplicated]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertInternalType('int', $responseBody->template->template_id);
+        $this->assertSame('Copie de TEST TEMPLATE UPDATE', $responseBody->template->template_label);
+        $this->assertSame('DESCRIPTION OF THIS TEMPLATE UPDATE', $responseBody->template->template_comment);
+        $this->assertSame('sendmail', $responseBody->template->template_target);
+        $this->assertSame('all', $responseBody->template->template_attachment_type);
+        $this->assertSame('HTML', $responseBody->template->template_type);
+        $this->assertSame('Content of this template', $responseBody->template->template_content);
+        $this->assertSame('letterbox_attachment', $responseBody->template->template_datasource);
+
+        ########## DUPLICATE FAIL ##########
+        $environment  = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request      = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $templates->duplicate($request, new \Slim\Http\Response(), ['id' => 139875323456]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame('Template not found', $responseBody->errors);
+    }
+
+    public function testGetList()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        //  READ
+        $environment  = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request      = \Slim\Http\Request::createFromEnvironment($environment);
+        $response     = $templates->get($request, new \Slim\Http\Response());
+        $responseBody = json_decode((string)$response->getBody());
+
+        $idFound = false;
+        $idDuplicatedFound = false;
+        foreach ($responseBody->templates as $template) {
+            $this->assertInternalType('int', $template->template_id);
+            $this->assertNotNull($template->template_label);
+            $this->assertNotNull($template->template_comment);
+            $this->assertNotNull($template->template_type);
+
+            if ($template->template_id == self::$id) {
+                $idFound = true;
+            }
+            if ($template->template_id == self::$idDuplicated) {
+                $idDuplicatedFound = true;
+            }
+        }
+
+        $this->assertSame(true, $idFound);
+        $this->assertSame(true, $idDuplicatedFound);
+    }
+
+    public function testDelete()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        ########## DELETE ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $templates->delete($request, new \Slim\Http\Response(), ['id' => self::$id]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame("success", $responseBody->success);
+
+        ########## DELETE DUPLICATED ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $templates->delete($request, new \Slim\Http\Response(), ['id' => self::$idDuplicated]);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame("success", $responseBody->success);
+
+        ########## DELETE FAIL ##########
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $templates->delete($request, new \Slim\Http\Response(), ['id' => '8928191923']);
+        $responseBody = json_decode((string)$response->getBody());
+
+        $this->assertSame('Template does not exist', $responseBody->errors);
+    }
+
+    public function testInitTemplate()
+    {
+        $templates   = new \Template\controllers\TemplateController();
+
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+        $response       = $templates->initTemplates($request, new \Slim\Http\Response());
+        $responseBody   = json_decode((string)$response->getBody());
+
+        $this->assertNotNull($responseBody->templatesModels);
+        $this->assertNotNull($responseBody->templatesModels[0]->fileName);
+        $this->assertNotNull($responseBody->templatesModels[0]->fileExt);
+        $this->assertNotNull($responseBody->templatesModels[0]->filePath);
+        $this->assertNotNull($responseBody->attachmentTypes);
+        $this->assertNotNull($responseBody->attachmentTypes[0]->label);
+        $this->assertNotNull($responseBody->attachmentTypes[0]->id);
+        $this->assertNotNull($responseBody->datasources);
+        $this->assertNotNull($responseBody->datasources[0]->id);
+        $this->assertNotNull($responseBody->datasources[0]->label);
+        $this->assertNotNull($responseBody->datasources[0]->script);
+        $this->assertNotNull($responseBody->datasources[0]->target);
+        $this->assertNotNull($responseBody->entities);
+        $this->assertNotNull($responseBody->entities[0]->entity_id);
+        $this->assertNotNull($responseBody->entities[0]->entity_label);
+    }
+}
diff --git a/core/Test/define.php b/core/Test/define.php
index d24a431af8ca6e85a2685bd0e0b1636d11657caa..e273d06367ec4e037f84bc8877f75548136f76db 100755
--- a/core/Test/define.php
+++ b/core/Test/define.php
@@ -21,7 +21,7 @@ class httpRequestCustom
         $json = json_encode($aArgs);
                
         $stream = fopen('php://memory', 'r+');
-        fputs($stream, $json);        
+        fputs($stream, $json);
         rewind($stream);
         $httpStream = new \Slim\Http\Stream($stream);
         $request = $request->withBody($httpStream);
diff --git a/phpunit.xml b/phpunit.xml
index 7d354085a3c68f275e33fd1ea4a65564f65f7144..149eea019db87de1facb8926ae607d893a5c910b 100755
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -24,6 +24,7 @@
             <file>core/Test/UserControllerTest.php</file>
             <file>core/Test/VersionUpdateControllerTest.php</file>
             <file>core/Test/CoreControllerTest.php</file>
+            <file>core/Test/TemplateControllerTest.php</file>
             <!--<file>modules/convert/Test/ProcessConvertTest.php</file>-->
             <!--<file>modules/convert/Test/ProcessFulltextTest.php</file>-->
             <!--<file>modules/convert/Test/ProcessManageConvertTest.php</file>-->
diff --git a/src/app/template/controllers/TemplateController.php b/src/app/template/controllers/TemplateController.php
index 9545c7724046b38d3219d008ddc9ba3d14c03344..948202985c319b9e6fac1c9c4b04ff7808bafade 100644
--- a/src/app/template/controllers/TemplateController.php
+++ b/src/app/template/controllers/TemplateController.php
@@ -59,6 +59,9 @@ class TemplateController
         }
 
         $template = TemplateModel::getById(['id' => $aArgs['id']]);
+        if (empty($template)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Template does not exist']);
+        }
 
         $rawLinkedEntities = TemplateAssociationModel::get(['select' => ['value_field'], 'where' => ['template_id = ?'], 'data' => [$template['template_id']]]);
         $linkedEntities = [];