diff --git a/src/datachunk.cpp b/src/datachunk.cpp
new file mode 100644
--- /dev/null
+++ b/src/datachunk.cpp
@@ -0,0 +1,130 @@
+/*
+  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 
+
+#include "datachunk.h"
+
+DataChunk::DataChunk(size_t start, size_t capacity)
+{
+    _start = start;
+    _capacity = capacity;
+    _size = 0;
+    _samples = new double[capacity];
+
+    _min = 0;
+    _max = 0;
+    _sum = 0;
+    _sumSquare = 0;
+}
+
+DataChunk::~DataChunk()
+{
+    delete[] _samples;
+}
+
+size_t DataChunk::start() const
+{
+    return _start;
+}
+
+size_t DataChunk::end() const
+{
+    return _start + _size;
+}
+
+bool DataChunk::isFull() const
+{
+    return left() == 0;
+}
+
+size_t DataChunk::size() const
+{
+    return _size;
+}
+
+size_t DataChunk::capacity() const
+{
+    return _capacity;
+}
+
+size_t DataChunk::left() const
+{
+    return _capacity - _size;
+}
+
+double DataChunk::min() const
+{
+    return _min;
+}
+
+double DataChunk::max() const
+{
+    return _max;
+}
+
+double DataChunk::avg() const
+{
+    return _sum / _size;
+}
+
+double DataChunk::meanSquare() const
+{
+    return _sumSquare / _size;
+}
+
+double DataChunk::sample(size_t i) const
+{
+    Q_ASSERT(i <= _size);
+    return _samples[i];
+}
+
+void DataChunk::addSamples(double* samples, size_t size)
+{
+    Q_ASSERT(size > 0 && size <= left());
+
+    // start min&max values from first sample
+    if (_size == 0)
+    {
+        _min = _max = samples[0];
+    }
+
+    for (unsigned i = 0; i < size; i++)
+    {
+        double newSample = samples[i];
+
+        _samples[this->_size + i] = newSample;
+
+        // update min/max and measurements
+        if (newSample < _min)
+        {
+            _min = newSample;
+        }
+        else if (newSample > _max)
+        {
+            _max = newSample;
+        }
+        _sum += newSample;
+        _sumSquare += newSample * newSample;
+    }
+
+    this->_size += size;
+
+    Q_ASSERT(this->_size <= this->_capacity);
+}