diff --git a/VERSIONS_WIP/32497 b/VERSIONS_WIP/32497
new file mode 100644
index 0000000000000000000000000000000000000000..6f077eb778c9a047a3324650a4c29a84afb982f8
--- /dev/null
+++ b/VERSIONS_WIP/32497
@@ -0,0 +1 @@
+  - ticket #32497 : Possibilité de dupliquer une newsletter
diff --git a/VERSIONS_WIP/32511 b/VERSIONS_WIP/32511
new file mode 100644
index 0000000000000000000000000000000000000000..4363b2c0988e9c7abde630992b8c9c03717e4f48
--- /dev/null
+++ b/VERSIONS_WIP/32511
@@ -0,0 +1 @@
+ - ticket #32511 : Ajout d'une case à cocher "Brouillon ?" dans le formulaire d'édition d'une newsletter qui permet de la masquer à l'opac.
\ No newline at end of file
diff --git a/VERSIONS_WIP/32614 b/VERSIONS_WIP/32614
new file mode 100644
index 0000000000000000000000000000000000000000..91f609685016259eb3a772eca1924706b17317e4
--- /dev/null
+++ b/VERSIONS_WIP/32614
@@ -0,0 +1 @@
+ - ticket #32614 : Une newsletter dupliquée doit être automatiquement mise en "brouillon" 
\ No newline at end of file
diff --git a/application/modules/admin/controllers/NewsletterController.php b/application/modules/admin/controllers/NewsletterController.php
index 10cf6dde3491c6aeb94bb3ff218fc85f116a2004..991f630c7a2898d649971020c8a90c4392564fcc 100644
--- a/application/modules/admin/controllers/NewsletterController.php
+++ b/application/modules/admin/controllers/NewsletterController.php
@@ -105,6 +105,18 @@ class Admin_NewsletterController extends ZendAfi_Controller_Action {
   }
 
 
+  public function duplicateAction() {
+    $this->_redirect('admin/newsletter');
+    if (!$newsletter = Class_Newsletter::find($this->_request->getParam('id'))) {
+      $this->_helper->notify($this->_('Duplication impossible: la source n\'a pas été trouvée.'));
+      return;
+    }
+
+    if(!$newsletter->duplicate())
+      $this->_helper->notify($this->_('Duplication impossible: Erreur lors de l\'enregisrement de la copie.'));
+  }
+
+
   public function editSubscribersAction() {
     if (!$newsletter = Class_Newsletter::find($this->_getParam('id'))) {
       $this->_redirect('admin/newsletter');
@@ -244,29 +256,33 @@ class Admin_NewsletterController extends ZendAfi_Controller_Action {
 
     $titre = $form
       ->createElement('text', 'titre')
-      ->setLabel('Titre')
+      ->setLabel($this->_('Titre'))
       ->setAttrib('size', 30)
       ->setRequired(true);
 
     $expediteur = $form
       ->createElement('text', 'expediteur')
-      ->setLabel('Expéditeur')
+      ->setLabel($this->_('Expéditeur'))
       ->setAttrib('size', 30)
       ->addValidator(new Zend_Validate_EmailAddress());
 
+    $draft = $form
+      ->createElement('checkbox', 'draft')
+      ->setLabel($this->_('Brouillon ?'));
+
     $contenu = $form
       ->createElement('ckeditor', 'contenu')
       ->setRequired(true);
 
     $id_catalogue = $form
       ->createElement('select', 'id_catalogue', array("onchange"=>"$('#id_panier').val('')"))
-      ->setLabel('Domaine')
+      ->setLabel($this->_('Domaine'))
       ->setMultiOptions(Class_Catalogue::getCataloguesForCombo());
 
 
     $id_panier = $form
       ->createElement('select', 'id_panier', array("onchange"=>"$('#id_catalogue').val('')"))
-      ->setLabel('Panier');
+      ->setLabel($this->_('Panier'));
 
     $paniers_admin = Class_PanierNotice::getLoader()->findAllBelongsToAdmin();
     $id_panier->addMultiOption(null, '');
@@ -285,13 +301,14 @@ class Admin_NewsletterController extends ZendAfi_Controller_Action {
     $form
       ->addElement($titre)
       ->addElement($expediteur)
-      ->addElement('checkbox', 'auto_subscribe', ['label' => "Inscrire automatiquement les nouveaux lecteurs à la lettre d'information"])
+      ->addElement($draft)
+      ->addElement('checkbox', 'auto_subscribe', ['label' => $this->_("Inscrire automatiquement les nouveaux lecteurs à la lettre d'information")])
       ->addElement($contenu)
-      ->addDisplayGroup(array('titre', 'expediteur'),
+      ->addDisplayGroup(array('titre', 'expediteur', 'draft'),
                         'letter',
                         array("legend" => "Lettre"))
       ->addDisplayGroup(['auto_subscribe'],
-                        'add_reader',['legend' => 'Inscription automatique'])
+                        'add_reader',['legend' => $this->_('Inscription automatique')])
       ->addDisplayGroup(array('contenu'),
                         'contenu_html',
                         array("legend" => "Contenu HTML"))
@@ -300,7 +317,7 @@ class Admin_NewsletterController extends ZendAfi_Controller_Action {
       ->addElement($nb_notices)
       ->addDisplayGroup(array('id_catalogue', 'id_panier', 'nb_notices'),
                         'notices',
-                        array("legend" => "Notices"));
+                        array("legend" => $this->_("Notices")));
 
     $form ->populate($newsletter->toArray());
 
diff --git a/application/modules/admin/views/scripts/newsletter/_newsletter_row.phtml b/application/modules/admin/views/scripts/newsletter/_newsletter_row.phtml
index 88810ffe74dfc4e9a522f8f75374c060cecf29f1..d49cd1ccdb0685d59309ee671184f8c5235d0821 100644
--- a/application/modules/admin/views/scripts/newsletter/_newsletter_row.phtml
+++ b/application/modules/admin/views/scripts/newsletter/_newsletter_row.phtml
@@ -3,8 +3,9 @@
   <td><?php echo $this->tagProgressBarForNewsletter($this->newsletter);?></td>
   <?php 
   foreach(['edit' => $this->boutonIco("type=edit"),
-           'delete' => $this->boutonIco("type=del"), 
-           'preview' => $this->boutonIco("type=show"), 
+           'delete' => $this->boutonIco("type=del"),
+           'preview' => $this->boutonIco("type=show"),
+           'duplicate' => $this->boutonIco("type=duplicate"),
            'edit-subscribers' => $this->boutonIco("picto=picto/abonnes.gif", "bulle=Membres").$this->newsletter->getNumberOfUsers(), 
            'sendtest' => $this->boutonIco("type=test"), 
            'send' => $this->boutonIco("type=mail")]
diff --git a/application/modules/opac/controllers/AbonneController.php b/application/modules/opac/controllers/AbonneController.php
index 3a3b4714cac7ee77065f8a6fc4f9fba0d4de1798..f0e90d9dc20742e59cf5c245f3c6c9eb41ce7da3 100644
--- a/application/modules/opac/controllers/AbonneController.php
+++ b/application/modules/opac/controllers/AbonneController.php
@@ -421,14 +421,14 @@ class AbonneController extends ZendAfi_Controller_Action {
       ->setAttrib('class', 'zend_form')
       ->setAttrib('autocomplete', 'off');
 
-    $textfields = array('nom' => $this->_('Nom'),
-                        'prenom' => $this->_('Prénom'),
-                        'pseudo' => $this->_('Pseudo'),
-                        'adresse' => $this->_('Adresse'),
-                        'code_postal' => $this->_('Code postal'),
-                        'ville' => $this->_('Ville'),
-                        'mail' => $this->_('E-Mail'),
-                        'telephone' => $this->_('Téléphone'));
+    $textfields = ['nom' => $this->_('Nom'),
+                   'prenom' => $this->_('Prénom'),
+                   'pseudo' => $this->_('Pseudo'),
+                   'adresse' => $this->_('Adresse'),
+                   'code_postal' => $this->_('Code postal'),
+                   'ville' => $this->_('Ville'),
+                   'mail' => $this->_('E-Mail'),
+                   'telephone' => $this->_('Téléphone')];
 
     foreach($textfields as $field => $label) {
       if (!in_array($field, $fields_to_show))
@@ -511,7 +511,7 @@ class AbonneController extends ZendAfi_Controller_Action {
     $subscriptions->setLabel($this->_("Abonnement aux lettres d'information"));
 
 
-    $newsletters = Class_Newsletter::getLoader()->findAll();
+    $newsletters = Class_Newsletter::getPublishedNewsletters();
     if (count($newsletters)>0) {
       foreach($newsletters as $nl)
         $subscriptions->addMultiOption($nl->getId(), $nl->getTitre());
@@ -540,11 +540,11 @@ class AbonneController extends ZendAfi_Controller_Action {
     $form = $this->_userForm($this->_user);
 
     if ($this->getRequest()->isPost() && $form->isValid($_POST)) {
-      $newsletters = array();
+      $newsletters = [];
 
-      $newsletters_id = $this->_request->getParam('subscriptions', array());
+      $newsletters_id = $this->_request->getParam('subscriptions', []);
       foreach($newsletters_id as $nl_id)
-        $newsletters []= Class_Newsletter::getLoader()->find($nl_id);
+        $newsletters []= Class_Newsletter::find($nl_id);
 
       try {
         $password = $this->_request->getParam('password');
diff --git a/cosmogramme/php/_init.php b/cosmogramme/php/_init.php
index 684300cd54dc68c228e1d58ffe132b9d70824c57..a9b7ff9dac9eef7a9d1dcec0d264f6c07ec214f4 100644
--- a/cosmogramme/php/_init.php
+++ b/cosmogramme/php/_init.php
@@ -1,7 +1,7 @@
 <?php
 error_reporting(E_ERROR | E_PARSE);
 
-define("PATCH_LEVEL","278");
+define("PATCH_LEVEL","279");
 
 define("APPLI","cosmogramme");
 define("COSMOPATH", "/var/www/html/vhosts/opac2/www/htdocs");
diff --git a/cosmogramme/sql/patch/patch_279.php b/cosmogramme/sql/patch/patch_279.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a56000b7b8c42e13af731a466d13d60ebfc4633
--- /dev/null
+++ b/cosmogramme/sql/patch/patch_279.php
@@ -0,0 +1,9 @@
+<?php
+$adapter = Zend_Db_Table::getDefaultAdapter();
+
+try {
+  $adapter->query('select draft from newsletters limit 1');
+} catch (Exception $e) {
+  $adapter->query('ALTER TABLE newsletters ADD COLUMN draft tinyint default 0');
+}
+?>
diff --git a/library/Class/Newsletter.php b/library/Class/Newsletter.php
index a991af74386d4637f4361547be93c8ab592f7a1a..f156ef7e277644c663eded34c50ee987d972c7b6 100644
--- a/library/Class/Newsletter.php
+++ b/library/Class/Newsletter.php
@@ -64,7 +64,7 @@ class Class_Newsletter extends Storm_Model_Abstract {
                                               'dependents' => 'delete']];
   protected $_notices_finder;
   protected $_recipent_size = 20;
-
+  protected $_default_attribute_values = ['draft' => 0];
 
   public function getSubscriptionsPage($page=0, $items_by_page=20) {
     return Class_NewsletterSubscription::findAllBy(['newsletter_id' => $this->getId(),
@@ -72,6 +72,11 @@ class Class_Newsletter extends Storm_Model_Abstract {
   }
 
 
+  public function getPublishedNewsletters() {
+    return Class_Newsletter::findAllBy(['draft' => 0]);
+  }
+
+
   public function send() {
     return (new Class_Batch_SendNewsletters($this))->run();
   }
@@ -301,6 +306,27 @@ class Class_Newsletter extends Storm_Model_Abstract {
     return hash('crc32b', $this->getId().$user->getMail());
   }
 
+
+  public function duplicate() {
+    $attributes = $this->attributesToArray();
+    unset($attributes['id']);
+    unset($attributes['last_distribution_date']);
+    $attributes['titre'] .= ' ('. $this->_('copie').')';
+
+    $duplicate = new Class_Newsletter();
+    $duplicate->updateAttributes($attributes);
+    $duplicate->setDraft(true);
+    if (!$duplicate->save())
+      return false;
+
+    $subscriptions = Class_NewsletterSubscription::findAllBy(['newsletter_id' => (int) $this->getId()]);
+
+    foreach ($subscriptions as $subscription)
+      Class_NewsletterSubscription::newWith($duplicate,
+                                            $subscription->getUser());
+
+    return true;
+  }
 }
 
 ?>
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/Accueil/Newsletters.php b/library/ZendAfi/View/Helper/Accueil/Newsletters.php
index c7b6fc5f1b8a4f9c0646a37dc4cf1647a4f00b2d..fd59f132550e593f8074e1fd75755ba52779718e 100644
--- a/library/ZendAfi/View/Helper/Accueil/Newsletters.php
+++ b/library/ZendAfi/View/Helper/Accueil/Newsletters.php
@@ -22,7 +22,7 @@ class ZendAfi_View_Helper_Accueil_Newsletters extends ZendAfi_View_Helper_Accuei
   protected $_boite_id = 'newsletters';
 
   public function getModels() {
-    return Class_Newsletter::findAll();
+    return Class_Newsletter::getPublishedNewsletters();
   }
 
   public function renderModel($newsletter) {
diff --git a/library/ZendAfi/View/Helper/BoutonIco.php b/library/ZendAfi/View/Helper/BoutonIco.php
index 6abedb0e2bbce0055b8ed4d3058d522816cbdd00..a3edca47125c38be10ba1bef698febfce282e0d7 100644
--- a/library/ZendAfi/View/Helper/BoutonIco.php
+++ b/library/ZendAfi/View/Helper/BoutonIco.php
@@ -51,8 +51,10 @@ class ZendAfi_View_Helper_BoutonIco extends ZendAfi_View_Helper_BaseHelper {
       $options['title'] = $this->bulle;
     }
 
-    if ('DEL' == strtoupper($this->type))
-      $options['onclick'] = 'javascript:return confirm(\'' . $this->traduire('Êtes vous sûr de vouloir supprimer cet élément ?') . '\');';
+    foreach (['DEL' => 'supprimer', 'DUPLICATE' => 'dupliquer'] as $key => $verb)
+      if ($key == strtoupper($this->type))
+        $options['onclick'] = 'javascript:return confirm(\'' . $this->traduire("Êtes vous sûr de vouloir $verb cet élément ?") . '\');';
+
 
     $html = $this->view->tag('img', null, $options);
 
@@ -73,7 +75,8 @@ class ZendAfi_View_Helper_BoutonIco extends ZendAfi_View_Helper_BaseHelper {
                 'SHOW' => ['show.gif', $this->traduire('Visualiser')],
                 'MAIL' => ['mail.png', $this->traduire('Envoyer par mail')],
                 'VISIBLE' => ['hide.gif', $this->traduire('Rendre visible')],
-                'INVISIBLE' => ['show.gif', $this->traduire('Archiver')]
+                'INVISIBLE' => ['show.gif', $this->traduire('Archiver')],
+                'DUPLICATE' => ['page_copy.png', $this->traduire('Dupliquer')]
     ];
 
     $type = strtoupper($type);
diff --git a/tests/application/modules/admin/controllers/NewsletterControllerTest.php b/tests/application/modules/admin/controllers/NewsletterControllerTest.php
index d8eb85869b7a256719ecbaa5e4e18b2202fb6ade..c4309b1a2dd8afd9e8e552fa601a2c213ea61525 100644
--- a/tests/application/modules/admin/controllers/NewsletterControllerTest.php
+++ b/tests/application/modules/admin/controllers/NewsletterControllerTest.php
@@ -161,6 +161,10 @@ class Admin_NewsletterControllerIndexActionTest extends Admin_NewsletterControll
     $this->assertXPath("//tbody//tr[1]//td//a[@href='/admin/newsletter/preview/id/1']");
   }
 
+  public function testDuplicateLink() {
+    $this->assertXPath("//tbody//tr[1]//td//a[@href='/admin/newsletter/duplicate/id/1']");
+  }
+
   public function testTestNouveautesClassiqueLink() {
     $this->assertXPath("//tbody//tr[1]//td//a[@href='/admin/newsletter/sendtest/id/1']");
   }
@@ -341,6 +345,10 @@ class Admin_NewsletterControllerEditActionTest extends Admin_NewsletterControlle
     $this->assertXPath("//form//input[@id='expediteur'][@value='laurent@free.fr']");
   }
 
+  public function testFormDraft() {
+    $this->assertXPath('//form//input[@id="draft"][@value="1"]');
+  }
+
   public function testFormContenuHTML() {
     $this->assertQueryContentContains("form textarea[@name='contenu'][following-sibling::script]",
                                       'Notre sélection du mois');
@@ -1062,4 +1070,67 @@ class Admin_NewsletterControllerNeverSendTest extends Admin_NewsletterController
   }
 }
 
+
+
+class Admin_NewsletterControllerDuplicateActionTest extends Admin_AbstractControllerTestCase {
+  protected $_new_id = null;
+
+  public function setUp() {
+    parent::setUp();
+
+    $subscription = $this->fixture('Class_Users', ['id' => 1,
+                                   'id_user' => 1,
+                                   'nom' => 'Jean',
+                                   'prenom' => 'Jean',
+                                   'login' => 'jean',
+                                   'password' => 'jean']);
+
+    $newsletter = $this->fixture('Class_Newsletter', ['id' => 1,
+                                        'titre' => 'Nouveautés classique',
+                                        'contenu' => 'Notre sélection du mois']);
+
+    Class_Newsletter::find(1)->setLastDistributionDateWithFormat();
+
+    $this->fixture('Class_NewsletterSubscription', ['id' => 100,
+                                                    'newsletter_id' => 1,
+                                                    'user_id' => 1]);
+
+    $newsletter->addSubscription($subscription);
+
+    $this->dispatch('/admin/newsletter/duplicate/id/1', true);
+    if ($new_newsletter = Class_Newsletter::findFirstBy(['titre' => 'Nouveautés classique (copie)']))
+      $this->_new_id = $new_newsletter->getId();
+  }
+
+
+  /** @test */
+  public function thereShouldBe2Newsletters() {
+    $this->assertCount(2, Class_Newsletter::findAll());
+  }
+
+
+  /** @test */
+  public function duplicateNewsletterShouldExit() {
+    $this->assertNotNull(Class_Newsletter::find($this->_new_id));
+  }
+
+
+  /** @test */
+  public function duplicatedNewsletterShouldBeDraft() {
+    $this->assertEquals(1,Class_Newsletter::find($this->_new_id)->getDraft());
+  }
+
+
+  /** @test */
+  public function duplicatedNewsletterShouldHaveSameContentThanSource() {
+    $this->assertEquals(Class_Newsletter::find(1)->getContenu(), Class_Newsletter::find($this->_new_id)->getContenu());
+  }
+
+
+  /** @test */
+  public function duplicatedNewsletterShouldHaveSameSubscriptionThanSource() {
+    $this->assertNotNull(Class_NewsletterSubscription::findFirstBy(['newsletter_id' => $this->_new_id, 'user_id' => 1]));
+  }
+}
+
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/AbonneControllerNewslettersTest.php b/tests/application/modules/opac/controllers/AbonneControllerNewslettersTest.php
index 71665246c44fec50b58a1fb83af4f390f3bf12d3..ee375150ce0335440f5e38d5e017c60e4cc0682e 100644
--- a/tests/application/modules/opac/controllers/AbonneControllerNewslettersTest.php
+++ b/tests/application/modules/opac/controllers/AbonneControllerNewslettersTest.php
@@ -22,6 +22,7 @@ require_once 'AbstractControllerTestCase.php';
 
 
 abstract class AbstractAbonneControllerNewslettersTestCase extends AbstractControllerTestCase {
+  protected $_storm_default_to_volatile=true;
   public function setUp() {
     parent::setUp();
 
@@ -29,26 +30,22 @@ abstract class AbstractAbonneControllerNewslettersTestCase extends AbstractContr
                                       ['valeur' => 'pseudo;nom;prenom;mail;password']);
 
 
-    $this->marcus = Class_Users::getLoader()->newInstanceWithId(10)
-      ->setPrenom('Marcus')
-      ->setNom('Miller')
-      ->setLogin('mmiller')
-      ->setMail('marcus@gmail.com')
-      ->setPseudo('mimi')
-      ->setDateDebut(null)
-      ->setPassword('mysecret')
-      ->setFicheSIGB(['type_comm' => 0,
-                      'nom_aff' => 'Marcus'])
-      ->setRole('abonne_sigb')
-      ->setRoleLevel(3)
-      ->setIdSite(999)
-      ->setIdabon('00123');
+    $this->marcus = $this->fixture('Class_Users',['id'=> 10,
+                                                  'prenom' => 'Marcus',
+                                                  'nom' => 'Miller',
+                                                  'login' => 'mmiller' ,
+                                                  'mail' => 'marcus@gmail.com',
+                                                  'pseudo' => 'mimi',
+                                                  'password' => 'mysecret',
+                                                  'date_debut' => null,
+                                                  'role' => 'abonne_sigb',
+                                                  'role_level' => 3,
+                                                  'id_site' => 999,
+                                                  'idabon' => '00123',
+                                                  'fiche_SIGB' => ['type_comm' => 0,
+                                                                   'nom_aff' => 'Marcus']
+                                                  ]);
 
-    Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-      ->whenCalled('save')
-      ->answers(true);
-
-    $this->newsletter_loader = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Newsletter');
 
     ZendAfi_Auth::getInstance()->logUser($this->marcus);
   }
@@ -81,9 +78,7 @@ class AbonneControllerNewslettersFicheActionWithNoExistingNewslettersTest extend
   public function setUp() {
     parent::setUp();
 
-    $this->marcus->setNewsletters(array());
-    $this->newsletter_loader->whenCalled('findAll')
-                           ->answers(array());
+    $this->marcus->setNewsletters([]);
 
     $this->dispatch('/opac/abonne');
   }
@@ -192,6 +187,10 @@ class AbonneControllerNewslettersEditActionTest extends AbonneControllerWithTwoN
       ->setValeur("Saisissez\nvos données");
     Class_AdminVar::getLoader()
       ->cacheInstance($this->aide_fiche_abonne);
+    $this->fixture('Class_Newsletter',
+                   ['id' => 5,
+                    'titre' => 'hidden newsletter',
+                    'draft' => true]);
 
 
     $this->dispatch('/opac/abonne/edit');
@@ -252,6 +251,13 @@ class AbonneControllerNewslettersEditActionTest extends AbonneControllerWithTwoN
   public function testBackButton() {
     $this->assertXPath("//table//div[contains(@onclick, 'window.location.replace')]");
   }
+
+  /** @test */
+  public function hiddenNewsletterShouldNotBedisplayed() {
+    $this->assertNotXPathContentContains("//form//input[@type='checkbox'][@name='subscriptions[]']/..",
+                                         'hidden newsletter',$this->_response->getBody());
+  }
+
 }
 
 
@@ -261,13 +267,13 @@ class AbonneControllerNewslettersSaveActionTest extends AbonneControllerWithTwoN
   public function setUp() {
     parent::setUp();
 
-    $data = array('nom' => 'MILLER',
-                  'prenom' => 'MARCUS',
-                  'mail' => 'marcus@free.fr',
-                  'pseudo' => 'M2',
-                  'subscriptions' => array(14),
-                  'password' => 'amstramgram',
-                  'confirm_password' => 'amstramgram');
+    $data = ['nom' => 'MILLER',
+             'prenom' => 'MARCUS',
+             'mail' => 'marcus@free.fr',
+             'pseudo' => 'M2',
+             'subscriptions' => [14],
+             'password' => 'amstramgram',
+             'confirm_password' => 'amstramgram'];
 
     $this->getRequest()
       ->setMethod('POST')
@@ -278,7 +284,7 @@ class AbonneControllerNewslettersSaveActionTest extends AbonneControllerWithTwoN
 
   /** @test */
   public function marcusShouldHaveBeenSaved() {
-    $this->assertEquals($this->marcus, Class_Users::getLoader()->getFirstAttributeForLastCallOn('save'));
+    $this->assertEquals($this->marcus, Class_Users::findFirstBy(['pseudo' => 'M2']));
   }
 
   public function testNomSetToMILLER() {
@@ -322,7 +328,7 @@ class AbonneControllerNewslettersSaveWithEmptyDataTest extends AbonneControllerW
 
   /** @test */
   public function marcusShouldHaveBeenSaved() {
-    $this->assertEquals($this->marcus, Class_Users::getLoader()->getFirstAttributeForLastCallOn('save'));
+    $this->assertEquals($this->marcus, Class_Users::findFirstBy(['idabon' => '00123']));
   }
 
   public function testNoNewsletters() {
@@ -421,12 +427,6 @@ class AbonneControllerNewslettersSubscriptionTest extends AbonneControllerWithTw
     $this->assertContains( $this->visites,$this->marcus->getNewsletters());
   }
 
-
-  /** @test **/
-  public function userShouldHaveBeenSaved() {
-    $this->assertTrue(Class_Users::methodHasBeenCalled('save'));
-  }
-
 }
 
 
@@ -450,14 +450,6 @@ class AbonneControllerNewslettersUnsubscriptionTest extends AbonneControllerWith
     $this->assertNotContains( $this->visites,$this->marcus->getNewsletters());
   }
 
-
-  /** @test **/
-  public function userShouldHaveBeenSaved() {
-    $this->assertTrue(Class_Users::methodHasBeenCalled('save'));
-  }
-
-
-
 }
 
 
@@ -514,7 +506,7 @@ class AbonneControllerNewslettersValidationsTest extends AbonneControllerWithTwo
   /** @test */
   public function withEmptyPasswordMarcusShouldBeSaved() {
     $this->_postData(array('password' => ''));
-    $this->assertEquals($this->marcus, Class_Users::getLoader()->getFirstAttributeForLastCallOn('save'));
+    $this->assertEquals($this->marcus->getPassword(), Class_Users::findFirstBy(['idabon' => '00123'])->getPassword());
   }
 }
 
@@ -553,4 +545,5 @@ class AbonneControllerNewslettersSubscriptionTwiceTest extends AbstractControlle
     $this->assertEquals(1 , Class_NewsletterSubscription::countBy(['user_id' => 156]));
   }
 }
+
 ?>
\ No newline at end of file
diff --git a/tests/db/UpgradeDBTest.php b/tests/db/UpgradeDBTest.php
index b56a38ca5fdb8f2922102deef61888766c5f18a8..fb06803c4fac3d0f7a4858c22487122dd338cedd 100644
--- a/tests/db/UpgradeDBTest.php
+++ b/tests/db/UpgradeDBTest.php
@@ -60,6 +60,22 @@ abstract class UpgradeDBTestCase extends PHPUnit_Framework_TestCase {
   }
 
 
+  public function assertColumnExists($exist) {
+    list($table, $column) = explode('.', $exist);
+
+    if (!$table || !$column)
+      return false;
+
+    try {
+      $adapter->query("select $column from $table limit 1");
+    } catch (Exception $e) {
+      return false;
+    }
+
+    return true;
+  }
+
+
   protected function _getPatchLevel() {
     preg_match('/UpgradeDB_([0-9]+)_Test/',
                get_class($this),
@@ -176,7 +192,6 @@ class UpgradeDB_277_Test extends UpgradeDBTestCase {
 }
 
 
-
 class UpgradeDB_278_Test extends UpgradeDBTestCase {
 
   public function prepare() {
@@ -197,3 +212,15 @@ class UpgradeDB_278_Test extends UpgradeDBTestCase {
     $this->assertContains("12:Cd-Script\r\n", $this->query('select liste from variables where clef = "comm_sigb";')->fetch()['liste']);
   }
 }
+
+class UpgradeDB_279_Test extends UpgradeDBTestCase {
+  public function prepare() {
+    $this->query("ALTER TABLE newsletters DROP draft");
+  }
+
+
+  /** @test */
+  public function newslettersDraftColumnshouldExist() {
+    $this->assertColumnExists('newsletters.draft');
+  }
+}
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/NewslettersTest.php b/tests/library/ZendAfi/View/Helper/Accueil/NewslettersTest.php
index 969a7abba63e30acfe0140d4ee8aa8250ee8a137..fde491b678919a08b087c07ba964358e3689c270 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/NewslettersTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/NewslettersTest.php
@@ -161,4 +161,50 @@ class NewslettersTestWithNonConnectedUser extends ViewHelperTestCase {
 
 }
 
+
+
+
+class NewslettersTestWithConnectedUserAndHiddenNewsletter extends ViewHelperTestCase {
+  public function setUp() {
+    parent::setUp();
+
+    $helper = new ZendAfi_View_Helper_Accueil_Newsletters(2, [
+      'type_module'=>'NEWSLETTERS',
+      'division' => '1',
+      'preferences' => [
+      'titre' => 'Newsletters']]);
+    $helper->setView(new ZendAfi_Controller_Action_Helper_View());
+
+    $account = new StdClass();
+    $account->ID_USER = '123456';
+    ZendAfi_Auth::getInstance()->getStorage()->write($account);
+    $user = $this->fixture('Class_Users', ['id' => 123456,
+                                           'nom' => 'Arnaud',
+                                           'login' => 'arnaud',
+                                           'password' => 'foo']);
+
+    $this->fixture('Class_Newsletter', ['id' => 2,
+                                        'titre' =>'Nouveautes musique',
+                                        'draft' => 0]);
+
+    $this->fixture('Class_Newsletter', ['id' => 3,
+                                        'titre' =>'Nouveautes classique',
+                                        'draft' => 1]);
+
+    $this->html = $helper->getBoite();
+  }
+
+
+  /** @test */
+  public function newsletterNouveautesMusiqueShouldBeDisplayed() {
+    $this->assertXPathContentContains($this->html,'//ul//li','Nouveautes musique');
+  }
+
+
+  /** @test */
+  public function newsletterNouveautesClassiqueShouldNotBeDisplayed() {
+    $this->assertNotXPathContentContains($this->html,'//ul//li','Nouveautes classique');
+  }
+}
+
 ?>
\ No newline at end of file