diff --git a/proto/tests.py b/proto/tests.py
index 74f1dd066c094c08d576f5fe95b3bdf7cf5b5f0a..b3f75070809862dd80240243f63ae03a0c40f7db 100755
--- a/proto/tests.py
+++ b/proto/tests.py
@@ -19,6 +19,7 @@ import cheby.gena2cheby as gena2cheby
 import cheby.wbgen2cheby as wbgen2cheby
 import cheby.gen_wbgen_hdl as gen_wbgen_hdl
 import cheby.print_regs as print_regs
+import cheby.gen_custom as gen_custom
 
 srcdir = '../testfiles/'
 verbose = False
@@ -421,6 +422,22 @@ def test_consts():
             if not compare_buffer_and_file(buf, file):
                 error('consts {} generation error for {}'.format(style, f))
 
+def test_custom():
+    for f in ['custom/fidsErrMiss']:
+        if verbose:
+            print('test custom: {}'.format(f))
+        cheby_file = srcdir + f + '.cheby'
+        c_file = srcdir + f + '.h'
+        t = parse_ok(cheby_file)
+        layout_ok(t)
+        buf = write_buffer()
+        # We need to change working directory
+        cwd = os.getcwd()
+        os.chdir(srcdir + '/custom')
+        gen_custom.generate_custom(buf, t)
+        os.chdir(cwd)
+        if not compare_buffer_and_file(buf, c_file):
+            error('custom generation error for {}'.format(f))
 
 def main():
     global verbose
@@ -442,6 +459,7 @@ def main():
         test_gena2cheby_err()
         test_wbgen2cheby()
         test_consts()
+        test_custom()
         print("Done!")
     except TestError as e:
         werr(e.msg)
diff --git a/testfiles/custom/fidsErrMiss.cheby b/testfiles/custom/fidsErrMiss.cheby
new file mode 100644
index 0000000000000000000000000000000000000000..3a2a9161aeb155a160c92479074bfe75f2f9159d
--- /dev/null
+++ b/testfiles/custom/fidsErrMiss.cheby
@@ -0,0 +1,205 @@
+memory-map:
+  name: fidsErrMiss
+  bus: axi4-lite-32
+  size: 128
+  children:
+    - reg:
+        name: fidsCounters
+        description: event FIDS counters, see sub-registers for more info
+        width: 32
+        access: ro
+        address: 0x0
+        children:
+          - field:
+              name: missing
+              range: 7-0
+          - field:
+              name: erratic
+              range: 15-8
+          - field:
+              name: normal
+              range: 31-26
+    - reg:
+        name: pfnMeasOnEvent
+        description: PFN measurement on FIDS event (normal, missing or erratic)
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: refCalcPuComp1
+        description: dynamic calculated comparator1 PickUp DAC reference, based on Upfn
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: refCalcPuComp2
+        description: dynamic calculated comparator1 PickUp DAC reference, based on Upfn
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: pulseLengthTrigger
+        description: lenght of the trigger pulse
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: pulseLengthPuComp1
+        description: lenght of the pick-up pulse Comparator1
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: pulseLengthPuComp2
+        description: lenght of the pick-up pulse Comparator2
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: delayTrigComp1
+        description: assertion delay between trigger and comp1
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: delayTrigComp2
+        description: assertion delay between trigger and comp2
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: delayComp1Comp2
+        description: assertion delay between comp1 and comp2
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: puName
+        description: pick-up ASCII name
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: calcParamComp1
+        description: linear paramters for Upfn to ref comp1 conversion y=shift_right(x,s)*a+b
+        width: 32
+        access: rw
+        address: next
+        x_gena:
+          preset: 0xff01
+        children:
+          - field:
+              name: multiplier
+              description: signed integer
+              range: 7-0
+              preset: 0x1
+          - field:
+              name: offset
+              description: signed integer
+              range: 23-8
+              preset: 0xff
+          - field:
+              name: shiftRight
+              description: unsigned
+              range: 31-24
+              preset: 0x0
+    - reg:
+        name: calcParamComp2
+        description: linear paramters for Upfn to ref comp1 conversion y=shift_right(x,s)*a+b
+        width: 32
+        access: rw
+        address: next
+        x_gena:
+          preset: 0xff01
+        children:
+          - field:
+              name: multiplier
+              description: signed integer
+              range: 7-0
+              preset: 0x1
+          - field:
+              name: offset
+              description: signed integer
+              range: 23-8
+              preset: 0xff
+          - field:
+              name: shiftRight
+              description: unsigned
+              range: 31-24
+              preset: 0x0
+    - reg:
+        name: moduleParam
+        description: module bitwise parameters
+        width: 32
+        access: rw
+        address: next
+        x_gena:
+          preset: 0x0
+        children:
+          - field:
+              name: upfnAbs
+              description: on 1, use abs(upfn) for reference calculation
+              range: 0
+              preset: 0x0
+          - field:
+              name: resetCounters
+              description: on rising edge, reset FIDS counters to zero
+              range: 1
+              preset: 0x0
+    - reg:
+        name: windowLengthMissing
+        description: window missing length parameter
+        width: 32
+        access: rw
+        address: next
+        preset: 0x1f4
+        x_gena:
+          preset: 500
+    - reg:
+        name: windowLengthErratic
+        description: window erratic length parameter
+        width: 32
+        access: rw
+        address: next
+        preset: 0xfa
+        x_gena:
+          preset: 250
+    - reg:
+        name: maxCounterMissing
+        description: missing counter max. on which PLC interlock assertion
+        width: 32
+        access: rw
+        address: next
+        preset: 0x9
+        x_gena:
+          preset: 9
+    - reg:
+        name: maxCounterErratic
+        description: erratic counter max. on which PLC interlock assertion
+        width: 32
+        access: rw
+        address: next
+        preset: 0x9
+        x_gena:
+          preset: 9
+    - reg:
+        name: fallingDebounceLength
+        description: pickup falling edge debounce length
+        width: 32
+        access: rw
+        address: next
+        preset: 0x32
+        x_gena:
+          preset: 50
+    - reg:
+        name: refCalcPuComp1OnEvent
+        description: latched on event calculated comparator2 PickUp DAC reference, based on Upfn
+        width: 32
+        access: ro
+        address: next
+    - reg:
+        name: refCalcPuComp2OnEvent
+        description: latched on event calculated comparator2 PickUp DAC reference, based on Upfn
+        width: 32
+        access: ro
+        address: next
diff --git a/testfiles/custom/fidsErrMiss.h b/testfiles/custom/fidsErrMiss.h
new file mode 100644
index 0000000000000000000000000000000000000000..5de6b86a1f790a68fae1a959b4f74976214d2d36
--- /dev/null
+++ b/testfiles/custom/fidsErrMiss.h
@@ -0,0 +1,42 @@
+#ifndef FIDSERRMISS_FUNCTIONS_H_
+#define FIDSERRMISS_FUNCTIONS_H_
+
+//read functions ro data
+#define fidsErrMiss_read_ro \
+block->setfidsCounters(fasec->read_reg(0));\
+block->setpfnMeasOnEvent(fasec->read_reg(4));\
+block->setrefCalcPuComp1(fasec->read_reg(8));\
+block->setrefCalcPuComp2(fasec->read_reg(12));\
+block->setpulseLengthTrigger(fasec->read_reg(16));\
+block->setpulseLengthPuComp1(fasec->read_reg(20));\
+block->setpulseLengthPuComp2(fasec->read_reg(24));\
+block->setdelayTrigComp1(fasec->read_reg(28));\
+block->setdelayTrigComp2(fasec->read_reg(32));\
+block->setdelayComp1Comp2(fasec->read_reg(36));\
+block->setpuName(fasec->read_reg(40));\
+block->setrefCalcPuComp1OnEvent(fasec->read_reg(76));\
+block->setrefCalcPuComp2OnEvent(fasec->read_reg(80));\
+
+//read functions rw data
+#define fidsErrMiss_read_rw \
+block->setcalcParamComp1(fasec->read_reg(44));\
+block->setcalcParamComp2(fasec->read_reg(48));\
+block->setmoduleParam(fasec->read_reg(52));\
+block->setwindowLengthMissing(fasec->read_reg(56));\
+block->setwindowLengthErratic(fasec->read_reg(60));\
+block->setmaxCounterMissing(fasec->read_reg(64));\
+block->setmaxCounterErratic(fasec->read_reg(68));\
+block->setfallingDebounceLength(fasec->read_reg(72));\
+
+//write functions rw data
+#define fidsErrMiss_write_rw \
+fasec->write_reg(44,block->getcalcParamComp1());\
+fasec->write_reg(48,block->getcalcParamComp2());\
+fasec->write_reg(52,block->getmoduleParam());\
+fasec->write_reg(56,block->getwindowLengthMissing());\
+fasec->write_reg(60,block->getwindowLengthErratic());\
+fasec->write_reg(64,block->getmaxCounterMissing());\
+fasec->write_reg(68,block->getmaxCounterErratic());\
+fasec->write_reg(72,block->getfallingDebounceLength());\
+
+#endif