diff --git a/src/plotmenu.cpp b/src/plotmenu.cpp
new file mode 100644
--- /dev/null
+++ b/src/plotmenu.cpp
@@ -0,0 +1,224 @@
+/*
+  Copyright © 2017 Hasan Yavuz Özderya
+
+  This file is part of serialplot.
+
+  serialplot is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  serialplot is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with serialplot.  If not, see .
+*/
+
+#include "plotmenu.h"
+#include "setting_defines.h"
+#include "utils.h"
+
+PlotMenu::PlotMenu(QWidget* parent) :
+    QMenu(tr("&View"), parent),
+    showGridAction("&Grid", this),
+    showMinorGridAction("&Minor Grid", this),
+    unzoomAction("&Unzoom", this),
+    darkBackgroundAction("&Dark Background", this),
+    showLegendAction("&Legend", this),
+    showMultiAction("Multi &Plot", this),
+    setSymbolsAction("&Symbols", this),
+    setSymbolsAutoAct("Show When &Zoomed", this),
+    setSymbolsShowAct("Always &Show", this),
+    setSymbolsHideAct("Always &Hide", this)
+{
+    showGridAction.setToolTip("Show Grid");
+    showMinorGridAction.setToolTip("Show Minor Grid");
+    unzoomAction.setToolTip("Unzoom the Plot");
+    darkBackgroundAction.setToolTip("Enable Dark Plot Background");
+    showLegendAction.setToolTip("Display the Legend on Plot");
+    showMultiAction.setToolTip("Display All Channels Separately");
+    setSymbolsAction.setToolTip("Show/Hide symbols");
+
+    showGridAction.setShortcut(QKeySequence("G"));
+    showMinorGridAction.setShortcut(QKeySequence("M"));
+
+    showGridAction.setCheckable(true);
+    showMinorGridAction.setCheckable(true);
+    darkBackgroundAction.setCheckable(true);
+    showLegendAction.setCheckable(true);
+    showMultiAction.setCheckable(true);
+
+    showGridAction.setChecked(false);
+    showMinorGridAction.setChecked(false);
+    darkBackgroundAction.setChecked(false);
+    showLegendAction.setChecked(true);
+    showMultiAction.setChecked(false);
+
+    // minor grid is only enabled when _major_ grid is enabled
+    showMinorGridAction.setEnabled(false);
+    connect(&showGridAction, SELECT::OVERLOAD_OF(&QAction::triggered),
+            &showMinorGridAction, &QAction::setEnabled);
+
+    // setup set symbols menu
+    setSymbolsMenu.addAction(&setSymbolsAutoAct);
+    setSymbolsAutoAct.setCheckable(true);
+    setSymbolsAutoAct.setChecked(true);
+    connect(&setSymbolsAutoAct, SELECT::OVERLOAD_OF(&QAction::triggered),
+            [this](bool checked)
+            {
+                if (checked) emit symbolShowChanged(Plot::ShowSymbolsAuto);
+            });
+
+    setSymbolsMenu.addAction(&setSymbolsShowAct);
+    setSymbolsShowAct.setCheckable(true);
+    connect(&setSymbolsShowAct, SELECT::OVERLOAD_OF(&QAction::triggered),
+            [this](bool checked)
+            {
+                if (checked) symbolShowChanged(Plot::ShowSymbolsShow);
+            });
+
+    setSymbolsMenu.addAction(&setSymbolsHideAct);
+    setSymbolsHideAct.setCheckable(true);
+    connect(&setSymbolsHideAct, SELECT::OVERLOAD_OF(&QAction::triggered),
+            [this](bool checked)
+            {
+                if (checked) symbolShowChanged(Plot::ShowSymbolsHide);
+            });
+
+    // add symbol actions to same group so that they appear as radio buttons
+    auto group = new QActionGroup(this);
+    group->addAction(&setSymbolsAutoAct);
+    group->addAction(&setSymbolsShowAct);
+    group->addAction(&setSymbolsHideAct);
+
+    setSymbolsAction.setMenu(&setSymbolsMenu);
+
+    // add all actions to create this menu
+    addAction(&showGridAction);
+    addAction(&showMinorGridAction);
+    addAction(&unzoomAction);
+    addAction(&darkBackgroundAction);
+    addAction(&showLegendAction);
+    addAction(&showMultiAction);
+    addAction(&setSymbolsAction);
+}
+
+PlotMenu::PlotMenu(PlotViewSettings s, QWidget* parent) :
+    PlotMenu(parent)
+{
+    showGridAction.setChecked(s.showGrid);
+    showMinorGridAction.setChecked(s.showMinorGrid);
+    darkBackgroundAction.setChecked(s.darkBackground);
+    showLegendAction.setChecked(s.showLegend);
+    showMultiAction.setChecked(s.showMulti);
+    switch (s.showSymbols)
+    {
+        case Plot::ShowSymbolsAuto:
+             setSymbolsAutoAct.setChecked(true);
+            break;
+        case Plot::ShowSymbolsShow:
+            setSymbolsShowAct.setChecked(true);
+            break;
+        case Plot::ShowSymbolsHide:
+            setSymbolsHideAct.setChecked(true);
+            break;
+    }
+}
+
+PlotViewSettings PlotMenu::viewSettings() const
+{
+    return PlotViewSettings(
+        {
+            showGridAction.isChecked(),
+            showMinorGridAction.isChecked(),
+            darkBackgroundAction.isChecked(),
+            showLegendAction.isChecked(),
+            showMultiAction.isChecked(),
+            showSymbols()
+        });
+}
+
+Plot::ShowSymbols PlotMenu::showSymbols() const
+{
+    if (setSymbolsAutoAct.isChecked())
+    {
+        return Plot::ShowSymbolsAuto;
+    }
+    else if (setSymbolsShowAct.isChecked())
+    {
+        return Plot::ShowSymbolsShow;
+    }
+    else // setSymbolsHideAct.isChecked()
+    {
+        return Plot::ShowSymbolsHide;
+    }
+}
+
+void PlotMenu::saveSettings(QSettings* settings)
+{
+    settings->beginGroup(SettingGroup_Plot);
+    settings->setValue(SG_Plot_DarkBackground, darkBackgroundAction.isChecked());
+    settings->setValue(SG_Plot_Grid, showGridAction.isChecked());
+    settings->setValue(SG_Plot_MinorGrid, showMinorGridAction.isChecked());
+    settings->setValue(SG_Plot_Legend, showLegendAction.isChecked());
+    settings->setValue(SG_Plot_MultiPlot, showMultiAction.isChecked());
+
+    QString showSymbolsStr;
+    if (showSymbols() == Plot::ShowSymbolsAuto)
+    {
+        showSymbolsStr = "auto";
+    }
+    else if (showSymbols() == Plot::ShowSymbolsShow)
+    {
+        showSymbolsStr = "show";
+    }
+    else
+    {
+        showSymbolsStr = "hide";
+    }
+    settings->setValue(SG_Plot_Symbols, showSymbolsStr);
+
+    settings->endGroup();
+}
+
+void PlotMenu::loadSettings(QSettings* settings)
+{
+    settings->beginGroup(SettingGroup_Plot);
+    darkBackgroundAction.setChecked(
+        settings->value(SG_Plot_DarkBackground, darkBackgroundAction.isChecked()).toBool());
+    showGridAction.setChecked(
+        settings->value(SG_Plot_Grid, showGridAction.isChecked()).toBool());
+    showMinorGridAction.setChecked(
+        settings->value(SG_Plot_MinorGrid, showMinorGridAction.isChecked()).toBool());
+    showMinorGridAction.setEnabled(showGridAction.isChecked());
+    showLegendAction.setChecked(
+        settings->value(SG_Plot_Legend, showLegendAction.isChecked()).toBool());
+    showMultiAction.setChecked(
+        settings->value(SG_Plot_MultiPlot, showMultiAction.isChecked()).toBool());
+
+    QString showSymbolsStr = settings->value(SG_Plot_Symbols, QString()).toString();
+    if (showSymbolsStr == "auto")
+    {
+        // setSymbols(Plot::ShowSymbolsAuto);
+        setSymbolsAutoAct.setChecked(true);
+    }
+    else if (showSymbolsStr == "show")
+    {
+        // setSymbols(Plot::ShowSymbolsShow);
+        setSymbolsShowAct.setChecked(true);
+    }
+    else if (showSymbolsStr == "hide")
+    {
+        // setSymbols(Plot::ShowSymbolsHide);
+        setSymbolsHideAct.setChecked(true);
+    }
+    else
+    {
+        qCritical() << "Invalid symbol setting:" << showSymbolsStr;
+    }
+
+    settings->endGroup();
+}