diff --git a/phpunit.xml b/phpunit.xml
index 7de1cc5483869402dec28504887eb8455fe00269..57b17e85e0e142f1b2d2547988e8087bdea12889 100755
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -8,6 +8,7 @@
             <file>test/unitTests/app/configuration/ConfigurationControllerTest.php</file>
             <file>test/unitTests/app/document/DocumentControllerTest.php</file>
             <file>test/unitTests/app/group/GroupControllerTest.php</file>
+            <file>test/unitTests/app/workflow/WorkflowTemplateControllerTest.php</file>
             <file>test/unitTests/app/history/HistoryControllerTest.php</file>
         </testsuite>
     </testsuites>
diff --git a/rest/index.php b/rest/index.php
index adcbd248ad46d2e8524602559c18b56df01fd9b6..18d4301dff8f8bab9894804c22264c91eceb7a08 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -82,6 +82,9 @@ $app->put('/documents/{id}/actions/{actionId}', \Document\controllers\DocumentCo
 $app->get('/documents/{id}/workflow', \Workflow\controllers\WorkflowController::class . ':getByDocumentId');
 $app->get('/documents/{id}/thumbnails/{page}', \Document\controllers\DocumentController::class . ':getThumbnailContent');
 
+//Emails
+$app->post('/emails', \Email\controllers\EmailController::class . ':send');
+
 //Languages
 $app->get('/languages/{lang}', \SrcCore\controllers\LanguageController::class . ':getByLang');
 
@@ -122,7 +125,10 @@ $app->delete('/users/{id}/signatures/{signatureId}', \User\controllers\Signature
 $app->put('/users/{id}/externalSignatures', \User\controllers\SignatureController::class . ':updateExternalSignatures');
 $app->patch('/users/{id}/signatures/{signatureId}/substituted', \User\controllers\SignatureController::class . ':updateSubstituted');
 
-//Emails
-$app->post('/emails', \Email\controllers\EmailController::class . ':send');
+//WorkflowTemplates
+$app->post('/workflowTemplates', \Workflow\controllers\WorkflowTemplateController::class . ':create');
+$app->get('/workflowTemplates', \Workflow\controllers\WorkflowTemplateController::class . ':get');
+$app->get('/workflowTemplates/{id}', \Workflow\controllers\WorkflowTemplateController::class . ':getById');
+$app->delete('/workflowTemplates/{id}', \Workflow\controllers\WorkflowTemplateController::class . ':delete');
 
 $app->run();
diff --git a/sql/2010.sql b/sql/2010.sql
index 967875e8488842307066f0b5a2e061b2727ec472..13af963e8c653f2e7d3166bd43403638fc6507ae 100755
--- a/sql/2010.sql
+++ b/sql/2010.sql
@@ -10,3 +10,26 @@ ALTER TABLE main_documents DROP COLUMN IF EXISTS status;
 ALTER TABLE main_documents ADD COLUMN status varchar(10);
 
 UPDATE main_documents SET status = 'READY';
+
+DROP TABLE IF EXISTS workflow_templates;
+CREATE TABLE workflow_templates
+(
+    id SERIAL NOT NULL,
+    title text NOT NULL,
+    owner INTEGER NOT NULL,
+    CONSTRAINT workflow_templates_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
+
+DROP TABLE IF EXISTS workflow_templates_items;
+CREATE TABLE workflow_templates_items
+(
+    id SERIAL NOT NULL,
+    workflow_template_id INTEGER NOT NULL,
+    user_id INTEGER NOT NULL,
+    mode CHARACTER VARYING(64) NOT NULL,
+    signature_mode CHARACTER VARYING(64) NOT NULL,
+    sequence INTEGER NOT NULL,
+    CONSTRAINT workflow_templates_items_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
diff --git a/sql/data_fr.sql b/sql/data_fr.sql
index 43bdca0dc68c2f376d698e9f4b4c21f9e97d4b5e..5588bdcbbdfa0999b87a58b2c70bc73201281b38 100755
--- a/sql/data_fr.sql
+++ b/sql/data_fr.sql
@@ -35,19 +35,10 @@ INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_documents
 INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_email_configuration');
 INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_connections');
 INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'manage_groups');
+INSERT INTO groups_privileges (group_id, privilege) VALUES (1, 'indexation');
 INSERT INTO groups_privileges (group_id, privilege) VALUES (2, 'manage_users');
 INSERT INTO groups_privileges (group_id, privilege) VALUES (2, 'manage_documents');
 INSERT INTO groups_privileges (group_id, privilege) VALUES (2, 'manage_groups');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_users');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_documents');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_email_configuration');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_connections');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (3, 'manage_groups');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_users');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_documents');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_email_configuration');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_connections');
-INSERT INTO groups_privileges (group_id, privilege) VALUES (4, 'manage_groups');
 
 
 TRUNCATE TABLE users_groups;
diff --git a/sql/structure.sql b/sql/structure.sql
index 3aab6d9a96987268dedb1c6e55d97f69f3332451..1544c5eca1f7db4c9d6d83f2bb56929128ed6c9b 100755
--- a/sql/structure.sql
+++ b/sql/structure.sql
@@ -238,3 +238,26 @@ CREATE TABLE workflows
     CONSTRAINT workflow_pkey PRIMARY KEY (id)
 )
 WITH (OIDS=FALSE);
+
+DROP TABLE IF EXISTS workflow_templates;
+CREATE TABLE workflow_templates
+(
+    id SERIAL NOT NULL,
+    title text NOT NULL,
+    owner INTEGER NOT NULL,
+    CONSTRAINT workflow_templates_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
+
+DROP TABLE IF EXISTS workflow_templates_items;
+CREATE TABLE workflow_templates_items
+(
+    id SERIAL NOT NULL,
+    workflow_template_id INTEGER NOT NULL,
+    user_id INTEGER NOT NULL,
+    mode CHARACTER VARYING(64) NOT NULL,
+    signature_mode CHARACTER VARYING(64) NOT NULL,
+    sequence INTEGER NOT NULL,
+    CONSTRAINT workflow_templates_items_pkey PRIMARY KEY (id)
+)
+WITH (OIDS=FALSE);
diff --git a/src/app/workflow/controllers/WorkflowTemplateController.php b/src/app/workflow/controllers/WorkflowTemplateController.php
new file mode 100755
index 0000000000000000000000000000000000000000..057437313fcd4ddd9aecbe175b98b99c930546c8
--- /dev/null
+++ b/src/app/workflow/controllers/WorkflowTemplateController.php
@@ -0,0 +1,166 @@
+<?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.
+ *
+ */
+
+/**
+ * @brief Workflow Template Controller
+ * @author dev@maarch.org
+ */
+
+namespace Workflow\controllers;
+
+use Group\controllers\PrivilegeController;
+use History\controllers\HistoryController;
+use Respect\Validation\Validator;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use SrcCore\models\ValidatorModel;
+use User\models\UserModel;
+use Workflow\models\WorkflowTemplateItemModel;
+use Workflow\models\WorkflowTemplateModel;
+
+class WorkflowTemplateController
+{
+    public function get(Request $request, Response $response)
+    {
+        $workflowTemplates = WorkflowTemplateModel::get([
+            'select'    => ['id', 'title'],
+            'where'     => ['owner = ?'],
+            'data'      => [$GLOBALS['id']]
+        ]);
+
+        return $response->withJson(['workflowTemplates' => $workflowTemplates]);
+    }
+
+    public function getById(Request $request, Response $response, array $args)
+    {
+        $workflowTemplate = WorkflowTemplateModel::getById(['id' => $args['id'], 'select' => ['title', 'owner']]);
+        if (empty($workflowTemplate)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Workflow template does not exist']);
+        }
+
+        if ($workflowTemplate['owner'] != $GLOBALS['id']) {
+            return $response->withStatus(403)->withJson(['errors' => 'Workflow template out of perimeter']);
+        }
+
+        $rawWorkflowTemplatesUsers = WorkflowTemplateItemModel::get(['select' => ['*'], 'where' => ['workflow_template_id = ?'], 'data' => [$args['id']], 'orderBy' => ['sequence']]);
+        $workflowTemplatesUsers = [];
+        foreach ($rawWorkflowTemplatesUsers as $value) {
+            $user['substituteUser'] = UserModel::getLabelledUserById(['id' => $value['user_id']]);
+
+            $workflowTemplatesUsers[] = [
+                'userId'        => $value['user_id'],
+                'userLabel'     => UserModel::getLabelledUserById(['id' => $value['user_id']]),
+                'mode'          => $value['mode'],
+                'signatureMode' => $value['signature_mode'],
+                'sequence'      => $value['sequence']
+            ];
+        }
+
+        $workflowTemplate = [
+            'title' => $workflowTemplate['title'],
+            'items' => $workflowTemplatesUsers
+        ];
+
+        return $response->withJson(['workflowTemplate' => $workflowTemplate]);
+    }
+
+    public function create(Request $request, Response $response)
+    {
+        if (!PrivilegeController::hasPrivilege(['userId' => $GLOBALS['id'], 'privilege' => 'indexation'])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Privilege forbidden']);
+        }
+
+        $body = $request->getParsedBody();
+        if (!Validator::stringType()->notEmpty()->validate($body['title'])) {
+            return $response->withStatus(400)->withJson(['errors' => 'Body title is empty or not a string']);
+        } elseif (!Validator::arrayType()->notEmpty()->validate($body['items'])) {
+            return $response->withStatus(400)->withJson(['errors' => 'Body items is empty or not an array']);
+        }
+
+        $control = WorkflowTemplateController::controlItems(['items' => $body['items']]);
+        if (!empty($control['errors'])) {
+            return $response->withStatus(400)->withJson(['errors' => $control['errors']]);
+        }
+
+        $workflowTemplateId = WorkflowTemplateModel::create([
+            'title' => $body['title'],
+            'owner' => $GLOBALS['id']
+        ]);
+
+        foreach ($body['items'] as $key => $item) {
+            WorkflowTemplateItemModel::create([
+                'workflow_template_id'  => $workflowTemplateId,
+                'user_id'               => $item['userId'],
+                'mode'                  => $item['mode'],
+                'signature_mode'        => $item['signatureMode'],
+                'sequence'              => $key
+            ]);
+        }
+
+        HistoryController::add([
+            'code'          => 'OK',
+            'objectType'    => 'workflowTemplates',
+            'objectId'      => $workflowTemplateId,
+            'type'          => 'CREATION',
+            'message'       => "{workflowTemplateAdded} : {$body['title']}"
+        ]);
+
+        return $response->withJson(['id' => $workflowTemplateId]);
+    }
+
+    public function delete(Request $request, Response $response, array $args)
+    {
+        $workflowTemplate = WorkflowTemplateModel::getById(['id' => $args['id'], 'select' => ['owner', 'title']]);
+        if (empty($workflowTemplate)) {
+            return $response->withStatus(400)->withJson(['errors' => 'Workflow template does not exist']);
+        } elseif ($workflowTemplate['owner'] != $GLOBALS['id']) {
+            return $response->withStatus(403)->withJson(['errors' => 'Workflow template out of perimeter']);
+        }
+
+        WorkflowTemplateModel::delete([
+            'where' => ['id = ?'],
+            'data'  => [$args['id']]
+        ]);
+        WorkflowTemplateItemModel::delete(['where' => ['workflow_template_id = ?'], 'data' => [$args['id']]]);
+
+        HistoryController::add([
+            'code'          => 'OK',
+            'objectType'    => 'workflowTemplates',
+            'objectId'      => $args['id'],
+            'type'          => 'SUPPRESSION',
+            'message'       => "{workflowTemplateDeleted} : {$workflowTemplate['title']}"
+        ]);
+
+        return $response->withStatus(204);
+    }
+
+    private static function controlItems(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['items']);
+        ValidatorModel::arrayType($args, ['items']);
+
+        //TODO check mode + signature mode
+        foreach ($args['items'] as $key => $item) {
+            if (empty($item['userId'])) {
+                return ['errors' => "Item[{$key}] userId is empty"];
+            } elseif (empty($item['mode'])) {
+                return ['errors' => "Item[{$key}] mode is empty"];
+            } elseif (empty($item['signatureMode'])) {
+                return ['errors' => "Item[{$key}] signatureMode is empty"];
+            }
+
+            $user = UserModel::getById(['id' => $item['userId'], 'select' => [1]]);
+            if (empty($user)) {
+                return ['errors' => 'User is not valid'];
+            }
+        }
+
+        return true;
+    }
+}
diff --git a/src/app/workflow/models/WorkflowTemplateItemModel.php b/src/app/workflow/models/WorkflowTemplateItemModel.php
new file mode 100755
index 0000000000000000000000000000000000000000..9eda7eddf38233f71a614ce8b3a3b2a04d80d9e4
--- /dev/null
+++ b/src/app/workflow/models/WorkflowTemplateItemModel.php
@@ -0,0 +1,85 @@
+<?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.
+ *
+ */
+
+/**
+ * @brief Workflow Template Item Model
+ * @author dev@maarch.org
+ */
+
+namespace Workflow\models;
+
+use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
+
+class WorkflowTemplateItemModel
+{
+    public static function get(array $args = [])
+    {
+        ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']);
+
+        $templatesUsers = DatabaseModel::select([
+            'select'    => $args['select'] ?? [1],
+            'table'     => ['workflow_templates_items'],
+            'where'     => $args['where'] ?? [],
+            'data'      => $args['data'] ?? [],
+            'order_by'  => $args['orderBy'] ?? []
+        ]);
+
+        return $templatesUsers;
+    }
+
+    public static function create(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['workflow_template_id', 'user_id', 'mode', 'signature_mode']);
+        ValidatorModel::stringType($args, ['mode', 'signature_mode']);
+        ValidatorModel::intVal($args, ['workflow_template_id', 'user_id', 'sequence']);
+
+        DatabaseModel::insert([
+            'table'         => 'workflow_templates_items',
+            'columnsValues' => [
+                'workflow_template_id'  => $args['workflow_template_id'],
+                'user_id'               => $args['user_id'],
+                'mode'                  => $args['mode'],
+                'signature_mode'        => $args['signature_mode'],
+                'sequence'              => $args['sequence']
+            ]
+        ]);
+
+        return true;
+    }
+
+    public static function update(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($args, ['set', 'where', 'data']);
+
+        DatabaseModel::update([
+            'table' => 'workflow_templates_items',
+            'set'   => $args['set'],
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+
+    public static function delete(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['where', 'data']);
+        ValidatorModel::arrayType($args, ['where', 'data']);
+
+        DatabaseModel::delete([
+            'table' => 'workflow_templates_items',
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+}
diff --git a/src/app/workflow/models/WorkflowTemplateModel.php b/src/app/workflow/models/WorkflowTemplateModel.php
new file mode 100755
index 0000000000000000000000000000000000000000..849cf3056b28390f345bdcacad29dd0df08f6a0d
--- /dev/null
+++ b/src/app/workflow/models/WorkflowTemplateModel.php
@@ -0,0 +1,121 @@
+<?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.
+ *
+ */
+
+/**
+ * @brief Workflow Template Model
+ * @author dev@maarch.org
+ */
+
+namespace Workflow\models;
+
+use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
+
+class WorkflowTemplateModel
+{
+    public static function get(array $args = [])
+    {
+        ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']);
+
+        $workflowTemplates = DatabaseModel::select([
+            'select'    => $args['select'] ?? [1],
+            'table'     => ['workflow_templates'],
+            'where'     => $args['where'] ?? [],
+            'data'      => $args['data'] ?? [],
+            'order_by'  => $args['orderBy'] ?? []
+        ]);
+
+        return $workflowTemplates;
+    }
+
+    public static function getById(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['id']);
+        ValidatorModel::intVal($args, ['id']);
+        ValidatorModel::arrayType($args, ['select']);
+
+        $workflowTemplate = DatabaseModel::select([
+            'select'    => $args['select'] ?? [1],
+            'table'     => ['workflow_templates'],
+            'where'     => ['id = ?'],
+            'data'      => [$args['id']]
+        ]);
+
+        if (empty($workflowTemplate[0])) {
+            return [];
+        }
+
+        return $workflowTemplate[0];
+    }
+
+    public static function create(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['title', 'owner']);
+        ValidatorModel::stringType($args, ['title']);
+        ValidatorModel::intVal($args, ['owner']);
+
+        $nextSequenceId = DatabaseModel::getNextSequenceValue(['sequenceId' => 'workflow_templates_id_seq']);
+
+        DatabaseModel::insert([
+            'table'         => 'workflow_templates',
+            'columnsValues' => [
+                'id'          => $nextSequenceId,
+                'title'       => $args['title'],
+                'owner'       => $args['owner']
+            ]
+        ]);
+
+        return $nextSequenceId;
+    }
+
+    public static function update(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($args, ['set', 'where', 'data']);
+
+        DatabaseModel::update([
+            'table' => 'workflow_templates',
+            'set'   => $args['set'],
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+
+    public static function delete(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['where', 'data']);
+        ValidatorModel::arrayType($args, ['where', 'data']);
+
+        DatabaseModel::delete([
+            'table' => 'workflow_templates',
+            'where' => $args['where'],
+            'data'  => $args['data']
+        ]);
+
+        return true;
+    }
+
+//    public static function getWithItems(array $args = [])
+//    {
+//        ValidatorModel::arrayType($args, ['select', 'where', 'data', 'orderBy']);
+//
+//        $listTemplates = DatabaseModel::select([
+//            'select'    => empty($args['select']) ? ['*'] : $args['select'],
+//            'table'     => ['list_templates', 'list_templates_items'],
+//            'left_join' => ['list_templates.id = list_templates_items.list_template_id'],
+//            'where'     => empty($args['where']) ? [] : $args['where'],
+//            'data'      => empty($args['data']) ? [] : $args['data'],
+//            'order_by'  => empty($args['orderBy']) ? [] : $args['orderBy']
+//        ]);
+//
+//        return $listTemplates;
+//    }
+}
diff --git a/test/unitTests/app/workflow/WorkflowTemplateControllerTest.php b/test/unitTests/app/workflow/WorkflowTemplateControllerTest.php
new file mode 100755
index 0000000000000000000000000000000000000000..fb30799951787475d7e247ea2fe996801d3d11fd
--- /dev/null
+++ b/test/unitTests/app/workflow/WorkflowTemplateControllerTest.php
@@ -0,0 +1,132 @@
+<?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 WorkflowTemplateControllerTest extends TestCase
+{
+    private static $workflowTemplateId = null;
+
+    public function testCreate()
+    {
+        $wtController = new \Workflow\controllers\WorkflowTemplateController();
+
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'POST']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $args = [
+            'title'     => 'mon workflow',
+            'items'     => [
+                [
+                    'userId'        => 1,
+                    'mode'          => 'visa',
+                    'signatureMode' => 'standard'
+                ],
+                [
+                    'userId'        => 3,
+                    'mode'          => 'sign',
+                    'signatureMode' => 'standard'
+                ]
+            ]
+        ];
+
+        $fullRequest = \httpRequestCustom::addContentInBody($args, $request);
+        $response     = $wtController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(200, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertIsNumeric($responseBody['id']);
+        self::$workflowTemplateId = $responseBody['id'];
+
+
+        //ERRORS
+        unset($args['items'][0]['userId']);
+        $fullRequest = \httpRequestCustom::addContentInBody($args, $request);
+        $response     = $wtController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Item[0] userId is empty', $responseBody['errors']);
+
+        unset($args['title']);
+        $fullRequest = \httpRequestCustom::addContentInBody($args, $request);
+        $response     = $wtController->create($fullRequest, new \Slim\Http\Response());
+        $this->assertSame(400, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Body title is empty or not a string', $responseBody['errors']);
+    }
+
+    public function testGet()
+    {
+        $wtController = new \Workflow\controllers\WorkflowTemplateController();
+
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $wtController->get($request, new \Slim\Http\Response());
+        $this->assertSame(200, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertIsArray($responseBody['workflowTemplates']);
+        $this->assertNotEmpty($responseBody['workflowTemplates']);
+    }
+
+    public function testGetById()
+    {
+        $wtController = new \Workflow\controllers\WorkflowTemplateController();
+
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $wtController->getById($request, new \Slim\Http\Response(), ['id' => self::$workflowTemplateId]);
+        $this->assertSame(200, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('mon workflow', $responseBody['workflowTemplate']['title']);
+        $this->assertSame(1, $responseBody['workflowTemplate']['items'][0]['userId']);
+        $this->assertNotEmpty($responseBody['workflowTemplate']['items'][0]['userLabel']);
+        $this->assertSame('visa', $responseBody['workflowTemplate']['items'][0]['mode']);
+        $this->assertSame('standard', $responseBody['workflowTemplate']['items'][0]['signatureMode']);
+        $this->assertSame(3, $responseBody['workflowTemplate']['items'][1]['userId']);
+        $this->assertNotEmpty($responseBody['workflowTemplate']['items'][1]['userLabel']);
+        $this->assertSame('sign', $responseBody['workflowTemplate']['items'][1]['mode']);
+        $this->assertSame('standard', $responseBody['workflowTemplate']['items'][1]['signatureMode']);
+
+        //ERRORS
+        $previousUserId = $GLOBALS['id'];
+        $GLOBALS['id']  = 2;
+
+        $response     = $wtController->getById($request, new \Slim\Http\Response(), ['id' => self::$workflowTemplateId]);
+        $this->assertSame(403, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Workflow template out of perimeter', $responseBody['errors']);
+
+        $GLOBALS['id']  = $previousUserId;
+    }
+
+    public function testDelete()
+    {
+        $wtController = new \Workflow\controllers\WorkflowTemplateController();
+
+        $environment    = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'DELETE']);
+        $request        = \Slim\Http\Request::createFromEnvironment($environment);
+
+        $response     = $wtController->delete($request, new \Slim\Http\Response(), ['id' => self::$workflowTemplateId]);
+        $this->assertSame(204, $response->getStatusCode());
+
+        //ERRORS
+        $response     = $wtController->delete($request, new \Slim\Http\Response(), ['id' => 9999999]);
+        $this->assertSame(400, $response->getStatusCode());
+
+        $responseBody = json_decode((string)$response->getBody(), true);
+        $this->assertSame('Workflow template does not exist', $responseBody['errors']);
+    }
+}