diff --git a/src/configPanel.cpp b/src/configPanel.cpp
index f9670a5a18a8dbc85ae4aefe86d3d229c1dae7ee..a78de029e004987c16d41c6199874ca612d8338c 100644
--- a/src/configPanel.cpp
+++ b/src/configPanel.cpp
@@ -45,9 +45,13 @@ ConfigPanel::ConfigPanel(QWidget* parent) : QDockWidget{parent}
     fileLine = new QLineEdit();
     fileLine->setPlaceholderText("/path/to/yourFile.csv");
     fileWidget->layout()->addWidget(fileLine);
-    fileGenerateButton = new QPushButton("Preview");
+    auto fileGenerateButton = new QPushButton("Preview");
     fileLayout->addWidget(fileGenerateButton);
+    auto fileLockButton = new QPushButton("Lock");
+    fileLayout->addWidget(fileLockButton);
+    lockButtons.push_back(fileLockButton);
     fileLayout->addStretch();
+    connect(fileGenerateButton, &QPushButton::clicked, this, &ConfigPanel::previewButtonClicked);
     connect(openButton, &QPushButton::clicked, this, &ConfigPanel::onOpenButton);
 
     randomWidget = new QWidget();
@@ -58,9 +62,13 @@ ConfigPanel::ConfigPanel(QWidget* parent) : QDockWidget{parent}
     randomLayout->setContentsMargins(0, 0, 0, 0);
     problemSizeBox = new QSpinBox();
     randomLayout->addWidget(problemSizeBox);
-    randomGenerateButton = new QPushButton("Preview");
+    auto randomGenerateButton = new QPushButton("Preview");
     randomLayout->addWidget(randomGenerateButton);
+    auto randomLockButton = new QPushButton("Lock");
+    randomLayout->addWidget(randomLockButton);
+    lockButtons.push_back(randomLockButton);
     randomLayout->addStretch();
+    connect(randomGenerateButton, &QPushButton::clicked, this, &ConfigPanel::previewButtonClicked);
 
     problemSizeBox->setMinimum(1);
     problemSizeBox->setMaximum(INT_MAX);
@@ -77,11 +85,20 @@ ConfigPanel::ConfigPanel(QWidget* parent) : QDockWidget{parent}
     pasteBox->setMinimumHeight(25);
     pasteBox->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
 
-    pasteGenerateButton = new QPushButton("Preview");
+    auto pasteGenerateButton = new QPushButton("Preview");
     pasteLayout->addWidget(pasteGenerateButton);
+    auto pasteLockButton = new QPushButton("Lock");
+    pasteLayout->addWidget(pasteLockButton);
+    lockButtons.push_back(pasteLockButton);
     pasteLayout->addStretch();
+    connect(pasteGenerateButton, &QPushButton::clicked, this, &ConfigPanel::previewButtonClicked);
 
     stackedWidget->setCurrentWidget(pasteWidget);
+
+    for (auto &&button : lockButtons)
+    {
+        connect(button, &QPushButton::clicked, this, lockButtonClicked);
+    }
 }
 
 void ConfigPanel::setRunning(bool running)
@@ -100,18 +117,26 @@ void ConfigPanel::setRunning(bool running)
 
 void ConfigPanel::setGenLocked()
 {
-    randomGenerateButton->setEnabled(false);
-    randomGenerateButton->setText("Generated");
-    fileGenerateButton->setEnabled(false);
-    fileGenerateButton->setText("Generated");
+    for (auto &&button : lockButtons)
+    {
+        button->setText("Unlock");
+    }
+    problemSizeBox->setDisabled(true);
+    fileLine->setDisabled(true);
+    openButton->setDisabled(true);
+    pasteBox->setDisabled(true);
 }
 
 void ConfigPanel::setGenUnlocked()
 {
-    randomGenerateButton->setEnabled(true);
-    randomGenerateButton->setText("Generate");
-    fileGenerateButton->setEnabled(true);
-    fileGenerateButton->setText("Generate");
+    for (auto &&button : lockButtons)
+    {
+        button->setText("Lock");
+    }
+    problemSizeBox->setDisabled(false);
+    fileLine->setDisabled(false);
+    openButton->setDisabled(false);
+    pasteBox->setDisabled(false);
 }
 
 void ConfigPanel::onOpenButton()
diff --git a/src/configPanel.h b/src/configPanel.h
index 05cefdf9c8847c164bafd6d8e8277225c9eeca7e..c8e3513cce99c7427b7df8af55455bf714470ee0 100644
--- a/src/configPanel.h
+++ b/src/configPanel.h
@@ -14,12 +14,12 @@ class ConfigPanel : public QDockWidget
 {
     Q_OBJECT
 
+private:
+    std::vector<QPushButton*> lockButtons;
+
 public:
     QPushButton*    runButton;
     QPushButton*    openButton;
-    QPushButton*    randomGenerateButton;
-    QPushButton*    fileGenerateButton;
-    QPushButton*    pasteGenerateButton;
     QLineEdit*      fileLine;
     QPlainTextEdit* pasteBox;
     QComboBox*      algoBox;
@@ -40,6 +40,10 @@ public slots:
     void setRunning(bool running);
     void setGenLocked();
     void setGenUnlocked();
+
+signals:
+    void previewButtonClicked();
+    void lockButtonClicked();
 };
 
 #endif // CONFIGPANEL_H
diff --git a/src/control.cpp b/src/control.cpp
index 92bdd58d3e80612b584c681adfec70e7798a6a42..d58979ef1b079ce7dac1fb4d4c69d22ac29b1f58 100644
--- a/src/control.cpp
+++ b/src/control.cpp
@@ -45,11 +45,8 @@ void Control::makeConnections()
     connect(cc, &CuteControl::s_undo, this, &Control::undo);
     connect(this, &Control::endThread, cc, &CuteControl::end);
     connect(w->configPanel->runButton, &QPushButton::clicked, this, &Control::onRunButton);
-    connect(w->configPanel->fileGenerateButton, &QPushButton::clicked, this, &Control::onGenerateButton);
-    connect(w->configPanel->randomGenerateButton, &QPushButton::clicked, this, &Control::onGenerateButton);
-    connect(w->configPanel->pasteGenerateButton, &QPushButton::clicked, this, &Control::onGenerateButton);
-    connect(w->configPanel->fileLine, &QLineEdit::textChanged, this, &Control::onProblemSettingChanged);
-    connect(w->configPanel->problemSizeBox, &QSpinBox::textChanged, this, &Control::onProblemSettingChanged);
+    connect(w->configPanel, &ConfigPanel::previewButtonClicked, this, &Control::onPreviewButton);
+    connect(w->configPanel, &ConfigPanel::lockButtonClicked, this, &Control::onLockButton);
     connect(w, &MainWindow::saveProblem, this, &Control::saveProblem);
     connect(w->cm, &ChartMenu::s_setPlotScale, this, &Control::setPlotScale);
     connect(cc, &CuteControl::s_verbosityChanged, w, &MainWindow::changeVerbosity);
@@ -306,17 +303,29 @@ void Control::generateProblem()
     }
 }
 
-void Control::onGenerateButton()
+void Control::onPreviewButton()
 {
-    generateProblem();
-    problemRetained = true;
-    w->configPanel->setGenLocked();
+    if (!threadRunning)
+    {
+        resetPlot(0);
+        CuteControl::get().plotPoints(getProblem(), 0, {});
+    }
 }
 
-void Control::onProblemSettingChanged([[maybe_unused]] const QString& text)
+void Control::onLockButton()
 {
-    problemRetained = false;
-    w->configPanel->setGenUnlocked();
+    if (problemRetained)
+    {
+        problemRetained = false;
+        w->configPanel->setGenUnlocked();
+    }
+    else
+    {
+        if (problem.empty())
+            generateProblem();
+        problemRetained = true;
+        w->configPanel->setGenLocked();
+    }
 }
 
 void Control::plotXYSeries(QtCharts::QXYSeries* s, int plot, bool onTop, bool legend, QString tooltip)
@@ -578,6 +587,8 @@ void Control::redrawOnTopSeries(int plot)
 {
     for (auto s : onTopSeries[plot])
     {
+        QtCharts::QLegendMarker* legendMarker = w->charts[plot]->legend()->markers(s)[0];
+        bool legendVisible = legendMarker->isVisible();
         w->charts[plot]->removeSeries(s);
         w->charts[plot]->addSeries(s);
         auto axes = w->charts[plot]->axes();
@@ -585,6 +596,8 @@ void Control::redrawOnTopSeries(int plot)
         {
             s->attachAxis(axis);
         }
+        legendMarker = w->charts[plot]->legend()->markers(s)[0];
+        legendMarker->setVisible(legendVisible);
     };
 }
 
diff --git a/src/control.h b/src/control.h
index e28da5baead22c6da91595a49b612f42522fc38a..d191db4ec99e364852fd69a6d604b6c007187f21 100644
--- a/src/control.h
+++ b/src/control.h
@@ -56,10 +56,10 @@ public slots:
     void setAxisTitles(int plot, QString x, QString y);
     void setAxisVisible(int plot, bool x, bool y);
     void onRunButton();
-    void onGenerateButton();
+    void onPreviewButton();
     void setProblemSize(int n);
     void setProblemFile(QString path);
-    void onProblemSettingChanged(const QString& text);
+    void onLockButton();
     void plotXYSeries(QtCharts::QXYSeries* s, int plot, bool onTop, bool legend, QString tooltip = "");
     void plotBarSeries(QtCharts::QBarSeries* series, int plot, bool onTop, bool legend);
     void highlightValue(float value, int plot, QColor c);