diff --git a/lib_python/lib/idea-format/bench_idea.py b/lib_python/lib/idea-format/bench_idea.py
index 47e1608ca694190d75edee66b75162e8735850e1..39efcdbf24d03debeae81f084f8155c6546a1dd0 100755
--- a/lib_python/lib/idea-format/bench_idea.py
+++ b/lib_python/lib/idea-format/bench_idea.py
@@ -8,7 +8,6 @@ from idea import lite
 from idea import valid
 import json
 from jsonschema import Draft4Validator
-import typedcol
 import timeit
 
 raw_idea = {
diff --git a/lib_python/lib/idea-format/idea/__init__.py b/lib_python/lib/idea-format/idea/__init__.py
index 9e32ead8a100f4c3d5fadd1a05e684a8e5707ac6..1e3d9a46009c078cf3408df612fa6e3a99ae3ca2 100644
--- a/lib_python/lib/idea-format/idea/__init__.py
+++ b/lib_python/lib/idea-format/idea/__init__.py
@@ -1,8 +1,8 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2016, CESNET, z. s. p. o.
+# Copyright (c) since 2016, CESNET, z. s. p. o.
 # Use of this source is governed by an ISC license, see LICENSE file.
 
-__version__ = '0.1.7'
+__version__ = '0.1.8'
 __author__ = 'Pavel Kácha <pavel.kacha@cesnet.cz>'
diff --git a/lib_python/lib/idea-format/idea/base.py b/lib_python/lib/idea-format/idea/base.py
index da5228fa4a087d597d839b9f49998421009f0d8f..72dad74082bd8b3145f849380d542470e9f0f87f 100644
--- a/lib_python/lib/idea-format/idea/base.py
+++ b/lib_python/lib/idea-format/idea/base.py
@@ -336,10 +336,14 @@ class IdeaBase(typedcols.TypedDict):
     allow_unknown = True
     typedef = {}
 
-def json_default(o):
-    if isinstance(o, typedcols.TypedDict):
-        return o.data
-    elif isinstance(o, typedcols.TypedList):
-        return o.data
-    else:
-        raise ValueError(o)
+    @staticmethod
+    def json_default(o):
+        if isinstance(o, typedcols.TypedDict):
+            return o.data
+        elif isinstance(o, typedcols.TypedList):
+            return o.data
+        else:
+            raise ValueError(o)
+
+    def to_json(self, *args, **kwargs):
+        return json.dumps(self, default=self.json_default, *args, **kwargs)
diff --git a/lib_python/lib/idea-format/idea/lite.py b/lib_python/lib/idea-format/idea/lite.py
index f5c7e4aa22470338f617947fada01929f6df4108..6a38f61b3e3f4b1cfd3acaa41c8e12953f22f415 100644
--- a/lib_python/lib/idea-format/idea/lite.py
+++ b/lib_python/lib/idea-format/idea/lite.py
@@ -232,15 +232,16 @@ class Idea(base.IdeaBase):
         typedcols.typed_list("AttachList", AttachDict),
         typedcols.typed_list("NodeList", NodeDict))
 
-def json_default(o):
-    if isinstance(o, (ipranges.IPBase, uuid.UUID)):
-        return str(o)
-    elif isinstance(o, datetime.datetime):
-        return o.isoformat() + "Z"
-    elif isinstance(o, datetime.timedelta):
-        hours = o.seconds // 3600
-        mins = (o.seconds % 3600) // 60
-        secs = o.seconds % 60
-        return "%s%02i:%02i:%02i%s" % (("%iD" % o.days) if o.days else "", hours, mins, secs, (".%i" % o.microseconds) if o.microseconds else "")
-    else:
-        return base.json_default(o)
+    @staticmethod
+    def json_default(o):
+        if isinstance(o, (ipranges.IPBase, uuid.UUID)):
+            return str(o)
+        elif isinstance(o, datetime.datetime):
+            return o.isoformat() + "Z"
+        elif isinstance(o, datetime.timedelta):
+            hours = o.seconds // 3600
+            mins = (o.seconds % 3600) // 60
+            secs = o.seconds % 60
+            return "%s%02i:%02i:%02i%s" % (("%iD" % o.days) if o.days else "", hours, mins, secs, (".%i" % o.microseconds) if o.microseconds else "")
+        else:
+            return base.IdeaBase.json_default(o)
diff --git a/lib_python/lib/idea-format/idea/valid.py b/lib_python/lib/idea-format/idea/valid.py
index dc4c27b1e39b7779117a0958276464774de52bad..59a87c63a1d973d50fa683a18f5c01bd62857026 100644
--- a/lib_python/lib/idea-format/idea/valid.py
+++ b/lib_python/lib/idea-format/idea/valid.py
@@ -11,7 +11,6 @@ import struct
 import socket
 
 from .base import unicode
-from .base import json_default
 
 
 def Version(s):
diff --git a/lib_python/lib/idea-format/setup.py b/lib_python/lib/idea-format/setup.py
index 9f22c72cb13cfad13d073daa6412f92155a8ec56..8f9d8b8aa29611aaa75bec42b51de77cc19c443d 100644
--- a/lib_python/lib/idea-format/setup.py
+++ b/lib_python/lib/idea-format/setup.py
@@ -17,6 +17,8 @@ from setuptools import setup, find_packages
 from codecs import open
 from os import path
 
+import idea
+
 here = path.abspath(path.dirname(__file__))
 
 # Get the long description from the README file
@@ -25,7 +27,8 @@ with open(path.join(here, 'README.rst'), encoding='utf-8') as f:
 
 setup(
     name = 'idea-format',
-    version = '0.1.7',
+    #version = '0.1.8',
+    version = idea.__version__,
     description = 'Python library for working with IDEA messages.',
     long_description = long_description,
     classifiers = [
diff --git a/lib_python/lib/idea-format/test_idea.py b/lib_python/lib/idea-format/test_idea.py
index 14056ceefa491967e853a7426237655d5264c711..e91ba5ead78b4eabeab1eedd255d1b47a560ca75 100755
--- a/lib_python/lib/idea-format/test_idea.py
+++ b/lib_python/lib/idea-format/test_idea.py
@@ -4,7 +4,6 @@
 # Copyright (c) 2016, CESNET, z. s. p. o.
 # Use of this source is governed by an ISC license, see LICENSE file.
 
-import typedcol
 import unittest
 import json
 import difflib
@@ -80,13 +79,13 @@ class TestIdea(unittest.TestCase):
     def testLiteIdea(self):
         idea = lite.Idea(raw_idea)
         orig = json.dumps(raw_idea, indent=4, sort_keys=True)
-        new = json.dumps(idea, indent=4, sort_keys=True, default=lite.json_default)
+        new = idea.to_json(indent=4, sort_keys=True)
         self.assertEqual(orig, new, "\n".join([l for l in difflib.context_diff(orig.split("\n"), new.split("\n"))]))
 
     def testValidIdea(self):
         idea = valid.Idea(raw_idea)
         orig = json.dumps(raw_idea, indent=4, sort_keys=True)
-        new = json.dumps(idea, indent=4, sort_keys=True, default=valid.json_default)
+        new = idea.to_json(indent=4, sort_keys=True)
         self.assertEqual(orig, new, "\n".join([l for l in difflib.context_diff(orig.split("\n"), new.split("\n"))]))