diff --git a/selftest/template_test.py b/selftest/template_test.py
new file mode 100755
index 0000000..2b44ae5
--- /dev/null
+++ b/selftest/template_test.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+
+import _prep
+
+import sys
+import os
+
+from osmo_gsm_tester import template, log
+
+log.set_level(log.C_CNF, log.L_DBG)
+
+print('- Testing: fill a config file with values')
+
+mock_timeslot_list=(
+        { 'phys_chan_config': 'val_phys_chan_config_0' },
+        { 'phys_chan_config': 'val_phys_chan_config_1' },
+        { 'phys_chan_config': 'val_phys_chan_config_2' },
+        { 'phys_chan_config': 'val_phys_chan_config_3' },
+        )
+
+mock_bts = {
+    'type': 'val_type',
+    'band': 'val_band',
+    'location_area_code': 'val_bts.location_area_code',
+    'base_station_id_code': 'val_bts.base_station_id_code',
+    'ipa_unit_id': 'val_bts.unit_id',
+    'stream_id': 'val_bts.stream_id',
+    'trx_list': (
+            dict(arfcn='val_trx_arfcn_trx0',
+                max_power_red='val_trx_max_power_red_trx0',
+                timeslot_list=mock_timeslot_list),
+            dict(arfcn='val_trx_arfcn_trx1',
+                max_power_red='val_trx_max_power_red_trx1',
+                timeslot_list=mock_timeslot_list),
+            )
+}
+
+def clone_mod(d, val_ext):
+    c = dict(d)
+    for name in c.keys():
+        if isinstance(c[name], str):
+            c[name] = c[name] + val_ext
+        elif isinstance(c[name], dict):
+            c[name] = clone_mod(c[name], val_ext)
+    return c
+
+mock_bts0 = clone_mod(mock_bts, '_bts0')
+mock_bts1 = clone_mod(mock_bts, '_bts1')
+
+vals = dict(nitb=dict(
+                    net=dict(
+                        mcc='val_mcc',
+                        mnc='val_mnc',
+                        short_name='val_short_name',
+                        long_name='val_long_name',
+                        auth_policy='val_auth_policy',
+                        encryption='val_encryption',
+                        bts_list=(mock_bts0, mock_bts1)
+                    ),
+                ),
+            nitb_iface=dict(addr='val_nitb_iface_addr'),
+       )
+
+print(template.render('osmo-nitb.cfg', vals))
+
+print('- Testing: expect to fail on invalid templates dir')
+try:
+    template.set_templates_dir('non-existing dir')
+    sys.stderr.write('Error: setting non-existing templates dir should raise RuntimeError\n')
+    assert(False)
+except RuntimeError:
+    # not logging exception to omit non-constant path name from expected output
+    print('sucess: setting non-existing templates dir raised RuntimeError\n')
+    pass
+
+# vim: expandtab tabstop=4 shiftwidth=4
