diff --git a/firanka/builder.py b/firanka/builder.py
new file mode 100644
index 0000000000000000000000000000000000000000..1b15543414737fc5369ddbc084d6356eee76e4bc
--- /dev/null
+++ b/firanka/builder.py
@@ -0,0 +1,44 @@
+# coding=UTF-8
+from __future__ import print_function, absolute_import, division
+import six
+import logging
+import copy
+from .series import Series, DiscreteSeries
+from .ranges import Range
+
+"""
+Update knowledge of current discrete series
+"""
+
+__all__ = [
+    'DiscreteKnowledgeBuilder',
+]
+
+class DiscreteKnowledgeBuilder(object):
+    def __init__(self, series):
+
+        if not isinstance(series, DiscreteSeries):
+            raise TypeError('discrete knowledge builder supports only discrete series')
+
+        self.new_data = {}
+        self.domain = series.domain
+        self.series = series
+
+    def put(self, index, value):
+
+        if index not in self.domain:
+            if index <= self.domain.start:
+                self.domain = Range(index, self.domain.stop, True, self.domain.right_inc)
+            if index >= self.domain.stop:
+                self.domain = Range(self.domain.start, index, self.domain.left_inc, True)
+
+        self.new_data[index] = value
+
+    def update_series(self):
+        """:return: a new DiscreteSeries instance"""
+
+        new_data = copy.copy(self.series.data)
+        for k,v in self.new_data.items():
+            new_data.add((k,v))
+
+        return DiscreteSeries(new_data, self.domain)
diff --git a/tests/test_builder.py b/tests/test_builder.py
new file mode 100644
index 0000000000000000000000000000000000000000..0c2b7043bff8be5e0f696538263c9576757b9325
--- /dev/null
+++ b/tests/test_builder.py
@@ -0,0 +1,24 @@
+# coding=UTF-8
+from __future__ import print_function, absolute_import, division
+import six
+import unittest
+
+from firanka.builder import DiscreteKnowledgeBuilder
+from firanka.series import DiscreteSeries
+
+
+class TestBuilder(unittest.TestCase):
+    def test_t1(self):
+
+        ser = DiscreteSeries([(0,1), (1,2)])
+
+        kb = DiscreteKnowledgeBuilder(ser)
+
+        kb.put(3, 4)
+        kb.put(-1, 5)
+        kb.put(-1, 6)
+
+        s2 = kb.update_series()
+
+        self.assertTrue(s2.domain, '<-1;3>')
+        self.assertEqual(s2.data,[(-1,6), (0,1), (1,2), (3,4)])
diff --git a/tests/test_series.py b/tests/test_series.py
index 4ef0223daf5f134f00ff28a121adaa1e3d4ad9ed..627ecfa531528f98020ac510be8981bcc231cadf 100644
--- a/tests/test_series.py
+++ b/tests/test_series.py
@@ -198,6 +198,8 @@ class TestModuloSeries(unittest.TestCase):
 
         self.assertEqual(series.period, 3.0)
 
+        self.assertEqual(series.eval_points([-1,0,1]), [1,2,3])
+
         self.assertEqual(series.eval_points([-5,-4,-3,-2,-1,0,1,2,3,4,5]),
                                             [ 3, 1, 2, 3, 1,2,3,1,2,3,1])