diff --git a/forms/neighborhoodDialog.ui b/forms/neighborhoodDialog.ui
new file mode 100644
index 0000000000000000000000000000000000000000..7232c50fd49cc206ccdd2c3a1306a1208a305d93
--- /dev/null
+++ b/forms/neighborhoodDialog.ui
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>NeighborhoodDialog</class>
+ <widget class="QDialog" name="NeighborhoodDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>894</width>
+    <height>441</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="mainLayout" stretch="1,0">
+     <item>
+      <widget class="QWidget" name="grid" native="true">
+       <property name="enabled">
+        <bool>true</bool>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>100</width>
+         <height>100</height>
+        </size>
+       </property>
+       <layout class="QGridLayout" name="gridLayout_3">
+        <item row="0" column="0">
+         <widget class="GridView" name="grid_view">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="frameShape">
+           <enum>QFrame::StyledPanel</enum>
+          </property>
+          <property name="frameShadow">
+           <enum>QFrame::Raised</enum>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="settingsLayout_2">
+       <property name="sizeConstraint">
+        <enum>QLayout::SetDefaultConstraint</enum>
+       </property>
+       <item>
+        <layout class="QFormLayout" name="gridDimLayout_2">
+         <property name="fieldGrowthPolicy">
+          <enum>QFormLayout::FieldsStayAtSizeHint</enum>
+         </property>
+         <item row="0" column="0">
+          <widget class="QLabel" name="widthLabel_2">
+           <property name="text">
+            <string>Width :</string>
+           </property>
+           <property name="buddy">
+            <cstring>widthSpinBox</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="1">
+          <widget class="QSpinBox" name="widthSpinBox_2">
+           <property name="minimum">
+            <number>1</number>
+           </property>
+           <property name="maximum">
+            <number>9999</number>
+           </property>
+           <property name="value">
+            <number>10</number>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="0">
+          <widget class="QLabel" name="heightLabel_2">
+           <property name="text">
+            <string>Height :</string>
+           </property>
+           <property name="buddy">
+            <cstring>heightSpinBox</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QSpinBox" name="heightSpinBox_2">
+           <property name="minimum">
+            <number>1</number>
+           </property>
+           <property name="maximum">
+            <number>9999</number>
+           </property>
+           <property name="value">
+            <number>10</number>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="1">
+          <widget class="QPushButton" name="validateGridDim_2">
+           <property name="enabled">
+            <bool>false</bool>
+           </property>
+           <property name="text">
+            <string>OK</string>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="1">
+          <widget class="QDialogButtonBox" name="buttonBox">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="standardButtons">
+            <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>GridView</class>
+   <extends>QFrame</extends>
+   <header>gridview.hpp</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>NeighborhoodDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>NeighborhoodDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/forms/neighborhoodWidget.ui b/forms/neighborhoodWidget.ui
index 591fcdf656b936df76add68ec2e8f1d4409edc76..8ec74b90aeac901bc04338bbb8c584e33a104db3 100644
--- a/forms/neighborhoodWidget.ui
+++ b/forms/neighborhoodWidget.ui
@@ -116,15 +116,9 @@
         </layout>
        </item>
        <item>
-        <widget class="QPushButton" name="validationButton">
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="text">
-          <string>Validate</string>
+        <widget class="QDialogButtonBox" name="buttonBox">
+         <property name="standardButtons">
+          <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
          </property>
         </widget>
        </item>
diff --git a/include/gridview.hpp b/include/gridview.hpp
index a73228d0aa24f7f263bff43f4a08a7a951401e15..1d1e367db22b2c4970036398c11366f59cf76318 100644
--- a/include/gridview.hpp
+++ b/include/gridview.hpp
@@ -88,6 +88,11 @@ public:
     //! \param checked_state L'état lorsqu'une cellule est sélectionnée
     //! \param unchecked_state L'état d'une cellule non sélectionnée
     void enable_toggle_mode(unsigned checked_state, unsigned unchecked_state = 0);
+    //! \brief Ajoute une règle au mode "toggle", qui permet de changer l'état d'une cellule de manière cyclique en cliquant dessus, passant d'un état check à uncheck, et inversement si cliqué à nouveau.
+    //! \brief Cette fonction permet d'ajouter une nouvellle paire d'états cycliques, pour pouvoir par exemple permettre de passer entre 0-1 et 2-3, indépendamment.
+    //! \param checked_state L'état d'une cellule sélectionnée
+    //! \param unchecked_state L'état d'une cellule non sélectionnée
+    void add_toggle_rule(unsigned checked_state, unsigned unchecked_state = 0);
     //! \brief Désactive le mode "toggle".
     void disable_toggle_mode();
     //! \brief Retourne un booléen indiquant si le mode actuel est le mode "toggle".
@@ -170,7 +175,7 @@ private:
     QPixmap m_grid_pixmap;
     Grid m_grid;
     bool m_in_toggle_mode;
-    unsigned m_checked_state, m_unchecked_state;
+    std::vector<std::pair<unsigned, unsigned>> m_toggle_states;
     std::vector<QGraphicsRectItem*> m_selection_rects;
     bool m_handling_rubberband;
     DragDropHandlerItem* m_drag_drop_handler;
diff --git a/include/neighborhoodWidget.hpp b/include/neighborhoodDialog.hpp
similarity index 57%
rename from include/neighborhoodWidget.hpp
rename to include/neighborhoodDialog.hpp
index 92a01f6ff86e42a805538394620b4b495d06f570..f37e0d9a6debc5d2f79b7f8ef631953e8632428b 100644
--- a/include/neighborhoodWidget.hpp
+++ b/include/neighborhoodDialog.hpp
@@ -1,39 +1,40 @@
-#ifndef NEIGHBORHOODWIDGET_HPP
-#define NEIGHBORHOODWIDGET_HPP
+#ifndef NEIGHBORHOODDIALOG_HPP
+#define NEIGHBORHOODDIALOG_HPP
 
 #include <QDialog>
 #include "neighborhood.hpp"
 #include "gridview.hpp"
 
 namespace Ui {
-    class NeighborhoodWidget;
+    class NeighborhoodDialog;
 }
 
 //! \brief Fenêtre de dialogue permettant de choisir les voisins d'une cellule de manière graphique.
-class NeighborhoodWidget : public QWidget
+class NeighborhoodDialog : public QDialog
 {
     Q_OBJECT
 
     Coord currentPoint;
 public:
-    explicit NeighborhoodWidget(QWidget *parent = nullptr);
-    ~NeighborhoodWidget();
+    explicit NeighborhoodDialog(QWidget *parent = nullptr);
+    ~NeighborhoodDialog();
 
     //! \brief Retourne le voisinage
     Neighborhood* getVoisinage() const;
 
-    QPushButton* getValidateButton() const;
-
     GridView& getGridView() const ;
 
 public slots:
     Neighborhood& getNeighborhood() const;
 
+protected:
+    void done(int r);
+
 private slots:
 
 private:
-    Ui::NeighborhoodWidget *ui;
+    Ui::NeighborhoodDialog *ui;
 };
 
 
-#endif // NEIGHBORHOODWIDGET_HPP
+#endif // NEIGHBORHOODDIALOG_HPP
diff --git a/include/property.hpp b/include/property.hpp
index e69b5b99bf0f621257eb1f283ace7a6282f01c17..62cfff92cf65ddc41efb840bf91009bf3b3b0883 100644
--- a/include/property.hpp
+++ b/include/property.hpp
@@ -33,7 +33,7 @@ Fichier définissant la classe Property représentant une propriété chargable,
 
 #include "coord.hpp"
 #include "neighborhood.hpp"
-#include "neighborhoodWidget.hpp"
+#include "neighborhoodDialog.hpp"
 
 struct StringProperty;
 struct IntegerProperty;
diff --git a/src/gridview.cpp b/src/gridview.cpp
index 7ac079364521b0cf23203105b4fb63f24965e4e6..2ad8a9a391c08348b9a33f4afe7960d1ac309c04 100644
--- a/src/gridview.cpp
+++ b/src/gridview.cpp
@@ -353,8 +353,12 @@ unsigned GridView::current_pen() const
 void GridView::enable_toggle_mode(unsigned checked_state, unsigned unchecked_state)
 {
     m_in_toggle_mode = true;
-    m_checked_state = checked_state;
-    m_unchecked_state = unchecked_state;
+    add_toggle_rule(checked_state, unchecked_state);
+}
+
+void GridView::add_toggle_rule(unsigned checked_state, unsigned unchecked_state)
+{
+    m_toggle_states.push_back({checked_state, unchecked_state});
 }
 
 void GridView::disable_toggle_mode()
@@ -530,10 +534,19 @@ void GridView::click_on(Coord coord)
     else
     {
         unsigned prev_state = get_grid().get_state(coord);
-        if (prev_state == m_checked_state)
-            set_cell_state(coord, m_unchecked_state);
-        else
-            set_cell_state(coord, m_checked_state);
+        for (auto toggle_pair : m_toggle_states)
+        {
+            if (prev_state == toggle_pair.first)
+            {
+                set_cell_state(coord, toggle_pair.second);
+                break;
+            }
+            else if (prev_state == toggle_pair.second)
+            {
+                set_cell_state(coord, toggle_pair.first);
+                break;
+            }
+        }
     }
 }
 
diff --git a/src/interface.cpp b/src/interface.cpp
index 960531506d7a35dcc3388de2d629144b441ffaed..3ea4d80c30b31ec061a509d03c80003cab21b316 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -10,7 +10,7 @@
 #include "propertyvisitors.hpp"
 #include "modelloadingdialog.hpp"
 #include "configurationloadingdialog.hpp"
-#include "neighborhoodWidget.hpp"
+#include "neighborhoodDialog.hpp"
 
 #include <QJsonArray>
 #include <QDate>
diff --git a/src/neighborhoodWidget.cpp b/src/neighborhoodDialog.cpp
similarity index 72%
rename from src/neighborhoodWidget.cpp
rename to src/neighborhoodDialog.cpp
index 6eb12789a0235294b45a93fa66e9e4b8327d8c4b..0e708b3538a4e2a5fdde97255e163ad7ed179500 100644
--- a/src/neighborhoodWidget.cpp
+++ b/src/neighborhoodDialog.cpp
@@ -1,11 +1,11 @@
-#include "neighborhoodWidget.hpp"
-#include "ui_neighborhoodWidget.h"
+#include "neighborhoodDialog.hpp"
+#include "ui_neighborhoodDialog.h"
 
 #include <QDate>
 #include <QMessageBox>
 
-NeighborhoodWidget::NeighborhoodWidget(QWidget *parent) :
-      QWidget(parent), ui(new Ui::NeighborhoodWidget)
+NeighborhoodDialog::NeighborhoodDialog(QWidget *parent) :
+      QDialog(parent), ui(new Ui::NeighborhoodDialog)
 {
     ui->setupUi(this);
     GridView& gv = *(*ui).grid_view;
@@ -33,25 +33,34 @@ NeighborhoodWidget::NeighborhoodWidget(QWidget *parent) :
     // TODO le clic sur la cellule centrale
 }
 
-NeighborhoodWidget::~NeighborhoodWidget()
+NeighborhoodDialog::~NeighborhoodDialog()
 {
     delete ui;
 }
 
-Neighborhood* NeighborhoodWidget::getVoisinage() const
+void NeighborhoodDialog::done(int r)
 {
-    return nullptr;
+    if(QDialog::Accepted == r)  // ok was pressed
+    {
+
+    }
+    else    // cancel, close or exc was pressed
+    {
+        QDialog::done(r);
+        return;
+    }
 }
 
-QPushButton* NeighborhoodWidget::getValidateButton() const {
-    return ui->validationButton;
+Neighborhood* NeighborhoodDialog::getVoisinage() const
+{
+    return nullptr;
 }
 
-GridView& NeighborhoodWidget::getGridView() const{
+GridView& NeighborhoodDialog::getGridView() const{
     return *(ui->grid_view);
 }
 
-Neighborhood& NeighborhoodWidget::getNeighborhood() const
+Neighborhood& NeighborhoodDialog::getNeighborhood() const
 {
     Neighborhood* newNeighborhood = new Neighborhood;
     Grid currentGrid = ui->grid_view->get_grid();
diff --git a/src/src.pro b/src/src.pro
index c31a2e7f6e04961a85f7621a6413a3c0237e8564..deee726a9cd402853ef228240a9776df088ac03c 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -18,7 +18,7 @@ SOURCES += \
     neighborhood_rules/arbitraryneighborhoodrule.cpp \
     automaton.cpp \
     gridview.cpp \
-    neighborhoodWidget.cpp \
+    neighborhoodDialog.cpp \
     savingdialog.cpp \
     transition_rules/circulartransition.cpp \
     transition_rules/lifegametransition.cpp \
@@ -71,7 +71,7 @@ HEADERS += \
     ../include/transition_rules/circulartransition.hpp \
     ../include/transition_rules/totalistictransition.hpp \
     ../include/modelloadingdialog.hpp \
-    ../include/neighborhoodWidget.hpp \
+    ../include/neighborhoodDialog.hpp \
     ../include/configurationloadingdialog.hpp \
     ../include/transition_rules/nonisotropictransition.hpp
 
@@ -82,6 +82,7 @@ FORMS += \
     ../forms/structurelibraryview.ui \
     ../forms/modelloadingdialog.ui \
     ../forms/neighborhoodWidget.ui \
+    ../forms/neighborhoodDialog.ui \
     ../forms/configurationloadingdialog.ui
 
 
diff --git a/src/uibuildervisitor.cpp b/src/uibuildervisitor.cpp
index d382ff588b35cd9066e68df779487ed04ceea764..44ba4ee15931d33a84684a84943058126182785e 100644
--- a/src/uibuildervisitor.cpp
+++ b/src/uibuildervisitor.cpp
@@ -1,6 +1,6 @@
 #include "propertyvisitors.hpp"
 
-#include "neighborhoodWidget.hpp"
+#include "neighborhoodDialog.hpp"
 
 #include <QGroupBox>
 #include <QPushButton>
@@ -186,17 +186,17 @@ void UIBuilderVisitor::visit(PropertyList &list)
                              }
                          });
         QObject::connect(widgetGridNeighborhoodButton, &QPushButton::pressed, [&list]() {
-            NeighborhoodWidget* nw = new NeighborhoodWidget;
-            nw->show();
-            QPushButton* validateButton = nw->getValidateButton();
+            NeighborhoodDialog* nw = new NeighborhoodDialog;
+            nw->exec();
+            /*
             QObject::connect(validateButton, &QPushButton::pressed, [&list, &nw] () {
                 list.clear();
                 Neighborhood newNeighborhood = nw->getNeighborhood();
                 // TODO a finir
                 list.push_back();
 
-            });
-            QObject::connect(validateButton, &QPushButton::pressed, nw, &QWidget::close );
+            });*/
+            // QObject::connect(validateButton, &QPushButton::pressed, nw, &QDialog::done );
 
         });
     }
diff --git a/tests/tests.pro b/tests/tests.pro
index 4899145823e7b04cb3629ec53cd12eb0b0d36d9e..b82a3628eec63aba9d495598ccc82a6d4fcd5d27 100644
--- a/tests/tests.pro
+++ b/tests/tests.pro
@@ -22,6 +22,7 @@ SOURCES += \
     ../src/history.cpp \
     ../src/grid.cpp \
     ../src/neighborhood_rules/mooreNeighborhoodRule.cpp \
+    ../src/neighborhood_rules/vonNeumannNeighborhoodRule.cpp \
     ../src/transition_rules/lifegametransition.cpp \
     ../src/transition_rules/circulartransition.cpp \
     ../src/transition_rules/totalistictransition.cpp \