diff --git a/application/modules/opac/views/scripts/abonne/reservations.phtml b/application/modules/opac/views/scripts/abonne/reservations.phtml
index a967f64c68f860eaac1d1908d8ac6751bd758fc0..340ad8dc0b167723ef660ddcffa0962a943b4acb 100644
--- a/application/modules/opac/views/scripts/abonne/reservations.phtml
+++ b/application/modules/opac/views/scripts/abonne/reservations.phtml
@@ -1,65 +1,12 @@
 <?php $this->openBoite($this->_('Réservations en cours'));?>
+<div class="abonneTitre"> <?php echo $this->user->getNomAff();?></div>
+<?php
 
-<div class="abonneTitre">
-  <?php echo $this->escape($this->user->getNomAff());?>
-</div>
+echo $this->abonne_ReservationsTable($this->user->getReservations(), $this->fiche);
 
-<table width="100%" class="tablesorter">
-  <thead>
-  <tr>
-    <th style="text-align:left;white-space:nowrap"><?php echo $this->_('n°');?></th>
-    <th style="text-align:left"><?php echo $this->_('Titre');?></th>
-    <th style="text-align:left"><?php echo $this->_('Auteur');?></th>
-    <th style="text-align:left"><?php echo $this->_('Bibliothèque');?></th>
-    <th style="text-align:left"><?php echo $this->_('Etat');?></th>
-    <th style="text-align:center"><?php echo $this->_('Rang');?></th>
-    <th style="text-align:center;width:20px"><?php echo $this->_('Suppr.');?></th>
-  </tr>
-  </thead>
-  <tbody>
-  <?php if ($this->fiche["message"]) { ?>
-  <tr>
-    <td colspan="6"><p class="error"><?php echo $this->fiche["message"];?></p></td>
-  </tr>
-  <?php } ?>
-  <?php if ($this->fiche["erreur"]) { ?>
-  <tr>
-    <td colspan="6"><p class="error"><?php echo $this->fiche["erreur"];?></p></td>
-  </tr>
-  <?php } ?>
-  <?php
-    $resas = $this->user->getReservations();
-    $num=1;
-    foreach($resas as $resa)  { ?>
-    <tr>
-      <td width="15px" align="center"><b><?php echo $num++;?></b></td>
-      <td>
-            <?php echo $this->tagAnchor(
-                    $this->url(['controller' => 'recherche',
-                                'action' => 'viewnotice',
-                                'id' => $resa->getNoticeOPACId(),
-                                'retour_abonne' => 'reservations'],
-                               null, true),
-                    $resa->getTitre());?>
-      </td>
-      <td><?php echo $this->escape(strip_tags($resa->getAuteur()));?></td>
-      <td><?php echo $this->escape($resa->getBibliotheque());?></td>
-      <td style="text-align:left"><?php echo $this->escape($resa->getEtat());?></td>
-      <td style="text-align:center"><?php echo $this->escape($resa->getRang());?></td>
-      <td style="text-align:center">
-        <?php echo $this->tagAnchor(
-                $this->url(['id_delete' => $resa->getId()]),
-                $this->tagImg(URL_IMG . 'bouton/cancel.gif',
-                              ['onclick' => 'return confirm(\''. str_replace("'", "\\'", $this->_('Etes vous sûr de vouloir supprimer cette réservation ?')) . '\')',
-                               'title'    => $this->_('Supprimer cette réservation')]));
-        ?>
-      </td>
-      </tr>
-  <?php } ?>
-  </tbody>
-</table>
+echo $this->tag('h2', $this->_('Réservation de consultation sur place'));
+echo $this->abonne_ReservationsTable($this->user->getReservations(), $this->fiche);
 
-<?php $this->closeBoite();?>
-<?php echo $this->abonne_RetourFiche(); ?>
-<br/>
-<br/>
+$this->closeBoite();
+echo $this->abonne_RetourFiche();
+?>
diff --git a/library/ZendAfi/View/Helper/Abonne/ReservationsTable.php b/library/ZendAfi/View/Helper/Abonne/ReservationsTable.php
new file mode 100644
index 0000000000000000000000000000000000000000..4376cb2348b68c8c75372bc9ab82b0c2e672abcb
--- /dev/null
+++ b/library/ZendAfi/View/Helper/Abonne/ReservationsTable.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class ZendAfi_View_Helper_Abonne_ReservationsTable extends ZendAfi_View_Helper_BaseHelper {
+  protected $_line_no;
+
+  public function abonne_ReservationsTable($reservations, $fiche) {
+    Class_ScriptLoader::getInstance()->loadTableSorter();
+    return $this->_tag('table',
+                       $this->_renderHeader() . $this->_renderReservations($reservations, $fiche),
+                       ['class' => 'tablesorter reservations']);
+  }
+
+
+  protected function _renderHeader() {
+    $headers = array_map(
+                         function($title) {
+                           return $this->_tag('th', $title);
+                         },
+
+                         [$this->_('n°'),
+                          $this->_('Titre'),
+                          $this->_('Auteur'),
+                          $this->_('Bibliothèque'),
+                          $this->_('État'),
+                          $this->_('Rang'),
+                          $this->_('Suppr.')]);
+
+    return $this->_tag('thead',
+                       $this->_tag('tr',
+                                   implode('', $headers)));
+  }
+
+
+  protected function _renderReservations($reservations, $fiche) {
+    $html = '';
+    $html .= (isset($fiche['message']) && $fiche['message'] ? $this->_renderError($fiche['message']) : '');
+    $html .= (isset($fiche['erreur']) && $fiche['erreur'] ? $this->_renderError($fiche['erreur']) : '');
+
+    $this->_line_no = 1;
+    foreach($reservations as $reservation)
+      $html .= $this->_renderReservation($reservation);
+
+    return $this->_tag('tbody', $html);
+  }
+
+
+  protected function _renderReservation($reservation) {
+    $notice_url = $reservation->getTitre();
+
+    if ($reservation->getNoticeOPACId())
+      $notice_url = $this->view->tagAnchor($this->view->url(
+                                                            ['controller' => 'recherche',
+                                                             'action' => 'viewnotice',
+                                                             'id' => $reservation->getNoticeOPACId(),
+                                                             'retour_abonne' => 'reservations'],
+                                                            null, true),
+                                           $reservation->getTitre());
+
+    $cancel_url = $this->view->tagAnchor($this->view->url(['id_delete' => $reservation->getId()]),
+                                         $this->view->tagImg(URL_IMG . 'bouton/cancel.gif',
+                                                             ['onclick' => 'return confirm(\''. str_replace("'", "\\'", $this->_('Etes vous sûr de vouloir supprimer cette réservation ?')) . '\')',
+                                                              'title'    => $this->_('Supprimer cette réservation')]));
+
+    return
+      $this->_tag('tr',
+                  $this->_tag('td',
+                              $this->_line_no++)
+                  . $this->_tag('td',
+                                $notice_url)
+                  . $this->_tag('td',
+                                strip_tags($reservation->getAuteur()))
+                  . $this->_tag('td',
+                                $reservation->getBibliotheque())
+                  . $this->_tag('td',
+                                $reservation->getEtat())
+                  . $this->_tag('td',
+                                $reservation->getRang())
+                  . $this->_tag('td',
+                                $cancel_url));
+  }
+
+
+  protected function _renderError($content) {
+    return $this->_tag('tr',
+                       $this->_tag('td',
+                                   $this->_tag('p', $content, ['class' => 'error']),
+                                   ['colspan' => '6']));
+  }
+}
+?>
\ No newline at end of file
diff --git a/public/opac/css/global.css b/public/opac/css/global.css
index 960b40298a1e7e304246647a67dc26614713485c..f2f3f6a65b614328314ef470598d0d8f82183089 100644
--- a/public/opac/css/global.css
+++ b/public/opac/css/global.css
@@ -671,6 +671,44 @@ table.loans-history td:first-child {
     text-align: center;
 }
 
+/* reservations in patron screen */
+table.reservations {
+    margin-bottom: 30px;
+    width: 100%;
+}
+
+table.reservations th {
+    text-align:left;
+}
+
+table.reservations th:first-child {
+    white-space: nowrap;
+}
+
+table.reservations th:last-child {
+    width: 20px;
+}
+
+table.reservations th:nth-child(6),
+table.reservations th:nth-child(7) {
+    text-align: center;
+}
+
+table.reservations td:first-child {
+    width: 15px;
+    font-weight: bold;
+    text-align: center;
+}
+
+table.reservations td:nth-child(5) {
+    text-align: left;
+}
+
+table.reservations td:nth-child(6),
+table.reservations td:nth-child(7) {
+    text-align: center;
+}
+
 /* Formulaires */
 .zend_form {
     background-color:#F0F0F0;
diff --git a/tests/library/Class/WebService/SIGB/VSmartTest.php b/tests/library/Class/WebService/SIGB/VSmartTest.php
index 0e9b6793af5126c15f2231549734d4a94ddbdfff..cb733ab77854d7447601dfd502b9aac2f414d0d9 100644
--- a/tests/library/Class/WebService/SIGB/VSmartTest.php
+++ b/tests/library/Class/WebService/SIGB/VSmartTest.php
@@ -811,13 +811,13 @@ class VSmartServiceSuccessPlaceRequestTest extends  VSmartServiceTestCase {
 
   /** @test */
   public function getResultShouldReturnTrue() {
-    $this->assertEquals(1, $this->consultation->getResult());
+    $this->assertEquals(1, $this->consultation['statut']);
   }
 
 
   /** @test */
   public function getResultReasonShouldReturnEmpty() {
-    $this->assertEquals('', $this->consultation->getResultReason());
+    $this->assertEquals('', $this->consultation['erreur']);
   }
 }
 
@@ -841,14 +841,14 @@ class VSmartServiceFailPlaceRequestTest extends  VSmartServiceTestCase {
 
   /** @test */
   public function getResultShouldReturnFalse() {
-    $this->assertEquals(0,$this->consultation->getResult());
+    $this->assertEquals(0,$this->consultation['statut']);
   }
 
 
   /** @test */
   public function getErrorShouldReturnTooMuchDemand() {
     $this->assertEquals('Vous avez trop de demandes et n\'êtes pas autorisé à en créer de nouvelles',
-                        $this->consultation->getResultReason());
+                        $this->consultation['erreur']);
   }
 }
 
diff --git a/tests/library/ZendAfi/View/Helper/Abonne/ReservationsTableTest.php b/tests/library/ZendAfi/View/Helper/Abonne/ReservationsTableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2da48e2f9b3c0b8b2b6bc569b739dcaf18864ccb
--- /dev/null
+++ b/tests/library/ZendAfi/View/Helper/Abonne/ReservationsTableTest.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Copyright (c) 2012-2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with BOKEH; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+class ReservationsTableTest extends ViewHelperTestCase {
+  protected $_html;
+
+  public function setUp() {
+    parent::setUp();
+
+    $harry_potter = new Class_WebService_SIGB_Reservation('10', new Class_WebService_SIGB_Exemplaire(100));
+    $harry_potter->getExemplaire()
+                 ->setTitre('Harry Potter')
+                 ->setNoticeOPAC(Class_Notice::newInstanceWithId(100));
+    $harry_potter->setEtat('Pas disponible');
+
+
+    $le_marche = new Class_WebService_SIGB_Reservation('12', new Class_WebService_SIGB_Exemplaire(120));
+    $le_marche->getExemplaire()
+              ->setTitre('Le marché couvert')
+              ->setNoticeOPAC(Class_Notice::newInstanceWithId(120));
+    $le_marche->setEtat('Disponible');
+
+    $emprunteur = new Class_WebService_SIGB_Emprunteur('1234', 'Estelle');
+    $user = Class_Users::newInstanceWithId('123456', ['nom' => 'Estelle'])
+      ->setFicheSigb(['fiche' => $emprunteur]);
+    ZendAfi_Auth::getInstance()->logUser($user);
+    $emprunteur->reservationsAddAll([$harry_potter, $le_marche]);
+
+    $helper = new ZendAfi_View_Helper_Abonne_ReservationsTable();
+    $helper->setView(new ZendAfi_Controller_Action_Helper_View());
+
+    $this->_html = $helper->abonne_ReservationsTable($emprunteur->getReservations(), $user->getFicheSigb());
+
+  }
+
+
+  /** @test */
+  public function TitleShouldBeHarryPotter() {
+    $this->assertXPathContentContains($this->_html, '//td', 'Harry Potter');
+  }
+
+
+  /** @test */
+  public function HarryPotterTitleShouldBeLinkToNotice() {
+    $this->assertXPathContentContains($this->_html, '//td/a[contains(@href, "recherche/viewnotice/id/100/retour_abonne/reservations")]', 'Harry Potter');
+  }
+}
+?>
\ No newline at end of file