diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py
index 4eeb522532718c5af99ef064bede44d4d24a84b0..d77e2498d96dd71c65666c9805c8ed5a033d3ff1 100644
--- a/src/Model/InitialConditions/InitialConditions.py
+++ b/src/Model/InitialConditions/InitialConditions.py
@@ -266,6 +266,9 @@ class InitialConditions(SQLSubModel):
     def __len__(self):
         return len(self._data)
 
+    def lst(self):
+        return self._data
+
     @property
     def reach(self):
         return self._reach
@@ -295,6 +298,15 @@ class InitialConditions(SQLSubModel):
         self._data.insert(index, n)
         self._status.modified()
 
+    def new_from_data(self, kp, discharge, elevation):
+        n = Data(reach=self._reach, status=self._status)
+
+        n['kp'] = kp
+        n['discharge'] = discharge
+        n['elevation'] = elevation
+
+        return n
+
     def insert(self, index, data):
         self._data.insert(index, data)
         self._status.modified()
diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py
index ee67a8acdd7f0d959b6cf8dcf94a33076159d510..9144a809878ea35a16f0fb78cb4beb238879574e 100644
--- a/src/View/InitialConditions/Table.py
+++ b/src/View/InitialConditions/Table.py
@@ -197,7 +197,7 @@ class InitialConditionTableModel(PamhyrTableModel):
         self.endMoveRows()
         self.layoutChanged.emit()
 
-    def move_down(self, index, parent=QModelIndex()):
+    def move_down(self, row, parent=QModelIndex()):
         if row > len(self._lst):
             return
 
@@ -214,6 +214,36 @@ class InitialConditionTableModel(PamhyrTableModel):
         self.endMoveRows()
         self.layoutChanged.emit()
 
+    def paste(self, index, header, data):
+        if len(header) != 0:
+            logger.error("Unexpected header in IC past data")
+            return
+
+        if len(data) == 0:
+            logger.error("Empty data")
+            return
+
+        if len(data[0]) != 3:
+            logger.error(f"Unexpected data size: [{data[0]}, ...]")
+            return
+
+        self.layoutAboutToBeChanged.emit()
+
+        self._undo.push(
+            PasteCommand(
+                self._lst, index,
+                list(
+                    map(
+                        lambda d: self._lst.new_from_data(*d),
+                        data
+                    )
+                )
+            )
+        )
+
+        self.layoutAboutToBeChanged.emit()
+        self.layoutChanged.emit()
+
     def undo(self):
         self._undo.undo()
         self.layoutChanged.emit()
diff --git a/src/View/InitialConditions/Window.py b/src/View/InitialConditions/Window.py
index 74262f5a5a307748029042f51111e7f293e8ceb3..78532521b430972427d8f33cd84590b2c4a3be99 100644
--- a/src/View/InitialConditions/Window.py
+++ b/src/View/InitialConditions/Window.py
@@ -18,7 +18,7 @@
 
 import logging
 
-from tools import trace, timer
+from tools import trace, timer, logger_exception
 
 from View.Tools.PamhyrWindow import PamhyrWindow
 
@@ -241,11 +241,49 @@ class InitialConditionsWindow(PamhyrWindow):
         self._update()
 
     def _copy(self):
-        logger.info("TODO: copy")
-        self._update()
+        rows = list(
+            map(
+                lambda row: row.row(),
+                self.tableView.selectionModel().selectedRows()
+            )
+        )
+
+        table = list(
+            map(
+                lambda eic: list(
+                    map(
+                        lambda k: eic[1][k],
+                        ["kp", "discharge", "elevation"]
+                    )
+                ),
+                filter(
+                    lambda eic: eic[0] in rows,
+                    enumerate(self._ics.lst())
+                )
+            )
+        )
+
+        self.copyTableIntoClipboard(table)
 
     def _paste(self):
-        logger.info("TODO: paste")
+        header, data = self.parseClipboardTable()
+
+        if len(data) + len(header) == 0:
+            return
+
+        logger.debug(
+            "IC: Paste: " +
+            f"header = {header}, " +
+            f"data = {data}"
+        )
+
+        try:
+            row = 0 if len(self._ics.lst()) == 0 else self.index_selected_row()
+            # self._table.paste(row, header, data)
+            self._table.paste(row, [], data)
+        except Exception as e:
+            logger_exception(e)
+
         self._update()
 
     def _undo(self):