diff --git a/VERSIONS_HOTLINE/81451 b/VERSIONS_HOTLINE/81451
new file mode 100644
index 0000000000000000000000000000000000000000..8c0780704bcd347c4550840aff8d00d879edd7a3
--- /dev/null
+++ b/VERSIONS_HOTLINE/81451
@@ -0,0 +1 @@
+ - ticket #81451 : Flux RSS: affichage responsive + mise en cache des flux
\ No newline at end of file
diff --git a/application/modules/opac/controllers/RssController.php b/application/modules/opac/controllers/RssController.php
index cd8a0763ada37fd30a7fb691c7c99edb831e52bd..123c5ebb2400037cde2afb71e6a41191e48104ee 100644
--- a/application/modules/opac/controllers/RssController.php
+++ b/application/modules/opac/controllers/RssController.php
@@ -128,87 +128,17 @@ class RssController extends Zend_Controller_Action
   }
 
 
-  //---------------------------------------------------------------------------
-  // Affichage d'1 flux en AJAX
-  //---------------------------------------------------------------------------
-  function afficherrssAction()
-  {
-    $rssId = (int)$this->_request->getParam('id_rss', 0);
-    $rssClass = new Class_Rss();
-
-    $ret = $rssClass->getRssById($rssId);
-    $rss=$ret[0];
-
-    $html[]='<div class="rss_popup">';
-    $html[]='<div class="header">';
-    $html[]=$rss["TITRE"];
-    $html[]='<img src="'.URL_ADMIN_IMG.'fermer.gif" style="cursor:pointer" onclick="closeRSSDiv(\''.$rssId.'\')"/>';
-    $html[]='</div>';
-
-    $html[]='<div class="content">';
-
-    if(!$rss)
-      {
-        $html[] = $this->view->_("L'adresse du flux RSS n'est plus valide.");
-      }
-    else
-      {
-        $httpClient = Class_HttpClientFactory::getInstance()->newHttpClient();
-        try
-          {
-            Zend_Feed::setHttpClient($httpClient);
-            $link = $rss["URL"];
-            $rssFeed = ZendAfi_Feed::import($link);
-
-            $i = 0;
-            $locale = Zend_Registry::get('locale');
-            foreach ($rssFeed as $item)
-              {
-                $i++;
-                $titleRss = $item->title();
-                $urlRss = $item->link();
-                $descriptionRss = $item->description();
-
-                if ($item->pubDate())
-                  {
-                    $date = $item->pubDate();
-                    if ($locale == 'en_US') $dateFormat = 'MM-dd-yyyy';
-                    else $dateFormat = 'dd-MM-yyyy';
-                    try
-                      {
-                        $zendDate =  new Zend_Date($date, Zend_Date::RFC_2822);
-                        $dateRss = $zendDate->toString($dateFormat);
-                      }
-                    catch (Exception $e)
-                      {
-                        $dateRss = '';
-                      }
-                  }
-                else $dateRss = '';
-                $html[]='<table width="100%" class="popup" cellspacing="0" align="center">';
-                $html[]='<tr>';
-                $html[]='<td class="popup_titre" width="70%"><a href="'.$urlRss.'" target="_blank" class="popup" onclick="' . $onclick . '">'.$titleRss.'</a></td>';
-                $html[]='<td  class="popup_titre" width="1%"></td>';
-                $html[]='<td  class="popup_titre" width="30%"><a href="#" onclick="return(false);">'.$dateRss.'</a></td>';
-                $html[]='</tr>';
-                $html[]='<tr>';
-                $html[]='<td  class="popup_ligne" colspan="3">'. $descriptionRss .'</td>';
-                $html[]='</tr>';
-                $html[]='</table>';
-              }
-
-          }
-        catch(Exception $e)
-          {
-            $html[] = $this->view->_("Il y a un problème avec l'adresse du flux RSS");
-          }
+  function afficherrssAction() {
+    $renderer = $this->_helper->getHelper('viewRenderer');
+    $renderer->setLayoutScript('empty.phtml');
 
-      }
-    $html[]='</div>';
-
-    $this->_helper->rssResponse(implode("", $html));
+    if (!$this->view->rss = Class_Rss::find((int)$this->_getParam('id_rss', 0))) {
+      $renderer->setNoRender();
+      return;
+    }
   }
 
+
   //---------------------------------------------------------------------------
   // Flux RSS de la page des modérations
   //---------------------------------------------------------------------------
diff --git a/application/modules/opac/views/scripts/rss/afficherrss.phtml b/application/modules/opac/views/scripts/rss/afficherrss.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..dbf2172b561efbde5caa3cf9f14fcbd23218d903
--- /dev/null
+++ b/application/modules/opac/views/scripts/rss/afficherrss.phtml
@@ -0,0 +1,23 @@
+<div>
+  <a href="#" onclick="closeRSSDiv('<?php echo $this->rss->getId() ?>')">
+    <img src="<?php echo URL_ADMIN_IMG ?>fermer.gif"/>
+    <?php echo $this->_('Masquer le contenu du fil RSS') ?>
+  </a>
+
+  <div class="content">
+    <?php  foreach($this->rss->getFeedItems() as $item) {?>
+      <div>
+        <h2>
+          <?php echo $this->tagAnchor($item->link(),
+                                      $item->title(),
+                                      ['class' => 'popup',
+                                       'target' => '_blank']) ?>
+        </h2>
+        <span><?php echo $item->pubDate() ?></span>
+        <p>
+          <?php echo $item->description() ?>
+        </p>
+      </div>
+    <?php } ?>
+  </div>
+</div>
diff --git a/tests/application/modules/opac/controllers/RssControllerTest.php b/tests/application/modules/opac/controllers/RssControllerTest.php
index 38c57b3552147a6fa83de20eab84c899c7a23c06..8890fc05a70ff1f21ad94ca6ae8aa1bec799a9b2 100644
--- a/tests/application/modules/opac/controllers/RssControllerTest.php
+++ b/tests/application/modules/opac/controllers/RssControllerTest.php
@@ -22,45 +22,88 @@ require_once 'AbstractControllerTestCase.php';
 
 class MockZendHttpClient extends Zend_Http_Client {
   public function request($method = null) {
-    return new Zend_Http_Response(200, array(), RssFixtures::lemondeRSS());
+    return new Zend_Http_Response(200, [], RssFixtures::lemondeRSS());
   }
 }
 
 
+abstract class RssControllerTestCase extends AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true;
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->fixture('Class_Rss',
+                   ['id' => 15,
+                    'id_cat' => 11,
+                    'id_notice' => 86546,
+                    'titre' => 'Le monde',
+                    'description' => 'A la Une',
+                    'url' => 'http://rss.lemonde.fr/c/205/f/3050/index.rss',
+                    'date_maj' => '2010-04-01 10:47:58']);
+
+    Class_HttpClientFactory::setInstance($this->mock()
+                                         ->whenCalled('newHttpClient')
+                                         ->answers(new MockZendHttpClient()));
+  }
+}
+
+
+
+
+class RssControllerAfficherRssTest extends RssControllerTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->dispatch('rss/afficherrss/id_rss/15');
+  }
+
+
+  /** @test */
+  public function rssPopupShouldContainsLinkToHideContent() {
+    $this->assertXPathContentContains('//div/a[@onclick="closeRSSDiv(\'15\')"]',
+                                      'Masquer le contenu');
+  }
+
 
+  /** @test */
+  public function rssPopupShouldContainsBlogDelinquance() {
+    $this->assertXPathContentContains('//h2/a',
+                                      utf8_encode('Blog - Délinquance des mineurs : le septième rapport en sept ans'));
+  }
+}
 
-class RssControllerViewRawRssTest extends AbstractControllerTestCase {
+
+
+
+class RssControllerAfficherRssErrorsTest extends RssControllerTestCase {
+  /** @test */
+  public function withInexistingRssShouldAnswerEmptyResponse() {
+    $this->dispatch('rss/afficherrss/id_rss/666');
+    $this->assertEquals('', $this->_response->getBody());
+
+  }
+}
+
+
+
+
+class RssControllerViewRawRssTest extends RssControllerTestCase {
   public function setUp() {
     parent::setUp();
 
-    Class_Rss::getLoader()
-      ->newInstanceWithId(15)
-      ->setIdCat(11)
-      ->setIdNotice(86546)
-      ->setTitre('Le monde')
-      ->setDescription('A la Une')
-      ->setUrl('http://rss.lemonde.fr/c/205/f/3050/index.rss')
-      ->setDateMaj('2010-04-01 10:47:58');
-
-    $preferences = array(
-                         'boite'        => '',
-                         'titre'        => 'Fils Rss',
-                         'type_aff'     => '1',
-                         'id_categorie' => '',
-                         'id_items'     => '15',
-                         'nb_aff'       => '2' );
+    $preferences = ['boite'        => '',
+                    'titre'        => 'Fils Rss',
+                    'type_aff'     => '1',
+                    'id_categorie' => '',
+                    'id_items'     => '15',
+                    'nb_aff'       => '2' ];
 
     Class_Profil::getLoader()
       ->newInstanceWithId(25)
-      ->setCfgAccueil(array(
-                            'modules' => array(
-                                               '1' => array(
-                                                            'division' => '1',
-                                                            'type_module' => 'RSS',
-                                                            'preferences' => $preferences))));
-
+      ->setCfgAccueil(['modules' => ['1' => [ 'division' => '1',
+                                             'type_module' => 'RSS',
+                                             'preferences' => $preferences]]]);
 
-    Class_HttpClientFactory::setInstance($this->mock()->whenCalled('newHttpClient')->answers(new MockZendHttpClient()));
     $this->dispatch('rss/view-raw-rss/id_rss/15/id_profil/25/id_module/1');
   }