diff --git a/src/View/Geometry/PlotKPZ.py b/src/View/Geometry/PlotKPZ.py
index 7368ceb00f9ff3b970300329e6b117a8e99d7b17..2e90498718a946026ed414534f537523a72e6104 100644
--- a/src/View/Geometry/PlotKPZ.py
+++ b/src/View/Geometry/PlotKPZ.py
@@ -21,7 +21,10 @@ import logging
 from tools import timer
 from View.Tools.PamhyrPlot import PamhyrPlot
 from PyQt5.QtWidgets import QApplication
-from PyQt5.QtCore import Qt
+from PyQt5.QtCore import(
+    Qt, QItemSelectionModel,
+    QItemSelection, QItemSelectionRange,
+)
 
 logger = logging.getLogger()
 
@@ -29,7 +32,7 @@ logger = logging.getLogger()
 class PlotKPZ(PamhyrPlot):
     def __init__(self, canvas=None, trad=None,
                  study=None, data=None, toolbar=None,
-                 parent=None):
+                 table=None, parent=None):
         self._study = study
 
         super(PlotKPZ, self).__init__(
@@ -37,6 +40,7 @@ class PlotKPZ(PamhyrPlot):
             trad=trad,
             data=data,
             toolbar=toolbar,
+            table=table,
             parent=parent
         )
 
@@ -55,6 +59,8 @@ class PlotKPZ(PamhyrPlot):
         self.after_plot_selected = None
         self._rect_select = None
         self.parent=parent
+        self._table=table
+        self._colors = []
 
     def onpick(self, event):
         if event.mouseevent.inaxes != self.canvas.axes:
@@ -69,7 +75,28 @@ class PlotKPZ(PamhyrPlot):
         ind, point = self._closest_kp(event)
         if self.parent._table is not None:
             self.parent._table.blockSignals(True)
-            self.parent.select_row_profile_slider(ind)
+            if modifiers == Qt.ControlModifier:
+                rows = list(
+                    set(
+                        (i.row() for i in self.parent.tableView.selectedIndexes())
+                    )
+                )
+                self._select_in_table(rows+[ind])
+            elif modifiers == Qt.ShiftModifier:
+                rows = list(
+                    set(
+                        (i.row() for i in self.parent.tableView.selectedIndexes())
+                    )
+                )
+                if len(rows)>0:
+                    i1 = min(rows[0], rows[-1], ind)
+                    i2 = max(rows[0], rows[-1], ind)
+                else:
+                    i1 = ind
+                    i2 = ind
+                self._select_range_in_table(i1, i2)
+            else:
+                self.parent.select_row_profile_slider(ind)
             self.parent._table.blockSignals(False)
 
         self.update()
@@ -96,6 +123,42 @@ class PlotKPZ(PamhyrPlot):
 
         return closest
 
+    def _select_in_table(self, ind):
+        if self._table is not None:
+            self._table.blockSignals(True)
+            self._table.setFocus()
+            selection = self._table.selectionModel()
+            index = QItemSelection()
+            if len(ind) > 0:
+                for i in ind:
+                    index.append(QItemSelectionRange(self._table.model().index(i, 0)))
+            selection.select(
+                index,
+                QItemSelectionModel.Rows |
+                QItemSelectionModel.ClearAndSelect |
+                QItemSelectionModel.Select
+            )
+
+            if len(ind) > 0:
+                self._table.scrollTo(self._table.model().index(ind[-1], 0))
+            self._table.blockSignals(False)
+
+    def _select_range_in_table(self, ind1, ind2):
+        if self._table is not None:
+            self._table.blockSignals(True)
+            self._table.setFocus()
+            selection = self._table.selectionModel()
+            index = QItemSelection(self._table.model().index(ind1, 0),
+                                   self._table.model().index(ind2, 0))
+            selection.select(
+                index,
+                QItemSelectionModel.Rows |
+                QItemSelectionModel.ClearAndSelect |
+                QItemSelectionModel.Select
+            )
+            self._table.scrollTo(self._table.model().index(ind2, 0))
+            self._table.blockSignals(False)
+
     @timer
     def draw(self):
         self.init_axes()
@@ -118,8 +181,7 @@ class PlotKPZ(PamhyrPlot):
             return
 
         self.draw_z_line()
-        self.draw_z_line_highlight()
-        self.draw_current()
+        self.draw_lr()
         self.draw_gl()
         self.draw_bottom()
         self.draw_profiles_hs(self._data)
@@ -132,77 +194,60 @@ class PlotKPZ(PamhyrPlot):
         z_min = self.data.get_z_min()
         z_max = self.data.get_z_max()
 
+        self._colors, self._style = self.color_hightlight()
+
         self.line_kp_zmin_zmax = self.canvas.axes.vlines(
             x=kp, ymin=z_min, ymax=z_max,
-            color=self.color_plot,
+            color=self._colors,
+            linestyle = self._style,
             lw=1.,
-            picker=10
+            picker=10,
         )
 
-    def draw_z_line_highlight(self):
-        if self._highlight_data is not None:
-            kp = self.data.get_kp_complete_profiles()
-            z_min = self.data.get_z_min()
-            z_max = self.data.get_z_max()
-
-            kp_min, kp_max = self._highlight_data
-
-            indexes = list(
-                map(
-                    lambda x: x[0],
-                    filter(
-                        lambda x: kp_min <= x[1] <= kp_max,
-                        enumerate(kp)
-                    )
-                )
-            )
-
-            def indexes_filter(data): return list(
-                map(
-                    lambda x: x[1],
-                    filter(
-                        lambda x: x[0] in indexes,
-                        enumerate(data)
-                    )
-                )
-            )
-
-            ikp = indexes_filter(kp)
-            imin = indexes_filter(z_min)
-            imax = indexes_filter(z_max)
-
-            self.line_kp_zmin_zmax_highlight = self.canvas.axes.vlines(
-                x=ikp,
-                ymin=imin, ymax=imax,
-                color=self.color_plot_highlight,
-                lw=1.
+    def color_hightlight(self):
+        rows = list(
+            set(
+                (i.row() for i in self.parent.tableView.selectedIndexes())
             )
-
-    def draw_current(self):
-        kp = self.data.get_kp_complete_profiles()
-        z_min = self.data.get_z_min()
-        z_max = self.data.get_z_max()
-
-        self.plot_selected, = self.canvas.axes.plot(
-            (kp[0], kp[0]),
-            (z_min[0], z_max[0]),
-            color=self.color_plot_current, lw=1.5
         )
-        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=self.color_plot_previous, lw=1.5, linestyle='--'
+        colors = [self.color_plot for row in range(len(self._data))]
+        style = ["-" for row in range(len(self._data))]
+        if len(rows) >0:
+            for row in rows:
+                colors[row] = self.color_plot_current
+            if rows[0] > 0:
+                colors[rows[0]-1] = self.color_plot_previous
+                style[rows[0]-1] = "--"
+            if rows[-1] < len(self._data)-1:
+                colors[rows[-1]+1] = self.color_plot_next
+                style[rows[-1]+1] = "--"
+        return colors, style
+
+    def draw_lr(self):
+        kp = self.data.get_kp_complete_profiles()
+        lz = []
+        rz = []
+
+        self.line_lr = []
+        for z in self.data.get_z():
+            lz.append(z[0])
+            rz.append(z[-1])
+
+        line = self.canvas.axes.plot(
+            kp, lz,
+            color=self.color_plot_river_bottom,
+            linestyle="dotted",
+            lw=1.,
         )
-        self.before_plot_selected.set_visible(False)
+        self.line_lr.append(line)
 
-        self.after_plot_selected, = self.canvas.axes.plot(
-            (kp[0], kp[0]),
-            (z_min[0], z_max[0]),
-            color=self.color_plot_next, lw=1.5, linestyle='--'
+        line = self.canvas.axes.plot(
+            kp, rz,
+            color=self.color_plot_river_bottom,
+            linestyle="dotted",
+            lw=1.,
         )
-        self.after_plot_selected.set_visible(False)
+        self.line_lr.append(line)
 
     def draw_gl(self):
         kp = self.data.get_kp_complete_profiles()
@@ -270,6 +315,7 @@ class PlotKPZ(PamhyrPlot):
             self.draw()
             return
 
+        self.update_lr()
         self.update_gl()
         self.update_current()
 
@@ -277,52 +323,9 @@ class PlotKPZ(PamhyrPlot):
 
     def update_current(self):
         if self._current_data_update:
-            ind = self._current_data
-            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:
-                profile = self.data.profile(before)
-                if len(profile) > 0:
-                    kp_i = profile.kp
-                    z_min_i = profile.z_min()
-                    z_max_i = profile.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:
-                profile = self.data.profile(ind)
-                if len(profile) > 0:
-                    kp_i = profile.kp
-                    z_min_i = profile.z_min()
-                    z_max_i = profile.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:
-                profile = self.data.profile(after)
-                if len(profile) > 0:
-                    kp_i = profile.kp
-                    z_min_i = profile.z_min()
-                    z_max_i = profile.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._colors, self._style = self.color_hightlight()
+            self.line_kp_zmin_zmax.set_colors(self._colors)
+            self.line_kp_zmin_zmax.set_linestyle(self._style)
 
     def update_gl(self):
         if self._current_data_update:
@@ -334,12 +337,19 @@ class PlotKPZ(PamhyrPlot):
 
         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.
-        )
+        # TODO comprendre à quoi sert ce bout de code
+        # ========>
+        #self.line_kp_zmin_zmax.remove()
+        #self._colors, self._style = self.color_hightlight()
+        #self.line_kp_zmin_zmax = self.canvas.axes.vlines(
+            #x=kp,
+            #ymin=z_min,
+            #ymax=z_max,
+            #color=self._colors,
+            #linestyle = self._style,
+            #lw=1.
+        #)
+        # <========
 
         z_complete = self.data.get_guidelines_z()
         try:
@@ -349,3 +359,9 @@ class PlotKPZ(PamhyrPlot):
                 )
         except Exception as e:
             logger.warning(f"Failed to update graphic KPZ: {e}")
+
+    def update_lr(self):
+        for line in self.line_lr:
+            line[0].remove()
+
+        self.draw_lr()
diff --git a/src/View/Geometry/PlotXY.py b/src/View/Geometry/PlotXY.py
index b4d106e2411cb3fbd6d66dc7f61f8ad281e742d4..de2c4105fac865f25e7be99ad869ccb4f2c28883 100644
--- a/src/View/Geometry/PlotXY.py
+++ b/src/View/Geometry/PlotXY.py
@@ -55,7 +55,8 @@ class PlotXY(PamhyrPlot):
         self.parent=parent
         self.line_xy_collection = None
         self._table=table
-        self.colors = []
+        self._colors = []
+        self._style = []
 
     def onpick(self, event):
         if event.mouseevent.inaxes != self.canvas.axes:
@@ -175,7 +176,6 @@ class PlotXY(PamhyrPlot):
         self.draw_xy()
         self.draw_lr()
         self.draw_gl()
-        #self.draw_current()
 
         self.idle()
         self._init = True
@@ -186,9 +186,10 @@ class PlotXY(PamhyrPlot):
         for xy in zip(self.data.get_x(), self.data.get_y()):
             self.line_xy.append(np.column_stack(xy))
 
-        self.colors = self.color_hightlight()
+        self._colors, self._style = self.color_hightlight()
         self.line_xy_collection = collections.LineCollection(self.line_xy,
-                                   colors = self.colors,
+                                   colors = self._colors,
+                                   linestyle = self._style,
                                    picker=10)
         self.canvas.axes.add_collection(self.line_xy_collection)
 
@@ -198,16 +199,18 @@ class PlotXY(PamhyrPlot):
                 (i.row() for i in self.parent.tableView.selectedIndexes())
             )
         )
-        colors = [self.color_plot for row in range(len(self.line_xy))]
+        colors = [self.color_plot for row in range(len(self._data))]
+        style = ["-" for row in range(len(self._data))]
         if len(rows) >0:
             for row in rows:
                 colors[row] = self.color_plot_current
             if rows[0] > 0:
                 colors[rows[0]-1] = self.color_plot_previous
-            if rows[-1] < len(self.line_xy)-1:
+                style[rows[0]-1] = "--"
+            if rows[-1] < len(self._data)-1:
                 colors[rows[-1]+1] = self.color_plot_next
-        return colors
-
+                style[rows[-1]+1] = "--"
+        return colors, style
 
     def draw_lr(self):
         lx = []
@@ -309,8 +312,9 @@ class PlotXY(PamhyrPlot):
 
     def update_current(self):
         if self._current_data_update:
-            self.colors = self.color_hightlight()
-            self.line_xy_collection.set_colors(self.colors)
+            self._colors, self._style = self.color_hightlight()
+            self.line_xy_collection.set_colors(self._colors)
+            self.line_xy_collection.set_linestyle(self._style)
 
     def update_lr(self):
         for line in self.line_lr:
diff --git a/src/View/Geometry/Window.py b/src/View/Geometry/Window.py
index 830f1ded262b56cd03ee7b8f9de668b9b45fe0ca..0f3891ca2b8e9ec6411035e4fbba1f9119bd8944 100644
--- a/src/View/Geometry/Window.py
+++ b/src/View/Geometry/Window.py
@@ -385,6 +385,7 @@ class GeometryWindow(PamhyrWindow):
             data=self._reach,
             trad=self._trad,
             toolbar=self._toolbar_kpc,
+            table=self.find(QTableView, "tableView"),
             parent=self
         )
         self._plot_kpc.draw()