diff --git a/src/app/resource/controllers/ExportController.php b/src/app/resource/controllers/ExportController.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e503e6a0cd4265120e461a840b6c58cb45b85f5
--- /dev/null
+++ b/src/app/resource/controllers/ExportController.php
@@ -0,0 +1,234 @@
+<?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 Export Controller
+* @author dev@maarch.org
+*/
+
+namespace Resource\controllers;
+
+use Attachment\models\AttachmentModel;
+use Basket\models\BasketModel;
+use Basket\models\GroupBasketModel;
+use Basket\models\RedirectBasketModel;
+use Entity\models\EntityModel;
+use Group\models\GroupModel;
+use Note\models\NoteModel;
+use Priority\models\PriorityModel;
+use Resource\models\ExportTemplateModel;
+use Resource\models\ResModel;
+use Resource\models\ResourceContactModel;
+use Resource\models\ResourceListModel;
+use Respect\Validation\Validator;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use SrcCore\controllers\PreparedClauseController;
+use SrcCore\models\ValidatorModel;
+use Status\models\StatusModel;
+use User\models\UserModel;
+
+class ExportController
+{
+    public function getExport(Request $request, Response $response, array $aArgs)
+    {
+        $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]);
+
+        $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $currentUser['id']]);
+        if (!empty($errors['errors'])) {
+            return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]);
+        }
+
+        $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order', 'basket_name']]);
+        $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
+
+        $data = $request->getQueryParams();
+
+        if (!Validator::stringType()->notEmpty()->validate($data['delimiter'])) {
+            return ['errors' => 'Delimiter is not set', 'code' => 400];
+        } elseif (!Validator::arrayType()->notEmpty()->validate($data['data'])) {
+            return ['errors' => 'Data is not an array or empty', 'code' => 400];
+        }
+        foreach ($data['data'] as $value) {
+            if (!Validator::stringType()->notEmpty()->validate($value['value'])) {
+                return ['errors' => 'Value is not set', 'code' => 400];
+            } elseif (!Validator::boolType()->validate($value['isFunction'])) {
+                return ['errors' => 'Data is not an array or empty', 'code' => 400];
+            }
+        }
+
+        $template = ExportTemplateModel::getByUserId(['select' => [1], 'userId' => $currentUser['id']]);
+        if (empty($template)) {
+            //create
+        } else {
+            //update
+        }
+        $table = [];
+        $leftJoin = [];
+        $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
+        $where = [$whereClause];
+        $queryData = [];
+
+        if (!empty($data['delayed']) && $data['delayed'] == 'true') {
+            $where[] = 'process_limit_date < CURRENT_TIMESTAMP';
+        }
+        if (!empty($data['search']) && mb_strlen($data['search']) >= 2) {
+            $where[] = '(alt_identifier ilike ? OR translate(subject, \'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\') ilike translate(?, \'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\'))';
+            $queryData[] = "%{$data['search']}%";
+            $queryData[] = "%{$data['search']}%";
+        }
+        if (isset($data['priorities'])) {
+            if (empty($data['priorities'])) {
+                $where[] = 'priority is null';
+            } else {
+                $replace = preg_replace('/(^,)|(,$)/', '', $data['priorities']);
+                $replace = preg_replace('/(,,)/', ',', $replace);
+                if ($replace != $data['priorities']) {
+                    $where[] = '(priority is null OR priority in (?))';
+                } else {
+                    $where[] = 'priority in (?)';
+                }
+                $queryData[] = explode(',', $replace);
+            }
+        }
+        if (isset($data['categories'])) {
+            if (empty($data['categories'])) {
+                $where[] = 'category_id is null';
+            } else {
+                $replace = preg_replace('/(^,)|(,$)/', '', $data['categories']);
+                $replace = preg_replace('/(,,)/', ',', $replace);
+                if ($replace != $data['categories']) {
+                    $where[] = '(category_id is null OR category_id in (?))';
+                } else {
+                    $where[] = 'category_id in (?)';
+                }
+                $queryData[] = explode(',', $replace);
+            }
+        }
+        if (!empty($data['statuses'])) {
+            $where[] = 'status in (?)';
+            $queryData[] = explode(',', $data['statuses']);
+        }
+        if (isset($data['entities'])) {
+            if (empty($data['entities'])) {
+                $where[] = 'destination is null';
+            } else {
+                $replace = preg_replace('/(^,)|(,$)/', '', $data['entities']);
+                $replace = preg_replace('/(,,)/', ',', $replace);
+                if ($replace != $data['entities']) {
+                    $where[] = '(destination is null OR destination in (?))';
+                } else {
+                    $where[] = 'destination in (?)';
+                }
+                $queryData[] = explode(',', $replace);
+            }
+        }
+        if (!empty($data['entitiesChildren'])) {
+            $entities = explode(',', $data['entitiesChildren']);
+            $entitiesChildren = [];
+            foreach ($entities as $entity) {
+                $children = EntityModel::getEntityChildren(['entityId' => $entity]);
+                $entitiesChildren = array_merge($entitiesChildren, $children);
+            }
+            if (!empty($entitiesChildren)) {
+                $where[] = 'destination in (?)';
+                $queryData[] = $entitiesChildren;
+            }
+        }
+
+        if (!empty($data['order']) && strpos($data['order'], 'alt_identifier') !== false) {
+            $data['order'] = 'order_alphanum(alt_identifier) ' . explode(' ', $data['order'])[1];
+        }
+        if (!empty($data['order']) && strpos($data['order'], 'priority') !== false) {
+            $data['order'] = 'priorities.order ' . explode(' ', $data['order'])[1];
+            $table = ['priorities'];
+            $leftJoin = ['res_view_letterbox.priority = priorities.id'];
+        }
+
+        $select = ['res_id'];
+        foreach ($data['data'] as $value) {
+            if (!$value['isFunction']) {
+                $select[] = $value['value'];
+            } else {
+                if ($value['value'] == 'getStatus') {
+                    $select[] = 'status';
+                } elseif ($value['value'] == 'getPriority') {
+                    $select[] = 'priority';
+                } elseif ($value['value'] == 'getParentFolder') {
+                    $select[] = 'fold_parent_id';
+                } elseif ($value['value'] == 'getCategory') {
+                    $select[] = 'category_id';
+                } elseif ($value['value'] == 'getInitiatorEntity') {
+                    $select[] = 'initiator';
+                } elseif ($value['value'] == 'getDestinationEntity') {
+                    $select[] = 'destination';
+                } elseif ($value['value'] == 'getContactType') {
+                    //TODO
+                } elseif ($value['value'] == 'getContactCivility') {
+                    //TODO
+                } elseif ($value['value'] == 'getContactFunction') {
+                    //TODO
+                }
+            }
+        }
+
+        $rawResources = ResourceListModel::getOnView([
+            'select'    => $select,
+            'table'     => $table,
+            'leftJoin'  => $leftJoin,
+            'where'     => $where,
+            'data'      => $queryData,
+            'orderBy'   => empty($data['order']) ? [$basket['basket_res_order']] : [$data['order']]
+        ]);
+        $resIds = [];
+        foreach ($rawResources as $resource) {
+            $resIds[] = $resource['res_id'];
+        }
+
+        if ($value['value'] == 'getStatus') {
+
+        } elseif ($value['value'] == 'getPriority') {
+
+        } elseif ($value['value'] == 'getCopyEntities') {
+
+        } elseif ($value['value'] == 'getDetailLink') {
+
+        } elseif ($value['value'] == 'getParentFolder') {
+
+        } elseif ($value['value'] == 'getCategory') {
+
+        } elseif ($value['value'] == 'getInitiatorEntity') {
+
+        } elseif ($value['value'] == 'getDestinationEntity') {
+
+        } elseif ($value['value'] == 'getContactType') {
+
+        } elseif ($value['value'] == 'getContactCivility') {
+
+        } elseif ($value['value'] == 'getContactFunction') {
+
+        } elseif ($value['value'] == 'getTags') {
+
+        } elseif ($value['value'] == 'getSignatories') {
+
+        } elseif ($value['value'] == 'getSignatureDates') {
+
+        }
+
+
+        $resources = [];
+        if (!empty($resIds)) {
+
+            $resources = ResourceListModel::get(['resIds' => $resIds]);
+
+        }
+
+        return $response->withJson(['resources' => $resources, 'basketLabel' => $basket['basket_name']]);
+    }
+}
diff --git a/src/app/resource/controllers/ResourceListController.php b/src/app/resource/controllers/ResourceListController.php
index bfab33eab6a1c1a96d7760d756ffedc4e6cb33b2..5439dc14fc2dad183a7cae97e126f92176ab5c46 100644
--- a/src/app/resource/controllers/ResourceListController.php
+++ b/src/app/resource/controllers/ResourceListController.php
@@ -405,7 +405,7 @@ class ResourceListController
         return $response->withJson(['entities' => $entities, 'priorities' => $priorities, 'categories' => $categories, 'statuses' => $statuses, 'entitiesChildren' => $entitiesChildren]);
     }
 
-    private static function listControl(array $aArgs)
+    public static function listControl(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['groupId', 'userId', 'basketId', 'currentUserId']);
         ValidatorModel::intVal($aArgs, ['groupId', 'userId', 'currentUserId']);
diff --git a/src/app/resource/models/ExportTemplateModel.php b/src/app/resource/models/ExportTemplateModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ab7cd164fcb70e27580d773bc31751404097b6a
--- /dev/null
+++ b/src/app/resource/models/ExportTemplateModel.php
@@ -0,0 +1,74 @@
+<?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 Export Template Model
+* @author dev@maarch.org
+*/
+
+namespace Resource\models;
+
+use SrcCore\models\DatabaseModel;
+use SrcCore\models\ValidatorModel;
+
+class ExportTemplateModel
+{
+    public static function getByUserId(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['userId']);
+        ValidatorModel::intVal($aArgs, ['userId']);
+        ValidatorModel::arrayType($aArgs, ['select']);
+
+        $exportTemplates = DatabaseModel::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => ['exports_templates'],
+            'where'     => ['user_id = ?'],
+            'data'      => [$aArgs['userId']]
+        ]);
+
+        if (empty($exportTemplates[0])) {
+            return [];
+        }
+
+        return $exportTemplates[0];
+    }
+
+    public static function create(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['userId', 'delimiter', 'data']);
+        ValidatorModel::stringType($aArgs, ['delimiter', 'data']);
+        ValidatorModel::intVal($aArgs, ['userId']);
+
+        DatabaseModel::insert([
+            'table'         => 'exports_templates',
+            'columnsValues' => [
+                'user_id'   => $aArgs['userId'],
+                'delimiter' => $aArgs['delimiter'],
+                'data'      => $aArgs['data']
+            ]
+        ]);
+
+        return true;
+    }
+
+    public static function update(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['set', 'where', 'data']);
+        ValidatorModel::arrayType($aArgs, ['set', 'where', 'data']);
+
+        DatabaseModel::update([
+            'table' => 'exports_templates',
+            'set'   => $aArgs['set'],
+            'where' => $aArgs['where'],
+            'data'  => $aArgs['data']
+        ]);
+
+        return true;
+    }
+}