diff --git a/data/Sql/Indexes.sql b/data/Sql/Indexes.sql
new file mode 100644
index 0000000000000000000000000000000000000000..5e3b47329e5b04023aaa9a1740fb12de1d002441
--- /dev/null
+++ b/data/Sql/Indexes.sql
@@ -0,0 +1,60 @@
+SELECT
+  i.*
+FROM
+  all_indexes i
+  LEFT JOIN all_constraints c ON c.index_name = i.index_name
+WHERE
+  i.owner='OSE'
+  AND c.constraint_name IS NULL;
+  
+
+
+-- enlever _IDX des indexes
+select 
+
+'ALTER INDEX ' || index_name || ' RENAME TO ' || new_index_name || ';' isql
+
+from (
+SELECT
+  index_name, substr( index_name, 1, length(index_name)-4 ) new_index_name
+FROM
+  all_indexes i
+WHERE
+  owner='OSE'
+  AND substr( index_name, -3 ) = 'IDX') t1;
+
+
+  
+-- création d'indexes manquants
+SELECT
+
+  'CREATE' || un || ' INDEX ' || constraint_name || ' ON ' || table_name || ' (' || cols || ') LOGGING;' isql
+
+FROM (
+  SELECT
+    c.constraint_name,
+    c.constraint_type,
+    c.table_name,
+    c.r_constraint_name,
+    c.index_name,
+    ose_divers.implode('SELECT column_name FROM all_cons_columns WHERE owner=''OSE'' AND constraint_name=q''[' || c.constraint_name || ']''', ' ASC,') || ' ASC' cols,
+    CASE WHEN c.constraint_type IN ('P','U') THEN ' UNIQUE' ELSE '' END un
+  FROM
+    all_constraints c
+    LEFT JOIN all_indexes i ON i.index_name = c.constraint_name
+  WHERE
+    c.owner = 'OSE'
+    AND c.constraint_type IN ('P', 'U', 'R')
+    AND c.table_name NOT LIKE 'BIN$%'
+    AND c.index_name IS NULL AND i.index_name IS NULL
+) t1;
+  
+SELECT * FROM all_tables where owner = 'OSE';
+select * from all_views where owner='OSE';
+  
+  select * from SYS.all_cons_columns;
+  
+-- CREATE INDEX INTERVENANT_HDFK_IDX ON INTERVENANT (HISTO_DESTRUCTEUR_ID ASC) TABLESPACE OSE_TS LOGGING;
+-- CREATE UNIQUE INDEX INTERVENANT_SOURCE__UN ON INTERVENANT ( SOURCE_CODE ASC, ANNEE_ID ASC ) LOGGING;
+
+--SUBSTR(constraint_name,0,26)
\ No newline at end of file
diff --git a/data/Sql/Pieces justificatives.sql b/data/Sql/Pieces justificatives.sql
index 8376fb33f80b5d7ea35a3c9e738edf52530ef96d..ccd02c4b6387d7ff2923c6872f1d91934df26354 100644
--- a/data/Sql/Pieces justificatives.sql	
+++ b/data/Sql/Pieces justificatives.sql	
@@ -9,23 +9,40 @@
 
  *******************************************************************************************************/
 
-select
+SELECT
+  i.prenom || ' ' || i.nom_usuel i_nom,
+  i.annee_id annee,
+  pj.histo_creation creation,
+  --tpj.code, 
+  tpj.libelle, pj.obligatoire, pj.force,
+  CASE
+    WHEN f.id IS NULL THEN 'non fourni'
+    WHEN f.histo_destruction IS NOT NULL THEN 'histo ' || to_char(f.histo_destruction,'dd/mm/yyyy')
+    ELSE 'fourni le ' || to_char(v.histo_creation,'dd/mm/yyyy')
+  END fichier,
+  CASE
+    WHEN v.id IS NULL THEN 'non validée'
+    WHEN v.histo_destruction IS NOT NULL THEN 'histo ' || to_char(v.histo_destruction,'dd/mm/yyyy')
+    ELSE 'validée le ' || to_char(v.histo_creation,'dd/mm/yyyy')
+  END validation,
+  
+  pj.histo_destruction pj_del,
   i.id i_id,
   d.id d_id,
   pj.id pj_id,
-  pj.histo_destruction pj_del,
-  i.prenom || ' ' || i.nom_usuel i_nom,
-  i.annee_id annee,
-  tpj.code, tpj.libelle, pj.obligatoire, pj.force
-from
+  f.id f_id,
+  v.id v_id
+FROM
   piece_jointe pj
   JOIN dossier d ON d.id = pj.dossier_id AND 1 = ose_divers.comprise_entre( d.histo_creation, d.histo_destruction )
   JOIN intervenant i ON i.id = d.intervenant_id AND 1 = ose_divers.comprise_entre( i.histo_creation, i.histo_destruction )
   JOIN type_piece_jointe tpj ON tpj.id = pj.TYPE_PIECE_JOINTE_ID AND 1 = ose_divers.comprise_entre( tpj.histo_creation, tpj.histo_destruction )
-where
-  
-  
-  i.source_code = 87944;
+  LEFT JOIN piece_jointe_fichier pjf ON pjf.piece_jointe_id = pj.id
+  LEFT JOIN fichier f ON f.id = pjf.fichier_id
+  LEFT JOIN validation v ON v.id = pj.validation_id
+WHERE
+    
+  i.id = 5573;
   
 SELECT * FROM intervenant WHERE source_code = '20259';
   
diff --git "a/data/Sql/R\303\264les.sql" "b/data/Sql/R\303\264les.sql"
index 9626dfd8e3bd5f8790843d14ec9781cdea8e6803..f59ee7fa026566185b0cb3e4f8f7f9cf5a7a68f2 100755
--- "a/data/Sql/R\303\264les.sql"
+++ "b/data/Sql/R\303\264les.sql"
@@ -16,7 +16,8 @@ from
   LEFT JOIN structure s ON s.id = a.structure_id AND s.histo_destruction IS NULL
 WHERE
   a.histo_destruction IS NULL
-  AND s.source_code IN ('12')
+  AND p.id = 219
+  --AND s.source_code IN ('12')
   --AND src.code = 'OSE'
 ORDER BY
   structure, nom, source, role;
diff --git a/data/Sql/contrat.sql b/data/Sql/contrat.sql
new file mode 100644
index 0000000000000000000000000000000000000000..9508d300b2a3f35ef39520c62af37f5297c6c2b7
--- /dev/null
+++ b/data/Sql/contrat.sql
@@ -0,0 +1,12 @@
+SELECT
+  c.id c_id,
+  c.histo_creation,
+  i.prenom || ' ' || i.nom_usuel intervenant,
+  s.libelle_court structure
+FROM
+  contrat c
+  JOIN intervenant i ON i.id = c.intervenant_id
+  JOIN type_contrat tc ON tc.id = c.type_contrat_id
+  JOIN structure s ON s.id = c.structure_id
+WHERE
+  i.id = 4554;
\ No newline at end of file
diff --git a/data/Sql/dossier.sql b/data/Sql/dossier.sql
new file mode 100644
index 0000000000000000000000000000000000000000..71f90e7189fbe203ebf59e4c6da737d4010caaad
--- /dev/null
+++ b/data/Sql/dossier.sql
@@ -0,0 +1,19 @@
+SELECT
+  i.id i_id,
+  i.nom_usuel || ' ' || i.prenom i_nom,
+  imd.*
+FROM
+  indic_modif_dossier imd
+  JOIN intervenant i ON i.id = imd.intervenant_id
+WHERE
+  i.id = 4554;
+  
+  
+SELECT
+  *
+FROM 
+  dossier d
+WHERE
+  d.intervenant_id = 4554;
+  
+  
diff --git a/data/Sql/v2.sql b/data/Sql/v2.sql
new file mode 100644
index 0000000000000000000000000000000000000000..3a7ac3602d18bacf6e96a79dd429618ea50d3466
--- /dev/null
+++ b/data/Sql/v2.sql
@@ -0,0 +1,186 @@
+-- ********************************************************************* --
+-- *          à faire AVANT avoir mis à jour le code source            * --
+-- ********************************************************************* --
+
+BEGIN DBMS_SCHEDULER.disable(name=>'"OSE"."OSE_SRC_SYNC"', force => TRUE); END; 
+/
+
+
+CREATE INDEX "OSE"."AII_FK_IDX" ON "OSE"."ADRESSE_INTERVENANT" ("INTERVENANT_ID");
+
+DROP MATERIALIZED VIEW "OSE"."MV_CENTRE_COUT";
+CREATE MATERIALIZED VIEW "OSE"."MV_CENTRE_COUT" ("LIBELLE","Z_ACTIVITE_ID","Z_TYPE_RESSOURCE_ID","Z_PARENT_ID","Z_STRUCTURE_ID","SOURCE_ID","SOURCE_CODE") 
+  BUILD IMMEDIATE
+  USING INDEX REFRESH FORCE ON DEMAND
+  USING DEFAULT LOCAL ROLLBACK SEGMENT  USING ENFORCED CONSTRAINTS
+  DISABLE QUERY REWRITE AS 
+  SELECT DISTINCT
+  TRIM(B.ktext) libelle,
+  CASE
+    WHEN a.kostl like '%A' THEN 'accueil' -- Activité (au sens compta analytique) ne devant pas permettre la saisie de référentiel
+    WHEN a.kostl like '%B' THEN 'enseignement'
+    WHEN a.kostl like '%M' THEN 'pilotage'
+  END z_activite_id,
+  CASE
+    WHEN LENGTH(a.kostl) = 5 THEN 'paye-etat'
+    WHEN LENGTH(a.kostl) > 5 THEN 'ressources-propres'
+  END z_type_ressource_id,
+  NULL z_parent_id,
+  CASE WHEN A.kostl = 'P950DRRA' THEN 'ECODOCT' ELSE STR.CODE_HARPEGE END z_structure_id,
+  s.id source_id,
+  A.kostl source_code
+  
+FROM
+  sapsr3.csks@sifacp A,
+  sapsr3.cskt@sifacp B,
+  unicaen_corresp_structure_cc str,
+  source s
+WHERE
+    s.code = 'SIFAC'
+    and A.kostl=B.kostl(+)
+    and A.kokrs=B.kokrs(+)
+    and substr( a.kostl, 2, 3 ) = str.code_sifac(+)
+    and B.mandt(+)='500'
+    and B.spras(+)='F'
+    and A.kokrs='UCBN'
+    and A.bkzkp !='X'
+    and a.kostl LIKE 'P%' AND (a.kostl like '%A' OR a.kostl like '%B' OR a.kostl like '%M')
+    AND SYSDATE BETWEEN to_date( NVL(A.datab,'10661231'), 'YYYYMMDD') AND to_date( NVL(A.datbi,'99991231'), 'YYYYMMDD')
+    AND STR.CODE_HARPEGE IS NOT NULL -- à désactiver pour trouver les structures non référencées dans la table de correspondance
+  
+UNION
+
+SELECT
+  TRIM(A.post1) libelle,
+  CASE
+    WHEN a.kostl like '%A' THEN 'accueil'
+    WHEN a.fkstl like '%B' THEN 'enseignement'
+    WHEN a.fkstl like '%M' THEN 'pilotage'
+  END z_activite_id,
+  CASE
+    WHEN LENGTH(a.fkstl) = 5 THEN 'paye-etat'
+    WHEN LENGTH(a.fkstl) > 5 THEN 'ressources-propres'
+  END z_type_ressource_id,
+  A.fkstl z_parent_id,
+  CASE WHEN A.posid = 'P950DRRA' THEN 'ECODOCT' ELSE STR.CODE_HARPEGE END z_structure_id,
+  s.id source_id,
+  A.posid source_code
+FROM
+  sapsr3.prps@sifacp A,
+  sapsr3.prte@sifacp B,
+  unicaen_corresp_structure_cc str,
+  source s
+WHERE
+  s.code = 'SIFAC'
+  and A.pspnr=B.posnr(+)
+  and substr( A.fkstl, 2, 3 ) = str.code_sifac(+)
+  and A.pkokr='UCBN'
+  and B.mandt(+)='500'
+  and a.fkstl LIKE 'P%' AND (a.fkstl like '%A' OR a.kostl like '%B' OR a.fkstl like '%M')
+  AND SYSDATE BETWEEN to_date( NVL(B.pstrt,'10661231'), 'YYYYMMDD') AND to_date( NVL(B.pende,'99991231'), 'YYYYMMDD')
+  AND STR.CODE_HARPEGE IS NOT NULL;
+  
+CREATE OR REPLACE FORCE VIEW "OSE"."V_ELEMENT_TYPE_MODULATEUR" 
+ ( "ELEMENT_PEDAGOGIQUE_ID", "TYPE_MODULATEUR_ID"
+  )  AS 
+  SELECT
+  ep.id element_pedagogique_id,
+  tms.type_modulateur_id type_modulateur_id
+FROM
+       element_pedagogique        ep
+  JOIN structure                   s ON s.id = ep.structure_id                    
+                                    AND ose_divers.comprise_entre( s.histo_creation, s.histo_destruction ) = 1
+                                    
+  JOIN type_modulateur_structure tms ON tms.structure_id = s.id 
+                                    AND ose_divers.comprise_entre( tms.histo_creation, tms.histo_destruction ) = 1
+                                    AND ep.annee_id BETWEEN GREATEST(NVL(tms.annee_debut_id,0),ep.annee_id) AND LEAST(NVL(tms.annee_fin_id,9999),ep.annee_id)
+
+UNION
+
+SELECT
+  tm_ep.element_pedagogique_id element_pedagogique_id,
+  tm_ep.type_modulateur_id type_modulateur_id
+FROM
+  type_modulateur_ep tm_ep 
+WHERE
+  ose_divers.comprise_entre( tm_ep.histo_creation, tm_ep.histo_destruction ) = 1;
+  
+CREATE OR REPLACE FORCE VIEW "OSE"."V_ELEMENT_TYPE_INTERVENTION" 
+ ( "ELEMENT_PEDAGOGIQUE_ID", "TYPE_INTERVENTION_ID"
+  )  AS 
+  SELECT
+  ep.id element_pedagogique_id,
+  ti.id type_intervention_id
+FROM
+            element_pedagogique            ep
+  JOIN      structure                    s_ep ON s_ep.id = ep.structure_id
+  JOIN      type_intervention              ti ON 1=1
+  
+  LEFT JOIN type_intervention_ep        ti_ep ON ti_ep.element_pedagogique_id = ep.id 
+                                             AND ti_ep.type_intervention_id = ti.id
+                                             AND 1 = ose_divers.comprise_entre( ti_ep.histo_creation, ti_ep.histo_destruction )
+  
+  LEFT JOIN type_intervention_structure  ti_s ON s_ep.structure_niv2_id = ti_s.structure_id 
+                                             AND ti_s.type_intervention_id = ti.id
+                                             AND 1 = ose_divers.comprise_entre( ti_s.histo_creation, ti_s.histo_destruction )
+                                             AND ep.annee_id BETWEEN GREATEST(NVL(ti_s.annee_debut_id,0),ep.annee_id) AND LEAST(NVL(ti_s.annee_fin_id,9999),ep.annee_id)
+WHERE
+  CASE
+    WHEN TI_EP.VISIBLE IS NULL THEN
+      CASE
+        WHEN TI_S.VISIBLE IS NULL THEN TI.VISIBLE
+        ELSE TI_S.VISIBLE
+      END
+    ELSE TI_EP.VISIBLE
+  END = 1
+ORDER BY
+  TI.ORDRE;
+  
+  
+ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD ("ANNEE_DEBUT_ID" NUMBER(*,0));
+ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD ("ANNEE_FIN_ID" NUMBER(*,0));
+ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD CONSTRAINT "TMS_ANNEE_DEBUT_FK" FOREIGN KEY ("ANNEE_DEBUT_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE;
+ALTER TABLE "OSE"."TYPE_MODULATEUR_STRUCTURE" ADD CONSTRAINT "TMS_ANNEE_FIN_FK" FOREIGN KEY ("ANNEE_FIN_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE;
+
+ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD ("ANNEE_DEBUT_ID" NUMBER(*,0));
+ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD ("ANNEE_FIN_ID" NUMBER(*,0));
+ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD CONSTRAINT "TIS_ANNEE_DEBUT_FK" FOREIGN KEY ("ANNEE_DEBUT_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE;
+ALTER TABLE "OSE"."TYPE_INTERVENTION_STRUCTURE" ADD CONSTRAINT "TIS_ANNEE_FIN_FK" FOREIGN KEY ("ANNEE_FIN_ID") REFERENCES "OSE"."ANNEE"("ID") ENABLE;
+
+ALTER TABLE "OSE"."INTERVENANT" ADD ("MONTANT_INDEMNITE_FC" FLOAT(126));
+
+
+UPDATE "OSE"."TYPE_INTERVENTION_STRUCTURE" SET ANNEE_FIN_ID = 2014 WHERE type_intervention_id = 10;
+
+INSERT INTO CC_ACTIVITE (
+    ID,
+    CODE,
+    LIBELLE,
+    FI,
+    FA,
+    FC,
+    FC_MAJOREES,
+    REFERENTIEL,
+    HISTO_CREATION, HISTO_CREATEUR_ID,
+    HISTO_MODIFICATION, HISTO_MODIFICATEUR_ID
+) VALUES (
+    CC_ACTIVITE_id_seq.nextval,
+    'accueil',
+    'Accueil',
+    1,
+    1,
+    1,
+    1,
+    0,
+    sysdate, (select id from utilisateur where username='lecluse'),
+    sysdate, (select id from utilisateur where username='lecluse')
+);
+
+-- ********************************************************************* --
+-- *          à faire APRÈS avoir mis à jour le code source            * --
+-- ********************************************************************* --
+
+BEGIN DBMS_SCHEDULER.enable(name=>'"OSE"."OSE_SRC_SYNC"'); END;
+/
+BEGIN OSE_FORMULE.CALCULER_TOUT; END;
+/
\ No newline at end of file
diff --git a/module/Application/config/intervenant.config.php b/module/Application/config/intervenant.config.php
index 6776b4bd1c675c9ff9db04c6e29aef529d509a41..2842fc0990118547237acf1a0e1b27b2620a3d1a 100644
--- a/module/Application/config/intervenant.config.php
+++ b/module/Application/config/intervenant.config.php
@@ -19,7 +19,7 @@ return [
                 ],
                 'may_terminate' => true,
                 'child_routes'  => [
-                    'default'                        => [
+                    /*'default'                        => [
                         'type'    => 'Segment',
                         'options' => [
                             'route'       => '/:action[/:intervenant]',
@@ -31,19 +31,25 @@ return [
                                 'action' => 'index',
                             ],
                         ],
-                    ],
+                    ],*/
                     'rechercher'                     => [
-                        'type'    => 'Segment',
+                        'type'    => 'Literal',
                         'options' => [
-                            'route'       => '/rechercher[/:intervenant]',
-                            'constraints' => [
-                                'intervenant' => '[0-9]*',
-                            ],
+                            'route'       => '/rechercher',
                             'defaults'    => [
                                 'action' => 'rechercher',
                             ],
                         ],
                     ],
+                    'recherche' => [
+                        'type'    => 'Literal',
+                        'options' => [
+                            'route'       => '/recherche',
+                            'defaults'    => [
+                                'action' => 'recherche',
+                            ],
+                        ],
+                    ],
                     'fiche'                          => [
                         'type'    => 'Segment',
                         'options' => [
@@ -470,7 +476,7 @@ return [
     ],
     'bjyauthorize'    => [
         'guards'             => [
-            'Application\Guard\PrivilegeController' => [
+            Guard\PrivilegeController::class => [
                 [
                     'controller' => 'Application\Controller\Intervenant',
                     'action'     => ['rechercher'],
@@ -505,7 +511,7 @@ return [
                 [
                     'controller' => 'Application\Controller\Intervenant',
                     'action'     => ['formule-totaux-hetd'],
-                    'roles'      => $R_ALL, /** @todo à sécuriser à l'aide d'une assertion pour éviter qu'un intervenant ne puisse voir les HETD des autres */
+                    'roles'      => $R_ALL,
                     'assertion'  => 'IntervenantAssertion',
                 ],
                 [
@@ -520,7 +526,7 @@ return [
                 ],
                 [
                     'controller' => 'Application\Controller\Intervenant',
-                    'action'     => ['choisir', 'rechercher', 'search'],
+                    'action'     => ['choisir', 'rechercher', 'recherche'],
                     'roles'      => [R_COMPOSANTE, R_ADMINISTRATEUR],
                 ],
                 [
@@ -536,7 +542,7 @@ return [
             ],
         ],
         'rule_providers'     => [
-            'Application\Provider\Rule\PrivilegeRuleProvider' => [
+            Provider\Rule\PrivilegeRuleProvider::class => [
                 'allow' => [
                     [
                         'privileges' => Privilege::MODIF_SERVICE_DU_EDITION,
@@ -545,7 +551,7 @@ return [
                     ],
                 ],
             ],
-            'BjyAuthorize\Provider\Rule\Config'               => [
+            'BjyAuthorize\Provider\Rule\Config'        => [
                 'allow' => [
                     [
                         $R_ALL,
@@ -560,9 +566,9 @@ return [
     ],
     'controllers'     => [
         'invokables' => [
-            'Application\Controller\Intervenant'           => 'Application\Controller\IntervenantController',
-            'Application\Controller\Dossier'               => 'Application\Controller\DossierController',
-            'Application\Controller\ModificationServiceDu' => 'Application\Controller\ModificationServiceDuController',
+            'Application\Controller\Intervenant'           => Controller\IntervenantController::class,
+            'Application\Controller\Dossier'               => Controller\DossierController::class,
+            'Application\Controller\ModificationServiceDu' => Controller\ModificationServiceDuController::class,
         ],
         'aliases'    => [
             'IntervenantController' => 'Application\Controller\Intervenant',
@@ -570,41 +576,42 @@ return [
     ],
     'service_manager' => [
         'invokables' => [
-            'ApplicationIntervenant'                => 'Application\\Service\\Intervenant',
-            'ApplicationMotifModificationServiceDu' => 'Application\\Service\\MotifModificationServiceDu',
-            'ApplicationCivilite'                   => 'Application\\Service\\Civilite',
-            'ApplicationStatutIntervenant'          => 'Application\\Service\\StatutIntervenant',
-            'ApplicationTypeIntervenant'            => 'Application\\Service\\TypeIntervenant',
-            'ApplicationDossier'                    => 'Application\\Service\\Dossier',
-            'IntervenantAssertion'                  => 'Application\\Assertion\\IntervenantAssertion',
-            'ModificationServiceDuAssertion'        => 'Application\\Assertion\\ModificationServiceDuAssertion',
-            'PeutSaisirDossierRule'                 => 'Application\Rule\Intervenant\PeutSaisirDossierRule',
-            'PeutSaisirServiceRule'                 => 'Application\Rule\Intervenant\PeutSaisirServiceRule',
-            'PeutSaisirReferentielRule'             => 'Application\Rule\Intervenant\PeutSaisirReferentielRule',
-            'PossedeDossierRule'                    => 'Application\Rule\Intervenant\PossedeDossierRule',
-            'ServiceValideRule'                     => 'Application\Rule\Intervenant\ServiceValideRule',
-            'PeutValiderServiceRule'                => 'Application\Rule\Intervenant\PeutValiderServiceRule',
-            'ReferentielValideRule'                 => 'Application\Rule\Intervenant\ReferentielValideRule',
-            'NecessiteAgrementRule'                 => 'Application\Rule\Intervenant\NecessiteAgrementRule',
-            'AgrementFourniRule'                    => 'Application\Rule\Intervenant\AgrementFourniRule',
-            'EstAffecteRule'                        => 'Application\Rule\Intervenant\EstAffecteRule',
+            'ApplicationIntervenant'                => Service\Intervenant::class,
+            'ApplicationMotifModificationServiceDu' => Service\MotifModificationServiceDu::class,
+            'ApplicationCivilite'                   => Service\Civilite::class,
+            'ApplicationStatutIntervenant'          => Service\StatutIntervenant::class,
+            'ApplicationTypeIntervenant'            => Service\TypeIntervenant::class,
+            'ApplicationDossier'                    => Service\Dossier::class,
+            'IntervenantAssertion'                  => Assertion\IntervenantAssertion::class,
+            'ModificationServiceDuAssertion'        => Assertion\ModificationServiceDuAssertion::class,
+            'PeutSaisirDossierRule'                 => Rule\Intervenant\PeutSaisirDossierRule::class,
+            'PeutSaisirServiceRule'                 => Rule\Intervenant\PeutSaisirServiceRule::class,
+            'PeutSaisirReferentielRule'             => Rule\Intervenant\PeutSaisirReferentielRule::class,
+            'PossedeDossierRule'                    => Rule\Intervenant\PossedeDossierRule::class,
+            'ServiceValideRule'                     => Rule\Intervenant\ServiceValideRule::class,
+            'PeutValiderServiceRule'                => Rule\Intervenant\PeutValiderServiceRule::class,
+            'ReferentielValideRule'                 => Rule\Intervenant\ReferentielValideRule::class,
+            'NecessiteAgrementRule'                 => Rule\Intervenant\NecessiteAgrementRule::class,
+            'AgrementFourniRule'                    => Rule\Intervenant\AgrementFourniRule::class,
+            'EstAffecteRule'                        => Rule\Intervenant\EstAffecteRule::class,
         ],
     ],
     'view_helpers'    => [
         'invokables'   => [
-            'formuleTotauxHetd' => 'Application\View\Helper\Intervenant\TotauxHetdViewHelper',
-            'Intervenant'       => 'Application\View\Helper\Intervenant\IntervenantViewHelper',
+            'formuleTotauxHetd' => View\Helper\Intervenant\TotauxHetdViewHelper::class,
+            'Intervenant'       => View\Helper\Intervenant\IntervenantViewHelper::class,
         ],
         'initializers' => [
         ],
     ],
     'form_elements'   => [
         'invokables' => [
-            'IntervenantDossier'                            => 'Application\Form\Intervenant\Dossier',
-            'IntervenantHeuresCompForm'                     => 'Application\Form\Intervenant\HeuresCompForm',
-            'IntervenantModificationServiceDuForm'          => 'Application\Form\Intervenant\ModificationServiceDuForm',
-            'IntervenantModificationServiceDuFieldset'      => 'Application\Form\Intervenant\ModificationServiceDuFieldset',
-            'IntervenantMotifModificationServiceDuFieldset' => 'Application\Form\Intervenant\MotifModificationServiceDuFieldset',
+            'intervenantForm'                               => Form\Intervenant\IntervenantForm::class,
+            'IntervenantDossier'                            => Form\Intervenant\Dossier::class,
+            'IntervenantHeuresCompForm'                     => Form\Intervenant\HeuresCompForm::class,
+            'IntervenantModificationServiceDuForm'          => Form\Intervenant\ModificationServiceDuForm::class,
+            'IntervenantModificationServiceDuFieldset'      => Form\Intervenant\ModificationServiceDuFieldset::class,
+            'IntervenantMotifModificationServiceDuFieldset' => Form\Intervenant\MotifModificationServiceDuFieldset::class,
         ],
     ],
 ];
diff --git a/module/Application/src/Application/Acl/Role.php b/module/Application/src/Application/Acl/Role.php
index ab99f609858f2d96a42b9ca48c59446cf4c17438..b2f0b0808da5c65d02aef3c1d93d37c470f51068 100644
--- a/module/Application/src/Application/Acl/Role.php
+++ b/module/Application/src/Application/Acl/Role.php
@@ -24,7 +24,7 @@ class Role extends NamedRole
 
 
 
-    public function __construct($id = self::ROLE_ID, $parent = 'user', $name = 'Rôle', $description = null, $selectable = true)
+    public function __construct($id = self::ROLE_ID, $parent = 'user', $name = 'Rôle inconnu', $description = null, $selectable = true)
     {
         parent::__construct($id, $parent, $name, $description, $selectable);
     }
diff --git a/module/Application/src/Application/Controller/IntervenantController.php b/module/Application/src/Application/Controller/IntervenantController.php
index 6005a5000e9f19069f94116231cb55a1a2a5ce32..e9f7b44087a28b437cc6476946f13f14bdc19beb 100644
--- a/module/Application/src/Application/Controller/IntervenantController.php
+++ b/module/Application/src/Application/Controller/IntervenantController.php
@@ -2,11 +2,16 @@
 
 namespace Application\Controller;
 
+use Application\Form\Intervenant\Traits\HeuresCompFormAwareTrait;
+use Application\Traits\SessionContainerTrait;
 use Zend\Mvc\Controller\AbstractActionController;
 use Common\Exception\LogicException;
 use Application\Entity\Db\Intervenant;
 use Application\Service\Workflow\WorkflowIntervenantAwareInterface;
 use Application\Service\Workflow\WorkflowIntervenantAwareTrait;
+use Application\Service\Traits\ContextAwareTrait;
+use Application\Service\Traits\IntervenantAwareTrait;
+use Application\Service\Traits\TypeHeuresAwareTrait;
 
 /**
  * Description of IntervenantController
@@ -14,170 +19,109 @@ use Application\Service\Workflow\WorkflowIntervenantAwareTrait;
  * @method \Doctrine\ORM\EntityManager                em()
  * @method \Application\Controller\Plugin\Context     context()
  *
- * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
  */
 class IntervenantController extends AbstractActionController implements WorkflowIntervenantAwareInterface
 {
-    use WorkflowIntervenantAwareTrait,
-        \Application\Service\Traits\ContextAwareTrait,
-        \Application\Service\Traits\IntervenantAwareTrait,
-        \Application\Service\Traits\TypeHeuresAwareTrait
-    ;
+    use WorkflowIntervenantAwareTrait;
+    use ContextAwareTrait;
+    use IntervenantAwareTrait;
+    use TypeHeuresAwareTrait;
+    use HeuresCompFormAwareTrait;
+    use SessionContainerTrait;
+
+
+
 
-    /**
-     * @var Intervenant
-     */
-    private $intervenant;
 
-    /**
-     *
-     * @return \Zend\View\Model\ViewModel
-     */
     public function indexAction()
     {
         $role = $this->getServiceContext()->getSelectedIdentityRole();
 
-        if ($role instanceof \Application\Acl\IntervenantRole) {
+        if ($intervenant = $role->getIntervenant()) {
             // redirection selon le workflow
-            $intervenant = $role->getIntervenant();
             $wf  = $this->getWorkflowIntervenant()->setIntervenant($intervenant);
             $url = $wf->getCurrentStepUrl();
             if (!$url) {
                 $url = $wf->getStepUrl($wf->getLastStep());
             }
+
             return $this->redirect()->toUrl($url);
         }
 
         return $this->redirect()->toRoute('intervenant/rechercher');
     }
 
+
+
     public function rechercherAction()
     {
-        $view = $this->choisirAction();
+        $recents = $this->getIntervenantsRecents();
+        return compact('recents');
+    }
 
-        if ($this->intervenant) {
-            $this->addIntervenantChoisiRecent($this->intervenant);
-            return $this->redirect()->toRoute('intervenant/fiche', ['intervenant' => $this->intervenant->getSourceCode()]);
-        }
 
-        $view->setTemplate('application/intervenant/choisir');
 
-        return $view;
-    }
-
-    /**
-     *
-     * @return \Zend\View\Model\ViewModel
-     */
-    public function choisirAction()
+    public function rechercheAction()
     {
-        $intervenant = $this->context()->intervenantFromQuery();
-
-        $url    = $this->url()->fromRoute('recherche', ['action' => 'intervenantFind']);
-        $interv = new \UnicaenApp\Form\Element\SearchAndSelect('interv');
-        $interv->setAutocompleteSource($url)
-                ->setRequired(true)
-                ->setSelectionRequired(true)
-                ->setLabel("Recherchez l'intervenant concerné :")
-                ->setAttributes(['title' => "Saisissez le nom suivi éventuellement du prénom (2 lettres au moins)"]);
-        if ($intervenant) {
-            $f = new \Common\Filter\IntervenantTrouveFormatter();
-            $interv->setValue($f->filter($intervenant));
-        }
-        $form = new \Zend\Form\Form('search');
-        $form->setAttributes([
-            'action' => $this->getRequest()->getRequestUri(),
-            'class'  => 'intervenant-rech']);
-        $form->add($interv);
-
-        if ($this->getRequest()->isPost()) {
-            $data = $this->getRequest()->getPost();
-            $form->setData($data);
-            if ($form->isValid()) {
-                $sourceCode = $form->get('interv')->getValueId();
-                $this->getRequest()->getQuery()->set('sourceCode', $sourceCode);
-                $this->intervenant = $this->importerAction()->getVariable('intervenant');
-                if (($redirect = $this->params()->fromQuery('redirect'))) {
-                    $redirect = str_replace('__sourceCode__', $sourceCode, $redirect);
-                    return $this->redirect()->toUrl($redirect);
-                }
-            }
-        }
+        $this->em()->getFilters()->enable('historique')->init([
+            Intervenant::class,
+        ]);
 
-        $viewModel = new \Zend\View\Model\ViewModel();
-        $viewModel
-                ->setTemplate('application/intervenant/choisir')
-                ->setVariables([
-                    'form'    => $form,
-                    'title'   => "Rechercher un intervenant",
-                    'recents' => $this->getIntervenantsChoisisRecents()]);
+        $critere      = $this->params()->fromPost('critere');
+        $intervenants = $this->getServiceIntervenant()->recherche($critere, 21);
 
-        return $viewModel;
+        return compact('intervenants');
     }
 
-    public function importerAction()
-    {
-        if (!($sourceCode = $this->params()->fromQuery('sourceCode', $this->params()->fromPost('sourceCode')))) {
-            throw new LogicException("Aucun code source d'intervenant spécifié.");
-        }
-
-        $intervenant = $this->getServiceIntervenant()->importer($sourceCode);
 
-        $view = new \Zend\View\Model\ViewModel();
-        $view->setVariables(['intervenant' => $intervenant]);
-        return $view;
-    }
 
     public function voirAction()
     {
-        $role = $this->getServiceContext()->getSelectedIdentityRole();
+        $role        = $this->getServiceContext()->getSelectedIdentityRole();
+        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
 
-        if ($role instanceof \Application\Acl\IntervenantRole) {
-            $intervenant = $role->getIntervenant();
-        } else {
-            $intervenant = $this->getEvent()->getParam('intervenant');
+        if (! $intervenant){
+            throw new \LogicException('Intervenant introuvable');
         }
 
-        $view = new \Zend\View\Model\ViewModel();
-        $view->setVariables(compact('intervenant', 'role'));
+        $this->addIntervenantRecent($intervenant);
 
-        return $view;
+        return compact('intervenant', 'role');
     }
 
+
+
     public function apercevoirAction()
     {
-        $intervenant = $this->context()->mandatory()->intervenantFromRoute();
+        $role        = $this->getServiceContext()->getSelectedIdentityRole();
+        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
+        $title       = "Aperçu d'un intervenant";
 
-        $import = $this->getServiceLocator()->get('ImportProcessusImport');
-        $changements = $import->intervenantGetDifferentiel($intervenant);
-        $title = "Aperçu d'un intervenant";
-        $short = $this->params()->fromQuery('short', false);
-
-        $view = new \Zend\View\Model\ViewModel();
-        $view->setVariables(compact('intervenant', 'changements', 'title', 'short'));
-        return $view;
+        return compact('intervenant', 'title');
     }
 
+
+
     public function voirHeuresCompAction()
     {
         $this->em()->getFilters()->enable('historique')->init([
-            'Application\Entity\Db\Service',
-            'Application\Entity\Db\VolumeHoraire'
+            \Application\Entity\Db\Service::class,
+            \Application\Entity\Db\VolumeHoraire::class,
         ]);
 
-        $intervenant = $this->context()->mandatory()->intervenantFromRoute();
+        $intervenant = $this->getEvent()->getParam('intervenant');
         /* @var $intervenant \Application\Entity\Db\Intervenant */
-        $form = $this->getFormHeuresComp();
+        $form = $this->getFormIntervenantHeuresComp();
 
         $typeVolumeHoraire = $this->context()->typeVolumeHoraireFromQuery('type-volume-horaire', $form->get('type-volume-horaire')->getValue());
         /* @var $typeVolumeHoraire \Application\Entity\Db\TypeVolumeHoraire */
-        if (! isset($typeVolumeHoraire)){
+        if (!isset($typeVolumeHoraire)) {
             throw new LogicException('Type de volume horaire erroné');
         }
 
         $etatVolumeHoraire = $this->context()->etatVolumeHoraireFromQuery('etat-volume-horaire', $form->get('etat-volume-horaire')->getValue());
         /* @var $etatVolumeHoraire \Application\Entity\Db\EtatVolumeHoraire */
-        if (! isset($etatVolumeHoraire)){
+        if (!isset($etatVolumeHoraire)) {
             throw new LogicException('Etat de volume horaire erroné');
         }
 
@@ -202,134 +146,148 @@ class IntervenantController extends AbstractActionController implements Workflow
         ];
 
         $referentiels = $intervenant->getFormuleIntervenant()->getFormuleServiceReferentiel();
-        foreach( $referentiels as $referentiel ){
+        foreach ($referentiels as $referentiel) {
             /* @var $referentiel \Application\Entity\Db\FormuleServiceReferentiel */
 
-            if (! isset($data['referentiel'][$referentiel->getStructure()->getId()])){
+            if (!isset($data['referentiel'][$referentiel->getStructure()->getId()])) {
                 $data['referentiel'][$referentiel->getStructure()->getId()] = [
-                    'structure' => $referentiel->getStructure(),
-                    'heures'    => 0,
-                    'hetd'      => 0,
-                    'hetd-compl'=> 0,
+                    'structure'  => $referentiel->getStructure(),
+                    'heures'     => 0,
+                    'hetd'       => 0,
+                    'hetd-compl' => 0,
                 ];
             }
-            $data['referentiel'][$referentiel->getStructure()->getId()]['heures'] += $referentiel->getHeures( $typeVolumeHoraire, $etatVolumeHoraire );
+            $data['referentiel'][$referentiel->getStructure()->getId()]['heures'] += $referentiel->getHeures($typeVolumeHoraire, $etatVolumeHoraire);
             $frr = $referentiel->getServiceReferentiel()->getUniqueFormuleResultatServiceReferentiel($typeVolumeHoraire, $etatVolumeHoraire);
-            $data['referentiel'][$referentiel->getStructure()->getId()]['hetd'] += $frr ?$frr->getHeuresServiceReferentiel() : 0;
+            $data['referentiel'][$referentiel->getStructure()->getId()]['hetd'] += $frr ? $frr->getHeuresServiceReferentiel() : 0;
             $data['referentiel'][$referentiel->getStructure()->getId()]['hetd-compl'] += $frr ? $frr->getHeuresComplReferentiel() : 0;
         }
 
         $services = $intervenant->getFormuleIntervenant()->getFormuleService();
-        foreach( $services as $service ){
+        foreach ($services as $service) {
             $dsId = $service->getId();
-            $ds = [];
+            $ds   = [];
 
             /* @var $service \Application\Entity\Db\FormuleService */
             $typesIntervention = [];
-            $totalHeures = 0;
+            $totalHeures       = 0;
 
             $fvhs = $service->getFormuleVolumeHoraire($typeVolumeHoraire, $etatVolumeHoraire);
-            foreach( $fvhs as $fvh ){ /* @var $fvh \Application\Entity\Db\FormuleVolumeHoraire */
+            foreach ($fvhs as $fvh) {
+                /* @var $fvh \Application\Entity\Db\FormuleVolumeHoraire */
                 $totalHeures += $fvh->getHeures();
-                if (! isset($typesIntervention[$fvh->getTypeIntervention()->getId()])) $typesIntervention[$fvh->getTypeIntervention()->getId()] = [
-                    'type-intervention' => $fvh->getTypeIntervention(),
-                    'heures'            => 0,
-                    'hetd'              => 0,
-                ];
+                if (!isset($typesIntervention[$fvh->getTypeIntervention()->getId()])) {
+                    $typesIntervention[$fvh->getTypeIntervention()->getId()] = [
+                        'type-intervention' => $fvh->getTypeIntervention(),
+                        'heures'            => 0,
+                        'hetd'              => 0,
+                    ];
+                }
                 $typesIntervention[$fvh->getTypeIntervention()->getId()]['heures'] += $fvh->getHeures();
                 $hetd = $fvh->getVolumeHoraire()->getFormuleResultatVolumeHoraire()->first()->getTotal();
                 $typesIntervention[$fvh->getTypeIntervention()->getId()]['hetd'] += $hetd;
             }
 
-            if ($totalHeures > 0){
-                $frs = $service->getService()->getUniqueFormuleResultatService( $typeVolumeHoraire, $etatVolumeHoraire );
-                if (1.0 !== $service->getPonderationServiceCompl()){
+            if ($totalHeures > 0) {
+                $frs = $service->getService()->getUniqueFormuleResultatService($typeVolumeHoraire, $etatVolumeHoraire);
+                if (1.0 !== $service->getPonderationServiceCompl()) {
                     $data['has-ponderation-service-compl'] = true;
                 }
                 $ds = [
-                    'element-etablissement'         => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique() : $service->getService()->getEtablissement(),
-                    'taux'                          => [],
-                    'structure'                     => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique()->getStructure() : $service->getService()->getIntervenant()->getStructure(),
-                    'ponderation-service-compl'     => $service->getPonderationServiceCompl(),
-                    'heures'                        => [],
-                    'hetd'                          => [
+                    'element-etablissement'     => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique() : $service->getService()->getEtablissement(),
+                    'taux'                      => [],
+                    'structure'                 => $service->getService()->getElementPedagogique() ? $service->getService()->getElementPedagogique()->getStructure() : $service->getService()->getIntervenant()->getStructure(),
+                    'ponderation-service-compl' => $service->getPonderationServiceCompl(),
+                    'heures'                    => [],
+                    'hetd'                      => [
                         'total' => 0,
-                    ]
+                    ],
                 ];
 
-                foreach( $typesHeures as $typeHeures ){
+                foreach ($typesHeures as $typeHeures) {
                     /* @var $typeHeures \Application\Entity\Db\TypeHeures */
                     // taux
-                    try{
+                    try {
                         $h = $service->getTaux($typeHeures);
                     } catch (\Exception $ex) {
                         $h = 0.0;
                     }
-                    if ($h > 0){
-                        $ds['taux'][$typeHeures->getId()] = $h;
+                    if ($h > 0) {
+                        $ds['taux'][$typeHeures->getId()]      = $h;
                         $data['th-taux'][$typeHeures->getId()] = $typeHeures;
                     }
 
                     // HETD service
-                    try{
+                    try {
                         $h = $frs->getHeuresService($typeHeures);
                     } catch (\Exception $ex) {
                         $h = 0.0;
                     }
-                    if ($h > 0){
+                    if ($h > 0) {
                         $ds['hetd']['service'][$typeHeures->getId()] = $h;
-                        $data['th-service'][$typeHeures->getId()] = $typeHeures;
+                        $data['th-service'][$typeHeures->getId()]    = $typeHeures;
                     }
 
                     // HETD compl
-                    try{
+                    try {
                         $h = $frs->getHeuresCompl($typeHeures);
                     } catch (\Exception $ex) {
                         $h = 0.0;
                     }
-                    if ($h > 0){
+                    if ($h > 0) {
                         $ds['hetd']['compl'][$typeHeures->getId()] = $h;
-                        $data['th-compl'][$typeHeures->getId()] = $typeHeures;
+                        $data['th-compl'][$typeHeures->getId()]    = $typeHeures;
                     }
                 }
 
-                foreach( $typesIntervention as $ti ){
-                    if ( $ti['heures'] > 0 ){
+                foreach ($typesIntervention as $ti) {
+                    if ($ti['heures'] > 0) {
                         $data['types-intervention'][$ti['type-intervention']->getId()] = $ti['type-intervention'];
-                        $ds['heures'][$ti['type-intervention']->getId()] = $ti['heures'];
-                        $ds['hetd'][$ti['type-intervention']->getId()] = $ti['hetd'];
+                        $ds['heures'][$ti['type-intervention']->getId()]               = $ti['heures'];
+                        $ds['hetd'][$ti['type-intervention']->getId()]                 = $ti['hetd'];
                     }
                 }
                 $data['services'][$dsId] = $ds;
             }
         }
 
-        usort($data['types-intervention'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); });
-        usort($data['th-taux'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); });
-        usort($data['th-service'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); });
-        usort($data['th-compl'], function($ti1,$ti2){ return $ti1->getOrdre() > $ti2->getOrdre(); });
+        usort($data['types-intervention'], function ($ti1, $ti2) {
+            return $ti1->getOrdre() > $ti2->getOrdre();
+        });
+        usort($data['th-taux'], function ($ti1, $ti2) {
+            return $ti1->getOrdre() > $ti2->getOrdre();
+        });
+        usort($data['th-service'], function ($ti1, $ti2) {
+            return $ti1->getOrdre() > $ti2->getOrdre();
+        });
+        usort($data['th-compl'], function ($ti1, $ti2) {
+            return $ti1->getOrdre() > $ti2->getOrdre();
+        });
+
         return compact('form', 'intervenant', 'typeVolumeHoraire', 'etatVolumeHoraire', 'data');
     }
 
+
+
     public function formuleTotauxHetdAction()
     {
-        $intervenant = $this->context()->mandatory()->intervenantFromRoute(); /* @var $intervenant Intervenant */
+        $intervenant = $this->getEvent()->getParam('intervenant');
+        /* @var $intervenant Intervenant */
         $typeVolumeHoraire = $this->getEvent()->getParam('typeVolumeHoraire');
         $etatVolumeHoraire = $this->getEvent()->getParam('etatVolumeHoraire');
-        $formuleResultat = $intervenant->getUniqueFormuleResultat($typeVolumeHoraire, $etatVolumeHoraire);
+        $formuleResultat   = $intervenant->getUniqueFormuleResultat($typeVolumeHoraire, $etatVolumeHoraire);
+
         return compact('formuleResultat');
     }
 
+
+
     public function feuilleDeRouteAction()
     {
         $role = $this->getServiceContext()->getSelectedIdentityRole();
 
-        if ($role instanceof \Application\Acl\IntervenantRole) {
-            $intervenant = $role->getIntervenant();
-        }
-        else {
-            $intervenant = $this->context()->mandatory()->intervenantFromRoute();
-        }
+        $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant');
+        /* @var $intervenant Intervenant */
 
         if ($intervenant->estPermanent()) {
             throw new \Common\Exception\MessageException("Pas encore implémenté pour un permanent");
@@ -337,80 +295,79 @@ class IntervenantController extends AbstractActionController implements Workflow
 
         $title = sprintf("Feuille de route <small>%s</small>", $intervenant);
 
-        $wf = $this->getWorkflowIntervenant()->setIntervenant($intervenant); /* @var $wf \Application\Service\Workflow\WorkflowIntervenant */
+        $wf = $this->getWorkflowIntervenant()->setIntervenant($intervenant);
+        /* @var $wf \Application\Service\Workflow\WorkflowIntervenant */
         $wf->init();
 
-        $view = new \Zend\View\Model\ViewModel();
-        $view->setVariables(compact('intervenant', 'title', 'wf', 'role'));
-
         if ($wf->getCurrentStep()) {
 //            var_dump($wf->getStepUrl($wf->getCurrentStep()));
         }
 
-        return $view;
+        return compact('intervenant', 'title', 'wf', 'role');
     }
 
-    private $intervenantsChoisisRecentsSessionContainer;
 
-    /**
-     * @return \Zend\Session\Container
-     */
-    protected function getIntervenantsChoisisRecentsSessionContainer()
-    {
-        if (null === $this->intervenantsChoisisRecentsSessionContainer) {
-            $container = new \Zend\Session\Container(get_class() . '_IntervenantsChoisisRecents');
-            $container->setExpirationSeconds(3*60*60); // 3 heures
-            $this->intervenantsChoisisRecentsSessionContainer = $container;
-        }
-        return $this->intervenantsChoisisRecentsSessionContainer;
-    }
 
     /**
      *
-     * @param bool $clear
      * @return array
      */
-    protected function getIntervenantsChoisisRecents($clear = false)
+    protected function getIntervenantsRecents()
     {
-        $container = $this->getIntervenantsChoisisRecentsSessionContainer();
-        if ($clear) {
-            unset($container->intervenants);
-        }
-        if (!isset($container->intervenants)) {
-            $container->intervenants = [];
+        $container = $this->getSessionContainer();
+
+        if (isset($container->recents)) {
+            return $container->recents;
+        } else {
+            return [];
         }
-        return $container->intervenants;
     }
 
+
+
     /**
      *
      * @param \Application\Entity\Db\Intervenant $intervenant
+     *
      * @return \Application\Controller\IntervenantController
      */
-    protected function addIntervenantChoisiRecent(Intervenant $intervenant)
+    protected function addIntervenantRecent(Intervenant $intervenant)
     {
-        $container    = $this->getIntervenantsChoisisRecentsSessionContainer();
-        $intervenants = (array) $container->intervenants;
-
-        if (!array_key_exists($intervenant->getId(), $intervenants)) {
-            $intervenants["" . $intervenant] = [
-                'id'         => $intervenant->getId(),
-                'sourceCode' => $intervenant->getSourceCode(),
-                'nom'        => "" . $intervenant,
-            ];
-            ksort($intervenants);
+        $container = $this->getSessionContainer();
+        if (!isset($container->recents)) {
+            $container->recents = [];
         }
-        $container->intervenants = $intervenants;
 
-        return $this;
-    }
+        if (count($container->recents) > 4 && !isset($container->recents[$intervenant->getSourceCode()])) {
+            $prem = (int)date('U');
+            foreach ($container->recents as $i) {
+                $horo = $i['__horo_ajout__'];
+                if ($horo) {
+                    if ($prem >= $horo) $prem = $horo;
+                }
+            }
+            foreach ($container->recents as $index => $i) {
+                $horo = $i['__horo_ajout__'];
+                if ($horo == $prem) {
+                    unset($container->recents[$index]);
+                }
+            }
+        }
 
-    /**
-     *
-     * @return \Application\Form\Intervenant\HeuresCompForm
-     */
-    protected function getFormHeuresComp()
-    {
-        return $this->getServiceLocator()->get('FormElementManager')->get('IntervenantHeuresCompForm');
+        $container->recents[$intervenant->getSourceCode()] = [
+            'civilite'         => $intervenant->getCivilite()->getLibelleLong(),
+            'nom'              => $intervenant->getNomUsuel(),
+            'prenom'           => $intervenant->getPrenom(),
+            'date-naissance'   => $intervenant->getDateNaissance(),
+            'structure'        => $intervenant->getStructure()->getLibelleCourt(),
+            'numero-personnel' => $intervenant->getSourceCode(),
+            '__horo_ajout__'   => (int)date('U'),
+        ];
+
+        uasort($container->recents, function ($a, $b) {
+            return $a['nom'] . ' ' . $a['prenom'] > $b['nom'] . ' ' . $b['prenom'];
+        });
+
+        return $this;
     }
 }
diff --git a/module/Application/src/Application/Provider/Identity/IdentityProvider.php b/module/Application/src/Application/Provider/Identity/IdentityProvider.php
index 1e84a05ebee80290a52ac39fc25f96848a5ffcbe..96e50c2488c4e4be57e95289d36bc11bca011552 100644
--- a/module/Application/src/Application/Provider/Identity/IdentityProvider.php
+++ b/module/Application/src/Application/Provider/Identity/IdentityProvider.php
@@ -72,7 +72,7 @@ class IdentityProvider implements ServiceLocatorAwareInterface, ChainableProvide
             /**
              * @todo attention : plusieurs intervenants pourront remonter si on peut leur donner plusieurs statuts par an!!
              */
-            $intervenant = $this->getServiceIntervenant()->importer($utilisateurCode);
+            $intervenant = $this->getServiceIntervenant()->getBySourceCode($utilisateurCode);
             $personnel = $this->getServicePersonnel()->getBySourceCode($utilisateurCode);
 
             /**
diff --git a/module/Application/src/Application/Provider/Role/RoleProvider.php b/module/Application/src/Application/Provider/Role/RoleProvider.php
index 8bec2171c9d28e82476f74b9c68c2620808a9ba9..b80f502e08016a7e1a33b4123870ea5daff6ac5b 100644
--- a/module/Application/src/Application/Provider/Role/RoleProvider.php
+++ b/module/Application/src/Application/Provider/Role/RoleProvider.php
@@ -97,7 +97,7 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface
 
         if ($ldapUser = $serviceAuthUserContext->getLdapUser()) {
             $numeroPersonnel = (integer)$ldapUser->getSupannEmpId();
-            $intervenant     = $this->getServiceIntervenant()->importer($numeroPersonnel);
+            $intervenant     = $this->getServiceIntervenant()->getBySourceCode($numeroPersonnel);
             $personnel       = $this->getServicePersonnel()->getBySourceCode($numeroPersonnel);
         } else {
             $intervenant = null;
diff --git a/module/Application/src/Application/Service/Context.php b/module/Application/src/Application/Service/Context.php
index d7f4d9e0020521378928c16901acd3a4258f5a4e..36a79925402f06fa1410416a08183c4a781fbd61 100644
--- a/module/Application/src/Application/Service/Context.php
+++ b/module/Application/src/Application/Service/Context.php
@@ -4,10 +4,10 @@ namespace Application\Service;
 
 use Application\Acl\Role;
 use Application\Entity\Db\Etablissement as EntityEtablissement;
-use Application\Entity\Db\Annee         as AnneeEntity;
-use Application\Entity\Db\Structure     as StructureEntity;
+use Application\Entity\Db\Annee as AnneeEntity;
+use Application\Entity\Db\Structure as StructureEntity;
+use Application\Traits\SessionContainerTrait;
 use DateTime;
-use Zend\Session\Container;
 
 /**
  * Service fournissant les différents contextes de fonctionnement de l'application.
@@ -21,7 +21,7 @@ class Context extends AbstractService
     use Traits\IntervenantAwareTrait;
     use Traits\ParametresAwareTrait;
     use Traits\StructureAwareTrait;
-
+    use SessionContainerTrait;
 
     /**
      * selectedIdentityRole
@@ -67,12 +67,6 @@ class Context extends AbstractService
      */
     protected $parametres;
 
-    /**
-     * @var Container
-     */
-    protected $sessionContainer;
-
-
 
 
 
@@ -88,77 +82,83 @@ class Context extends AbstractService
 
             if ($authUserContext->getIdentity()) {
                 $this->selectedIdentityRole = $authUserContext->getSelectedIdentityRole();
-                if (
-                    $this->selectedIdentityRole instanceof \Application\Acl\IntervenantRole
-                    && ! $this->selectedIdentityRole->getIntervenant()
-                ){
-                    // import automatique
-                    $iSourceCode = (int)$authUserContext->getLdapUser()->getSupannEmpId();
-                    $intervenant = $this->getServiceIntervenant()->importer($iSourceCode);
-                    $this->selectedIdentityRole->setIntervenant( $intervenant ); // injection à la volée de l'intervenant
-                }
+                if (! $this->selectedIdentityRole instanceof Role) $this->selectedIdentityRole = new Role();
             }
         }
+
         return $this->selectedIdentityRole;
     }
 
+
+
     /**
      *
      * @return EntityEtablissement
      */
     public function getEtablissement()
     {
-        if (! $this->etablissement){
+        if (!$this->etablissement) {
             $sc = $this->getSessionContainer();
-            if (! $sc->offsetExists('etablissement')){
+            if (!$sc->offsetExists('etablissement')) {
                 $sc->etablissement = (int)$this->getServiceParametres()->etablissement;
             }
-            $this->etablissement = $this->getServiceEtablissement()->get( $sc->etablissement);
+            $this->etablissement = $this->getServiceEtablissement()->get($sc->etablissement);
         }
+
         return $this->etablissement;
     }
 
+
+
     /**
      *
      * @param EntityEtablissement $etablissement
-     * @param boolean $updateParametres
+     * @param boolean             $updateParametres
+     *
      * @return self
      */
-    public function setEtablissement( EntityEtablissement $etablissement, $updateParametres=false )
+    public function setEtablissement(EntityEtablissement $etablissement, $updateParametres = false)
     {
-        $this->etablissement = $etablissement;
+        $this->etablissement                        = $etablissement;
         $this->getSessionContainer()->etablissement = $etablissement->getId();
-        if ($updateParametres){
+        if ($updateParametres) {
             $this->getServiceParametres()->etablissement = (string)$etablissement->getId();
         }
+
         return $this;
     }
 
+
+
     /**
-     * Retourne l'année courante. 
+     * Retourne l'année courante.
      * C'est à dire :
-     * - celle mémorisée en session (car sélectionnée par l'utilisateur) si elle existe ; 
+     * - celle mémorisée en session (car sélectionnée par l'utilisateur) si elle existe ;
      * - ou sinon celle spécifiée dans les paramètres de l'appli.
      *
      * @return AnneeEntity
      */
     public function getAnnee()
     {
-        if (! $this->annee){
+        if (!$this->annee) {
             $sc = $this->getSessionContainer();
-            if (! $sc->offsetExists('annee')){
+            if (!$sc->offsetExists('annee')) {
                 $sc->annee = (int)$this->getServiceParametres()->annee;
             }
 
-            $this->annee = $this->getServiceAnnee()->get( $sc->annee);
+            $this->annee = $this->getServiceAnnee()->get($sc->annee);
         }
+
         return $this->annee;
     }
 
+
+
     /**
      * Retourne l'année N - x, N étant l'année courante.
      *
      * @param int $x Entier supérieur ou égal à zéro
+     *
      * @return AnneeEntity
      */
     public function getAnneeNmoins($x)
@@ -166,49 +166,61 @@ class Context extends AbstractService
         return $this->getServiceAnnee()->getNmoins($this->getAnnee(), $x);
     }
 
+
+
     /**
      *
      * @return AnneeEntity
      */
     public function getAnneePrecedente()
     {
-        if (! $this->anneePrecedente){
-            $this->anneePrecedente = $this->getServiceAnnee()->getPrecedente( $this->getAnnee() );
+        if (!$this->anneePrecedente) {
+            $this->anneePrecedente = $this->getServiceAnnee()->getPrecedente($this->getAnnee());
         }
+
         return $this->anneePrecedente;
     }
 
+
+
     /**
      *
      * @return AnneeEntity
      */
     public function getAnneeSuivante()
     {
-        if (! $this->anneeSuivante){
-            $this->anneeSuivante = $this->getServiceAnnee()->getSuivante( $this->getAnnee() );
+        if (!$this->anneeSuivante) {
+            $this->anneeSuivante = $this->getServiceAnnee()->getSuivante($this->getAnnee());
         }
+
         return $this->anneeSuivante;
     }
 
+
+
     /**
      *
      * @param AnneeEntity $annee
-     * @param boolean $updateParametres
+     * @param boolean     $updateParametres
+     *
      * @return self
      */
-    public function setAnnee( AnneeEntity $annee, $updateParametres=false )
+    public function setAnnee(AnneeEntity $annee, $updateParametres = false)
     {
-        $this->annee = $annee;
+        $this->annee                        = $annee;
         $this->getSessionContainer()->annee = $annee->getId();
-        if ($updateParametres){
+        if ($updateParametres) {
             $this->getServiceParametres()->annee = (string)$annee->getId();
         }
         /* Rafraîchit les années précédentes et suivantes par la même occasion!! */
         $this->getAnneePrecedente();
         $this->getAnneeSuivante();
+
         return $this;
     }
 
+
+
     /**
      *
      * @return DateTime
@@ -216,122 +228,132 @@ class Context extends AbstractService
     function getDateObservation()
     {
         $sc = $this->getSessionContainer();
-        if (! $sc->offsetExists('dateObservation')){
+        if (!$sc->offsetExists('dateObservation')) {
             $sc->dateObservation = null;
         }
+
         return $sc->dateObservation;
     }
 
+
+
     /**
      *
      * @param DateTime $dateObservation
+     *
      * @return self
      */
-    public function setDateObservation( DateTime $dateObservation )
+    public function setDateObservation(DateTime $dateObservation)
     {
         $sc->dateObservation = $dateObservation;
+
         return $this;
     }
 
+
+
     /**
-     * 
+     *
      * @return DateTime
      */
     function getDateFinSaisiePermanents()
     {
         $sc = $this->getSessionContainer();
-        if (! $sc->offsetExists('dateFinSaisiePermanents')){
+        if (!$sc->offsetExists('dateFinSaisiePermanents')) {
             $sc->dateFinSaisiePermanents = DateTime::createFromFormat(
-                                                'd/m/Y',
-                                                $this->getServiceParametres()->date_fin_saisie_permanents
-                                           );
+                'd/m/Y',
+                $this->getServiceParametres()->date_fin_saisie_permanents
+            );
         }
+
         return $sc->dateFinSaisiePermanents;
     }
 
+
+
     /**
      *
      * @param DateTime $dateFinSaisiePermanents
+     *
      * @return self
      */
-    public function setDateFinSaisiePermanents( DateTime $dateFinSaisiePermanents, $updateParametres=false )
+    public function setDateFinSaisiePermanents(DateTime $dateFinSaisiePermanents, $updateParametres = false)
     {
         $sc->dateFinSaisiePermanents = $dateFinSaisiePermanents;
-        if ($updateParametres){
+        if ($updateParametres) {
             $this->getServiceParametres()->date_fin_saisie_permanents = $sc->dateFinSaisiePermanents->format('d/m/Y');
         }
+
         return $this;
     }
 
+
+
     /**
      *
      * @return StructureEntity
      */
-    public function getStructure($initializing=false)
+    public function getStructure($initializing = false)
     {
-        if (! $this->structure){
+        if (!$this->structure) {
             $sc = $this->getSessionContainer();
-            if (! $sc->offsetExists('structure')){
-                if ($initializing){
+            if (!$sc->offsetExists('structure')) {
+                if ($initializing) {
                     $sc->structure = null;
-                }else{
+                } else {
                     $role = $this->getSelectedIdentityRole();
-                    if ($role && $role->getStructure()){
+                    if ($role && $role->getStructure()) {
                         $sc->structure = $role->getStructure()->getId();
-                    }else{
+                    } else {
                         $sc->structure = null;
                     }
                 }
             }
-            $this->structure = $this->getServiceStructure()->get( $sc->structure);
+            $this->structure = $this->getServiceStructure()->get($sc->structure);
         }
+
         return $this->structure;
     }
 
+
+
     /**
      *
      * @param StructureEntity $structure
-     * @param boolean $updateParametres
+     * @param boolean         $updateParametres
+     *
      * @return self
      */
-    public function setStructure( $structure )
+    public function setStructure($structure)
     {
-        if ($structure instanceof StructureEntity){
-            $this->structure = $structure;
+        if ($structure instanceof StructureEntity) {
+            $this->structure                        = $structure;
             $this->getSessionContainer()->structure = $structure->getId();
-        }else{
-            $this->structure = null;
+        } else {
+            $this->structure                        = null;
             $this->getSessionContainer()->structure = null;
         }
+
         return $this;
     }
-    
+
+
+
     /**
      * Détermine si l'application était opérationnelle l'année spécifiée.
-     * 
+     *
      * On considère que s'il existe des intervenants pour l'année spécifiée, alors
      * l'application était opérationnelle.
-     * 
+     *
      * @param AnneeEntity $annee
+     *
      * @return boolean
      */
     public function applicationExists(AnneeEntity $annee)
     {
         $qb    = $this->getServiceIntervenant()->finderByAnnee($annee);
-        $found = (int) $qb->select("COUNT(int)")->getQuery()->getSingleScalarResult();
-        
-        return (bool) $found;
-    }
+        $found = (int)$qb->select("COUNT(int)")->getQuery()->getSingleScalarResult();
 
-    /**
-     * @return Container
-     */
-    protected function getSessionContainer()
-    {
-        if (null === $this->sessionContainer) {
-            $this->sessionContainer = new Container(__CLASS__);
-        }
-        return $this->sessionContainer;
+        return (bool)$found;
     }
-
 }
\ No newline at end of file
diff --git a/module/Application/src/Application/Service/Intervenant.php b/module/Application/src/Application/Service/Intervenant.php
index 4e3796905cace32826550d13f8dbe60cae90da4e..f9cf59944860b59f12a2681500e767d8eb68afa5 100644
--- a/module/Application/src/Application/Service/Intervenant.php
+++ b/module/Application/src/Application/Service/Intervenant.php
@@ -11,6 +11,7 @@ use Application\Service\Traits\StatutIntervenantAwareTrait;
 use Common\Exception\RuntimeException;
 use Doctrine\ORM\QueryBuilder;
 use Import\Processus\Import;
+use UnicaenApp\Util;
 
 /**
  * Description of Intervenant
@@ -23,6 +24,64 @@ class Intervenant extends AbstractEntityService
 
 
 
+    /**
+     * @param string  $critere
+     * @param integer $limit
+     *
+     * @return array
+     */
+    public function recherche($critere, $limit = 50)
+    {
+        if (strlen($critere) < 2) return [];
+
+        $anneeId = (int)$this->getServiceContext()->getAnnee()->getId();
+
+        $critere  = Util::reduce($critere);
+        $criteres = explode('_', $critere);
+
+        $sql     = 'SELECT * FROM V_INTERVENANT_RECHERCHE WHERE rownum <= ' . (int)$limit . ' AND annee_id = ' . $anneeId;
+        $sqlCri  = '';
+        $criCode = 0;
+
+        foreach ($criteres as $c) {
+            $cc = (int)$c;
+            if (0 === $cc) {
+                if ($sqlCri != '') $sqlCri .= ' AND ';
+                $sqlCri .= 'critere LIKE q\'[%' . $c . '%]\'';
+            } else {
+                $criCode = $cc;
+            }
+        }
+        $orc = '';
+        if ($sqlCri != '') {
+            $orc[] = '(' . $sqlCri . ')';
+        }
+        if ($criCode) {
+            $orc[] = 'source_code LIKE \'%' . $criCode . '%\'';
+        }
+        $orc = implode(' OR ', $orc);
+        $sql .= ' AND (' . $orc . ') ORDER BY nom_usuel, prenom';
+//        sqlDump($sql);
+
+        $stmt = $this->getEntityManager()->getConnection()->executeQuery($sql);
+
+        $intervenants = [];
+        while ($r = $stmt->fetch()) {
+            $intervenants[$r['SOURCE_CODE']] = [
+                'civilite'         => $r['CIVILITE'],
+                'nom'              => $r['NOM_USUEL'],
+                'prenom'           => $r['PRENOM'],
+                'date-naissance'   => new \DateTime($r['DATE_NAISSANCE']),
+                'structure'        => $r['STRUCTURE'],
+                'numero-personnel' => $r['SOURCE_CODE'],
+            ];
+        }
+
+        return $intervenants;
+    }
+
+
+
     /**
      * Recherche par :
      * - id source exact (numéro Harpege ou autre),
@@ -98,7 +157,18 @@ class Intervenant extends AbstractEntityService
             $annee = $this->getServiceContext()->getAnnee();
         }
 
-        return $this->getRepo()->findOneBy(['sourceCode' => $sourceCode, 'annee' => $annee->getId()]);
+        $findParams = ['sourceCode' => $sourceCode, 'annee' => $annee->getId()];
+        $repo       = $this->getRepo();
+
+        $result = $repo->findOneBy($findParams);
+        if (!$result) {
+            $import = $this->getServiceLocator()->get('importProcessusImport');
+            /* @var $import Import */
+            $import->intervenant($sourceCode);
+            $result = $repo->findOneBy($findParams); // on retente
+        }
+
+        return $result;
     }
 
 
@@ -226,10 +296,8 @@ class Intervenant extends AbstractEntityService
         /* @var $import Import */
         $import->intervenant($sourceCode);
 
-        $repo = $this->getEntityManager()->getRepository($this->getEntityClass());
-
-        if (!($intervenant = $repo->findOneBySourceCode($sourceCode))) {
-            throw new RuntimeException("Vous n'êtes pas autorisé à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide.");
+        if (!($intervenant = $this->getRepo()->findOneBySourceCode($sourceCode))) {
+            //    throw new RuntimeException("Vous n'êtes pas autorisé à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide.");
         }
 
         return $intervenant;
diff --git a/module/Application/view/application/index/index.phtml b/module/Application/view/application/index/index.phtml
index 5d826720ff6f75aaf1bf9744abf8ffae80559094..dcb7b2e18d15a04c6604d8c5336324a1baecde0e 100755
--- a/module/Application/view/application/index/index.phtml
+++ b/module/Application/view/application/index/index.phtml
@@ -11,7 +11,6 @@ echo $this->messenger()->addMessagesFromFlashMessenger();
             <small>Organisation des Services d'Enseignement</small>
         </h1>
         <p class="lead">Bienvenue dans l'application de saisie des enseignements de l'université de Caen.</p>
-
         <p>Année <?php echo $annee ?>.</p>
 
         <?php
@@ -44,6 +43,12 @@ echo $this->messenger()->addMessagesFromFlashMessenger();
                 $label = $this->translate("Tableau synthétique des enseignements concernant ma composante...");
                 ?><p><a class="btn btn-primary btn-large" href="<?php echo $url ?>"><?php echo $label ?></a></p><?php
 
+            }elseif (!$role->getPersonnel()){
+            ?>
+            <div class="alert alert-danger" role="alert">
+                Vous n'êtes pas autorisé(e) à vous connecter à OSE avec ce compte. Vous vous prions de vous rapprocher de votre composante pour en obtenir un valide.
+            </div>
+            <?php
             }
 
         }else{
diff --git a/module/Application/view/application/intervenant/liste.phtml b/module/Application/view/application/intervenant/liste.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..3cdecc31d85c7dfbe47132a988d2a8aaa79d0851
--- /dev/null
+++ b/module/Application/view/application/intervenant/liste.phtml
@@ -0,0 +1,31 @@
+<?php
+    /* @var $intervenants array */
+?>
+<table class="table table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>&nbsp;</th>
+        <th>Civilité</th>
+        <th>Nom</th>
+        <th>Prénom</th>
+        <th>Structure</th>
+        <th>Date de naissance</th>
+        <th>N° personnel</th>
+    </tr>
+    </thead>
+    <tbody class="table-hover">
+    <?php foreach($intervenants as $sourceCode => $intervenant): ?>
+    <tr>
+        <td><a href="<?php echo $this->url('intervenant/fiche', ['intervenant' => $sourceCode]); ?>">
+                <span class="glyphicon glyphicon-eye-open"></span> Fiche
+            </a></td>
+        <td><?php echo $intervenant['civilite'] ?></td>
+        <td><?php echo $intervenant['nom'] ?></td>
+        <td><?php echo $intervenant['prenom'] ?></td>
+        <td><?php echo $intervenant['structure'] ?></td>
+        <td><?php echo $intervenant['date-naissance']->format(\Common\Constants::DATE_FORMAT) ?></td>
+        <td><?php echo $intervenant['numero-personnel'] ?></td>
+    </tr>
+    </tbody>
+    <?php endforeach; ?>
+</table>
\ No newline at end of file
diff --git a/module/Application/view/application/intervenant/recherche.phtml b/module/Application/view/application/intervenant/recherche.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..843d5e116c3d73b6d20bb0e6191c97c0df76db91
--- /dev/null
+++ b/module/Application/view/application/intervenant/recherche.phtml
@@ -0,0 +1,21 @@
+<?php
+
+/* @var $intervenants array */
+$nombre = count($intervenants);
+
+?>
+<?php if (empty($intervenants)): ?>
+
+    <div class="alert alert-info">Aucun intervenant trouvé!</div>
+
+<?php else: ?>
+    <div class="alert alert-success"><?php
+    switch($nombre){
+        case 1:  echo '1 intervenant(e) trouvé(e)'; break;
+        case 21: echo 'plus de 20 intervenants trouvés. Voici les 20 premiers :'; break;
+        default: echo $nombre.' intervenants trouvés';
+    }
+    ?></div>
+    <?php echo $this->partial('liste', compact('intervenants')); ?>
+
+<?php endif; ?>
diff --git a/module/Application/view/application/intervenant/rechercher.phtml b/module/Application/view/application/intervenant/rechercher.phtml
index 3ac6594d6fbc9b54588c8dd1addfa80f1a3f2d4b..5490fd434cb9c1633955c4acd57dcde371331b15 100644
--- a/module/Application/view/application/intervenant/rechercher.phtml
+++ b/module/Application/view/application/intervenant/rechercher.phtml
@@ -1,38 +1,25 @@
-<div class="jumbotron">
-    <h1>Rechercher un intervenant</h1>
-</div>
-
-<?php $form->prepare(); ?>
+<?php
+    /* @var $recents []  */
+?>
+<h1>Rechercher un intervenant</h1>
 
-<div class="row">
-    <div class="col-md-4">
-        <?php echo $this->form()->openTag($form) ?>
-        <?php echo $this->formControlGroup($form->get('interv')); ?>
-        <input class="btn btn-primary" type="submit" value="Consulter" name="submit">
-        <?php echo $this->form()->closeTag() ?>
+<div style="padding:1em">
+<div class="intervenant-recherche">
+    <div class="critere">
+        Saisissez le nom suivi éventuellement du prénom (2 lettres au moins) :
+        <input id="critere" class="form-control input" type="text"  />
     </div>
-    <div class="col-md-8 intervenant-voir">
-        <?php if (false !== $intervenant): ?>
-            <?php echo $intervenant ? $this->intervenant($intervenant) : "Intervenant introuvable dans OSE." ?>
-        <?php endif ?>
-        <?php if ($intervenant): ?>
-            <?php echo $this->navigation('navigation')->menuContextuel()->withTarget($intervenant->getId()) ?>
-        <?php endif ?>
+    <div class="recherche" data-url="<?php echo $this->url('intervenant/recherche') ?>">
+
     </div>
 </div>
 
-<script>
-    var url = '<?php echo $this->url('intervenant/default', ['action' => 'voir']) ?>';
-    $("body").on("submit", "form.intervenant-rech", function(event) {
-        var form = $(event.target);
-        var id = $("input.sas", form).val();
-        $.post(url, { 'id': id }, function(data) {
-            $("div.intervenant-voir").html(data);
-        });
-        event.preventDefault();
-    });
+<?php
 
-    $(function() {
-        $(":input").tooltip();
-    });
-</script>
\ No newline at end of file
+if (! empty($recents)){
+    echo '<h3>Fiches récemment consultées :</h3>';
+    echo $this->partial('liste', ['intervenants' => $recents]);
+}
+
+?>
+</div>
diff --git a/module/Application/view/application/intervenant/voir.phtml b/module/Application/view/application/intervenant/voir.phtml
index 192fc826b191594ef55947ffe906b383d30b6fd3..15fb93c09409c63bc0e80b210cb5dd0945c7a718 100644
--- a/module/Application/view/application/intervenant/voir.phtml
+++ b/module/Application/view/application/intervenant/voir.phtml
@@ -6,4 +6,4 @@
 
 <hr />
 
-<?php echo $this->partial('application/intervenant/partial/feuille-de-route.phtml', ['intervenant' => $intervenant, 'role' => $role]);
\ No newline at end of file
+<?php echo $this->partial('application/intervenant/partial/feuille-de-route.phtml', compact('intervenant','role'));
\ No newline at end of file
diff --git a/public/css/app.css b/public/css/app.css
index eaa456e618c9ff5549b5e429f1daf12695f25a08..fa998858f445200f325c2be653c3dc46110985fc 100755
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -373,4 +373,12 @@ div#navbar pre {
 
 form#dossier .form-control[disabled], form#dossier .form-control[readonly], form#dossier fieldset[disabled] .form-control {
     cursor: text;
+}
+
+
+
+
+
+.intervenant-recherche .critere{
+    padding-bottom: 1em;
 }
\ No newline at end of file
diff --git a/public/js/app.js b/public/js/app.js
index 262f36319d3fddec757666ec50c5406f31d5fa2a..e5951c2e3b75da1d4ec85c6b47875a9c2114a989 100755
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -102,6 +102,47 @@ function changementAnnee(annee)
     );
 }
 
+/**
+ *
+ * @constructor
+ */
+$.widget("ose.intervenantRecherche", {
 
+    rechercher: function( critere )
+    {
+        var that = this;
+
+
+        if (critere.length > 1) {
+            if (that.getElementRecherche().find('.loading').length == 0){
+                that.getElementRecherche().prepend('<div class="loading"></div>');
+            }
+            that.getElementRecherche().refresh({critere: critere}, function( response, status, xhr ){
+                if ( status == "error" ) {
+                    var msg = "Sorry but there was an error: ";
+                    that.getElementRecherche().html( msg + xhr.status + " " + xhr.statusText + xhr.responseText );
+                }
+            });
+        }
+    },
+
+    _create: function ()
+    {
+        var that = this;
 
+        this.element.find( "#critere" ).autocomplete({
+            source: function( event, ui ) {
+                that.rechercher(event.term);
+                return {};
+            }
+        });
+    },
+
+    getElementRecherche : function () { return this.element.find('.recherche'); },
+});
+
+$(function ()
+{
+    WidgetInitializer.add('intervenant-recherche', 'intervenantRecherche');
+});