diff --git a/src/stream.h b/src/stream.h
new file mode 100644
--- /dev/null
+++ b/src/stream.h
@@ -0,0 +1,82 @@
+/*
+  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 .
+*/
+
+#ifndef STREAM_H
+#define STREAM_H
+
+#include 
+#include 
+#include 
+#include 
+
+#include "sink.h"
+#include "source.h"
+#include "channelinfomodel.h"
+#include "streamchannel.h"
+
+/**
+ * Main waveform storage class. It consists of channels. Channels are
+ * synchronized with each other.
+ *
+ * Implements `Sink` class for data entry. It's expected to be
+ * connected to a `Device` source. Also implements a `Source` class
+ * for data that exists the buffers.
+ */
+class Stream : public Sink, public Source, public QObject
+{
+public:
+    /**
+     * @param nc number of channels
+     * @param ns number of samples
+     */
+    Stream(unsigned ns);
+    ~Stream();
+
+    // implementations for `Source`
+    virtual bool hasX() const;
+    virtual unsigned numChannels();
+
+    // implementations for `Sink`
+    virtual void setNumChannels(unsigned nc, bool x);
+
+    unsigned numSamples() const;
+    const StreamChannel* channel(unsigned index) const;
+    /// Saves channel information
+    void saveSettings(QSettings* settings) const;
+    /// Load channel information
+    void loadSettings(QSettings* settings);
+
+signals:
+    void numChannelsChanged(unsigned value);
+    void numSamplesChanged(unsigned value);
+    void channelAdded(const StreamChannel* chan);
+    void channelNameChanged(unsigned channel, QString name); // TODO: does it stay?
+    void dataAdded(); ///< emitted when data added to channel man.
+
+public slots:
+    // TODO: these won't be public
+    void setNumChannels(unsigned number);
+    void setNumSamples(unsigned number);
+
+    /// When paused `addData` does nothing.
+    void pause(bool paused);
+};
+
+
+#endif // STREAM_H