diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..b00977a30e9ea59180ca02f65c41acdbc00168d5
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,9 @@
+CHANGELOG
+=========
+
+3.0.0 (03/09/2020)
+------------------
+
+- Adaptation du code pour le passage à ZF3.
+- Ajout de fonctions au Service "ZimbraAccount" : ajout/suppression alias, ajout/suppression forward et modifications de quelques options du compte Zimbra. 
+
diff --git a/Module.php b/Module.php
index fc58ad0115529bef3f03766d080b297bf4845ce4..09bd67b513554b16dfaf214e45be1f6fc02d6779 100644
--- a/Module.php
+++ b/Module.php
@@ -2,16 +2,11 @@
 
 namespace UnicaenZimbra;
 
+use Zend\Loader\StandardAutoloader;
 use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
 use Zend\ModuleManager\Feature\ConfigProviderInterface;
-use Zend\ModuleManager\Feature\ServiceProviderInterface;
 
-/**
- * Point d'entrée du module de gestion de Zimbra.
- *
- * @author Laurent LECLUSE <laurent.lecluse@unicaen.fr>
- */
-class Module implements ConfigProviderInterface, ServiceProviderInterface
+class Module implements ConfigProviderInterface
 {
 
     /**
@@ -31,54 +26,12 @@ class Module implements ConfigProviderInterface, ServiceProviderInterface
      */
     public function getAutoloaderConfig()
     {
-        return array(
-            'Zend\Loader\ClassMapAutoloader' => array(
-                __DIR__ . '/autoload_classmap.php',
-            ),
-            'Zend\Loader\StandardAutoloader' => array(
-                'namespaces' => array(
+        return [
+            StandardAutoloader::class => [
+                'namespaces' => [
                     __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
-                ),
-            ),
-        );
-    }
-
-    /**
-     *
-     * @return array
-     * @see ServiceProviderInterface
-     */
-    public function getServiceConfig()
-    {
-        $services = array(
-            'Account',  'Alias',   'Cos',      'DistributionList',
-            'Domain',   'Filter',  'Folder',   'Gal',
-            'Identity', 'MailBox', 'Resource', 'Right', 'Server'
-        );
-        $processus = array(
-            'BoiteGenerique'
-        );
-        $factories = array(
-            'zimbra'        => function($sm){
-                return new Zimbra;
-            },
-            'zimbraOptions' => 'UnicaenZimbra\Options\ModuleOptionsFactory',
-        );
-        foreach( $services as $service ){
-            $factories['zimbraService'.$service] = function($sm) use ($service){
-                $className = 'UnicaenZimbra\\Service\\'.$service;
-                return new $className;
-            };
-        }
-        foreach( $processus as $proc ){
-            $factories['zimbraProcessus'.$proc] = function($sm) use ($proc){
-                $className = 'UnicaenZimbra\\Processus\\'.$proc;
-                return new $className;
-            };
-        }
-
-        return array(
-            'factories' => $factories,
-        );
+                ],
+            ],
+        ];
     }
 }
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..6bda1aa6b00a253f09b703c50e5f50f58fafa4ba
--- /dev/null
+++ b/README.md
@@ -0,0 +1,42 @@
+# UnicaenZimbra
+
+ * [Introduction](#introduction)
+ * [Installation](#installation)
+ * [Configuration](#configuration)
+ 
+## Introduction
+ 
+Ce module permet d'utiliser l'[API SOAP Zimbra](https://wiki.zimbra.com/wiki/SOAP_API_Reference_Material_Beginning_with_ZCS_8) et de piloter le serveur Zimbra de l'université. 
+
+## Pré-requis
+
+L'utilisation de ce module nécessite l'installation de l'extension `ext-curl` de PHP.
+
+## Installation
+
+```bash 
+$ composer require unicaen/zimbra
+```
+
+## Configuration
+
+> Récupérer les fichiers de config du module 
+ 
+```bash
+$ cp -n vendor/unicaen/zimbra/config/unicaen-zimbra.global.php.dist config/autoload/unicaen-zimbra.global.php
+$ cp -n vendor/unicaen/zimbra/config/unicaen-zimbra.local.php.dist config/autoload/unicaen-zimbra.local.php
+```
+
+> Adapter le contenu à vos besoins en configurant notamment les paramètres de connexion au serveur Zimbra.
+
+```php
+'unicaen-zimbra' => [
+    'server' => 'test-zimbra.unicaen.fr',
+    'port' => 7071,
+    'email' => 'test@unicaen.fr',
+    'password' => 'xxxx',
+    'domain' => 'unicaen.fr',
+    'boite_generique_cos_id' => 'e00428a1-0c00-11d9-836a-000d93afea2a',
+    'debug_mode' => false,
+]
+```
\ No newline at end of file
diff --git a/autoload_classmap.php b/autoload_classmap.php
deleted file mode 100644
index 1f29108fdf04df2de3fe882de2424564ca50b2f6..0000000000000000000000000000000000000000
--- a/autoload_classmap.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-// Generated by ZF2's ./bin/classmap_generator.php
-return array(
-);
\ No newline at end of file
diff --git a/config/module.config.php b/config/module.config.php
index 967aa92d5adf7676768a584b0a4dcce55a4a8b68..a55c05c4473a2f407403f2264b93951827fe0e8a 100644
--- a/config/module.config.php
+++ b/config/module.config.php
@@ -1,9 +1,81 @@
 <?php
 
-$settings = array(
+namespace UnicaenZimbra;
 
-);
+use UnicaenZimbra\Options\ModuleOptionsFactory;
+use UnicaenZimbra\Processus\ZimbraBoiteGeneriqueProcessus;
+use UnicaenZimbra\Processus\ZimbraBoiteGeneriqueProcessusFactory;
+use UnicaenZimbra\Service\ZimbraAccountService;
+use UnicaenZimbra\Service\ZimbraAccountServiceFactory;
+use UnicaenZimbra\Service\ZimbraAliasService;
+use UnicaenZimbra\Service\ZimbraAliasServiceFactory;
+use UnicaenZimbra\Service\ZimbraCosService;
+use UnicaenZimbra\Service\ZimbraCosServiceFactory;
+use UnicaenZimbra\Service\ZimbraDistributionListService;
+use UnicaenZimbra\Service\ZimbraDistributionListServiceFactory;
+use UnicaenZimbra\Service\ZimbraDomainService;
+use UnicaenZimbra\Service\ZimbraDomainServiceFactory;
+use UnicaenZimbra\Service\ZimbraFilterService;
+use UnicaenZimbra\Service\ZimbraFilterServiceFactory;
+use UnicaenZimbra\Service\ZimbraFolderService;
+use UnicaenZimbra\Service\ZimbraFolderServiceFactory;
+use UnicaenZimbra\Service\ZimbraGalService;
+use UnicaenZimbra\Service\ZimbraGalServiceFactory;
+use UnicaenZimbra\Service\ZimbraIdentityService;
+use UnicaenZimbra\Service\ZimbraIdentityServiceFactory;
+use UnicaenZimbra\Service\ZimbraMailBoxService;
+use UnicaenZimbra\Service\ZimbraMailBoxServiceFactory;
+use UnicaenZimbra\Service\ZimbraResourceService;
+use UnicaenZimbra\Service\ZimbraResourceServiceFactory;
+use UnicaenZimbra\Service\ZimbraRightService;
+use UnicaenZimbra\Service\ZimbraRightServiceFactory;
+use UnicaenZimbra\Service\ZimbraServerService;
+use UnicaenZimbra\Service\ZimbraServerServiceFactory;
 
-return array(
-   'unicaen-zimbra' => $settings
-);
\ No newline at end of file
+return [
+    'unicaen-zimbra' => [],
+
+    'service_manager' => [
+        'aliases' => [
+            // services
+            'zimbraServiceAccount' => ZimbraAccountService::class,
+            'zimbraServiceAlias' => ZimbraAliasService::class,
+            'zimbraServiceCos' => ZimbraCosService::class,
+            'zimbraServiceDistributionList' => ZimbraDistributionListService::class,
+            'zimbraServiceDomain' => ZimbraDomainService::class,
+            'zimbraServiceFilter' => ZimbraFilterService::class,
+            'zimbraServiceFolder' => ZimbraFolderService::class,
+            'zimbraServiceGal' => ZimbraGalService::class,
+            'zimbraServiceIdentity' => ZimbraIdentityService::class,
+            'zimbraServiceMailBox' => ZimbraMailBoxService::class,
+            'zimbraServiceResource' => ZimbraResourceService::class,
+            'zimbraServiceRight' => ZimbraRightService::class,
+            'zimbraServiceServer' => ZimbraServerService::class,
+
+            // processus
+            'zimbraProcessusBoiteGenerique' => BoiteGeneriqueProcessus::class,
+        ],
+        'factories' => [
+            'zimbra' => ZimbraFactory::class,
+            'zimbraOptions' => ModuleOptionsFactory::class,
+
+            // services
+            ZimbraAccountService::class => ZimbraAccountServiceFactory::class,
+            ZimbraAliasService::class => ZimbraAliasServiceFactory::class,
+            ZimbraCosService::class => ZimbraCosServiceFactory::class,
+            ZimbraDistributionListService::class => ZimbraDistributionListServiceFactory::class,
+            ZimbraDomainService::class => ZimbraDomainServiceFactory::class,
+            ZimbraFilterService::class => ZimbraFilterServiceFactory::class,
+            ZimbraFolderService::class => ZimbraFolderServiceFactory::class,
+            ZimbraGalService::class => ZimbraGalServiceFactory::class,
+            ZimbraIdentityService::class => ZimbraIdentityServiceFactory::class,
+            ZimbraMailBoxService::class => ZimbraMailBoxServiceFactory::class,
+            ZimbraResourceService::class => ZimbraResourceServiceFactory::class,
+            ZimbraRightService::class => ZimbraRightServiceFactory::class,
+            ZimbraServerService::class => ZimbraServerServiceFactory::class,
+
+            // Zimbra processus
+            ZimbraBoiteGeneriqueProcessus::class => ZimbraBoiteGeneriqueProcessusFactory::class,
+        ],
+    ],
+];
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Entity/Account.php b/src/UnicaenZimbra/Entity/Account.php
index a86dc3493a7b163c79ae91b4898041c14c155565..2400b00858471b399ea66efe81ee73e01f20ee56 100644
--- a/src/UnicaenZimbra/Entity/Account.php
+++ b/src/UnicaenZimbra/Entity/Account.php
@@ -1,11 +1,5 @@
 <?php
 
-/**
- * Compte Mail Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Entity;
 
 class Account extends Entity
@@ -20,9 +14,44 @@ class Account extends Entity
         if (is_array($this->zimbraMailAlias))
             return $this->zimbraMailAlias;
         elseif(is_string($this->zimbraMailAlias))
-            return array($this->zimbraMailAlias);
+            return [$this->zimbraMailAlias];
         else
-            return array();
+            return [];
+    }
+
+    /**
+     * Retourne la liste des forwards
+     *
+     * @return string[]
+     */
+    public function getForward()
+    {
+        if(is_string($this->zimbraPrefMailForwardingAddress)) {
+            return preg_split('/,\s*/', $this->zimbraPrefMailForwardingAddress);
+        }
+        else {
+            return [];
+        }
+    }
+
+    /**
+     * Conservation d'une copie des messages dans la boîte locale ?
+     *
+     * @return bool
+     */
+    public function getLocalDelivery()
+    {
+        return $this->zimbraPrefMailLocalDeliveryDisabled ? false : true;
+    }
+
+    /**
+     * Synchronisation du mobile (ActiveSync) ?
+     *
+     * @return bool
+     */
+    public function getSynchroMobile()
+    {
+        return $this->zimbraFeatureMobileSyncEnabled;
     }
 
     /**
diff --git a/src/UnicaenZimbra/Entity/Cos.php b/src/UnicaenZimbra/Entity/Cos.php
index 26f9052fdcf07053c8e25994260dd98a19f5c344..44522d220a826836bb3d0bd7d43ca52b53b2676e 100644
--- a/src/UnicaenZimbra/Entity/Cos.php
+++ b/src/UnicaenZimbra/Entity/Cos.php
@@ -10,4 +10,9 @@ namespace UnicaenZimbra\Entity;
 
 class Cos extends Entity
 {
+    const COS_ETUDIANTS = 'cos_etudiants';
+    const COS_PERSONNEL = 'cos_personnel';
+    const COS_PERSONNEL_SYNCHRO = 'cos_personnel_synchro';
+    const COS_PERSONNEL_VIP = 'cos_personnel_6g';
+    const COS_PERSONNEL_VIP_SYNCHRO = 'cos_personnel_synchro_6g';
 }
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Options/ModuleOptions.php b/src/UnicaenZimbra/Options/ModuleOptions.php
index bd73b15b923c2b36a04ad8ab8e0294864205660a..a598be8910f16fb544d067339c10e79f892266aa 100644
--- a/src/UnicaenZimbra/Options/ModuleOptions.php
+++ b/src/UnicaenZimbra/Options/ModuleOptions.php
@@ -1,13 +1,9 @@
 <?php
+
 namespace UnicaenZimbra\Options;
 
 use Zend\Stdlib\AbstractOptions;
 
-/**
- * Classe encapsulant les options de fonctionnement du module.
- * 
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
 class ModuleOptions extends AbstractOptions
 {
     /**
diff --git a/src/UnicaenZimbra/Options/ModuleOptionsFactory.php b/src/UnicaenZimbra/Options/ModuleOptionsFactory.php
index 6c64914098da0ec65e3b680d8b62c5c8309a37c7..3efe4b341e1234eb78517e90488eda32d5e6b237 100644
--- a/src/UnicaenZimbra/Options/ModuleOptionsFactory.php
+++ b/src/UnicaenZimbra/Options/ModuleOptionsFactory.php
@@ -2,25 +2,22 @@
 
 namespace UnicaenZimbra\Options;
 
-use Zend\ServiceManager\FactoryInterface;
-use Zend\ServiceManager\ServiceLocatorInterface;
+use Interop\Container\ContainerInterface;
+use Zend\ServiceManager\Factory\FactoryInterface;
 
-/**
- * Description of ModuleOptionsFactory
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
 class ModuleOptionsFactory implements FactoryInterface
 {
     /**
      * Create service
      *
-     * @param ServiceLocatorInterface $serviceLocator
-     * @return mixed
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return ModuleOptions|object
      */
-    public function createService(ServiceLocatorInterface $serviceLocator)
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
     {
-        $config       = $serviceLocator->get('Configuration');
+        $config = $container->get('Configuration');
         $moduleConfig = isset($config['unicaen-zimbra']) ? $config['unicaen-zimbra'] : array();
         return new ModuleOptions($moduleConfig);
     }
diff --git a/src/UnicaenZimbra/Processus/AbstractProcessus.php b/src/UnicaenZimbra/Processus/AbstractProcessus.php
new file mode 100644
index 0000000000000000000000000000000000000000..a48b967e7fc3031c110e4c8b0be0260886d747a7
--- /dev/null
+++ b/src/UnicaenZimbra/Processus/AbstractProcessus.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace UnicaenZimbra\Processus;
+
+use UnicaenZimbra\Service\ZimbraAccountServiceAwareTrait;
+use UnicaenZimbra\Service\ZimbraCosServiceAwareTrait;
+use UnicaenZimbra\Service\ZimbraDistributionListServiceAwareTrait;
+use UnicaenZimbra\Service\ZimbraFilterServiceAwareTrait;
+use UnicaenZimbra\Service\ZimbraFolderServiceAwareTrait;
+use UnicaenZimbra\Service\ZimbraIdentityServiceAwareTrait;
+use UnicaenZimbra\Service\ZimbraRightServiceAwareTrait;
+use UnicaenZimbra\Zimbra;
+
+abstract class AbstractProcessus
+{
+    use ZimbraAccountServiceAwareTrait;
+    use ZimbraCosServiceAwareTrait;
+    use ZimbraDistributionListServiceAwareTrait;
+    use ZimbraFilterServiceAwareTrait;
+    use ZimbraFolderServiceAwareTrait;
+    use ZimbraIdentityServiceAwareTrait;
+    use ZimbraRightServiceAwareTrait;
+    
+    /**
+     * @var Zimbra
+     */
+    protected $zimbra;
+
+
+    /**
+     * @param Zimbra $zimbra
+     * @return $this
+     */
+    public function setZimbra(Zimbra $zimbra) : self
+    {
+        $this->zimbra = $zimbra;
+
+        return $this;
+    }
+
+    /**
+     * @return Zimbra
+     */
+    public function getZimbra() : Zimbra
+    {
+        return $this->zimbra;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Processus/Processus.php b/src/UnicaenZimbra/Processus/Processus.php
deleted file mode 100644
index 3b57385fe8db76b23c9c704de646d137f9e8e742..0000000000000000000000000000000000000000
--- a/src/UnicaenZimbra/Processus/Processus.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/**
- * Processus de gestion des boites génériques
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
-namespace UnicaenZimbra\Processus;
-
-use Zend\ServiceManager\ServiceManager;
-use Zend\ServiceManager\ServiceManagerAwareInterface;
-
-abstract class Processus implements ServiceManagerAwareInterface {
-    /**
-     * @var ServiceManager
-     */
-    protected $serviceManager;
-
-
-
-
-
-    /**
-     * Get service manager
-     *
-     * @return ServiceManager
-     */
-    public function getServiceManager()
-    {
-        return $this->serviceManager;
-    }
-
-    /**
-     * Set service manager
-     *
-     * @param ServiceManager $serviceManager
-     * @return self
-     */
-    public function setServiceManager(ServiceManager $serviceManager)
-    {
-        $this->serviceManager = $serviceManager;
-        return $this;
-    }
-}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Processus/BoiteGenerique.php b/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessus.php
similarity index 83%
rename from src/UnicaenZimbra/Processus/BoiteGenerique.php
rename to src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessus.php
index 9d9771b4972c2a167fb4ef376a40918c4f8304fc..505e5ce82bfb2e86dd3b2e27c5498691d250b96a 100644
--- a/src/UnicaenZimbra/Processus/BoiteGenerique.php
+++ b/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessus.php
@@ -1,11 +1,5 @@
 <?php
 
-/**
- * Processus de gestion des boites génériques
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Processus;
 
 use UnicaenZimbra\Entity\Account;
@@ -17,12 +11,36 @@ use UnicaenZimbra\Entity\Filter\Test\Address as FilterTestAddress;
 use UnicaenZimbra\Entity\Filter\Test\Header as FilterTestHeader;
 use UnicaenZimbra\Entity\Filter\Action\FileInto as FilterActionFileInto;
 use UnicaenZimbra\Entity\Filter\Action\Keep as FilterActionKeep;
+use UnicaenZimbra\Options\ModuleOptions;
 use UnicaenZimbra\Service\Folder as FolderService;
+use UnicaenZimbra\Service\ZimbraGalService;
 
-class BoiteGenerique extends Processus
+class ZimbraBoiteGeneriqueProcessus extends AbstractProcessus
 {
     const ZIMBRA_TEMPORISATION = 5000000; // microsecondes
 
+    /**
+     * @var ModuleOptions
+     */
+    protected $options;
+
+
+    /**
+     * @param ModuleOptions $moduleOptions
+     */
+    public function setOptions(ModuleOptions $moduleOptions)
+    {
+        $this->options = $moduleOptions;
+    }
+
+    /**
+     * @return ModuleOptions
+     */
+    public function getOptions()
+    {
+        return $this->options;
+    }
+
     /**
      * Créer une boite générique
      *
@@ -34,13 +52,13 @@ class BoiteGenerique extends Processus
      */
     public function create($mail, $password, $name, $description)
     {
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $cosService = $this->getServiceManager()->get('zimbraServiceCos');
+        $accountService = $this->getZimbraAccountService();
+        $cosService = $this->getZimbraCosService();
 
         $account = new Account;
         $account->name = $mail;
         $account->description = $description;
-        $account->zimbraCOSId = $this->getServiceManager()->get('zimbraOptions')->getBoiteGeneriqueCosId();
+        $account->zimbraCOSId = $this->getOptions()->getBoiteGeneriqueCosId();
         $accountService->create($account, $password);
         $accountService->addAlias($account, $name . substr($mail, strpos($mail, '@')));
         return $this;
@@ -55,7 +73,7 @@ class BoiteGenerique extends Processus
      */
     public function rename($mail, $newName)
     {
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
+        $accountService = $this->getZimbraAccountService();
         $accountService->rename($accountService->get($mail), $newName);
         return $this;
     }
@@ -68,7 +86,7 @@ class BoiteGenerique extends Processus
      */
     public function delete($mail)
     {
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
+        $accountService = $this->getZimbraAccountService();
         $accountService->delete($accountService->get($mail));
         return $this;
     }
@@ -85,10 +103,10 @@ class BoiteGenerique extends Processus
         $afName = $this->getMailName($adresseFonctionnelle);
 
         // Récupération des services
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $folderService = $this->getServiceManager()->get('zimbraServiceFolder');
-        $filterService = $this->getServiceManager()->get('zimbraServiceFilter');
+        $accountService = $this->getZimbraAccountService();
+        $distribListService = $this->getZimbraDistributionListService();
+        $folderService = $this->getZimbraFolderService();
+        $filterService = $this->getZimbraFilterService();
 
         // Travail sur la boite générique
         $bg = $accountService->get($mail);
@@ -148,10 +166,10 @@ class BoiteGenerique extends Processus
         $afNewName = $this->getMailName($newName);
 
         // récupération des services
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $folderService = $this->getServiceManager()->get('zimbraServiceFolder');
-        $filterService = $this->getServiceManager()->get('zimbraServiceFilter');
+        $accountService = $this->getZimbraAccountService();
+        $distribListService = $this->getZimbraDistributionListService();
+        $folderService = $this->getZimbraFolderService();
+        $filterService = $this->getZimbraFilterService();
 
         // Travail sur la boite générique
         $bg = $accountService->get($mail);
@@ -213,10 +231,10 @@ class BoiteGenerique extends Processus
         $afName = $this->getMailName($adresseFonctionnelle);
 
         // récupération des services
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $folderService = $this->getServiceManager()->get('zimbraServiceFolder');
-        $filterService = $this->getServiceManager()->get('zimbraServiceFilter');
+        $accountService = $this->getZimbraAccountService();
+        $distribListService = $this->getZimbraDistributionListService();
+        $folderService = $this->getZimbraFolderService();
+        $filterService = $this->getZimbraFilterService();
 
         // Travail sur la boite générique
         $bg = $accountService->get($mail);
@@ -245,8 +263,8 @@ class BoiteGenerique extends Processus
      */
     public function getGrantsOfAdresseFonctionnelle($adresseFonctionnelle)
     {
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $rightService = $this->getServiceManager()->get('zimbraServiceRight');
+        $distribListService = $this->getZimbraDistributionListService();
+        $rightService = $this->getZimbraRightService();
 
         $ace = new Right;
         $ace->setTarget($distribListService->get($adresseFonctionnelle));
@@ -264,12 +282,12 @@ class BoiteGenerique extends Processus
     {
         $afName = $this->getMailName($adresseFonctionnelle);
 
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $folderService = $this->getServiceManager()->get('zimbraServiceFolder');
-        $filterService = $this->getServiceManager()->get('zimbraServiceFilter');
-        $rightService = $this->getServiceManager()->get('zimbraServiceRight');
-        $identityService = $this->getServiceManager()->get('zimbraServiceIdentity');
+        $distribListService = $this->getZimbraDistributionListService();
+        $accountService = $this->getZimbraAccountService();
+        $folderService = $this->getZimbraFolderService();
+        $filterService = $this->getZimbraFilterService();
+        $rightService = $this->getZimbraRightService();
+        $identityService = $this->getZimbraIdentityService();
 
         // Travail sur la boite générique
         $dlAccount = $distribListService->get($adresseFonctionnelle);
@@ -352,12 +370,12 @@ class BoiteGenerique extends Processus
     {
         $afName = $this->getMailName($adresseFonctionnelle);
 
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $folderService = $this->getServiceManager()->get('zimbraServiceFolder');
-        $filterService = $this->getServiceManager()->get('zimbraServiceFilter');
-        $rightService = $this->getServiceManager()->get('zimbraServiceRight');
-        $identityService = $this->getServiceManager()->get('zimbraServiceIdentity');
+        $distribListService = $this->getZimbraDistributionListService();
+        $accountService = $this->getZimbraAccountService();
+        $folderService = $this->getZimbraFolderService();
+        $filterService = $this->getZimbraFilterService();
+        $rightService = $this->getZimbraRightService();
+        $identityService = $this->getZimbraIdentityService();
 
         // Travail sur la boite générique
         $dlAccount = $distribListService->get($adresseFonctionnelle);
@@ -409,12 +427,12 @@ class BoiteGenerique extends Processus
         $afName = $this->getMailName($adresseFonctionnelle);
         $afNewName = $this->getMailName($newName);
 
-        $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList');
-        $accountService = $this->getServiceManager()->get('zimbraServiceAccount');
-        $folderService = $this->getServiceManager()->get('zimbraServiceFolder');
-        $filterService = $this->getServiceManager()->get('zimbraServiceFilter');
-        $rightService = $this->getServiceManager()->get('zimbraServiceRight');
-        $identityService = $this->getServiceManager()->get('zimbraServiceIdentity');
+        $distribListService = $this->getZimbraDistributionListService();
+        $accountService = $this->getZimbraAccountService();
+        $folderService = $this->getZimbraFolderService();
+        $filterService = $this->getZimbraFilterService();
+        $rightService = $this->getZimbraRightService();
+        $identityService = $this->getZimbraIdentityService();
 
         // Travail sur la boite utilisateur
         $userAccount = $accountService->get($userMail);
diff --git a/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessusAwareTrait.php b/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessusAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..951de4c1cba7fa69f3c28773ff6e7c456523e9fd
--- /dev/null
+++ b/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessusAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraBoiteGeneriqueProcessusAwareTrait
+{
+    /**
+     * @var BoiteGeneriqueProcessus
+     */
+    protected $boiteGeneriqueProcessus;
+
+
+    /**
+     * @param BoiteGeneriqueProcessus $boiteGeneriqueProcessus
+     */
+    public function setBoiteGeneriqueProcessus(BoiteGeneriqueProcessus $boiteGeneriqueProcessus)
+    {
+        $this->boiteGeneriqueProcessus = $boiteGeneriqueProcessus;
+    }
+
+    /**
+     * @return BoiteGeneriqueProcessus
+     */
+    public function getBoiteGeneriqueProcessus()
+    {
+        return $this->boiteGeneriqueProcessus;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessusFactory.php b/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessusFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d46d33b07711bce0499f3e726b5ed2648ed5c0c
--- /dev/null
+++ b/src/UnicaenZimbra/Processus/ZimbraBoiteGeneriqueProcessusFactory.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace UnicaenZimbra\Processus;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Options\ModuleOptions;
+use UnicaenZimbra\Service\ZimbraAccountService;
+use UnicaenZimbra\Service\ZimbraCosService;
+use UnicaenZimbra\Service\ZimbraDistributionListService;
+use UnicaenZimbra\Service\ZimbraFilterService;
+use UnicaenZimbra\Service\ZimbraFolderService;
+use UnicaenZimbra\Service\ZimbraIdentityService;
+use UnicaenZimbra\Service\ZimbraRightService;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraBoiteGeneriqueProcessusFactory implements FactoryInterface
+{
+    /**
+     * Create processus
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|BoiteGeneriqueProcessus
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) : BoiteGeneriqueProcessus
+    {
+        /**
+         * @var Zimbra $zimbra
+         * @var ModuleOptions $moduleOptions
+         * @var ZimbraAccountService $accountService
+         * @var ZimbraCosService $cosService
+         * @var ZimbraDistributionListService $distributionListService
+         * @var ZimbraFilterService $filterService
+         * @var ZimbraFolderService $folderService
+         * @var ZimbraIdentityService $identityService
+         * @var ZimbraRightService $rightService
+         */
+        $zimbra = $container->get('zimbra');
+        $moduleOptions = $container->get('zimbraOptions');
+        $accountService = $container->get(ZimbraAccountService::class);
+        $cosService = $container->get(ZimbraCosService::class);
+        $distributionListService = $container->get(ZimbraDistributionListService::class);
+        $filterService = $container->get(ZimbraFilterService::class);
+        $folderService = $container->get(ZimbraFolderService::class);
+        $identityService = $container->get(ZimbraIdentityService::class);
+        $rightService = $container->get(ZimbraRightService::class);
+
+        $processus = new ZimbraBoiteGeneriqueProcessus();
+        $processus->setZimbra($zimbra);
+        $processus->setOptions($moduleOptions);
+        $processus->setZimbraAccountService($accountService);
+        $processus->setZimbraCosService($cosService);
+        $processus->setZimbraDistributionListService($distributionListService);
+        $processus->setZimbraFilterService($filterService);
+        $processus->setZimbraFolderService($folderService);
+        $processus->setZimbraIdentityService($identityService);
+        $processus->setZimbraRightService($rightService);
+
+        return $processus;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/AbstractService.php b/src/UnicaenZimbra/Service/AbstractService.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a0ad3a7eba023c5a968dfdf6bfa584925b396ad
--- /dev/null
+++ b/src/UnicaenZimbra/Service/AbstractService.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use UnicaenZimbra\Zimbra;
+
+abstract class AbstractService
+{
+    /**
+     * @var Zimbra
+     */
+    protected $zimbra;
+
+    /**
+     * Nombre d'occurences renvoyées par la dernière requête en date
+     *
+     * @var integer
+     */
+    protected $count;
+
+    /**
+     * @param Zimbra $zimbra
+     * @return $this
+     */
+    public function setZimbra(Zimbra $zimbra) : self
+    {
+        $this->zimbra = $zimbra;
+
+        return $this;
+    }
+
+    /**
+     * @return Zimbra
+     */
+    public function getZimbra() : Zimbra
+    {
+        return $this->zimbra;
+    }
+
+    /**
+     * Retourne le nombre d'occurences renvoyées par la dernière requête renvoyant des données
+     *
+     * @return integer
+     */
+    public function getLastCount()
+    {
+        return $this->count;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Service.php b/src/UnicaenZimbra/Service/Service.php
deleted file mode 100644
index 8e57434311f9fe9872b70e78ed269ecde7a99202..0000000000000000000000000000000000000000
--- a/src/UnicaenZimbra/Service/Service.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * Classe abstraite de gestion de Service Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
-namespace UnicaenZimbra\Service;
-
-use Zend\ServiceManager\ServiceManager;
-use Zend\ServiceManager\ServiceManagerAwareInterface;
-use UnicaenZimbra\Zimbra;
-
-
-abstract class Service implements ServiceManagerAwareInterface {
-    
-    /**
-     * Nombre d'occurences renvoyées par la dernière requête en date
-     * 
-     * @var integer
-     */
-    protected $count;    
-
-    /**
-     * @var ServiceManager
-     */
-    protected $serviceManager;
-
-
-
-
-
-    /**
-     * 
-     * @return Zimbra
-     */
-    public function getZimbra()
-    {
-        return $this->getServiceManager()->get('zimbra');
-    }
-
-    /**
-     * Get service manager
-     *
-     * @return ServiceManager
-     */
-    public function getServiceManager()
-    {
-        return $this->serviceManager;
-    }
-
-    /**
-     * Set service manager
-     *
-     * @param ServiceManager $serviceManager
-     * @return self
-     */
-    public function setServiceManager(ServiceManager $serviceManager)
-    {
-        $this->serviceManager = $serviceManager;
-        return $this;
-    }
-
-    /**
-     * Retourne le nombre d'occurences renvoyées par la dernière requête renvoyant des données
-     * 
-     * @return integer
-     */
-    public function getLastCount()
-    {
-        return $this->count;
-    }
-}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Account.php b/src/UnicaenZimbra/Service/ZimbraAccountService.php
similarity index 56%
rename from src/UnicaenZimbra/Service/Account.php
rename to src/UnicaenZimbra/Service/ZimbraAccountService.php
index 31f6ab5a1db0465eb1d7758f228ebf31f0698342..3b259f33f95acc8682ef6c8b98ad7c21e54461ac 100644
--- a/src/UnicaenZimbra/Service/Account.php
+++ b/src/UnicaenZimbra/Service/ZimbraAccountService.php
@@ -1,17 +1,14 @@
 <?php
 
-/**
- * Service de comptes mail Zimbra
- *
- * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Account as AccountEntity;
+use UnicaenZimbra\Entity\Cos;
 use UnicaenZimbra\Zimbra;
 
-class Account extends Service {
+class ZimbraAccountService extends AbstractService
+{
+    use ZimbraCosServiceAwareTrait;
 
     /**
      * Retourne la liste des comptes
@@ -24,8 +21,9 @@ class Account extends Service {
      * @param string $sort
      * @param string $query
      * @return AccountEntity[]
+     * @throws \UnicaenZimbra\Exception
      */
-    public function getList( $domain, $limit=Zimbra::DEFAULT_LIMIT, $offset=Zimbra::DEFAULT_OFFSET, $sort=null, $query=null )
+    public function getList( $domain, $limit = Zimbra::DEFAULT_LIMIT, $offset = Zimbra::DEFAULT_OFFSET, $sort = null, $query = null ): array
     {
         $accounts = $this->getZimbra()->searchDirectory($domain, $limit, $offset, 'accounts', $sort, $query);
 
@@ -36,6 +34,7 @@ class Account extends Service {
             $account->populate($accountXml);
             $results[$account->getId()] = $account;
         }
+
         return $results;
     }
 
@@ -46,25 +45,28 @@ class Account extends Service {
      *
      * @param string $value
      * @param string $by
-     * @return boolean
+     * @return bool
+     * @throws \UnicaenZimbra\Exception
      */
-    public function exists($value, $by='name')
+    public function exists(string $value, string $by = 'name'): bool
     {
         return $this->getZimbra()->exists($value, $by, 'accounts');
     }
 
     /**
      * Retourne un compte en fonction de la valeur donnée et de son type (son nom par défaut)
+     *
      * @param string $value
      * @param string $by
      * @return AccountEntity
+     * @throws \UnicaenZimbra\Exception
      */
-    public function get( $value, $by='name' )
+    public function get(string $value, string $by = 'name'): AccountEntity
     {
         $params = array(
             'account' => array(
-                '@content'  => $value,
-                '@attributes' => array( 'by' => $by )
+                '@content' => $value,
+                '@attributes' => array('by' => $by)
             )
         );
 
@@ -73,7 +75,8 @@ class Account extends Service {
         $account = new AccountEntity;
         $account->populate($accounts[0]);
         $this->count = 1;
-        return $account;       
+
+        return $account;
     }
  
     /**
@@ -83,12 +86,13 @@ class Account extends Service {
      * @param integer $limit
      * @param integer $offset
      * @return AccountEntity[]
+     * @throws \UnicaenZimbra\Exception
      */
-    public function search( $query='', $limit=Zimbra::DEFAULT_LIMIT, $offset=Zimbra::DEFAULT_OFFSET )
+    public function search($query = '', $limit = Zimbra::DEFAULT_LIMIT, $offset = Zimbra::DEFAULT_OFFSET): array
     {
         $params = array(
-            'query'  => $query,
-            'limit'  => $limit,
+            'query' => $query,
+            'limit' => $limit,
             'offset' => $offset
         );
         $accounts = $this->getZimbra()->request('SearchAccountsRequest', array(), $params);
@@ -100,6 +104,7 @@ class Account extends Service {
             $account->populate($accountXml);
             $results[$account->getId()] = $account;
         }
+
         return $results;
     }
 
@@ -112,16 +117,17 @@ class Account extends Service {
      * @param array $sort
      * @param string $targetServer
      * @return array
+     * @throws \UnicaenZimbra\Exception
      */
-    public function getQuotas(array $attributes, $sort = null, $targetServer = null)
+    public function getQuotas(array $attributes, $sort = null, $targetServer = null): array
     {
         $results = array();
 
         if (!empty($sort)) {
-            list( $attributes['sortBy'], $attributes['sortAscending'] ) = $sort;
+            list($attributes['sortBy'], $attributes['sortAscending']) = $sort;
         }
 
-        if (! empty($targetServer)) {
+        if (!empty($targetServer)) {
             $this->getZimbra()->addContextChild('targetServer', $targetServer);
         }
         $response = $this->getZimbra()->request('GetQuotaUsageRequest', $attributes);
@@ -132,9 +138,9 @@ class Account extends Service {
             $b = explode('.', $account[0]);
 
             if (!in_array($b[0], $this->getZimbra()->getSystemUsers())) {
-                $results[(string) $quota['name']] = array(
-                    'used' => (integer) $quota['used'],
-                    'limit' => (integer) $quota['limit'],
+                $results[(string)$quota['name']] = array(
+                    'used' => (integer)$quota['used'],
+                    'limit' => (integer)$quota['limit'],
                 );
             }
         }
@@ -143,23 +149,25 @@ class Account extends Service {
     }
 
     /**
+     * Renomme un compte
      * 
      * @param string|AccountEntity $id
      * @param string $newName
      * @return AccountEntity
+     * @throws \UnicaenZimbra\Exception
      */
-    public function rename($id, $newName)
+    public function rename($id, $newName): AccountEntity
     {
-        if ($id instanceof AccountEntity){
+        if ($id instanceof AccountEntity) {
             $aid = $id->getId();
             $account = $id;
-        }else{
+        } else {
             $aid = $id;
             $account = new AccountEntity;
         }
 
         $attributes = array(
-            'id'    => $aid,
+            'id' => $aid,
             'newName' => $newName
         );
 
@@ -167,27 +175,29 @@ class Account extends Service {
         $accounts = $response->children()->RenameAccountResponse->children();
         $account->populate($accounts[0]);
         $this->count = 1;
+
         return $account;
     }
 
     /**
-     * Prend soit le nom du nouveau compte, soit un nouvel objet AccountEntity
-     * 
-     * @param string|AccountEntity $value
+     * Créé un nouveau compte
+     *
+     * @param string|AccountEntity $value nom du compte ou objet AccountEntity
      * @param string $password
      * @return AccountEntity
+     * @throws \UnicaenZimbra\Exception
      */
-    public function create( $value, $password )
+    public function create($value, string $password): AccountEntity
     {
         $attrs = array();
 
-        if ($value instanceof AccountEntity){
+        if ($value instanceof AccountEntity) {
             $attrs['name'] = $value->getName();
             $params = $value->getConvertedChanges();
             if (isset($params['name'])) unset($params['name']);
-            $params = $this->getZimbra()->makeZimbraAttributes( $params );
+            $params = $this->getZimbra()->makeZimbraAttributes($params);
             $account = $value;
-        }elseif(is_string($value)){
+        } elseif (is_string($value)) {
             $attrs['name'] = $value;
             $params = array();
             $account = new AccountEntity;
@@ -199,79 +209,73 @@ class Account extends Service {
         $accounts = $response->children()->CreateAccountResponse->children();
         $account->populate($accounts[0]);
         $this->count = 1;
+
         return $account;
     }
 
     /**
+     * Modifie un compte
      * 
      * @param AccountEntity $account
      * @return AccountEntity
+     * @throws \UnicaenZimbra\Exception
      */
     public function modify(AccountEntity $account)
     {
         $attrs = array(
-           'id' => $account->getId(),
+            'id' => $account->getId(),
         );
-        $params = $this->getZimbra()->makeZimbraAttributes( $account->getConvertedChanges() );
+        $params = $this->getZimbra()->makeZimbraAttributes($account->getConvertedChanges());
 
         $response = $this->getZimbra()->request('ModifyAccountRequest', $attrs, $params);
         $accounts = $response->children()->ModifyAccountResponse->children();
-
         $account->populate($accounts[0]);
         $this->count = 1;
+
         return $account;
     }
 
     /**
+     * Supprimer un compte
      * 
      * @param AccountEntity|string $id
-     * @return boolean
+     * @return bool
+     * @throws \UnicaenZimbra\Exception
      */
-    public function delete( $id )
+    public function delete($id): bool
     {
         if ($id instanceof AccountEntity) $id = $id->getId();
         $this->getZimbra()->request('DeleteAccountRequest', array('id' => $id), array());
         $this->count = 1;
-        return true;
-    }
 
-    /**
-     *
-     * @param string|AccountEntity $id
-     * @return string[]
-     */
-    public function getAlias( $id ){
-        if (is_string($id)){
-            $id = $this->get($id, 'id');
-        }
-        $alias = $id->getAlias();
-        $this->count = count($alias);
-        return $alias;
+        return true;
     }
 
     /**
+     * Ajoute un alias de messagerie
      * 
      * @param string|AccountEntity $id
      * @param string $alias
      * @return self
+     * @throws \UnicaenZimbra\Exception
      */
-    public function addAlias( $id, $alias )
+    public function addAlias($id, $alias): self
     {
-        if ($id instanceof AccountEntity){
+        if ($id instanceof AccountEntity) {
             $account = $id;
             $id = $id->getId();
-        }else{
+        } else {
             $account = null;
         }
 
         $attributes = array(
-            'id'    => $id,
+            'id' => $id,
             'alias' => $alias
         );
 
-        $this->getZimbra()->request('AddAccountAliasRequest', $attributes );
+        $this->getZimbra()->request('AddAccountAliasRequest', $attributes);
 
-        if (! empty($account)){
+        if (!empty($account)) {
             $lastAlias = $account->getAlias();
             $lastAlias[] = $alias;
             $account->zimbraMailAlias = $lastAlias;
@@ -281,12 +285,62 @@ class Account extends Service {
     }
 
     /**
+     * Modifie la conservation des messages dans la boite aux lettres Zimbra
+     *
+     * @param string|AccountEntity $id
+     * @param bool $localDelivery
+     * @return self
+     * @throws \UnicaenZimbra\Exception
+     */
+    public function modifyLocalDelivery($id, bool $localDelivery): self
+    {
+        $account = $id instanceof AccountEntity ? $id : $this->get($id);
+        $account->zimbraPrefMailLocalDeliveryDisabled = $localDelivery;
+        $this->modify($account);
+
+        return $this;
+    }
+
+    /**
+     * Modifie la synchronisation du mobile avec Zimbra
+     *
+     * @param string|AccountEntity $id
+     * @param bool $synchroMobile
+     * @return self
+     * @throws \UnicaenZimbra\Exception
+     */
+    public function modifySynchroMobile($id, bool $synchroMobile): self
+    {
+        $account = $id instanceof AccountEntity ? $id : $this->get($id);
+        $cos = $this->getZimbraCosService()->get($account->zimbraCOSId, 'id');
+
+        switch ($cos->getName()) {
+            case Cos::COS_PERSONNEL:
+            case Cos::COS_PERSONNEL_SYNCHRO:
+                $cosName = ($synchroMobile) ? Cos::COS_PERSONNEL_SYNCHRO : Cos::COS_PERSONNEL;
+                break;
+            case Cos::COS_PERSONNEL_VIP:
+            case Cos::COS_PERSONNEL_VIP_SYNCHRO:
+                $cosName = ($synchroMobile) ? Cos::COS_PERSONNEL_VIP_SYNCHRO : Cos::COS_PERSONNEL_VIP;
+                break;
+        }
+
+        $account->zimbraCOSId =  $this->getZimbraCosService()->get($cosName ?: $cos->getName())->getId();
+        $this->modify($account);
+
+        return $this;
+    }
+
+
+    /**
+     * Supprimer un alias de messagerie
      * 
      * @param string|AccountEntity $id
      * @param string $alias
      * @return self
+     * @throws \UnicaenZimbra\Exception
      */
-    public function removeAlias($id, $alias)
+    public function removeAlias($id, string $alias): self
     {
         if ($id instanceof AccountEntity){
             $account = $id;
@@ -312,4 +366,49 @@ class Account extends Service {
 
         return $this;
     }
+
+    /**
+     * Ajoute une adresse de redirection
+     *
+     * @param string|AccountEntity $id
+     * @param string $forward
+     * @return self
+     * @throws \UnicaenZimbra\Exception
+     */
+    public function addForward($id, string $forward): self
+    {
+        $account = $id instanceof AccountEntity ? $id : $this->get($id);
+        $zimbraForward = $account->getForward();
+        $zimbraForward[] = $forward;
+
+        $account->zimbraPrefMailForwardingAddress = implode(',', $zimbraForward);
+        $this->modify($account);
+
+        return $this;
+    }
+
+    /**
+     * Supprimer une adresse de redirection
+     *
+     * @param string|AccountEntity $id
+     * @param string $forward
+     * @return self
+     * @throws \UnicaenZimbra\Exception
+     */
+    public function removeForward($id, string $forward): self
+    {
+        $account = $id instanceof AccountEntity ? $id : $this->get($id);
+        $zimbraForward = $account->getForward();
+        $zimbraForward = array_filter($zimbraForward, function ($v) use ($forward) {
+            return $v != $forward;
+        });
+
+        $account->zimbraPrefMailForwardingAddress = implode(',', $zimbraForward);
+        if(empty($zimbraForward)) {
+            $account->zimbraPrefMailLocalDeliveryDisabled = false;
+        }
+        $this->modify($account);
+
+        return $this;
+    }
 }
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraAccountServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraAccountServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..171cd4d45f8ae39e04af077430d1706a046c9015
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraAccountServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraAccountServiceAwareTrait
+{
+    /**
+     * @var ZimbraAccountService
+     */
+    protected $accountService;
+
+
+    /**
+     * @param ZimbraAccountService $accountService
+     */
+    public function setZimbraAccountService(ZimbraAccountService $accountService)
+    {
+        $this->accountService = $accountService;
+    }
+
+    /**
+     * @return ZimbraAccountService
+     */
+    public function getZimbraAccountService()
+    {
+        return $this->accountService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraAccountServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraAccountServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..db0c746f503f359dc1cbd2d98d521059f56d4fdb
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraAccountServiceFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraAccountServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|AccountService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+        $cosService = $container->get(ZimbraCosService::class);
+
+        $service = new ZimbraAccountService();
+        $service->setZimbra($zimbra);
+        $service->setZimbraCosService($cosService);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Alias.php b/src/UnicaenZimbra/Service/ZimbraAliasService.php
similarity index 94%
rename from src/UnicaenZimbra/Service/Alias.php
rename to src/UnicaenZimbra/Service/ZimbraAliasService.php
index f1ce6bc5282bbccbf684aab8447d3fda90d85f9c..56e75b24fb9856f49de33a1541c19023ed2b3ccb 100644
--- a/src/UnicaenZimbra/Service/Alias.php
+++ b/src/UnicaenZimbra/Service/ZimbraAliasService.php
@@ -1,18 +1,13 @@
 <?php
 
-/**
- * Service d'alias Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
-use UnicaenZimbra\Zimbra;
 use UnicaenZimbra\Entity\Alias as AliasEntity;
 use UnicaenZimbra\Exception;
+use UnicaenZimbra\Zimbra;
 
-class Alias extends Service {
+class ZimbraAliasService extends AbstractService
+{
 
     /**
      * Retourne la liste des alias
diff --git a/src/UnicaenZimbra/Service/ZimbraAliasServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraAliasServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f27a5e8ea6b6538072c40e4ed0944cea2374d7d
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraAliasServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraAliasServiceAwareTrait
+{
+    /**
+     * @var ZimbraAliasService
+     */
+    protected $aliasService;
+
+
+    /**
+     * @param ZimbraAliasService $aliasService
+     */
+    public function setZimbraAliasService(ZimbraAliasService $aliasService)
+    {
+        $this->aliasService = $aliasService;
+    }
+
+    /**
+     * @return ZimbraAliasService
+     */
+    public function getZimbraAliasService()
+    {
+        return $this->aliasService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraAliasServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraAliasServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e928d69dfe3292e2cc26fc2cde124eacf43bcef
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraAliasServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraAliasServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|AliasService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraAliasService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Cos.php b/src/UnicaenZimbra/Service/ZimbraCosService.php
similarity index 96%
rename from src/UnicaenZimbra/Service/Cos.php
rename to src/UnicaenZimbra/Service/ZimbraCosService.php
index a7219e626dc54c85fc8ed60afd0525e1918f508e..cd3d087480d4897bcd8e2a8882b3e17a89d7c77c 100644
--- a/src/UnicaenZimbra/Service/Cos.php
+++ b/src/UnicaenZimbra/Service/ZimbraCosService.php
@@ -10,7 +10,8 @@ namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Cos as CosEntity;
 
-class Cos extends Service {
+class ZimbraCosService extends AbstractService
+{
 
     /**
      * Retourne la liste des COS
@@ -49,6 +50,7 @@ class Cos extends Service {
 
     /**
      * Retourne un COS en fonction de la valeur donnée et de son type (son nom par défaut)
+     * 
      * @param string $value
      * @param string $by
      * @return CosEntity
diff --git a/src/UnicaenZimbra/Service/ZimbraCosServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraCosServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb14b9d980c64c7caebef2016ca68e0a435044c9
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraCosServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraCosServiceAwareTrait
+{
+    /**
+     * @var ZimbraCosService
+     */
+    protected $cosService;
+
+
+    /**
+     * @param ZimbraCosService $cosService
+     */
+    public function setZimbraCosService(ZimbraCosService $cosService)
+    {
+        $this->cosService = $cosService;
+    }
+
+    /**
+     * @return ZimbraCosService
+     */
+    public function getZimbraCosService()
+    {
+        return $this->cosService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraCosServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraCosServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..2396488ee7321b6d961700265f91c6eb3fda1196
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraCosServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraCosServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|CosService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraCosService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/DistributionList.php b/src/UnicaenZimbra/Service/ZimbraDistributionListService.php
similarity index 98%
rename from src/UnicaenZimbra/Service/DistributionList.php
rename to src/UnicaenZimbra/Service/ZimbraDistributionListService.php
index fc0d8838db5c6e4767da23cba81f098c2bd1d635..e52f6139988f36581cebb7b91abfa3f6cac6bc78 100644
--- a/src/UnicaenZimbra/Service/DistributionList.php
+++ b/src/UnicaenZimbra/Service/ZimbraDistributionListService.php
@@ -1,18 +1,13 @@
 <?php
 
-/**
- * Service de liste de distribution Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\DistributionList as DistributionListEntity;
 use UnicaenZimbra\Entity\Account as AccountEntity;
 use UnicaenZimbra\Zimbra;
 
-class DistributionList extends Service {
+class ZimbraDistributionListService extends AbstractService
+{
     
     /**
      * Retourne la liste des listes de distribution
diff --git a/src/UnicaenZimbra/Service/ZimbraDistributionListServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraDistributionListServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..30ed4530bd44675b77fbcc152c8c86a31b64e66c
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraDistributionListServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraDistributionListServiceAwareTrait
+{
+    /**
+     * @var ZimbraDistributionListService
+     */
+    protected $distributionListService;
+
+
+    /**
+     * @param ZimbraDistributionListService $distributionListService
+     */
+    public function setZimbraDistributionListService(ZimbraDistributionListService $distributionListService)
+    {
+        $this->distributionListService = $distributionListService;
+    }
+
+    /**
+     * @return ZimbraDistributionListService
+     */
+    public function getZimbraDistributionListService()
+    {
+        return $this->distributionListService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraDistributionListServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraDistributionListServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..a18865352bed107bdcff47c18efc42be3b3c987c
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraDistributionListServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraDistributionListServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|DistributionListService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraDistributionListService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Domain.php b/src/UnicaenZimbra/Service/ZimbraDomainService.php
similarity index 94%
rename from src/UnicaenZimbra/Service/Domain.php
rename to src/UnicaenZimbra/Service/ZimbraDomainService.php
index 647e52d96bc1fa041cab93722aa5e950da534b89..276c57c5bbab652d113a53842b92773b1e292d03 100644
--- a/src/UnicaenZimbra/Service/Domain.php
+++ b/src/UnicaenZimbra/Service/ZimbraDomainService.php
@@ -1,16 +1,12 @@
 <?php
 
-/**
- * Service de domaines Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
 
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Domain as DomainEntity;
 
-class Domain extends Service {
+class ZimbraDomainService extends AbstractService
+{
 
     /**
      * Retourne la liste des domaines
diff --git a/src/UnicaenZimbra/Service/ZimbraDomainServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraDomainServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..7cb9a2acc85c2cc7e4b473ecd00e8713ef70e5c8
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraDomainServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraDomainServiceAwareTrait
+{
+    /**
+     * @var ZimbraDomainService
+     */
+    protected $domainService;
+
+
+    /**
+     * @param ZimbraDomainService $domainService
+     */
+    public function setZimbraDomainService(ZimbraDomainService $domainService)
+    {
+        $this->domainService = $domainService;
+    }
+
+    /**
+     * @return ZimbraDomainService
+     */
+    public function getZimbraDomainService()
+    {
+        return $this->domainService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraDomainServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraDomainServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cb11989697f254e436eec867fe39aaf95b572f4
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraDomainServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraDomainServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|DomainService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraDomainService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Filter.php b/src/UnicaenZimbra/Service/ZimbraFilterService.php
similarity index 96%
rename from src/UnicaenZimbra/Service/Filter.php
rename to src/UnicaenZimbra/Service/ZimbraFilterService.php
index 65a6f564bc8c8f1a516062f7cc1e6ad874044943..7c7a38972d3b72cac2849cd373589267a4459a22 100644
--- a/src/UnicaenZimbra/Service/Filter.php
+++ b/src/UnicaenZimbra/Service/ZimbraFilterService.php
@@ -1,18 +1,14 @@
 <?php
 
-/**
- * Service de filtres Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Filter\Filter as FilterEntity;
 use UnicaenZimbra\Entity\Account as AccountEntity;
 use UnicaenZimbra\Exception;
 
-class Filter extends Service {
+class ZimbraFilterService extends AbstractService
+{
+    use ZimbraAccountServiceAwareTrait;
 
     /**
      * URN local
@@ -56,7 +52,7 @@ class Filter extends Service {
      */
     public function getAccount(){
         if (is_string($this->account)){
-            return $this->getServiceManager()->get('zimbraServiceAccount')->get($this->account);
+            return $this->getZimbraAccountService()->get($this->account);
         }else{
             return $this->account;
         }
diff --git a/src/UnicaenZimbra/Service/ZimbraFilterServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraFilterServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..024a3dafec10dbb18a06a77dccf69db912b47e1c
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraFilterServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraFilterServiceAwareTrait
+{
+    /**
+     * @var ZimbraFilterService
+     */
+    protected $filterService;
+
+
+    /**
+     * @param ZimbraFilterService $filterService
+     */
+    public function setZimbraFilterService(ZimbraFilterService $filterService)
+    {
+        $this->filterService = $filterService;
+    }
+
+    /**
+     * @return ZimbraFilterService
+     */
+    public function getZimbraFilterService()
+    {
+        return $this->filterService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraFilterServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraFilterServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6a2402d07c9aae509392e78f060a1d9113ae082
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraFilterServiceFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraFilterServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|FilterService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+        $accountService = $container->get(ZimbraAccountService::class);
+
+        $service = new ZimbraFilterService();
+        $service->setZimbra($zimbra);
+        $service->setZimbraAccountService($accountService);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Folder.php b/src/UnicaenZimbra/Service/ZimbraFolderService.php
similarity index 97%
rename from src/UnicaenZimbra/Service/Folder.php
rename to src/UnicaenZimbra/Service/ZimbraFolderService.php
index 1c514038da3c8a1e414d983922aef6788ec8a9d0..95b226a5828dddd4102b3bc61f6a998855611fcc 100644
--- a/src/UnicaenZimbra/Service/Folder.php
+++ b/src/UnicaenZimbra/Service/ZimbraFolderService.php
@@ -1,11 +1,5 @@
 <?php
 
-/**
- * Service de comptes mail Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Folder as FolderEntity;
@@ -14,7 +8,9 @@ use UnicaenZimbra\Entity\Grant as GrantEntity;
 use UnicaenZimbra\Entity\Link as LinkEntity;
 use UnicaenZimbra\Exception;
 
-class Folder extends Service {
+class ZimbraFolderService extends AbstractService
+{
+    use ZimbraAccountServiceAwareTrait;
 
     /**
      * Anvoie un mail lors d'un partage sur un destinataire
@@ -73,7 +69,7 @@ class Folder extends Service {
      */
     public function getAccount(){
         if (is_string($this->account)){
-            return $this->getServiceManager()->get('zimbraServiceAccount')->get($this->account);
+            return $this->getZimbraAccountService()->get($this->account);
         }else{
             return $this->account;
         }
@@ -360,12 +356,12 @@ class Folder extends Service {
         switch( $action ){
         case self::GRANT_ACTION_SENDMAIL:
             /* Envoi d'un mail au destinataire pour le partage */
-            if (empty($account)) $account = $this->getServiceManager()->get('zimbraServiceAccount')->get($accountId,'id');
+            if (empty($account)) $account = $this->getZimbraAccountService()->get($accountId,'id');
             $this->sendRevokeNotification($id, $account);
         break;
         case self::GRANT_ACTION_LINK:
             /* Suppression automatique du lien vers le dossier partagé sur le destinataire en cas de partage de usr à usr uniquement */
-            if (empty($account)) $account = $this->getServiceManager()->get('zimbraServiceAccount')->get($accountId,'id');
+            if (empty($account)) $account = $this->getZimbraAccountService()->get($accountId,'id');
             $this->deleteMountPoint($id, $account);
         break;
         }
diff --git a/src/UnicaenZimbra/Service/ZimbraFolderServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraFolderServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..df149af1d373af267d9c3eef01cf2ed96638ba5d
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraFolderServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraFolderServiceAwareTrait
+{
+    /**
+     * @var ZimbraFolderService
+     */
+    protected $folderService;
+
+
+    /**
+     * @param ZimbraFolderService $folderService
+     */
+    public function setZimbraFolderService(ZimbraFolderService $folderService)
+    {
+        $this->folderService = $folderService;
+    }
+
+    /**
+     * @return ZimbraFolderService
+     */
+    public function getZimbraFolderService()
+    {
+        return $this->folderService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraFolderServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraFolderServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c1635da9518cc9ea00a478faabccd0366fa6857
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraFolderServiceFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraFolderServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|FolderService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+        $accountService = $container->get(ZimbraAccountService::class);
+
+        $service = new ZimbraFolderService();
+        $service->setZimbra($zimbra);
+        $service->setZimbraAccountService($accountService);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Gal.php b/src/UnicaenZimbra/Service/ZimbraGalService.php
similarity index 87%
rename from src/UnicaenZimbra/Service/Gal.php
rename to src/UnicaenZimbra/Service/ZimbraGalService.php
index 03aaea754b78c5acc9d3cc1fa79f45aefdd49f91..e4e7fec80d6cc3e2ba84b9ab6765ca49cf52dc4e 100644
--- a/src/UnicaenZimbra/Service/Gal.php
+++ b/src/UnicaenZimbra/Service/ZimbraGalService.php
@@ -1,17 +1,12 @@
 <?php
 
-/**
- * Service de classes de services (COS) Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Gal as GalEntity;
 use UnicaenZimbra\Zimbra;
 
-class Gal extends Service {
+class ZimbraGalService extends AbstractService
+{
 
     /**
      * Retourne la liste des boites mail
diff --git a/src/UnicaenZimbra/Service/ZimbraGalServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraGalServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab544e6956289bf0fb3b8dd8102fef20be29be8b
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraGalServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraGalServiceAwareTrait
+{
+    /**
+     * @var ZimbraGalService
+     */
+    protected $galService;
+
+
+    /**
+     * @param ZimbraGalService $galService
+     */
+    public function setZimbraGalService(ZimbraGalService $galService)
+    {
+        $this->galService = $galService;
+    }
+
+    /**
+     * @return ZimbraGalService
+     */
+    public function getZimbraGalService()
+    {
+        return $this->galService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraGalServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraGalServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..de682618ae7a557044477a0f5e35328f773e092f
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraGalServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraGalServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|GalService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraGalService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Identity.php b/src/UnicaenZimbra/Service/ZimbraIdentityService.php
similarity index 95%
rename from src/UnicaenZimbra/Service/Identity.php
rename to src/UnicaenZimbra/Service/ZimbraIdentityService.php
index a4964129529f0d2a71cb5b0073e1f11a4ea15971..d23cbf6feaaf172fcccec32943725005d4470ee6 100644
--- a/src/UnicaenZimbra/Service/Identity.php
+++ b/src/UnicaenZimbra/Service/ZimbraIdentityService.php
@@ -1,18 +1,14 @@
 <?php
 
-/**
- * Service de gestion d'identités de comptes Zimbra
- *
- * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Identity as IdentityEntity;
 use UnicaenZimbra\Entity\Account as AccountEntity;
 use UnicaenZimbra\Exception;
 
-class Identity extends Service {
+class ZimbraIdentityService extends AbstractService
+{
+    use ZimbraAccountServiceAwareTrait;
 
     /**
      * URN local
@@ -56,7 +52,7 @@ class Identity extends Service {
      */
     public function getAccount(){
         if (is_string($this->account)){
-            return $this->getServiceManager()->get('zimbraServiceAccount')->get($this->account);
+            return $this->getZimbraAccountService()->get($this->account);
         }else{
             return $this->account;
         }
diff --git a/src/UnicaenZimbra/Service/ZimbraIdentityServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraIdentityServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b1d20c4e15f010228ad40d7b86dd4f6366b07ac
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraIdentityServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraIdentityServiceAwareTrait
+{
+    /**
+     * @var ZimbraIdentityService
+     */
+    protected $identityService;
+
+
+    /**
+     * @param ZimbraIdentityService $identityService
+     */
+    public function setZimbraIdentityService(ZimbraIdentityService $identityService)
+    {
+        $this->identityService = $identityService;
+    }
+
+    /**
+     * @return ZimbraIdentityService
+     */
+    public function getZimbraIdentityService()
+    {
+        return $this->identityService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraIdentityServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraIdentityServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e9ae220452f13f097a634bf35320c986f87638c
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraIdentityServiceFactory.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraIdentityServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|IdentityService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+        $accountService = $container->get(ZimbraAccountService::class);
+
+        $service = new ZimbraIdentityService();
+        $service->setZimbra($zimbra);
+        $service->setZimbraAccountService($accountService);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/MailBox.php b/src/UnicaenZimbra/Service/ZimbraMailBoxService.php
similarity index 92%
rename from src/UnicaenZimbra/Service/MailBox.php
rename to src/UnicaenZimbra/Service/ZimbraMailBoxService.php
index 540d5475d019e32e3fe3539f91417c89d332f142..d3b4fca9687e5f69d07bbddae2e098e6f5a17fcd 100644
--- a/src/UnicaenZimbra/Service/MailBox.php
+++ b/src/UnicaenZimbra/Service/ZimbraMailBoxService.php
@@ -1,18 +1,13 @@
 <?php
 
-/**
- * Service de classes de services (COS) Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
-use UnicaenZimbra\Entity\MailBox as MailBoxEntity;
 use UnicaenZimbra\Entity\Account as AccountEntity;
+use UnicaenZimbra\Entity\MailBox as MailBoxEntity;
 use UnicaenZimbra\Zimbra;
 
-class MailBox extends Service {
+class ZimbraMailBoxService extends AbstractService
+{
 
     /**
      * Retourne la liste des boites mail
diff --git a/src/UnicaenZimbra/Service/ZimbraMailBoxServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraMailBoxServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..55177e4bfadfecf25bc7c96d628dba356cf06377
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraMailBoxServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraMailBoxServiceAwareTrait
+{
+    /**
+     * @var ZimbraMailBoxService
+     */
+    protected $mailBoxService;
+
+
+    /**
+     * @param ZimbraMailBoxService $mailBoxService
+     */
+    public function setZimbraMailBoxService(ZimbraMailBoxService $mailBoxService)
+    {
+        $this->mailBoxService = $mailBoxService;
+    }
+
+    /**
+     * @return ZimbraMailBoxService
+     */
+    public function getZimbraMailBoxService()
+    {
+        return $this->mailBoxService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraMailBoxServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraMailBoxServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..73545bdf12f9094183b1f32d80d04fa5fc1ebfc5
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraMailBoxServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraMailBoxServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|MailBoxService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraMailBoxService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Resource.php b/src/UnicaenZimbra/Service/ZimbraResourceService.php
similarity index 97%
rename from src/UnicaenZimbra/Service/Resource.php
rename to src/UnicaenZimbra/Service/ZimbraResourceService.php
index 8308077e064f8e92b050671d7f060e0f7cef1ecf..3850ee4ae6c2e4e8872e3455e9c094c8ce9456f9 100644
--- a/src/UnicaenZimbra/Service/Resource.php
+++ b/src/UnicaenZimbra/Service/ZimbraResourceService.php
@@ -1,17 +1,12 @@
 <?php
 
-/**
- * Service de ressources Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Resource as ResourceEntity;
 use UnicaenZimbra\Zimbra;
 
-class Resource extends Service{
+class ZimbraResourceService extends AbstractService
+{
 
     /**
      * Retourne la liste des ressources
diff --git a/src/UnicaenZimbra/Service/ZimbraResourceServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraResourceServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..21d23ba994909b7060e8dc16ce5fc2120825e492
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraResourceServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraResourceServiceAwareTrait
+{
+    /**
+     * @var ZimbraResourceService
+     */
+    protected $resourceService;
+
+
+    /**
+     * @param ZimbraResourceService $resourceService
+     */
+    public function setZimbraResourceService(ZimbraResourceService $resourceService)
+    {
+        $this->resourceService = $resourceService;
+    }
+
+    /**
+     * @return ZimbraResourceService
+     */
+    public function getZimbraResourceService()
+    {
+        return $this->resourceService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraResourceServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraResourceServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..72739d9b7c76cf175bee597d7e6a35d9c427dfd0
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraResourceServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraResourceServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|ResourceService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraResourceService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Right.php b/src/UnicaenZimbra/Service/ZimbraRightService.php
similarity index 91%
rename from src/UnicaenZimbra/Service/Right.php
rename to src/UnicaenZimbra/Service/ZimbraRightService.php
index 44c668bcc1209db567defed2e530973f1a696f2e..e56148bef06ccec162b200864d879c50e43de6dd 100644
--- a/src/UnicaenZimbra/Service/Right.php
+++ b/src/UnicaenZimbra/Service/ZimbraRightService.php
@@ -4,14 +4,7 @@ namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Right as RightEntity;
 
-/**
- * @version    $Id$
- * 
- * Service de droits Zimbra
- * 
- * @author     David Surville <david.surville at unicaen.fr>
- */
-class Right extends Service
+class ZimbraRightService extends AbstractService
 {
     /**
      * Returns all grants on the specified target entry, or all grants granted 
diff --git a/src/UnicaenZimbra/Service/ZimbraRightServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraRightServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ad1fbb47235b74cc298363286aad76ce8da31bf
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraRightServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraRightServiceAwareTrait
+{
+    /**
+     * @var ZimbraRightService
+     */
+    protected $rightService;
+
+
+    /**
+     * @param ZimbraRightService $rightService
+     */
+    public function setZimbraRightService(ZimbraRightService $rightService)
+    {
+        $this->rightService = $rightService;
+    }
+
+    /**
+     * @return ZimbraRightService
+     */
+    public function getZimbraRightService()
+    {
+        return $this->rightService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraRightServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraRightServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..17804810a0b9315a58baab395f6a438d9eb84931
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraRightServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraRightServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|RightService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraRightService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/Server.php b/src/UnicaenZimbra/Service/ZimbraServerService.php
similarity index 90%
rename from src/UnicaenZimbra/Service/Server.php
rename to src/UnicaenZimbra/Service/ZimbraServerService.php
index 8dfa0b7781a949be5ff82447c185aa8797644073..0be5d7d2849f2b1217e877fd6ba6cd86c2f3fe72 100644
--- a/src/UnicaenZimbra/Service/Server.php
+++ b/src/UnicaenZimbra/Service/ZimbraServerService.php
@@ -1,16 +1,11 @@
 <?php
 
-/**
- * Service de classes de services (COS) Zimbra
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
-
 namespace UnicaenZimbra\Service;
 
 use UnicaenZimbra\Entity\Server as ServerEntity;
 
-class Server extends Service {
+class ZimbraServerService extends AbstractService
+{
 
     /**
      * Retourne la liste des serveurs
diff --git a/src/UnicaenZimbra/Service/ZimbraServerServiceAwareTrait.php b/src/UnicaenZimbra/Service/ZimbraServerServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..d173f3d148188d1f4cdfe5392f8bade0c5e01c3b
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraServerServiceAwareTrait.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+trait ZimbraServerServiceAwareTrait
+{
+    /**
+     * @var ZimbraServerService
+     */
+    protected $serverService;
+
+
+    /**
+     * @param ZimbraServerService $serverService
+     */
+    public function setZimbraServerService(ZimbraServerService $serverService)
+    {
+        $this->serverService = $serverService;
+    }
+
+    /**
+     * @return ZimbraServerService
+     */
+    public function getZimbraServerService()
+    {
+        return $this->serverService;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Service/ZimbraServerServiceFactory.php b/src/UnicaenZimbra/Service/ZimbraServerServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..62cf2fb0c829f9b5dfc128619c87eb48e6b0625b
--- /dev/null
+++ b/src/UnicaenZimbra/Service/ZimbraServerServiceFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra\Service;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Zimbra;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraServerServiceFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return object|ServerService
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var Zimbra $zimbra
+         */
+        $zimbra = $container->get('zimbra');
+
+        $service = new ZimbraServerService();
+        $service->setZimbra($zimbra);
+
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenZimbra/Zimbra.php b/src/UnicaenZimbra/Zimbra.php
index 6259a3b5fe15aa24e14eb4d9982ab7807ef75698..a4f464f8f9d3276ecaa3fba32954aae690a762c7 100644
--- a/src/UnicaenZimbra/Zimbra.php
+++ b/src/UnicaenZimbra/Zimbra.php
@@ -1,21 +1,12 @@
 <?php
 
-/**
- * Zimbra API
- *
- * @author Laurent LECLUSE <laurent.lecluse at unicaen.fr>
- */
 namespace UnicaenZimbra;
 
-use Zend\ServiceManager\ServiceManager;
-use Zend\ServiceManager\ServiceManagerAwareInterface;
-use UnicaenZimbra\Options\ModuleOptions;
 use SimpleXMLElement;
-use UnicaenZimbra\Exception;
+use UnicaenZimbra\Options\ModuleOptions;
 
-class Zimbra implements ServiceManagerAwareInterface 
+class Zimbra
 {
-
     /**
      * Zimbra ID pour le puvlic (utile pour gérer les droits de partage)
      */
@@ -30,7 +21,7 @@ class Zimbra implements ServiceManagerAwareInterface
      * Limite de recherche par défaut
      */
     const DEFAULT_LIMIT = 10;
-    
+
     /**
      * Offset par défaut
      */
@@ -38,29 +29,24 @@ class Zimbra implements ServiceManagerAwareInterface
 
     /**
      * The entire XML message
-     * 
-     * @var SimpleXMLElement 
+     *
+     * @var SimpleXMLElement
      */
     private $message;
-    
+
     /**
-     * Pointing to the context element 
-     * 
+     * Pointing to the context element
+     *
      * @var SimpleXMLElement
      */
     private $context;
-    
+
     /**
      * Curl Handle
-     * 
+     *
      * @var resource
      */
     private $curlHandle;
-    
-    /**
-     * @var ServiceManager
-     */
-    protected $serviceManager;
 
     /**
      * @var ModuleOptions
@@ -75,8 +61,7 @@ class Zimbra implements ServiceManagerAwareInterface
     protected $connected = false;
 
     /**
-     *
-     * @var array 
+     * @var array
      */
     private $systemUsers = array(
         "admin",
@@ -86,7 +71,7 @@ class Zimbra implements ServiceManagerAwareInterface
         "virus-quarantine",
         "galsync"
     );
-    
+
     /**
      *
      * @var string
@@ -94,39 +79,12 @@ class Zimbra implements ServiceManagerAwareInterface
     private $authToken;
 
 
-    
-
-
     /**
-     * Get service manager
-     *
-     * @return ServiceManager
+     * @param ModuleOptions $moduleOptions
      */
-    public function getServiceManager()
+    public function setOptions(ModuleOptions $moduleOptions)
     {
-        return $this->serviceManager;
-    }
-
-    /**
-     * Set service manager
-     *
-     * @param ServiceManager $serviceManager
-     * @return self
-     */
-    public function setServiceManager(ServiceManager $serviceManager)
-    {
-        $this->serviceManager = $serviceManager;
-        return $this;
-    }
-
-    /**
-     * @param ModuleOptions $options
-     * @return self
-     */
-    public function setOptions(ModuleOptions $options)
-    {
-        $this->options = $options;
-        return $this;
+        $this->options = $moduleOptions;
     }
 
     /**
@@ -134,16 +92,13 @@ class Zimbra implements ServiceManagerAwareInterface
      */
     public function getOptions()
     {
-        if (empty($this->options)) {
-            $this->setOptions($this->getServiceManager()->get('zimbraOptions'));
-        }
         return $this->options;
     }
 
     /**
      * Retourne la liste des utilisateurs système de Zimbra
-     * 
-     * @return string[]
+     *
+     * @return array|string[]
      */
     public function getSystemUsers()
     {
@@ -152,10 +107,12 @@ class Zimbra implements ServiceManagerAwareInterface
 
     /**
      * Connexion au serveur Zimbra
-     * 
+     *
      * @return self
+     * @throws Exception
      */
-    public function connect(){
+    public function connect()
+    {
         $options = $this->getOptions();
 
         $this->curlHandle = curl_init();
@@ -181,7 +138,7 @@ class Zimbra implements ServiceManagerAwareInterface
 
     /**
      * Recherche dans l'annuaire LDAP de Zimbra
-     * 
+     *
      * @param string $domain
      * @param integer $limit
      * @param integer $offset
@@ -189,6 +146,7 @@ class Zimbra implements ServiceManagerAwareInterface
      * @param string $sort
      * @param string $query
      * @return SimpleXMLElement
+     * @throws Exception
      */
     public function searchDirectory($domain, $limit = self::DEFAULT_LIMIT, $offset = self::DEFAULT_OFFSET, $types = 'accounts', $sort = null, $query = null)
     {
@@ -204,11 +162,11 @@ class Zimbra implements ServiceManagerAwareInterface
         }
 
         $attributes = array(
-            'limit'  => $limit,
+            'limit' => $limit,
             'offset' => $offset,
-            'types'  => $types,
+            'types' => $types,
         );
-        if ($types != 'coses'){ // pas de domaine pris en compte quand on recherche des COS
+        if ($types != 'coses') { // pas de domaine pris en compte quand on recherche des COS
             $attributes['domain'] = $domain;
         }
 
@@ -228,13 +186,14 @@ class Zimbra implements ServiceManagerAwareInterface
      * @param string $value
      * @param string $by
      * @param string $types
-     * @return boolean
+     * @return bool
+     * @throws Exception
      */
-    public function exists( $value, $by='name', $types='accounts')
+    public function exists($value, $by = 'name', $types = 'accounts')
     {
         $domain = null;
         $queryField = null;
-        switch($by){
+        switch ($by) {
             case 'id':
                 $queryField = 'zimbraId';
                 break;
@@ -245,28 +204,28 @@ class Zimbra implements ServiceManagerAwareInterface
                 throw new Exception('La valeur de $by n\'est pas correcte.');
         }
 
-        if ($types == 'accounts'){
+        if ($types == 'accounts') {
             $ldapQuery = "(&amp;";
             $ldapQuery .= "($queryField=$value)";
             $ldapQuery .= '(!(zimbraIsSystemAccount=TRUE))';
             $ldapQuery .= ')';
-        }elseif($types == 'aliases' && $by == 'name'){
-            list( $uid, $domain ) = explode( '@', $value );
+        } elseif ($types == 'aliases' && $by == 'name') {
+            list($uid, $domain) = explode('@', $value);
 
             $ldapQuery = "uid=$uid";
-        }elseif($types == 'domains' && $by == 'name'){
+        } elseif ($types == 'domains' && $by == 'name') {
             $ldapQuery = "zimbraDomainName=$value";
-        }elseif($types == 'coses' && $by == 'name'){
+        } elseif ($types == 'coses' && $by == 'name') {
             $ldapQuery = "cn=$value";
-        }else{
+        } else {
             $ldapQuery = "$queryField=$value";
         }
 
         $attributes = array(
-            'types'  => $types,
+            'types' => $types,
             'countOnly' => 1
         );
-        if (! empty($domain) && $types != 'coses'){ // pas de domaine pris en compte quand on recherche des COS
+        if (!empty($domain) && $types != 'coses') { // pas de domaine pris en compte quand on recherche des COS
             $attributes['domain'] = $domain;
         }
 
@@ -282,10 +241,11 @@ class Zimbra implements ServiceManagerAwareInterface
      *
      * $id = Zimbra ID
      * $password = nouveau mot de passe (en clair)
-     * 
+     *
      * @param string $id
      * @param string $password
      * @return self
+     * @throws Exception
      */
     public function setPassword($id, $password)
     {
@@ -299,26 +259,27 @@ class Zimbra implements ServiceManagerAwareInterface
 
     /**
      * Retourne les quotas d'utilisation du domaine
-     * 
+     *
      * @param string $domain
-     * @return array
+     * @return int[]
+     * @throws Exception
      */
     public function getTotalQuota($domain)
     {
         $result = array(
-            'diskUsage'       => 0,
+            'diskUsage' => 0,
             'diskProvisioned' => 0,
-            'diskLimit'       => 0,
-            'mailTotal'       => 0,
-            'mailLimit'       => 0,
+            'diskLimit' => 0,
+            'mailTotal' => 0,
+            'mailLimit' => 0,
         );
 
         $allServers = $this->request('GetAllServersRequest', array());
-        
+
         foreach ($allServers->children()->GetAllServersResponse->children() as $server) {
-            $this->addContextChild('targetServer', (string) $server['id']);
+            $this->addContextChild('targetServer', (string)$server['id']);
             $response = $this->request('GetQuotaUsageRequest', array('domain' => $domain));
-            $result['mailTotal'] += (string) $response->children()->GetQuotaUsageResponse['searchTotal'];
+            $result['mailTotal'] += (string)$response->children()->GetQuotaUsageResponse['searchTotal'];
 
             foreach ($response->children()->GetQuotaUsageResponse->children() as $quota) {
                 $b = explode('@', $quota['name']);
@@ -330,7 +291,7 @@ class Zimbra implements ServiceManagerAwareInterface
                     $result['diskUsage'] += $quota['used'];
                     $result['diskProvisioned'] += $quota['limit'];
                 } elseif ($b[0] = 'postmaster') {
-                    $result['diskLimit'] = (int) $quota['limit'];
+                    $result['diskLimit'] = (int)$quota['limit'];
                     $result['mailTotal'] -= 1;
                 } else {
                     $result['mailTotal'] -= 1;
@@ -341,61 +302,69 @@ class Zimbra implements ServiceManagerAwareInterface
         $params = array(
             'domain' => array(
                 '@content' => $domain,
-                '@attributes' => array( 'by' => 'name' ),
+                '@attributes' => array('by' => 'name'),
             )
         );
         $response = $this->request('GetDomainRequest', array('attrs' => 'zimbraDomainMaxAccounts'), $params);
         $domains = $response->children()->GetDomainResponse->children();
 
-        $result['mailLimit'] = (int) $domains[0]->zimbraDomainMaxAccounts;
+        $result['mailLimit'] = (int)$domains[0]->zimbraDomainMaxAccounts;
 
         return $result;
     }
 
     /**
      * Envoie une requête qui ne fait rien
+     *
+     * @throws Exception
      */
     public function noOp()
     {
         $this->request('NoOpRequest');
     }
 
-    public function addContextChild($name, $value, $attributes=array())
+    /**
+     * @param string $name
+     * @param string $value
+     * @param array $attributes
+     */
+    public function addContextChild($name, $value, $attributes = [])
     {
         if (isset($this->context->$name)) {
             $this->context->$name = $value;
-            if (array() != $attributes){
-                foreach($attributes as $key => $value ){
+            if (array() != $attributes) {
+                foreach ($attributes as $key => $value) {
                     if ((string)$this->context->$name->attributes()->$key != $value)
                         $this->context->$name->addAttribute($key, $value);
                 }
             }
         } else {
             $child = $this->context->addChild($name, $value);
-            if (array() != $attributes){
-                foreach($attributes as $key => $value ){
+            if (array() != $attributes) {
+                foreach ($attributes as $key => $value) {
                     $child->addAttribute($key, $value);
                 }
-            }   
+            }
         }
     }
 
     /**
      * Effectue une requête sur le serveur SOAP
-     * 
+     *
      * @param string $name
      * @param array $attributes
      * @param array $params
      * @param string $urn
      * @return SimpleXMLElement
+     * @throws Exception
      */
-    public function request($name, array $attributes = array(), array $params = array(), $urn='urn:zimbraAdmin')
+    public function request($name, array $attributes = array(), array $params = array(), $urn = 'urn:zimbraAdmin')
     {
-        if (! $this->connected && 'AuthRequest' != $name ) $this->connect();
+        if (!$this->connected && 'AuthRequest' != $name) $this->connect();
 
         unset($this->message->children('soap', true)->Body);
         $body = $this->message->addChild('Body');
-        $this->arrayToNode($body, $name, $attributes, $params, $urn );
+        $this->arrayToNode($body, $name, $attributes, $params, $urn);
         if ($this->getOptions()->getDebugMode()) $this->debugXml($this->message->asXml());
         curl_setopt($this->curlHandle, CURLOPT_POSTFIELDS, $this->message->asXml());
         $soapMessage = curl_exec($this->curlHandle);
@@ -409,7 +378,7 @@ class Zimbra implements ServiceManagerAwareInterface
 
         $fault = $xml->children('soap', true)->Body->Fault;
         if ($fault) {
-            throw new Exception( $fault->Reason->Text );
+            throw new Exception($fault->Reason->Text);
         }
 
         return $xml->children('soap', true)->Body;
@@ -419,42 +388,45 @@ class Zimbra implements ServiceManagerAwareInterface
      * Transforme un tableau en ensemble de noeuds XML
      *
      * @param SimpleXMLElement $node
+     * @param string $name
+     * @param array $attributes
      * @param array $data
+     * @param string $namespace
      * @return self
      */
-    private function arrayToNode( SimpleXMLElement $node, $name, array $attributes=array(), $data=null, $namespace=null )
+    private function arrayToNode(SimpleXMLElement $node, $name, array $attributes = array(), $data = null, $namespace = null)
     {
         $nodeContent = null;
         $hasChildren = false;
-        if (! is_array($data)){
+        if (!is_array($data)) {
             $nodeContent = $data;
-        }elseif(isset($data['@content'])){
+        } elseif (isset($data['@content'])) {
             $nodeContent = $data['@content'];
             unset($data['@content']);
             $hasChildren = true;
-        }else{
+        } else {
             $hasChildren = true;
         }
 
-        if (isset($data['@attributes'])){
+        if (isset($data['@attributes'])) {
             $attributes = array_merge($attributes, $data['@attributes']);
             unset($data['@attributes']);
         }
 
-        $child = $node->addChild( $name, $nodeContent, $namespace );
-        foreach( $attributes as $attrKey => $attrValue){
+        $child = $node->addChild($name, $nodeContent, $namespace);
+        foreach ($attributes as $attrKey => $attrValue) {
             $child->addAttribute($attrKey, $attrValue);
         }
 
-        if ($hasChildren){
-            foreach( $data as $childName => $childData ){
-                if (0 === strpos($childName, '*')){
+        if ($hasChildren) {
+            foreach ($data as $childName => $childData) {
+                if (0 === strpos($childName, '*')) {
                     $childName = substr($childName, 1);
-                    foreach( $childData as $childDataItem ){
-                        $this->arrayToNode($child, $childName, array(), $childDataItem, $namespace );
+                    foreach ($childData as $childDataItem) {
+                        $this->arrayToNode($child, $childName, array(), $childDataItem, $namespace);
                     }
-                }else{
-                    $this->arrayToNode($child, $childName, array(), $childData, $namespace );
+                } else {
+                    $this->arrayToNode($child, $childName, array(), $childData, $namespace);
                 }
             }
         }
@@ -466,37 +438,38 @@ class Zimbra implements ServiceManagerAwareInterface
      *
      * @param array $data
      * @param string $nameField
-     * @return array
+     * @return array[]
      */
-    public function makeZimbraAttributes( array $data, $nameField='n' ){
+    public function makeZimbraAttributes(array $data, $nameField = 'n')
+    {
         $result = array();
-        foreach( $data as $key => $value ){
-            if (is_array($value)){
-                foreach( $value as $val ){
+        foreach ($data as $key => $value) {
+            if (is_array($value)) {
+                foreach ($value as $val) {
                     $result[] = array(
-                        '@attributes' => array( $nameField => $key ),
+                        '@attributes' => array($nameField => $key),
                         '@content' => $val,
                     );
                 }
-            }else{
+            } else {
                 $result[] = array(
-                    '@attributes' => array( $nameField => $key ),
+                    '@attributes' => array($nameField => $key),
                     '@content' => $value,
                 );
             }
         }
-        return array( '*a' => $result );
+        return array('*a' => $result);
     }
 
-    public function debugXml( $xml )
+    /**
+     * Debug
+     *
+     * @param string $xml
+     */
+    public function debugXml($xml)
     {
         echo '<div style="border:1px red solid;margin:1px;padding:1px">';
-        if ($this->getServiceManager()->has('Test\Xml')){
-            $xmlHighlighter = $this->getServiceManager()->get('Test\Xml');
-            $xmlHighlighter->highlight( $xml );
-        }else{
-            echo htmlentities( $xml );
-        }
+        echo htmlentities($xml);
         echo '</div>';
     }
 }
\ No newline at end of file
diff --git a/src/UnicaenZimbra/ZimbraFactory.php b/src/UnicaenZimbra/ZimbraFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e0a0f15794a968717d3079a8be3d2214e466294
--- /dev/null
+++ b/src/UnicaenZimbra/ZimbraFactory.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace UnicaenZimbra;
+
+use Interop\Container\ContainerInterface;
+use UnicaenZimbra\Options\ModuleOptions;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class ZimbraFactory implements FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ContainerInterface $container
+     * @param string $requestedName
+     * @param array|null $options
+     * @return Zimbra|object
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        /**
+         * @var ModuleOptions $moduleOptions
+         */
+        $moduleOptions = $container->get('zimbraOptions');
+
+        $service = new Zimbra();
+        $service->setOptions($moduleOptions);
+
+        return $service;
+    }
+}
\ No newline at end of file