diff --git a/soitool/codebook.py b/soitool/codebook_model_view.py
similarity index 100%
rename from soitool/codebook.py
rename to soitool/codebook_model_view.py
diff --git a/soitool/codebook_row_adder.py b/soitool/codebook_row_adder.py
index cac0fe8603ff8df87e4eb8aa44da0ee71c66544f..2372001b36cba575590b9c77fb94c61771d51479 100644
--- a/soitool/codebook_row_adder.py
+++ b/soitool/codebook_row_adder.py
@@ -11,7 +11,7 @@ from PySide2.QtWidgets import (
 )
 from PySide2.QtCore import Qt
 from soitool.database import Database
-from soitool.codebook import CodeBookTableView, CodeBookTableModel
+from soitool.codebook_model_view import CodeBookTableModel, CodeBookTableView
 
 
 class CodebookRowAdder(QWidget):
diff --git a/soitool/codebook_widget.py b/soitool/codebook_widget.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f418daad940e50385f76b342dd6f3f021c13647
--- /dev/null
+++ b/soitool/codebook_widget.py
@@ -0,0 +1,29 @@
+"""Module containing a widget for viewing and editing codebook."""
+from PySide2.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout
+from soitool.codebook_model_view import CodeBookTableView
+from soitool.codebook_row_adder import CodebookRowAdder
+
+
+class CodebookWidget(QWidget):
+    """Widget for viewing and editing codebook."""
+
+    def __init__(self):
+        super().__init__()
+
+        # Create widgets
+        self.view = CodeBookTableView()
+        self.row_adder = CodebookRowAdder()
+
+        self.create_and_set_layouts()
+
+    def create_and_set_layouts(self):
+        """Create layouts, add widgets and set layout."""
+        # Add widgets to layouts
+        vbox = QVBoxLayout()
+        vbox.addWidget(self.row_adder)
+        vbox.addWidget(self.view)
+        hbox = QHBoxLayout()
+        hbox.addLayout(vbox)
+
+        # Set layout
+        self.setLayout(hbox)
diff --git a/soitool/main_window.py b/soitool/main_window.py
index bfb194a5b29ae3d3c1fb4d7bb474714a41fc4c5c..eb093b0c53146a7b21dd6c050d092e1776c0f1f2 100644
--- a/soitool/main_window.py
+++ b/soitool/main_window.py
@@ -8,21 +8,18 @@ from enum import Enum
 from functools import partial
 from PySide2.QtWidgets import (
     QTabWidget,
-    QWidget,
     QMainWindow,
     QApplication,
-    QHBoxLayout,
-    QVBoxLayout,
     QAction,
     QFileDialog,
 )
 from PySide2.QtGui import QIcon
 from PySide2.QtCore import QTimer
 from soitool.soi_workspace_widget import SOIWorkspaceWidget
-from soitool.codebook import CodeBookTableView
-from soitool.codebook_row_adder import CodebookRowAdder
 from soitool.codebook_to_pdf import generate_codebook_pdf
 from soitool.dialog_wrappers import exec_info_dialog
+from soitool.codebook_widget import CodebookWidget
+from soitool.codebook_model_view import CodeBookTableModel
 from soitool.database import Database, DBPATH
 from soitool.serialize_export_import_soi import (
     export_soi,
@@ -57,9 +54,7 @@ class MainWindow(QMainWindow):
         self.timer.setInterval(
             self.database.seconds_to_next_update(60 * 60 * 24) * 1000
         )
-        self.timer.timeout.connect(
-            lambda: self.database.update_codebook_auto(self.timer)
-        )
+        self.timer.timeout.connect(partial(self.regenerate_codes, auto=True))
         self.timer.start()
 
         # Add SOIWorkspaceWidget-tab
@@ -147,7 +142,7 @@ class MainWindow(QMainWindow):
         # Regenerate codebook-codes:
         regenerate_codes = QAction("Nye koder i db", self)
         regenerate_codes.setStatusTip("Nye koder lages tilfeldig")
-        regenerate_codes.triggered.connect(self.database.update_codebook)
+        regenerate_codes.triggered.connect(self.regenerate_codes)
         codebook_menu.addAction(regenerate_codes)
 
         # Export codebook as PDF
@@ -192,20 +187,7 @@ class MainWindow(QMainWindow):
                 break
         # Codebook-tab does not exist, create, add and select tab
         else:
-            # Create widgets
-            tab = QWidget()
-            view = CodeBookTableView(self.database)
-            row_adder = CodebookRowAdder(view)
-
-            # Add widgets to layouts
-            vbox = QVBoxLayout()
-            vbox.addWidget(row_adder)
-            vbox.addWidget(view)
-            hbox = QHBoxLayout()
-            hbox.addLayout(vbox)
-
-            # Set layout, add tab and select tab
-            tab.setLayout(hbox)
+            tab = CodebookWidget()
             self.tabs.addTab(tab, "Kodebok")
             self.tabs.setCurrentWidget(tab)
 
@@ -256,6 +238,34 @@ class MainWindow(QMainWindow):
             self.tabs.addTab(tab, soi.title)
             self.tabs.setCurrentWidget(tab)
 
+    def regenerate_codes(self, auto=False):
+        """Regenerate codebook-codes and update codebook-tab if open.
+
+        Parameters
+        ----------
+        auto : bool, optional
+            True if self.timer called this function, by default False.
+        """
+        if auto:
+
+            def regenerate():
+                self.database.update_codebook_auto(self.timer)
+
+        else:
+
+            def regenerate():
+                self.database.update_codebook()
+
+        for i in range(self.tabs.count()):
+            if self.tabs.tabText(i) == "Kodebok":
+                view = self.tabs.widget(i).view
+                view.setModel(None)
+                regenerate()
+                view.setModel(CodeBookTableModel())
+                break
+        else:
+            regenerate()
+
 
 if __name__ == "__main__":