diff --git a/src/View/Geometry/GeometryWindow.py b/src/View/Geometry/GeometryWindow.py
index b853005e389cd6f9eb67822b42d58733aa058ed2..55ed9d92f17962fdc8a38720e28d74545dbf832d 100644
--- a/src/View/Geometry/GeometryWindow.py
+++ b/src/View/Geometry/GeometryWindow.py
@@ -18,6 +18,7 @@ from PyQt5.QtWidgets import (
 )
 
 from View.Geometry.PlotXY import PlotXY
+from View.Geometry.PlotKPC import PlotKPC
 from View.Geometry.mainwindow_ui_reach import Ui_MainWindow
 from View.Geometry import qtableview_reach
 from View.Geometry import window_profileXYZ
@@ -221,6 +222,8 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self.list_row = []
 
     def graphic_1(self):
+        self.tableView.model().blockSignals(True)
+
         self.plot_xy = PlotXY(
             canvas = self.ui.canvas_1,
             data = self._reach,
@@ -228,110 +231,33 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         )
         self.plot_xy.draw()
 
-    @timer
+        self.tableView.model().blockSignals(False)
+
     def graphic_2(self):
         self.tableView.model().blockSignals(True)
 
-        self.ui.canvas_2.axes.cla()
-        self.ui.canvas_2.axes.grid(color='grey', linestyle='--', linewidth=0.5)
-        self.ui.canvas_2.axes.set_xlabel(
-            _translate("MainWindow_reach", "Kp (m)"), color='green', fontsize=12
-        )
-        self.ui.canvas_2.axes.set_ylabel(
-            _translate("MainWindow_reach", "Cote (m)"), color='green', fontsize=12
-        )
-
-        kp = self._reach.get_kp()
-        z_min = self._reach.get_z_min()
-        z_max = self._reach.get_z_max()
-
-        self.line_kp_zmin_zmax = self.ui.canvas_2.axes.vlines(
-            x=kp,
-            ymin=z_min, ymax=z_max,
-            color='r', lw=1.
-        )
-
-        self.plot_selected_2, = self.ui.canvas_2.axes.plot(
-            (kp[0], kp[0]),
-            (z_min[0], z_max[0]),
-            color='b', lw=1.8
-        )
-        self.plot_selected_2.set_visible(False)
-
-        self.before_plot_selected_2, = self.ui.canvas_2.axes.plot(
-            (kp[0], kp[0]),
-            (z_min[0], z_max[0]),
-            color='k', lw=1.6, linestyle='--'
-        )
-        self.before_plot_selected_2.set_visible(False)
-
-        self.after_plot_selected_2, = self.ui.canvas_2.axes.plot(
-            (kp[0], kp[0]),
-            (z_min[0], z_max[0]),
-            color='m', lw=1.6, linestyle='--'
-        )
-        self.after_plot_selected_2.set_visible(False)
-
-        kp = self._reach.get_kp()
-        self.line_kp_zgl = []
-        for z in self._reach.get_guidelines_z():
-            # Is incomplete guideline?
-            if len(z) != len(kp):
-                continue
-
-            self.line_kp_zgl.append(
-                self.ui.canvas_2.axes.plot(
-                    kp, z, lw=1.
-                )
-            )
-
-        self.line_kp_zmin, = self.ui.canvas_2.axes.plot(
-            kp, z_min,
-            linestyle=":", lw=1.8,
-            color='lightgrey'
+        self.plot_kpc = PlotKPC(
+            canvas = self.ui.canvas_2,
+            data = self._reach,
+            toolbar = self.ui.toolbar_2
         )
+        self.plot_kpc.draw()
 
         self.tableView.model().blockSignals(False)
 
-        self.ui.canvas_2.figure.tight_layout()
-        self.ui.canvas_2.figure.canvas.draw_idle()
-        self.ui.toolbar_2.update()
-
-    def update_graphic_1(self):
+    def update_graphic_2(self):
         self.tableView.model().blockSignals(True)
 
-        self.plot_xy.update()
+        self.plot_kpc.update()
 
         self.tableView.model().blockSignals(False)
 
-    @timer
-    def update_graphic_2(self):
+    def update_graphic_1(self):
         self.tableView.model().blockSignals(True)
 
-        kp = self._reach.get_kp()
-        z_min = self._reach.get_z_min()
-        z_max = self._reach.get_z_max()
-
-        self.line_kp_zmin.set_data(kp, z_min)
-
-        self.line_kp_zmin_zmax.remove()
-        self.line_kp_zmin_zmax = self.ui.canvas_2.axes.vlines(
-            x=kp,
-            ymin=z_min, ymax=z_max,
-            color='r', lw=1.
-        )
-
-        try:
-            for i in range(len(self.line_kp_zgl)):
-                self.line_kp_zgl[i][0].set_data(
-                    kp, self._tablemodel.z_complete_guideline()[i]
-                )
-        except Exception as e:
-            print(f"Failed to update graphic 2: {e}")
+        self.plot_xy.update()
 
         self.tableView.model().blockSignals(False)
-        self.ui.canvas_2.axes.autoscale_view(True, True, True)
-        self.ui.canvas_2.figure.canvas.draw_idle()
 
     @timer
     def graphic_3(self):
@@ -552,42 +478,12 @@ class GeometryWindow(QMainWindow, WindowToolKit):
         self.tableView.model().blockSignals(False)
 
     def select_plot_graphic_2(self, ind: int):
-        kp_i = self._reach.profile(ind).kp
-        z_min_i = self._reach.profile(ind).z_min()
-        z_max_i = self._reach.profile(ind).z_max()
-
-        if 0 <= ind < self._tablemodel.rowCount():
-            self.plot_selected_2.set_data((kp_i, kp_i),
-                                          (z_min_i, z_max_i))
-            self.plot_selected_2.set_visible(True)
-
-    def select_before_plot_selected_2(self, ind: int):
-        if 0 <= ind < self._tablemodel.rowCount():
-            kp_i = self._reach.profile(ind).kp
-            z_min_i = self._reach.profile(ind).z_min()
-            z_max_i = self._reach.profile(ind).z_max()
-
-            self.before_plot_selected_2.set_data(
-                (kp_i, kp_i),
-                (z_min_i, z_max_i)
-            )
+        self.tableView.model().blockSignals(True)
 
-            self.before_plot_selected_2.set_visible(True)
-            self.ui.canvas_2.figure.canvas.draw_idle()
+        self.plot_kpc.update(ind=ind)
 
-    def select_after_plot_selected_2(self, ind: int):
-        if 0 <= ind < self._tablemodel.rowCount():
-            kp_i = self._reach.profile(ind).kp
-            z_min_i = self._reach.profile(ind).z_min()
-            z_max_i = self._reach.profile(ind).z_max()
+        self.tableView.model().blockSignals(False)
 
-            self.after_plot_selected_2.set_data(
-                (kp_i, kp_i),
-                (z_min_i, z_max_i)
-            )
-
-            self.after_plot_selected_2.set_visible(True)
-            self.ui.canvas_2.figure.canvas.draw_idle()
 
     def select_row_profile_slider(self, ind: int = 0):
         if self.tableView is not None:
@@ -614,16 +510,7 @@ class GeometryWindow(QMainWindow, WindowToolKit):
             self.select_plot_graphic_2(row)
 
             self.plot_xy.update(ind = row)
-
-            if row == 0:
-                self.before_plot_selected_2.set_visible(False)
-                self.select_after_plot_selected_2(row + 1)
-            elif 0 < row < self._tablemodel.rowCount() - 1:
-                self.select_before_plot_selected_2(row - 1)
-                self.select_after_plot_selected_2(row + 1)
-            elif row == self._tablemodel.rowCount() - 1:
-                self.after_plot_selected_2.set_visible(False)
-                self.select_before_plot_selected_2(row - 1)
+            self.plot_kpc.update(ind = row)
 
             self.tableView.model().blockSignals(False)
             self.update_graphic_3(row)
diff --git a/src/View/Geometry/PlotKPC.py b/src/View/Geometry/PlotKPC.py
new file mode 100644
index 0000000000000000000000000000000000000000..690367cfe6a1528a1fa4c10af40250eaf2dd96d2
--- /dev/null
+++ b/src/View/Geometry/PlotKPC.py
@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+
+from tools import timer
+from View.Plot.APlot import APlot
+
+from PyQt5.QtCore import (
+    QCoreApplication
+)
+
+_translate = QCoreApplication.translate
+
+class PlotKPC(APlot):
+    def __init__(self, canvas=None, data=None, toolbar=None):
+        super(PlotKPC, self).__init__(
+            canvas=canvas,
+            data=data,
+            toolbar=toolbar
+        )
+
+        self.line_kp_zgl = []
+        self.line_kp_zmin = None
+        self.line_kp_zmin_zmax = None
+
+        self.before_plot_selected = None
+        self.plot_selected = None
+        self.after_plot_selected = None
+
+    @timer
+    def draw(self):
+        self.canvas.axes.cla()
+        self.canvas.axes.grid(color='grey', linestyle='--', linewidth=0.5)
+        self.canvas.axes.set_xlabel(
+            _translate("MainWindow_reach", "Kp (m)"),
+            color='green', fontsize=12
+        )
+        self.canvas.axes.set_ylabel(
+            _translate("MainWindow_reach", "Cote (m)"),
+            color='green', fontsize=12
+        )
+
+        kp = self.data.get_kp()
+        z_min = self.data.get_z_min()
+        z_max = self.data.get_z_max()
+
+        self.line_kp_zmin_zmax = self.canvas.axes.vlines(
+            x=kp,
+            ymin=z_min, ymax=z_max,
+            color='r', lw=1.
+        )
+
+        self.plot_selected, = self.canvas.axes.plot(
+            (kp[0], kp[0]),
+            (z_min[0], z_max[0]),
+            color='b', lw=1.8
+        )
+        self.plot_selected.set_visible(False)
+
+        self.before_plot_selected, = self.canvas.axes.plot(
+            (kp[0], kp[0]),
+            (z_min[0], z_max[0]),
+            color='k', lw=1.6, linestyle='--'
+        )
+        self.before_plot_selected.set_visible(False)
+
+        self.after_plot_selected, = self.canvas.axes.plot(
+            (kp[0], kp[0]),
+            (z_min[0], z_max[0]),
+            color='m', lw=1.6, linestyle='--'
+        )
+        self.after_plot_selected.set_visible(False)
+
+        kp = self.data.get_kp()
+        self.line_kp_zgl = []
+        for z in self.data.get_guidelines_z():
+            # Is incomplete guideline?
+            if len(z) != len(kp):
+                continue
+
+            self.line_kp_zgl.append(
+                self.canvas.axes.plot(
+                    kp, z, lw=1.
+                )
+            )
+
+        self.line_kp_zmin, = self.canvas.axes.plot(
+            kp, z_min,
+            linestyle=":", lw=1.8,
+            color='lightgrey'
+        )
+
+        self.canvas.figure.tight_layout()
+        self.canvas.figure.canvas.draw_idle()
+        self.toolbar.update()
+
+    @timer
+    def update(self, ind=None):
+        if ind:
+            before = ind - 1
+            after = ind + 1
+
+            self.before_plot_selected.set_visible(False)
+            self.plot_selected.set_visible(False)
+            self.after_plot_selected.set_visible(False)
+
+            if 0 <= before < self.data.number_profiles:
+                kp_i = self.data.profile(before).kp
+                z_min_i = self.data.profile(before).z_min()
+                z_max_i = self.data.profile(before).z_max()
+
+                self.before_plot_selected.set_data(
+                    (kp_i, kp_i),
+                    (z_min_i, z_max_i)
+                )
+                self.before_plot_selected.set_visible(True)
+
+            if 0 <= ind < self.data.number_profiles:
+                kp_i = self.data.profile(ind).kp
+                z_min_i = self.data.profile(ind).z_min()
+                z_max_i = self.data.profile(ind).z_max()
+
+                self.plot_selected.set_data(
+                    (kp_i, kp_i),
+                    (z_min_i, z_max_i)
+                )
+                self.plot_selected.set_visible(True)
+
+            if 0 <= after < self.data.number_profiles:
+                kp_i = self.data.profile(after).kp
+                z_min_i = self.data.profile(after).z_min()
+                z_max_i = self.data.profile(after).z_max()
+
+                self.after_plot_selected.set_data(
+                    (kp_i, kp_i),
+                    (z_min_i, z_max_i)
+                )
+                self.after_plot_selected.set_visible(True)
+
+            self.canvas.figure.canvas.draw_idle()
+        else:
+            kp = self.data.get_kp()
+            z_min = self.data.get_z_min()
+            z_max = self.data.get_z_max()
+
+            self.line_kp_zmin.set_data(kp, z_min)
+
+            self.line_kp_zmin_zmax.remove()
+            self.line_kp_zmin_zmax = self.canvas.axes.vlines(
+                x=kp,
+                ymin=z_min, ymax=z_max,
+                color='r', lw=1.
+            )
+
+            z_complete = self.data.get_guidelines_z()
+            try:
+                for i in range(len(self.line_kp_zgl)):
+                    self.line_kp_zgl[i][0].set_data(
+                        kp, z_complete[i]
+                    )
+            except Exception as e:
+                print(f"Failed to update graphic 2: {e}")
+
+            self.canvas.axes.autoscale_view(True, True, True)
+            self.canvas.figure.canvas.draw_idle()