diff --git a/FEATURES/65265 b/FEATURES/65265
new file mode 100644
index 0000000000000000000000000000000000000000..f8a1fc229c9b97737359e017b973de0886ae8723
--- /dev/null
+++ b/FEATURES/65265
@@ -0,0 +1,10 @@
+        '65265' =>
+            ['Label' => $this->_('Historique des modifications des articles en Front'),
+             'Desc' => $this->_('Vous pouvez accéder à l\'historique des modifications d\'un article directement à partir des boites article ou calendrier'),
+             'Image' => '',
+             'Video' => '',
+             'Category' => $this->_('Administration'),
+             'Right' => function($feature_description, $user) {return $user->canAccessBackend();},
+             'Wiki' => 'http://wiki.bokeh-library-portal.org/index.php?title=Articles_-_Cr%C3%A9er,_r%C3%A9diger_et_ordonner#Historique_des_versions',
+             'Test' => '',
+             'Date' => '2017-10-02'],
\ No newline at end of file
diff --git a/VERSIONS_WIP/65265 b/VERSIONS_WIP/65265
new file mode 100644
index 0000000000000000000000000000000000000000..65ae088477e3000451433034e9d683c3d91e368c
--- /dev/null
+++ b/VERSIONS_WIP/65265
@@ -0,0 +1 @@
+ - ticket #65265 : Administration : Vous pouvez accéder à l'historique des modifications d'un article directement à partir des boites article ou calendrier en front
\ No newline at end of file
diff --git a/application/modules/admin/views/scripts/cms/versions.phtml b/application/modules/admin/views/scripts/cms/versions.phtml
index 1c336082db3f96eb0aec5be754f8dbd70cbb83ad..be1ca7c16628f52110513d2ac07f6b9ab79ffafb 100644
--- a/application/modules/admin/views/scripts/cms/versions.phtml
+++ b/application/modules/admin/views/scripts/cms/versions.phtml
@@ -1,29 +1,7 @@
 <?php
-$date_formater = function($model, $attrib) {
-  return strftime($this->_('%d %B %Y à %Hh %Mmn %Ss'), $model->get($attrib));
-};
+echo $this
+  ->versions($this->versions,
+             '/admin/cms/version/id/' . $this->model->getId() . '/key/%s',
+             '/admin/cms/version-delete/id/' . $this->model->getId() . '/key/%s');
 
-
-$user_formater = function($model, $attrib) {
-  return ($user = $model->get($attrib)) ? $user->getNomAff() : $this->_('Inconnu');
-};
-
-
-$actions = [['url' => '/admin/cms/version/id/'. $this->article->getId()  .'/key/%s',
-             'icon' => 'view',
-             'label' => $this->_('Voir')],
-            ['url' => '/admin/cms/version-delete/id/'. $this->article->getId()  .'/key/%s',
-             'icon' => 'delete',
-             'label' => $this->_('Supprimer'),
-             'anchorOptions' => ['onclick' => "return confirm('" . htmlspecialchars($this->_('Êtes-vous sur de vouloir supprimer cette version de l\\\'historique ?')) .  "')"]]];
-
-
-echo $this->tagModelTable($this->versions,
-                          [$this->_('Date'), $this->_('Auteur')],
-                          ['Date', 'User'],
-                          [function($model) use($actions)
-                           { return $this->renderModelActions($model, $actions); }],
-                          'versions',
-                          null,
-                          ['Date' => $date_formater,
-                           'User' => $user_formater]);
+echo $this->Button_Back();
diff --git a/application/modules/admin/views/scripts/modo/articlesformulaires.phtml b/application/modules/admin/views/scripts/modo/articlesformulaires.phtml
index fdffc6662a9346e3ba0b86907063970320336241..6339ef59ab3526e1fd6a1743ea3e82dd33c715ff 100644
--- a/application/modules/admin/views/scripts/modo/articlesformulaires.phtml
+++ b/application/modules/admin/views/scripts/modo/articlesformulaires.phtml
@@ -1,17 +1,23 @@
 <?php
-echo '<ul>';
+$items = [];
+$editArticleHelper = $this->getHelper('tagEditArticle');
 foreach ($this->articles as $article) {
-  echo sprintf('<li><a href="%s">%s [%d/%d]</a>%s</li>',
-               $this->url(['module' => 'admin',
-                           'controller' => 'modo',
-                           'action' => 'formulaires',
-                           'id_article' => $article->getId()],
-                          null,
-                          true),
-               $article->getTitre(),
-               $article->numberOfFormulairesToValidate(),
-               $article->numberOfFormulaires(),
-               $this->tagEditArticle($article));
+  $modo_url = $this->url(['module' => 'admin',
+                          'controller' => 'modo',
+                          'action' => 'formulaires',
+                          'id_article' => $article->getId()],
+                         null, true);
+  $modo_label = sprintf('%s [%d/%d]',
+                        $article->getTitre(),
+                        $article->numberOfFormulairesToValidate(),
+                        $article->numberOfFormulaires());
+
+  $items[] = $this
+    ->tag('li',
+          $this->tag('a', $modo_label,
+                     ['href' => $modo_url])
+          . $editArticleHelper->renderEdit($article)
+    );
 }
-echo '</ul>';
-?>
\ No newline at end of file
+
+echo $this->tag('ul', implode('', $items));
diff --git a/application/modules/admin/views/scripts/widget/versions.phtml b/application/modules/admin/views/scripts/widget/versions.phtml
index cfdbc95c3c0f423325e7200b75aa365a5dbccc1d..6c307562f105bd3a9ab802ef89d40ad0ea9183a8 100644
--- a/application/modules/admin/views/scripts/widget/versions.phtml
+++ b/application/modules/admin/views/scripts/widget/versions.phtml
@@ -1,44 +1,9 @@
 <?php
-$date_formater = function($model, $attrib) {
-  return strftime($this->_('%d %B %Y à %Hh %Mmn %Ss'), $model->get($attrib));
-};
+echo $this
+  ->versions($this->versions,
+             '/admin/widget/version/id_profil/' . $this->model->getProfileId() . '/id/' . $this->model->getId() . '/key/%s',
+             '/admin/widget/version-delete/id_profil/' . $this->model->getProfileId() . '/id/' . $this->model->getId() . '/key/%s'
+  );
 
-$user_formater = function($model, $attrib) {
-  return ($user = $model->get($attrib)) ? $user->getNomAff() : $this->_('Inconnu');
-};
-
-$details = ['url' => '/admin/widget/version/id_profil/' . $this->widget->getProfileId() . '/id/'. $this->widget->getId() .'/key/%s',
-            'icon' => 'view',
-            'label' => $this->_('Voir')];
-
-if ($this->isPopup()) {
-  $details['url'] .= '/render/popup';
-  $details['anchorOptions'] = ['onclick' => 'opacDialogFromUrl(this.href); return false;'];
-}
-
-$confirm = $this->_('Êtes-vous sur de vouloir supprimer cette version de l\\\'historique ?');
-
-$delete = ['url' => '/admin/widget/version-delete/id_profil/'. $this->widget->getProfileId() .'/id/'. $this->widget->getId() .'/key/%s',
-           'icon' => 'delete',
-           'label' => $this->_('Supprimer'),
-           'anchorOptions' => ['onclick' => "return confirm('" . htmlspecialchars($confirm) .  "')"]];
-
-if ($this->isPopup()) {
-  $delete['url'] .= '/render/popup';
-  $delete['anchorOptions'] = ['onclick' => sprintf("if (confirm('%s')) { opacDialogFromUrl(this.href); }; return false;",
-                                                   htmlspecialchars($confirm))];
-}
-
-$actions = [$details, $delete];
-
-echo $this->tagModelTable($this->versions,
-                          [$this->_('Date'), $this->_('Auteur')],
-                          ['Date', 'User'],
-                          [function($model) use($actions)
-                           { return $this->renderModelActions($model, $actions); }],
-                          'versions',
-                          null,
-                          ['Date' => $date_formater,
-                           'User' => $user_formater]);
 
 echo $this->Button_Back();
diff --git a/library/ZendAfi/Controller/Plugin/Versionning/Abstract.php b/library/ZendAfi/Controller/Plugin/Versionning/Abstract.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ad1408c7f704a8c11f7e0ca77dcbc5eecf87f98
--- /dev/null
+++ b/library/ZendAfi/Controller/Plugin/Versionning/Abstract.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, 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
+ */
+
+
+abstract class ZendAfi_Controller_Plugin_Versionning_Abstract
+  extends ZendAfi_Controller_Plugin_Abstract {
+
+  public function visitGetForm($closure) {
+    $this->_get_form_closure = $closure;
+    return $this;
+  }
+
+
+  public function versionsAction() {
+    if (!$model = $this->_loadModel())
+      return $this->_redirectCloseReferer();
+
+    if (!$versions = $this->_versionsFor($model)->findAll())
+      return $this->_handleNoVersion($model);
+
+    $this->_view->titre = $this->_('Versions de : "%s"', $this->_modelLabel($model));
+    $this->_view->versions = $versions;
+    $this->_view->model = $model;
+  }
+
+
+  public function versionAction() {
+    if (!$model = $this->_loadModel())
+      return $this->_redirectCloseReferer();
+
+    if (!$key = $this->_getParam('key'))
+      $key = $this->_versionsFor($model)->findLastKey();
+
+    if (!$version = $this->_versionsFor($model)->find($key))
+      return $this->_handleNoVersion($model);
+
+    $this->_view->titre = $this->_('Version de : "%s"', $this->_modelLabel($model));
+    $this->_view->version = $version;
+    $form = call_user_func($this->_get_form_closure, $model);
+    $form->beVersionCompare($version->getData());
+
+    $this->_view->form = $form;
+  }
+
+
+  public function versionApplyAction() {
+    if (!$model = $this->_loadModel())
+      return $this->_redirectCloseReferer();
+
+    if (!$version = $this->_versionsFor($model)->find($this->_getParam('key')))
+      return $this->_notifyToReferer($this->_('Version introuvable'));
+
+    $version->injectIn($this->_request);
+    $this->_forwardToEdit($model);
+  }
+
+
+  public function versionDeleteAction() {
+    if (!$model = $this->_loadModel())
+      return $this->_redirectCloseReferer();
+
+    if (!$version = $this->_versionsFor($model)->find($this->_getParam('key')))
+      return $this->_notifyToReferer($this->_('Version introuvable'));
+
+    $version->delete();
+    $this->_notify($this->_('Version supprimée'));
+
+    $this->_view->isPopup()
+      ? $this->_redirectCloseReferer()
+      : $this->_redirect($this->_versionUrl($model));
+  }
+
+
+  public function notifyAfterDelete($model) {
+    $this->_versionsFor($model)->clear();
+  }
+
+
+  public function notifyAfterSave($model) {
+    $this->_versionsFor($model)
+         ->newInstance()
+         ->setData($this->_getPost())
+         ->save();
+  }
+
+
+  protected function _handleNoVersion($model) {
+    $this->_notify($this->_('Aucune version dans l\'historique'));
+    return $this->_view->isPopup()
+      ? $this->_redirectCloseReferer()
+      : $this->_redirect($this->_editUrl($model));
+  }
+
+
+  protected function _notifyToReferer($message) {
+    $this->_notify($message);
+    $this->_redirectCloseReferer();
+  }
+
+
+  protected function _redirectCloseReferer() {
+    $this->_redirectClose($this->_getReferer());
+  }
+
+
+  protected function _notify($message) {
+    $this->_helper->notify($message);
+  }
+
+
+  abstract protected function _loadModel();
+
+  abstract protected function _modelLabel($model);
+
+  abstract protected function _versionsFor($model);
+
+  abstract protected function _forwardToEdit($model);
+
+  abstract protected function _versionUrl($model);
+
+  abstract protected function _editUrl($model);
+}
diff --git a/library/ZendAfi/Controller/Plugin/Versionning/Article.php b/library/ZendAfi/Controller/Plugin/Versionning/Article.php
index 7fed31379f39b51979662f4e3d216c98e0e65e83..b83e82709c0c3e268d12f8c0056a59e0ac4880c1 100644
--- a/library/ZendAfi/Controller/Plugin/Versionning/Article.php
+++ b/library/ZendAfi/Controller/Plugin/Versionning/Article.php
@@ -21,7 +21,7 @@
 
 
 class ZendAfi_Controller_Plugin_Versionning_Article
-  extends ZendAfi_Controller_Plugin_Abstract {
+  extends ZendAfi_Controller_Plugin_Versionning_Abstract {
 
   public function getActions($model) {
     if ('Class_Article' != get_class($model))
@@ -55,115 +55,32 @@ class ZendAfi_Controller_Plugin_Versionning_Article
   }
 
 
-  public function visitGetForm($closure) {
-    $this->_get_form_closure = $closure;
-    return $this;
+  protected function _loadModel() {
+    return Class_Article::find((int)$this->_getParam('id'));
   }
 
 
-  public function versionsAction() {
-    if (!$article = Class_Article::find((int)$this->_getParam('id'))) {
-      $this->_redirectToIndex();
-      return;
-    }
-
-    $this->_view->titre = $this->_('Versions de l\'article : "%s"',
-                                   $article->getTitre());
-
-    if (!$versions = $this->_versionsFor($article)->findAll()) {
-      $this->_helper->notify($this->_('Aucune version dans l\'historique'));
-      $this->_redirect('admin/cms/edit/id/' . $article->getId());
-      return;
-    }
-
-    $this->_view->versions = $this->_versionsFor($article)->findAll();
-    $this->_view->article = $article;
+  protected function _modelLabel($model) {
+    return $model->getTitre();
   }
 
 
-  public function versionAction() {
-    if (!$article = Class_Article::find((int)$this->_getParam('id'))) {
-      $this->_redirectToIndex();
-      return;
-    }
-
-    if (!$key = $this->_getParam('key'))
-      $key = $this->_versionsFor($article)->findLastKey();
-
-    if (!$version = $this->_versionsFor($article)->find($key)) {
-      $this->_helper->notify($this->_('Aucune version dans l\'historique'));
-      $this->_redirectToEdit($article);
-      return;
-    }
-
-    $this->_view->titre = $this->_('Version de l\'article : "%s"',
-                                   $article->getTitre());
-
-    $this->_view->version = $version;
-    $form = call_user_func($this->_get_form_closure, $article);
-    $form->setAttrib('data-backurl', $this->_view->url(['action' => 'edit',
-                                                        'key' => null]))
-         ->beVersionCompare($version->getData());
-
-    $this->_view->form = $form;
-  }
-
-
-  public function versionApplyAction() {
-    if (!$article = Class_Article::find((int)$this->_getParam('id'))) {
-      $this->_redirectToIndex();
-      return;
-    }
-
-    if (!$version = $this->_versionsFor($article)->find($this->_getParam('key'))) {
-      $this->_helper->notify($this->_view->_('Version introuvable'));
-      $this->_redirectToEdit($article);
-      return;
-    }
-
-    $version->injectIn($this->_request);
-    $this->_forward('edit', 'cms', 'admin', ['id' => $article->getId()]);
-  }
-
-
-  public function versionDeleteAction() {
-    if (!$article = Class_Article::find((int)$this->_getParam('id'))) {
-      $this->_redirectToIndex();
-      return;
-    }
-
-    if (!$version = $this->_versionsFor($article)->find($this->_getParam('key'))) {
-      $this->_helper->notify($this->_view->_('Version introuvable'));
-      $this->_redirectToEdit($article);
-      return;
-    }
-
-    $version->delete();
-    $this->_helper->notify($this->_view->_('Version supprimée'));
-    $this->_redirect('admin/cms/version/id/' . $article->getId());
-  }
-
-
-  public function notifyAfterSave($model) {
-    $this->_versionsFor($model)
-         ->newInstance()
-         ->setData($this->_getPost())
-         ->save();
+  protected function _versionsFor($model) {
+    return Class_Versions::forArticle($model);
   }
 
 
-  public function notifyAfterDelete($model) {
-    $this->_versionsFor($model)
-         ->clear();
+  protected function _forwardToEdit($model) {
+    $this->_forward('edit', 'cms', 'admin', ['id' => $model->getId()]);
   }
 
 
-  protected function _redirectToEdit($article) {
-    $this->_redirect('admin/cms/edit/id/' . $article->getId());
+  protected function _versionUrl($model) {
+    return '/admin/cms/version/id/' . $model->getId();
   }
 
 
-  protected function _versionsFor($model) {
-    return Class_Versions::forArticle($model);
+  protected function _editUrl($model) {
+    return '/admin/cms/edit/id/' . $model->getId();
   }
 }
diff --git a/library/ZendAfi/Controller/Plugin/Versionning/Widget.php b/library/ZendAfi/Controller/Plugin/Versionning/Widget.php
index 62c3aed9ca6fb18dabb000da00fb33a1c93010be..1d137e16063b9a22085f20c013927a7518cdb917 100644
--- a/library/ZendAfi/Controller/Plugin/Versionning/Widget.php
+++ b/library/ZendAfi/Controller/Plugin/Versionning/Widget.php
@@ -21,115 +21,56 @@
 
 
 class ZendAfi_Controller_Plugin_Versionning_Widget
-  extends ZendAfi_Controller_Plugin_Abstract {
+  extends ZendAfi_Controller_Plugin_Versionning_Abstract {
 
-  public function visitGetForm($closure) {
-    $this->_get_form_closure = $closure;
-    return $this;
-  }
-
-
-  public function versionsAction() {
-    if (!$widget = $this->_loadWidget()) {
-      $this->_redirectClose($this->_getReferer());
-      return;
-    }
-
-    $this->_view->titre = $this->_('Versions de : "%s"',
-                                   $widget->getTitle());
-
-    if (!$versions = $this->_versionsFor($widget)->findAll()) {
-      $this->_helper->notify($this->_('Aucune version dans l\'historique'));
-      $this->_redirectClose($this->_getReferer());
+  public function notifyAfterSave($model) {
+    if (!$model->shouldVersion())
       return;
-    }
 
-    $this->_view->versions = $versions;
-    $this->_view->widget = $widget;
+    $this->_versionsFor($model)
+         ->newInstance()
+         ->setData($model->getNewDatas())
+         ->save();
   }
 
 
-  public function versionAction() {
-    if (!$widget = $this->_loadWidget())
-      return $this->_redirectClose($this->_getReferer());
-
-    if (!$key = $this->_getParam('key'))
-      $key = $this->_versionsFor($widget)->findLastKey();
-
-    if (!$version = $this->_versionsFor($widget)->find($key)) {
-      $this->_helper->notify($this->_('Aucune version dans l\'historique'));
-      return $this->_redirectClose($this->_getReferer());
-    }
-
-    $this->_view->titre = $this->_('Version de : "%s"', $widget->getTitle());
-
-    $this->_view->version = $version;
-    $form = call_user_func($this->_get_form_closure, $widget);
-    $form->beVersionCompare($version->getData());
+  public function notifyAfterDelete($model) {
+    if (!$model->shouldVersion())
+      return;
 
-    $this->_view->form = $form;
+    parent::notifyAfterDelete($model);
   }
 
 
-  public function versionApplyAction() {
-    if (!$widget = $this->_loadWidget())
-      return $this->_redirectClose($this->_getReferer());
-
-    if (!$version = $this->_versionsFor($widget)->find($this->_getParam('key'))) {
-      $this->_helper->notify($this->_view->_('Version introuvable'));
-      return $this->_redirectClose($this->_getReferer());
-    }
-
-    $version->injectIn($this->_request);
-    $this->_forward('edit-widget', 'widget', 'admin');
+  protected function _loadModel() {
+    return (new Class_Systeme_Widget_Widget())
+      ->setId($this->_getParam('id'))
+      ->setProfileId($this->_getParam('id_profil'))
+      ->load();
   }
 
 
-  public function versionDeleteAction() {
-    if (!$widget = $this->_loadWidget())
-      return $this->_redirectClose($this->_getReferer());
-
-    if (!$version = $this->_versionsFor($widget)->find($this->_getParam('key'))) {
-      $this->_helper->notify($this->_view->_('Version introuvable'));
-      return $this->_redirectClose($this->_getReferer());
-    }
-
-    $version->delete();
-
-    $this->_helper->notify($this->_view->_('Version supprimée'));
-    $this->_redirectClose($this->_getReferer());
+  protected function _modelLabel($model) {
+    return $model->getTitle();
   }
 
 
-  public function notifyAfterSave($model) {
-    if (!$model->shouldVersion())
-      return;
-
-    $this->_versionsFor($model)
-         ->newInstance()
-         ->setData($model->getNewDatas())
-         ->save();
+  protected function _versionsFor($model) {
+    return Class_Versions::forWidget($model);
   }
 
 
-  public function notifyAfterDelete($model) {
-    if (!$model->shouldVersion())
-      return;
-
-    $this->_versionsFor($model)
-         ->clear();
+  protected function _forwardToEdit($model) {
+    $this->_forward('edit-widget', 'widget', 'admin');
   }
 
 
-  protected function _versionsFor($model) {
-    return Class_Versions::forWidget($model);
+  protected function _versionUrl($model) {
+    return '';
   }
 
 
-  protected function _loadWidget() {
-    return (new Class_Systeme_Widget_Widget())
-      ->setId($this->_getParam('id'))
-      ->setProfileId($this->_getParam('id_profil'))
-      ->load();
+  protected function _editUrl($model) {
+    return '';
   }
 }
diff --git a/library/ZendAfi/View/Helper/Admin/Versions.php b/library/ZendAfi/View/Helper/Admin/Versions.php
new file mode 100644
index 0000000000000000000000000000000000000000..74fb43c2d345487729ab849c9f763c9d3ee90b95
--- /dev/null
+++ b/library/ZendAfi/View/Helper/Admin/Versions.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Copyright (c) 2012-2017, 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_Admin_Versions extends ZendAfi_View_Helper_BaseHelper {
+  protected
+    $_view_url,
+    $_delete_url;
+
+  public function versions($versions, $view_url, $delete_url) {
+    $this->_view_url = $view_url;
+    $this->_delete_url = $delete_url;
+
+    $description = (new Class_TableDescription('versions'))
+      ->addColumn($this->_('Date'), ['attribute' => 'Date',
+                                     'callback' => [$this, 'dateFormat']])
+
+      ->addColumn($this->_('Auteur'), ['attribute' => 'User',
+                                       'callback' => [$this, 'userFormat']])
+
+      ->addRowAction(function($model)
+                     {
+                       return $this->view->renderModelActions($model, $this->actions());
+                     })
+      ;
+
+    return $this->view->renderTable($description, $versions, ['sorter' => true]);
+  }
+
+
+  public function dateFormat($model, $attrib) {
+    return strftime($this->_('%d %B %Y à %Hh %Mmn %Ss'), $model->get($attrib));
+  }
+
+
+  public function userFormat($model, $attrib) {
+    return ($user = $model->get($attrib)) ? $user->getNomAff() : $this->_('Inconnu');
+  }
+
+
+  public function actions() {
+    return [ $this->detailAction(), $this->deleteAction() ];
+  }
+
+
+  public function detailAction() {
+    $action = ['url' => $this->_view_url,
+               'icon' => 'view',
+               'label' => $this->_('Voir')];
+
+    if (!$this->view->isPopup())
+      return $action;
+
+    $action['url'] .= '/render/popup';
+    $action['anchorOptions'] = ['onclick' => 'opacDialogFromUrl(this.href); return false;'];
+
+    return $action;
+  }
+
+
+  public function deleteAction() {
+    $message = htmlspecialchars($this->_('Êtes-vous sur de vouloir supprimer cette version de l\\\'historique ?'));
+
+    $action = ['url' => $this->_delete_url,
+               'icon' => 'delete',
+               'label' => $this->_('Supprimer'),
+               'anchorOptions' => ['onclick' => "return confirm('" . $message .  "')"]];
+
+    if (!$this->view->isPopup())
+      return $action;
+
+    $action['url'] .= '/render/popup';
+    $action['anchorOptions']  = ['onclick' => sprintf("if (confirm('%s')) { opacDialogClose(); opacDialogFromUrl(this.href); }; return false;",
+                                                      $message)];
+
+    return $action;
+  }
+}
diff --git a/library/ZendAfi/View/Helper/Article/RenderAbstract.php b/library/ZendAfi/View/Helper/Article/RenderAbstract.php
index 28adc8325d890ea497e97961757b702bb9342e23..e75025529e2a733d5569f6734f651b4b33da682e 100644
--- a/library/ZendAfi/View/Helper/Article/RenderAbstract.php
+++ b/library/ZendAfi/View/Helper/Article/RenderAbstract.php
@@ -18,30 +18,30 @@
  * along with BOKEH; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
-abstract class ZendAfi_View_Helper_Article_RenderAbstract extends ZendAfi_View_Helper_BaseHelper {
+abstract class ZendAfi_View_Helper_Article_RenderAbstract
+  extends ZendAfi_View_Helper_BaseHelper {
+
   public function renderArticle($article, $html_class = 'article') {
+    $content = '<!-- RSPEAK_START -->'
+      . $this->_tag('header',
+                    $this->view->tagEditArticle($article)
+                    . $this->renderReadSpeaker($article)
+                    . $this->renderTitreHeader($article)
+                    . $this->renderDraftStatus($article)
+                    . $this->renderArticleInfo($article)
+                    . $this->tagArticleEvent($article))
+      . $this->_tag('div', $this->renderContent($article),
+                    ['class' => 'article_content'])
+      . $this->_tag('footer',
+                    $this->renderLieu($article)
+                    .$this->renderReseauxSociaux($article)
+                    .$this->renderAvis($article))
+      . '<!-- RSPEAK_STOP -->';
+
     return
-      $this->renderArticleHTML(
-        '<article class="auto_resize '.$html_class.'"><!-- RSPEAK_START -->'
-        .'<header>'
-        .$this->view->tagEditArticle($article)
-        .$this->renderReadSpeaker($article)
-        .$this->renderTitreHeader($article)
-        .$this->renderDraftStatus($article)
-        .$this->renderArticleInfo($article)
-        .$this->tagArticleEvent($article)
-        .'</header>'
-        .'<div class="article_content">'
-        .$this->renderContent($article)
-        .'</div>'
-        .'<footer>'
-        .$this->renderLieu($article)
-        .$this->renderReseauxSociaux($article)
-        .$this->renderAvis($article)
-        .'</footer>'
-        .'<!-- RSPEAK_STOP --></article>',
-
-        $article);
+      $this->renderArticleHTML($this->_tag('article', $content,
+                                           ['class' => 'auto_resize '.$html_class]),
+                               $article);
   }
 
 
diff --git a/library/ZendAfi/View/Helper/TagEditArticle.php b/library/ZendAfi/View/Helper/TagEditArticle.php
index cbd088b44686fe2917ff73905704e92a3132009c..2f138af14d25379711654cafb9fad98c6b9b20bf 100644
--- a/library/ZendAfi/View/Helper/TagEditArticle.php
+++ b/library/ZendAfi/View/Helper/TagEditArticle.php
@@ -18,26 +18,72 @@
  * 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_TagEditArticle extends Zend_View_Helper_HtmlElement {
+class ZendAfi_View_Helper_TagEditArticle extends ZendAfi_View_Helper_BaseHelper {
+  protected
+    $_article,
+    $_current_skin;
+
+  public function __construct() {
+    parent::__construct();
+    $this->_current_skin = Class_Admin_Skin::current();
+  }
+
+
   /**
    * @param Class_Article $article
    * @return string
    */
   public function tagEditArticle($article) {
-    if (!Class_Users::getLoader()->isCurrentUserCanEditArticle($article))
+    $this->setArticle($article);
+
+    if (!Class_Users::isCurrentUserCanEditArticle($article))
       return '';
 
-    return $this->view->tagAnchor($this->view->url(['module' => 'admin',
-                                                    'controller' => 'cms',
-                                                    'action' => 'edit',
-                                                    'id' => $article->getId()]),
-                                  Class_Admin_Skin::current()
-                                  ->renderActionIconOn('edit', $this->view,
-                                                       ['class' => 'article_edit',
-                                                        'alt' => $this->view->translate("Modifier l'article"),
-                                                        'title' => $this->view->translate("Modifier l'article")]),
-                                  ['class' => 'edit_article',
-                                   'data-popup' => 'true']);
+    return $this->_tag('div', $this->_renderEdit() . $this->_renderVersion(),
+                       ['class' => 'edit_article']);
+  }
+
+
+  public function setArticle($article) {
+    $this->_article = $article;
+    return $this;
+  }
+
+
+  public function renderEdit($article) {
+    return $this->setArticle($article)
+                ->_renderEdit();
+  }
+
+
+  protected function _renderEdit() {
+    return $this
+      ->_renderActionLink('edit', $this->_('Modifier l\'article'),
+                          ['module' => 'admin',
+                           'controller' => 'cms',
+                           'action' => 'edit',
+                           'id' => $this->_article->getId()]);
+  }
+
+
+  protected function _renderVersion() {
+    if (0 == Class_Versions::forArticle($this->_article)->count())
+      return '';
+
+    return $this
+      ->_renderActionLink('batch', $this->_('Historique des modifications'),
+                          ['module' => 'admin',
+                           'controller' => 'cms',
+                           'action' => 'version',
+                           'id' => $this->_article->getId()]);
+  }
+
+
+  protected function _renderActionLink($icon, $label, $url) {
+    $icon = $this->_current_skin
+      ->renderActionIconOn($icon, $this->view, ['alt' => $label]);
+
+    return $this->view->tagAnchor($url, $icon,
+                                  ['data-popup' => 'true', 'title' => $label]);
   }
 }
-?>
\ No newline at end of file
diff --git a/public/admin/css/front_nav.css b/public/admin/css/front_nav.css
index c5143b5c4ac2850e855fdc601e8b83a5d660ab99..5060492f66aede1878584fe097437df5ddc5962e 100644
--- a/public/admin/css/front_nav.css
+++ b/public/admin/css/front_nav.css
@@ -232,7 +232,11 @@ div.menu_vertical ul a.edit_menu,
     left: -1em !important;
 }
 
-article header .edit_article,
 section .edit_library {
     top: 2ex;
-}
\ No newline at end of file
+}
+
+article header .edit_article {
+    position:absolute;
+    top: 2ex;
+}
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php b/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php
index 09cd0607f75e23542aee5d4575f1dcfbe6bbb428..de4961d7b2b849520f5c1f59638f309a0592958d 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php
@@ -22,11 +22,12 @@ require_once 'library/ZendAfi/View/Helper/ViewHelperTestCase.php';
 
 
 abstract class NewsHelperTestCase extends ViewHelperTestCase {
+  protected $_storm_default_to_volatile = true;
+
   public function setUp() {
     parent::setUp();
-    Storm_Model_Loader::defaultToVolatile();
 
-    $this->article_wrapper = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article');
+    $this->article_wrapper = $this->onLoaderOfModel('Class_Article');
     Class_Profil::setCurrentProfil(Class_Profil::newInstanceWithId(5));
 
     Zend_Registry::get('translate')->setLocale('fr');
@@ -329,7 +330,9 @@ class NewsHelperWithThreeArticlesWithPermissionUserModoTest extends NewsHelperWi
 
 
 
-class NewsHelperWithThreeArticlesWorkflowActivatedUserAdminTest extends NewsHelperWithThreeArticlesTestCase {
+class NewsHelperWithThreeArticlesWorkflowActivatedUserAdminTest
+  extends NewsHelperWithThreeArticlesTestCase {
+
   public function setUp() {
     parent::setUp();
 
@@ -352,27 +355,36 @@ class NewsHelperWithThreeArticlesWorkflowActivatedUserAdminTest extends NewsHelp
                                  'op_largeur_img' => 200,
                                  'op_transition' => 'zork']];
 
+    Class_Versions::setPersistence($this->mock()->whenCalled('count')->answers(2));
+
     $helper = new ZendAfi_View_Helper_Accueil_News(12, $params);
     $helper->setView(new ZendAfi_Controller_Action_Helper_View());
     $this->html = $helper->getBoite();
   }
 
+
+  public function tearDown() {
+    Class_Versions::setPersistence(null);
+    parent::tearDown();
+  }
+
+
   /** @test */
-  function getArticlesByPreferencesParamsShouldContainStatusValidated() {
+  public function getArticlesByPreferencesParamsShouldContainStatusValidated() {
     $prefs = $this->article_wrapper->getFirstAttributeForLastCallOn('getArticlesByPreferences');
     $this->assertEquals(Class_Article::STATUS_VALIDATED, $prefs['status'][1]);
   }
 
 
   /** @test */
-  function getArticlesByPreferencesParamsShouldContainStatusDraft() {
+  public function getArticlesByPreferencesParamsShouldContainStatusDraft() {
     $prefs = $this->article_wrapper->getFirstAttributeForLastCallOn('getArticlesByPreferences');
     $this->assertEquals(Class_Article::STATUS_DRAFT, $prefs['status'][0]);
   }
 
 
   /** @test */
-  function getArticlesByPreferencesParamsShouldNotContainLangue() {
+  public function getArticlesByPreferencesParamsShouldNotContainLangue() {
     $prefs = $this->article_wrapper->getFirstAttributeForLastCallOn('getArticlesByPreferences');
     $this->assertFalse(array_isset('langue',$prefs));
   }
@@ -405,20 +417,27 @@ class NewsHelperWithThreeArticlesWorkflowActivatedUserAdminTest extends NewsHelp
 
 
   /** @test */
-  function editArticleLinksShouldBePresent() {
+  public function editArticleLinksShouldBePresent() {
+    $this->assertXPath($this->html,
+                       '//div[contains(@class, "edit_article")]//a[contains(@href, "admin/cms/edit/id/34")]');
+  }
+
+
+  /** @test */
+  public function articleVersionLinkShouldBePresent() {
     $this->assertXPath($this->html,
-                       '//a[contains(@href, "admin/cms/edit/id/34")]//img[@class="article_edit"]');
+                       '//div[contains(@class, "edit_article")]//a[contains(@href, "admin/cms/version/id/34")]');
   }
 
 
   /** @test */
-  function separatorShouldNotBeVisible() {
+  public function separatorShouldNotBeVisible() {
     $this->assertNotXPath($this->html,
                           '//div[@class="article_full_separator"]');
   }
 
   /** @test */
-  function diaporamaTransitionShouldFallbackToFade() {
+  public function diaporamaTransitionShouldFallbackToFade() {
     $this->assertContains('"fx":"fade"',
                           Class_ScriptLoader::getInstance()->html());
   }
diff --git a/tests/scenarios/Versionning/VersionningArticleTest.php b/tests/scenarios/Versionning/VersionningArticleTest.php
index c83110f03e7b7f316e7319d7649592728abae7e0..d7d42c51b06ce32ea7686d722e8fde3e4d65033d 100644
--- a/tests/scenarios/Versionning/VersionningArticleTest.php
+++ b/tests/scenarios/Versionning/VersionningArticleTest.php
@@ -95,7 +95,7 @@ class VersionningArticleVersionsTest extends VersionningAdminTestCase {
 
   /** @test */
   public function titleShouldBeVersionDuProfilAProfile() {
-    $this->assertXPathContentContains('//h1', 'Versions de l\'article : "An article"');
+    $this->assertXPathContentContains('//h1', 'Versions de : "An article"');
   }
 
 
@@ -174,7 +174,7 @@ class VersionningArticleVersionTest extends VersionningAdminTestCase {
 
   /** @test */
   public function titleShouldBeVersionOfArticleAnArticle() {
-    $this->assertXPathContentContains('//h1', 'Version de l\'article : "An article"');
+    $this->assertXPathContentContains('//h1', 'Version de : "An article"');
   }