diff --git a/VERSIONS_HOTLINE/37107 b/VERSIONS_HOTLINE/37107
new file mode 100644
index 0000000000000000000000000000000000000000..27f968e097ad2f581afca92da2d3c7e30256eb38
--- /dev/null
+++ b/VERSIONS_HOTLINE/37107
@@ -0,0 +1 @@
+ - ticket #37107 : Ressources numérique : lorsque la ressource le permet, redirection directe à la ressource en cas de login réussi
\ No newline at end of file
diff --git a/application/modules/opac/controllers/ModulesController.php b/application/modules/opac/controllers/ModulesController.php
index 4652534dd02b629364c72ecbd320a2421d75e330..6f0146b07648d9c810faecbfaee4d7a2f0fb9b8a 100644
--- a/application/modules/opac/controllers/ModulesController.php
+++ b/application/modules/opac/controllers/ModulesController.php
@@ -20,13 +20,26 @@
  */
 
 class ModulesController extends Zend_Controller_Action {
-  public function cvsAction() {
-    $cvs = new Class_Systeme_ModulesMenu_CVS();
+  public function preDispatch() {
+    $mapping = ['vodeclic' => 'Vodeclic',
+                'toutapprendre' => 'ToutApprendre',
+                'lekiosk' => 'LeKiosk',
+                'lesocial' => 'LeSocial',
+                'mycow' => 'MyCow',
+                'planetnemo' => 'PlanetNemo',
+                'kidilangues' => 'Kidilangues',
+                'orthodidacte' => 'Orthodidacte'];
+
+    $action = $this->_request->getActionName();
+    if (array_key_exists($action, $mapping))
+      $this->_forward('simple', null, null, ['type' => $mapping[$action]]);
+  }
 
-    $cvs->setDocId($this->_getParam('docid'))
-        ->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
 
-    return $this->checkNotifyMessage($cvs, $cvs->getDynamiqueUrl());
+  public function cvsAction() {
+    $cvs = new Class_Systeme_ModulesMenu_CVS();
+    $cvs->setDocId($this->_getParam('docid'));
+    $this->simple($cvs);
   }
 
 
@@ -54,62 +67,27 @@ class ModulesController extends Zend_Controller_Action {
   }
 
 
-  public function vodeclicAction() {
-    $vodeclic = new Class_Systeme_ModulesMenu_Vodeclic();
-    $vodeclic->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
-    $this->checkNotifyMessage($vodeclic, $vodeclic->getDynamiqueUrl());
-  }
-
-
-  public function toutapprendreAction() {
-    $tout_apprendre = new Class_Systeme_ModulesMenu_ToutApprendre();
-    $tout_apprendre->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
-    $this->checkNotifyMessage($tout_apprendre,
-                              $tout_apprendre->getDynamiqueUrl());
-  }
-
-
-  public function lekioskAction() {
-    $redirect = Class_AdminVar::isLeKioskCas()
-      ? Class_Url::absolute($this->view->url())
-      : $this->_request->getServer('HTTP_REFERER') ;
-
-    $lekiosk = new Class_Systeme_ModulesMenu_LeKiosk();
-    $lekiosk->afterLoginRedirectTo($redirect);
-    $this->checkNotifyMessage($lekiosk, $lekiosk->getDynamiqueUrl());
-  }
-
-  public function lesocialAction() {
-    $lesocial = new Class_Systeme_ModulesMenu_LeSocial();
-    $lesocial->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
-    $this->checkNotifyMessage($lesocial, $lesocial->getDynamiqueUrl());
-  }
-
-
-  public function mycowAction() {
-    $mycow = new Class_Systeme_ModulesMenu_MyCow();
-    $mycow->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
-    $this->checkNotifyMessage($mycow, $mycow->getDynamiqueUrl());
-  }
-
-
   public function mycowSsoAction() {
     $this->view->eid = $this->_request->getParam('eid', 0);
     $this->view->uid = $this->_request->getParam('uid', 0);
   }
 
 
-  public function planetnemoAction() {
-    $planetnemo = new Class_Systeme_ModulesMenu_PlanetNemo();
-    $planetnemo->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
-    $this->checkNotifyMessage($planetnemo, $planetnemo->getDynamiqueUrl());
+  public function simpleAction() {
+    $class_name = 'Class_Systeme_ModulesMenu_' . $this->_getParam('type', 'Null');
+    $this->simple(new $class_name());
   }
 
 
-  public function kidilanguesAction() {
-    $kidilangues = new Class_Systeme_ModulesMenu_Kidilangues();
-    $kidilangues->afterLoginRedirectTo($this->_request->getServer('HTTP_REFERER'));
-    $this->checkNotifyMessage($kidilangues, $kidilangues->getDynamiqueUrl());
+  protected function simple($link) {
+    $this->willRedirectToMe($link)
+         ->checkNotifyMessage($link, $link->getDynamiqueUrl());
+  }
+
+
+  protected function willRedirectToMe($link) {
+    $link->afterLoginRedirectTo(Class_Url::absolute($this->view->url()));
+    return $this;
   }
 
 
@@ -124,11 +102,4 @@ class ModulesController extends Zend_Controller_Action {
     $this->getResponse()->setHeader('Content-Type', 'text/html;charset=utf-8');
     $this->getResponse()->setBody('<script>window.location="'.$url.'";</script>');
   }
-
-
-  public function orthodidacteAction() {
-    $orthodidacte = new Class_Systeme_ModulesMenu_Orthodidacte();
-    $orthodidacte->afterLoginRedirectTo(Class_Url::absolute($this->view->url()));
-    $this->checkNotifyMessage($orthodidacte, $orthodidacte->getDynamiqueUrl());
-  }
 }
diff --git a/library/Class/Systeme/ModulesMenu/SSOAbstract.php b/library/Class/Systeme/ModulesMenu/SSOAbstract.php
index 20b418d2692c4e0d46a3950d2e259dc92b6b6bcf..726f130c9ecb1fc234beb9ecd93955bc9930d306 100644
--- a/library/Class/Systeme/ModulesMenu/SSOAbstract.php
+++ b/library/Class/Systeme/ModulesMenu/SSOAbstract.php
@@ -18,10 +18,10 @@
  * along with BOKEH; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
+
 abstract class Class_Systeme_ModulesMenu_SSOAbstract extends Class_Systeme_ModulesMenu_Null {
   protected $_login_redirect_url = null;
 
-
   public function afterLoginRedirectTo($url) {
     $this->_login_redirect_url = $url;
     return $this;
@@ -39,6 +39,11 @@ abstract class Class_Systeme_ModulesMenu_SSOAbstract extends Class_Systeme_Modul
       ? $this->urlForUser($user)
       : $this->loginUrl();
   }
+
+
+  public function urlForUser($user) {
+    return '';
+  }
 }
 
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/ModulesControllerKidilanguesTest.php b/tests/application/modules/opac/controllers/ModulesControllerKidilanguesTest.php
index 26333f5a8ec66ea189bef440453d061d44314059..f3d5516a193c41b8726e0e482b65821515851af9 100644
--- a/tests/application/modules/opac/controllers/ModulesControllerKidilanguesTest.php
+++ b/tests/application/modules/opac/controllers/ModulesControllerKidilanguesTest.php
@@ -116,14 +116,14 @@ class ModulesControllerKidilanguesLoggedV2Test extends ModulesControllerKidilang
 class ModulesControllerKidilanguesNotLoggedTest extends ModulesControllerKidilanguesActivatedTestCase {
   public function setUp() {
     parent::setUp();
-    $_SERVER['HTTP_REFERER'] = '/opac/modules/kidilangues';
+    $_SERVER['HTTP_REFERER'] = '/opac';
     $this->dispatch('/opac/modules/kidilangues', true);
   }
 
 
   /** @test */
   public function shouldRedirectToLogin() {
-    $this->assertContains('/auth/login?redirect='.urlencode('/opac/modules/kidilangues'),
+    $this->assertContains('/auth/login?redirect='.urlencode(ROOT_URL . BASE_URL . '/modules/kidilangues'),
                           $this->_response->getBody());
   }
 }
diff --git a/tests/application/modules/opac/controllers/ModulesControllerMyCowTest.php b/tests/application/modules/opac/controllers/ModulesControllerMyCowTest.php
index be82a624556374d293087c34a20f0d2c2332b29c..9716635a98978ad525aab8b0ca370c4b76a4f8e2 100644
--- a/tests/application/modules/opac/controllers/ModulesControllerMyCowTest.php
+++ b/tests/application/modules/opac/controllers/ModulesControllerMyCowTest.php
@@ -98,14 +98,14 @@ class ModulesControllerMyCowNotLoggedTest extends AbstractControllerTestCase {
     parent::setUp();
     ZendAfi_Auth::getInstance()->clearIdentity();
     RessourcesNumeriquesFixtures::activateMyCow();
-    $_SERVER['HTTP_REFERER'] = '/opac/modules/mycow';
+    $_SERVER['HTTP_REFERER'] = '/';
     $this->dispatch('/opac/modules/mycow', true);
   }
 
 
   /** @test */
   public function shouldRedirectToLogin() {
-    $this->assertContains('/auth/login?redirect='.urlencode('/opac/modules/mycow'),
+    $this->assertContains('/auth/login?redirect='.urlencode(ROOT_URL . BASE_URL . '/modules/mycow'),
                           $this->_response->getBody());
   }
 }
diff --git a/tests/application/modules/opac/controllers/ModulesControllerTest.php b/tests/application/modules/opac/controllers/ModulesControllerTest.php
index f99de2061357202a184c2c5a07c452a5b3794be9..6eb4a604957cad330b402c9579d50619d1d1c5e9 100644
--- a/tests/application/modules/opac/controllers/ModulesControllerTest.php
+++ b/tests/application/modules/opac/controllers/ModulesControllerTest.php
@@ -46,7 +46,7 @@ class ModulesControllerLoginRequiredTest extends AbstractControllerTestCase {
 
     $this->dispatch('/opac/modules/' . $action);
 
-    $this->assertContains('/auth/login?redirect='.urlencode($_SERVER['HTTP_REFERER']),
+    $this->assertContains('/auth/login?redirect='.urlencode(ROOT_URL . BASE_URL . '/modules/' . $action),
                           $this->_response->getBody());
   }
 }