diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,6 +89,8 @@ add_executable(${PROGRAM_NAME} WIN32
   src/dataformatpanel.cpp
   src/tooltipfilter.cpp
   src/sneakylineedit.cpp
+  src/channelmanager.cpp
+  src/framebufferseries.cpp
   misc/windows_icon.rc
   ${UI_FILES}
   ${RES_FILES}
diff --git a/serialplot.pro b/serialplot.pro
--- a/serialplot.pro
+++ b/serialplot.pro
@@ -52,7 +52,9 @@ SOURCES += \
     src/commandedit.cpp \
     src/dataformatpanel.cpp \
     src/tooltipfilter.cpp \
-    src/sneakylineedit.cpp
+    src/sneakylineedit.cpp \
+    src/channelmanager.cpp \
+    src/framebufferseries.cpp
 
 HEADERS += \
     src/mainwindow.h \
@@ -75,7 +77,9 @@ HEADERS += \
     src/commandedit.h \
     src/dataformatpanel.h \
     src/tooltipfilter.h \
-    src/sneakylineedit.h
+    src/sneakylineedit.h \
+    src/channelmanager.h \
+    src/framebufferseries.h
 
 FORMS += \
     src/mainwindow.ui \
diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp
new file mode 100644
--- /dev/null
+++ b/src/channelmanager.cpp
@@ -0,0 +1,145 @@
+/*
+  Copyright © 2016 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 "channelmanager.h"
+
+#include 
+#include 
+
+ChannelManager::ChannelManager(unsigned numberOfChannels, unsigned numberOfSamples, QObject *parent) :
+    QObject(parent)
+{
+    _numOfChannels = numberOfChannels;
+    _numOfSamples = numberOfSamples;
+
+    QStringList channelNamesList;
+
+    for (unsigned int i = 0; i < numberOfChannels; i++)
+    {
+        channelBuffers.append(new FrameBuffer(numberOfSamples));
+        channelNamesList << QString("Channel %1").arg(i+1);
+    }
+
+    _channelNames.setStringList(channelNamesList);
+
+    connect(&_channelNames, &QStringListModel::dataChanged,
+            this, &ChannelManager::onChannelNameDataChange);
+}
+
+ChannelManager::~ChannelManager()
+{
+    for (auto buffer : channelBuffers)
+    {
+        delete buffer;
+    }
+}
+
+unsigned ChannelManager::numOfChannels()
+{
+    return channelBuffers.size();
+}
+
+unsigned ChannelManager::numOfSamples()
+{
+    return _numOfSamples;
+}
+
+void ChannelManager::setNumOfChannels(unsigned number)
+{
+    unsigned int oldNum = channelBuffers.size();
+
+    if (number > oldNum)
+    {
+        // add new channels
+        for (unsigned int i = 0; i < number - oldNum; i++)
+        {
+            channelBuffers.append(new FrameBuffer(_numOfSamples));
+            addChannelName(QString("Channel %1").arg(oldNum+i+1));
+        }
+    }
+    else if(number < oldNum)
+    {
+        // remove channels
+        for (unsigned int i = oldNum-1; i > number-1; i--)
+        {
+            delete channelBuffers.takeLast();
+            _channelNames.removeRow(i);
+        }
+    }
+
+    emit numOfChannelsChanged(number);
+}
+
+void ChannelManager::setNumOfSamples(unsigned number)
+{
+    _numOfSamples = number;
+
+    for (int ci = 0; ci < channelBuffers.size(); ci++)
+    {
+        channelBuffers[ci]->resize(_numOfSamples);
+    }
+
+    emit numOfSamplesChanged(number);
+}
+
+FrameBuffer* ChannelManager::channelBuffer(unsigned channel)
+{
+    return channelBuffers[channel];
+}
+
+QStringListModel* ChannelManager::channelNames()
+{
+    return &_channelNames;
+}
+
+QString ChannelManager::channelName(unsigned channel)
+{
+    return _channelNames.data(_channelNames.index(channel, 0), Qt::DisplayRole).toString();
+}
+
+void ChannelManager::setChannelName(unsigned channel, QString name)
+{
+    _channelNames.setData(_channelNames.index(channel, 0), QVariant(name), Qt::DisplayRole);
+}
+
+void ChannelManager::addChannelName(QString name)
+{
+    _channelNames.insertRow(_channelNames.rowCount());
+    setChannelName(_channelNames.rowCount()-1, name);
+}
+
+void ChannelManager::onChannelNameDataChange(const QModelIndex & topLeft,
+                                             const QModelIndex & bottomRight,
+                                             const QVector & roles)
+{
+    Q_UNUSED(roles);
+    int start = topLeft.row();
+    int end = bottomRight.row();
+
+    // TODO: maybe check `roles` parameter, can't think of a reason for current use case
+    for (int i = start; i <= end; i++)
+    {
+        emit channelNameChanged(i, channelName(i));
+    }
+}
+
+void ChannelManager::addChannelData(unsigned channel, double* data, unsigned size)
+{
+    channelBuffer(channel)->addSamples(data, size);
+}
diff --git a/src/channelmanager.h b/src/channelmanager.h
new file mode 100644
--- /dev/null
+++ b/src/channelmanager.h
@@ -0,0 +1,68 @@
+/*
+  Copyright © 2016 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 .
+*/
+
+#ifndef CHANNELMANAGER_H
+#define CHANNELMANAGER_H
+
+#include 
+#include 
+#include 
+#include 
+
+#include "framebuffer.h"
+
+class ChannelManager : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ChannelManager(unsigned numberOfChannels, unsigned numberOfSamples, QObject *parent = 0);
+    ~ChannelManager();
+
+    unsigned numOfChannels();
+    unsigned numOfSamples();
+    FrameBuffer* channelBuffer(unsigned channel);
+    QStringListModel* channelNames();
+    QString channelName(unsigned channel);
+
+signals:
+    void numOfChannelsChanged(unsigned value);
+    void numOfSamplesChanged(unsigned value);
+    void channelNameChanged(unsigned channel, QString name);
+
+public slots:
+    void setNumOfChannels(unsigned number);
+    void setNumOfSamples(unsigned number);
+    void setChannelName(unsigned channel, QString name);
+    void addChannelData(unsigned channel, double* data, unsigned size);
+
+private:
+    unsigned _numOfChannels;
+    unsigned _numOfSamples;
+    QList channelBuffers;
+    QStringListModel _channelNames;
+
+    void addChannelName(QString name); ///< appends a new channel name at the end of list
+
+private slots:
+    void onChannelNameDataChange(const QModelIndex & topLeft,
+                                 const QModelIndex & bottomRight,
+                                 const QVector & roles = QVector ());
+};
+
+#endif // CHANNELMANAGER_H
diff --git a/src/dataformatpanel.cpp b/src/dataformatpanel.cpp
--- a/src/dataformatpanel.cpp
+++ b/src/dataformatpanel.cpp
@@ -21,12 +21,13 @@
 #include "ui_dataformatpanel.h"
 
 #include 
+#include 
 
 #include "utils.h"
 #include "floatswap.h"
 
 DataFormatPanel::DataFormatPanel(QSerialPort* port,
-                                 QList* channelBuffers,
+                                 ChannelManager* channelMan,
                                  QWidget *parent) :
     QWidget(parent),
     ui(new Ui::DataFormatPanel)
@@ -34,7 +35,7 @@ DataFormatPanel::DataFormatPanel(QSerial
     ui->setupUi(this);
 
     serialPort = port;
-    _channelBuffers = channelBuffers;
+    _channelMan = channelMan;
     paused = false;
 
     // setup number format buttons
@@ -319,6 +320,6 @@ template double DataFormatPa
 void DataFormatPanel::addChannelData(unsigned int channel,
                                      double* data, unsigned size)
 {
-    (*_channelBuffers)[channel]->addSamples(data, size);
+    _channelMan->addChannelData(channel, data, size);
     sampleCount += size;
 }
diff --git a/src/dataformatpanel.h b/src/dataformatpanel.h
--- a/src/dataformatpanel.h
+++ b/src/dataformatpanel.h
@@ -28,6 +28,7 @@
 #include 
 
 #include "framebuffer.h"
+#include "channelmanager.h"
 
 namespace Ui {
 class DataFormatPanel;
@@ -39,7 +40,7 @@ class DataFormatPanel : public QWidget
 
 public:
     explicit DataFormatPanel(QSerialPort* port,
-                             QList* channelBuffers,
+                             ChannelManager* channelMan,
                              QWidget *parent = 0);
     ~DataFormatPanel();
 
@@ -77,7 +78,7 @@ private:
     QButtonGroup numberFormatButtons;
 
     QSerialPort* serialPort;
-    QList* _channelBuffers;
+    ChannelManager* _channelMan;
 
     unsigned int _numOfChannels;
     NumberFormat numberFormat;
diff --git a/src/framebuffer.cpp b/src/framebuffer.cpp
--- a/src/framebuffer.cpp
+++ b/src/framebuffer.cpp
@@ -45,7 +45,7 @@ void FrameBuffer::resize(size_t size)
 
     for (int i = fill_start; i < int(size); i++)
     {
-        newData[i] = _sample(i - offset);
+        newData[i] = sample(i - offset);
     }
 
     // fill the beginning of the new data
@@ -141,17 +141,12 @@ size_t FrameBuffer::size() const
     return _size;
 }
 
-QPointF FrameBuffer::sample(size_t i) const
-{
-    return QPointF(i, _sample(i));
-}
-
 QRectF FrameBuffer::boundingRect() const
 {
     return _boundingRect;
 }
 
-double FrameBuffer::_sample(size_t i) const
+double FrameBuffer::sample(size_t i) const
 {
     size_t index = headIndex + i;
     if (index >= _size) index -= _size;
diff --git a/src/framebuffer.h b/src/framebuffer.h
--- a/src/framebuffer.h
+++ b/src/framebuffer.h
@@ -20,11 +20,10 @@
 #ifndef FRAMEBUFFER_H
 #define FRAMEBUFFER_H
 
-#include 
 #include 
 #include 
 
-class FrameBuffer : public QwtSeriesData
+class FrameBuffer
 {
 public:
     FrameBuffer(size_t size);
@@ -34,10 +33,10 @@ public:
     void addSamples(double* samples, size_t size);
     void clear(); // fill 0
 
-    // QwtSeriesData implementations
+    // QwtSeriesData related implementations
     size_t size() const;
-    QPointF sample(size_t i) const;
     QRectF boundingRect() const;
+    double sample(size_t i) const;
 
 private:
     size_t _size; // size of `data`
@@ -45,8 +44,6 @@ private:
     size_t headIndex; // indicates the actual `0` index of the ring buffer
 
     QRectF _boundingRect;
-
-    double _sample(size_t i) const;
 };
 
 #endif // FRAMEBUFFER_H
diff --git a/src/framebufferseries.cpp b/src/framebufferseries.cpp
new file mode 100644
--- /dev/null
+++ b/src/framebufferseries.cpp
@@ -0,0 +1,40 @@
+/*
+  Copyright © 2016 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 "framebufferseries.h"
+
+FrameBufferSeries::FrameBufferSeries(FrameBuffer* buffer)
+{
+    _buffer = buffer;
+}
+
+size_t FrameBufferSeries::size() const
+{
+    return _buffer->size();
+}
+
+QPointF FrameBufferSeries::sample(size_t i) const
+{
+    return QPointF(i, _buffer->sample(i));
+}
+
+QRectF FrameBufferSeries::boundingRect() const
+{
+    return _buffer->boundingRect();
+}
diff --git a/src/framebufferseries.h b/src/framebufferseries.h
new file mode 100644
--- /dev/null
+++ b/src/framebufferseries.h
@@ -0,0 +1,49 @@
+/*
+  Copyright © 2016 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 .
+*/
+
+#ifndef FRAMEBUFFERSERIES_H
+#define FRAMEBUFFERSERIES_H
+
+#include 
+#include 
+#include 
+
+#include "framebuffer.h"
+
+/**
+ * This class provides an interface for actual FrameBuffer
+ * object. That way we can keep our data structures relatively
+ * isolated from Qwt. Otherwise QwtPlotCurve owns FrameBuffer
+ * structures.
+ */
+class FrameBufferSeries : public QwtSeriesData
+{
+public:
+    FrameBufferSeries(FrameBuffer* buffer);
+
+    // QwtSeriesData implementations
+    size_t size() const;
+    QPointF sample(size_t i) const;
+    QRectF boundingRect() const;
+
+private:
+    FrameBuffer* _buffer;
+};
+
+#endif // FRAMEBUFFERSERIES_H
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -34,6 +34,7 @@
 
 #include 
 
+#include "framebufferseries.h"
 #include "utils.h"
 #include "defines.h"
 #include "version.h"
@@ -56,9 +57,10 @@ MainWindow::MainWindow(QWidget *parent) 
     ui(new Ui::MainWindow),
     aboutDialog(this),
     portControl(&serialPort),
+    channelMan(1, 1, this),
     commandPanel(&serialPort),
-    dataFormatPanel(&serialPort, &channelBuffers),
-    snapshotMan(this, &channelBuffers)
+    dataFormatPanel(&serialPort, &channelMan),
+    snapshotMan(this, &channelMan)
 {
     ui->setupUi(this);
     ui->tabWidget->insertTab(0, &portControl, "Port");
@@ -153,17 +155,26 @@ MainWindow::MainWindow(QWidget *parent) 
     numOfSamples = ui->spNumOfSamples->value();
     unsigned numOfChannels = dataFormatPanel.numOfChannels();
 
-    QObject::connect(&dataFormatPanel,
-                     &DataFormatPanel::numOfChannelsChanged,
-                     this,
-                     &MainWindow::onNumOfChannelsChanged);
+    channelMan.setNumOfSamples(ui->spNumOfSamples->value());
+    channelMan.setNumOfChannels(dataFormatPanel.numOfChannels());
+
+    connect(&dataFormatPanel, &DataFormatPanel::numOfChannelsChanged,
+            &channelMan, &ChannelManager::setNumOfChannels);
 
-    // init channel data and curve list
+    connect(&channelMan, &ChannelManager::numOfChannelsChanged,
+            this, &MainWindow::onNumOfChannelsChanged);
+
+    connect(&channelMan, &ChannelManager::channelNameChanged,
+            this, &MainWindow::onChannelNameChanged);
+
+    ui->lvChannelNames->setModel(channelMan.channelNames());
+
+    // init curve list
     for (unsigned int i = 0; i < numOfChannels; i++)
     {
-        channelBuffers.append(new FrameBuffer(numOfSamples));
-        curves.append(new QwtPlotCurve(QString("Channel %1").arg(i+1)));
-        curves[i]->setSamples(channelBuffers[i]);
+        curves.append(new QwtPlotCurve(channelMan.channelName(i)));
+        curves[i]->setSamples(
+            new FrameBufferSeries(channelMan.channelBuffer(i)));
         curves[i]->setPen(Plot::makeColor(i));
         curves[i]->attach(ui->plot);
     }
@@ -319,9 +330,9 @@ required privileges or device is already
 
 void MainWindow::clearPlot()
 {
-    for (int ci = 0; ci < channelBuffers.size(); ci++)
+    for (unsigned ci = 0; ci < channelMan.numOfChannels(); ci++)
     {
-        channelBuffers[ci]->clear();
+        channelMan.channelBuffer(ci)->clear();
     }
     ui->plot->replot();
 }
@@ -329,30 +340,26 @@ void MainWindow::clearPlot()
 void MainWindow::onNumOfSamplesChanged(int value)
 {
     numOfSamples = value;
-
-    for (int ci = 0; ci < channelBuffers.size(); ci++)
-    {
-        channelBuffers[ci]->resize(numOfSamples);
-    }
-
+    channelMan.setNumOfSamples(value);
     ui->plot->replot();
 }
 
 void MainWindow::onNumOfChannelsChanged(unsigned value)
 {
-    unsigned int oldNum = channelBuffers.size();
+    unsigned int oldNum = curves.size();
     unsigned numOfChannels = value;
 
     if (numOfChannels > oldNum)
     {
         // add new channels
-        for (unsigned int i = 0; i < numOfChannels - oldNum; i++)
+        for (unsigned int i = oldNum; i < numOfChannels; i++)
         {
-            channelBuffers.append(new FrameBuffer(numOfSamples));
-            curves.append(new QwtPlotCurve(QString("Channel %1").arg(oldNum+i+1)));
-            curves.last()->setSamples(channelBuffers.last());
-            curves.last()->setPen(Plot::makeColor(curves.length()-1));
-            curves.last()->attach(ui->plot);
+            QwtPlotCurve* curve = new QwtPlotCurve(channelMan.channelName(i));
+            curve->setSamples(
+                new FrameBufferSeries(channelMan.channelBuffer(i)));
+            curve->setPen(Plot::makeColor(i));
+            curve->attach(ui->plot);
+            curves.append(curve);
         }
     }
     else if(numOfChannels < oldNum)
@@ -360,11 +367,23 @@ void MainWindow::onNumOfChannelsChanged(
         // remove channels
         for (unsigned int i = 0; i < oldNum - numOfChannels; i++)
         {
-            // also deletes owned FrameBuffer
             delete curves.takeLast();
-            channelBuffers.removeLast();
         }
     }
+
+    ui->plot->replot();
+}
+
+void MainWindow::onChannelNameChanged(unsigned channel, QString name)
+{
+    // This slot is triggered also when a new channel is added, in
+    // this case curve list doesn't contain said channel. No worries,
+    // since `onNumOfChannelsChanged` slot will update curve list.
+    if ((int) channel < curves.size()) // check if channel exists in curve list
+    {
+        curves[channel]->setTitle(name);
+        ui->plot->replot();
+    }
 }
 
 void MainWindow::onAutoScaleChecked(bool checked)
@@ -454,7 +473,7 @@ void MainWindow::onExportCsv()
         {
             QTextStream fileStream(&file);
 
-            unsigned numOfChannels = channelBuffers.size();
+            unsigned numOfChannels = channelMan.numOfChannels();
             for (unsigned int ci = 0; ci < numOfChannels; ci++)
             {
                 fileStream << "Channel " << ci;
@@ -466,7 +485,7 @@ void MainWindow::onExportCsv()
             {
                 for (unsigned int ci = 0; ci < numOfChannels; ci++)
                 {
-                    fileStream << channelBuffers[ci]->sample(i).y();
+                    fileStream << channelMan.channelBuffer(ci)->sample(i);
                     if (ci != numOfChannels-1) fileStream << ",";
                 }
                 fileStream << '\n';
diff --git a/src/mainwindow.h b/src/mainwindow.h
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -39,6 +39,7 @@
 #include "dataformatpanel.h"
 #include "ui_about_dialog.h"
 #include "framebuffer.h"
+#include "channelmanager.h"
 #include "snapshotmanager.h"
 
 namespace Ui {
@@ -69,7 +70,8 @@ private:
 
     QList curves;
     // Note: FrameBuffer s are owned by their respective QwtPlotCurve s.
-    QList channelBuffers;
+    // QList channelBuffers;
+    ChannelManager channelMan;
 
     QLabel spsLabel;
 
@@ -90,6 +92,7 @@ private slots:
     void onYScaleChanged();
     void onRangeSelected();
     void onNumOfChannelsChanged(unsigned value);
+    void onChannelNameChanged(unsigned channel, QString name);
 
     void clearPlot();
 
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -57,17 +57,28 @@
        
        
         - 
-         
-          
-           Qt::Horizontal
-          
-          
-           
-            370
-            20
-           
-          
-         
+         
+          
- 
+           
+            
+             font-weight: bold;
+            
+            
+             Channel Names:
+            
+           
+          
 
+          - 
+           
+            
+             
+              16777215
+              170
+             
+            
+           
+          
 
+         
          
         - 
          
diff --git a/src/snapshot.cpp b/src/snapshot.cpp
--- a/src/snapshot.cpp
+++ b/src/snapshot.cpp
@@ -92,6 +92,16 @@ void Snapshot::setName(QString name)
     emit nameChanged(this);
 }
 
+void Snapshot::setChannelNames(QStringList names)
+{
+    _channelNames = names;
+}
+
+QString Snapshot::channelName(unsigned channel)
+{
+    return _channelNames[channel];
+}
+
 void Snapshot::save(QString fileName)
 {
     // TODO: remove code duplication (MainWindow::onExportCsv)
@@ -107,7 +117,7 @@ void Snapshot::save(QString fileName)
         // print header
         for (unsigned int ci = 0; ci < numOfChannels; ci++)
         {
-            fileStream << "Channel " << ci;
+            fileStream << channelName(ci);
             if (ci != numOfChannels-1) fileStream << ",";
         }
         fileStream << '\n';
diff --git a/src/snapshot.h b/src/snapshot.h
--- a/src/snapshot.h
+++ b/src/snapshot.h
@@ -25,6 +25,7 @@
 #include 
 #include 
 #include 
+#include 
 
 class SnapshotView;
 
@@ -42,6 +43,8 @@ public:
 
     QString name();
     void setName(QString name);
+    void setChannelNames(QStringList names); // must be called when setting data!
+    QString channelName(unsigned channel);
 
     void save(QString fileName); /// save snapshot data as CSV
 
@@ -51,6 +54,7 @@ signals:
 
 private:
     QString _name;
+    QStringList _channelNames;
     QAction _showAction;
     QAction _deleteAction;
     QMainWindow* mainWindow;
diff --git a/src/snapshotmanager.cpp b/src/snapshotmanager.cpp
--- a/src/snapshotmanager.cpp
+++ b/src/snapshotmanager.cpp
@@ -24,18 +24,19 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "snapshotmanager.h"
 
 SnapshotManager::SnapshotManager(QMainWindow* mainWindow,
-                                 QList* channelBuffers) :
+                                 ChannelManager* channelMan) :
     _menu("Snapshots"),
     _takeSnapshotAction("Take Snapshot", this),
     loadSnapshotAction("Load Snapshots", this),
     clearAction("Clear Snapshots", this)
 {
     _mainWindow = mainWindow;
-    _channelBuffers = channelBuffers;
+    _channelMan = channelMan;
 
     _takeSnapshotAction.setToolTip("Take a snapshot of current plot");
     _takeSnapshotAction.setShortcut(QKeySequence("F5"));
@@ -64,17 +65,18 @@ void SnapshotManager::takeSnapshot()
     QString name = QTime::currentTime().toString("'Snapshot ['HH:mm:ss']'");
     auto snapshot = new Snapshot(_mainWindow, name);
 
-    unsigned numOfChannels = _channelBuffers->size();
-    unsigned numOfSamples = _channelBuffers->at(0)->size();
+    unsigned numOfChannels = _channelMan->numOfChannels();
+    unsigned numOfSamples = _channelMan->numOfSamples();
 
     for (unsigned ci = 0; ci < numOfChannels; ci++)
     {
         snapshot->data.append(QVector(numOfSamples));
         for (unsigned i = 0; i < numOfSamples; i++)
         {
-            snapshot->data[ci][i] = _channelBuffers->at(ci)->sample(i);
+            snapshot->data[ci][i] = QPointF(i, _channelMan->channelBuffer(ci)->sample(i));
         }
     }
+    snapshot->setChannelNames(_channelMan->channelNames()->stringList());
 
     addSnapshot(snapshot);
 }
@@ -145,7 +147,8 @@ void SnapshotManager::loadSnapshotFromFi
 
     // read first row as headlines and determine number of channels
     auto headLine = QString(file.readLine());
-    unsigned numOfChannels = headLine.split(',').size();
+    QStringList channelNames = headLine.split(',');
+    unsigned numOfChannels = channelNames.size();
 
     // read data
     QVector> data(numOfChannels);
@@ -183,6 +186,7 @@ void SnapshotManager::loadSnapshotFromFi
 
     auto snapshot = new Snapshot(_mainWindow, QFileInfo(fileName).baseName());
     snapshot->data = data;
+    snapshot->setChannelNames(channelNames);
 
     addSnapshot(snapshot, false);
 }
diff --git a/src/snapshotmanager.h b/src/snapshotmanager.h
--- a/src/snapshotmanager.h
+++ b/src/snapshotmanager.h
@@ -25,6 +25,7 @@
 #include 
 
 #include "framebuffer.h"
+#include "channelmanager.h"
 #include "snapshot.h"
 
 class SnapshotManager : public QObject
@@ -32,7 +33,7 @@ class SnapshotManager : public QObject
     Q_OBJECT
 
 public:
-    SnapshotManager(QMainWindow* mainWindow, QList* channelBuffers);
+    SnapshotManager(QMainWindow* mainWindow, ChannelManager* channelMan);
     ~SnapshotManager();
 
     QMenu* menu();
@@ -40,7 +41,7 @@ public:
 
 private:
     QMainWindow* _mainWindow;
-    QList* _channelBuffers;
+    ChannelManager* _channelMan;
 
     QList snapshots;
 
diff --git a/src/snapshotview.cpp b/src/snapshotview.cpp
--- a/src/snapshotview.cpp
+++ b/src/snapshotview.cpp
@@ -35,7 +35,7 @@ SnapshotView::SnapshotView(QWidget *pare
 
     for (unsigned ci = 0; ci < numOfChannels; ci++)
     {
-        QwtPlotCurve* curve = new QwtPlotCurve();
+        QwtPlotCurve* curve = new QwtPlotCurve(snapshot->channelName(ci));
         curves.append(curve);
         curve->setSamples(snapshot->data[ci]);
         curve->setPen(Plot::makeColor(ci));