diff --git a/applications/unb1_fn_bf/tb/python/tc_unb1_fn_bf.py b/applications/unb1_fn_bf/tb/python/tc_unb1_fn_bf.py
index 98050299868a36dcc241b90e35dc1c2a481902c8..71c3b0e4218fe45c2a97f0ec77676085ec66aea8 100644
--- a/applications/unb1_fn_bf/tb/python/tc_unb1_fn_bf.py
+++ b/applications/unb1_fn_bf/tb/python/tc_unb1_fn_bf.py
@@ -22,7 +22,7 @@
 
 """Test case for the fn_bf design
 
-   Usage: python tc_fn_bf.py --unb 0 --fn 0:3 --rep 1 -n 1 -v 6
+   Usage: python tc_unb1_fn_bf.py --unb 0 --fn 0:3 --rep 1 -n 1 -v 6
 
 """
 
@@ -38,7 +38,8 @@ import pi_st_sst
 import pi_ss_ss_wide
 import unb_apertif as apr
 from tools import *
-from common import *
+from common import * 
+import mem_init_file
 
 # Create a test case object
 tc = test_case.Testcase('TB - ', '')
@@ -55,7 +56,7 @@ c_nof_signal_paths     = 16      # 64
 c_nof_input_streams    =  4      # 16 
 c_nof_subbands         = 24      # 24
 c_nof_weights          = 256      # 256
-c_nof_bf_units         =  1      # 4
+c_nof_bf_units         =  4      # 4
 c_in_dat_w             = 16      # 16
 c_in_weight_w          = 16      # 16
 c_gain_w               = -1      # -1
@@ -90,13 +91,15 @@ if tc.sim==False:
     c_blocks_per_sync      = 781250
 
 c_nof_sp_per_input_stream = c_nof_signal_paths / c_nof_input_streams
+c_nof_subbands_per_stream = c_nof_subbands*c_nof_sp_per_input_stream 
 
 # Define settings for the block generator
 c_samples_per_packet = c_nof_sp_per_input_stream * c_nof_subbands
 c_gapsize            = c_nof_weights - c_samples_per_packet
 c_mem_low_addr       = 0
 c_mem_high_addr      = c_samples_per_packet-1
-c_bsn_init           = 42
+c_bsn_init           = 42     
+c_gen_hex_files      = True
     
 # Create access object for all nodes
 io = node_io.NodeIO(tc.nodeImages, tc.base_ip)
@@ -114,136 +117,176 @@ for i in range(tc.nofFnNodes):
 for k in xrange(tc.nofFnNodes):   
     for i in range(c_nof_bf_units):
         print bf[k*c_nof_bf_units+i].st.write_treshold([0])
-n=0
-                                                           
-for rep in xrange(tc.repeat):
-    
-    tc.append_log(3, '>>> Rep %d' % rep)
-
-    ################################################################################
-    ##
-    ## Initialize the blockgenerators
-    ##
-    ################################################################################
-    # - Write settings to the block generator 
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '>>> Write settings to the block generator')
-    tc.append_log(3, '>>>')
-    bg.write_block_gen_settings(c_samples_per_packet, c_blocks_per_sync, c_gapsize, c_mem_low_addr, c_mem_high_addr, c_bsn_init)
-    
-    # - Create a list with the input data and write it to the RAMs of the block generator
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '>>> Write data to the waveform RAM of all channels')
-    tc.append_log(3, '>>>')
-
-    inputData = []
-    for i in xrange(c_nof_input_streams):
-        dataList = bg.generate_data_list(c_nof_sp_per_input_stream, c_nof_subbands, 2048*i*4, i, c_in_dat_w)
-        print dataList
-        print ""
-        bg.write_waveform_ram(dataList, i)
-        dataListComplex = bg.convert_concatenated_to_complex(dataList, c_in_dat_w)
-        inputData.append(dataListComplex)
-        print dataListComplex
-    ################################################################################
-    ##
-    ## Create and Write the weight factors 
-    ##
-    ################################################################################
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '>>> Create and write weightfactors for all signal paths on all bf_units ')
-    tc.append_log(3, '>>>')
-   
-    weightsNodes = []
-    for k in xrange(tc.nofFnNodes):                    
-        weightsBf = []
-        for i in range(c_nof_bf_units):
-            weightsBfUnit=[]
-            for j in range(c_nof_signal_paths):
-                weightsSignalPath = bf[k*c_nof_bf_units+i].generate_weights(i+j, i, c_in_weight_w)
-                bf[k*c_nof_bf_units+i].write_weights(weightsSignalPath, j) 
-                weightsSignalPathComplex = bg.convert_concatenated_to_complex(weightsSignalPath, c_in_weight_w)
-                weightsBfUnit.append(weightsSignalPathComplex)
-            weightsBf.append(weightsBfUnit)
-        weightsNodes.append(weightsBf)
-    
-    ################################################################################
-    ##
-    ## Create and Write the selection buffers
-    ##
-    ################################################################################
-    select_buf = []
-    for i in range(c_nof_sp_per_input_stream): 
-        select_buf_line = []
-        for j in range(4):
-            for k in range(c_nof_weights/4): 
-                select_buf_line.append(i*c_nof_subbands + j)  
-        select_buf.append(select_buf_line)
-
-    for i in range(tc.nofFnNodes):
-        for j in xrange(c_nof_bf_units):
-            for k in range(c_nof_input_streams):
-                bf[i*c_nof_bf_units + j].ss_wide[k].write_selects(flatten(select_buf)); 
-
-    # - Enable the block generator
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '>>> Enable the block generator')
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '')
-    bg.write_enable()
-    
-    ################################################################################
-    ##
-    ## Calculate the reference values
-    ##
-    ################################################################################
-    statisticsAccumulatedNode = []
-    for k in xrange(tc.nofFnNodes):   
-        statisticsAccumulated = []                 
-        for i in range(c_nof_bf_units):
-            statisticsAccumulated.append(bf[k*c_nof_bf_units+i].calculate_beamlets(inputData, select_buf, weightsNodes[k][i], c_in_weight_w, c_blocks_per_sync))
-        statisticsAccumulatedNode.append(statisticsAccumulated)
-
-    ################################################################################
-    ##
-    ## Read out the beamlet statistics 
-    ##
-    ################################################################################
-    # Wait a while before reading out the statistics
-    if tc.sim == True: 
-        current_time = io.simIO.getSimTime()
-        wait_time = current_time[0] + 2*c_blocks_per_sync * c_nof_weights * c_clk_period
-        do_until_gt(io.simIO.getSimTime, wait_time, s_timeout=3600)
-    else:
-        tc.sleep(1)
-        
-    tc.append_log(3, '>>>')
-    tc.append_log(2, '>>> Rep = %d, n = %d: Read the Beamlet Statistics of all bf_units' % (rep, n))
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '')
-    
-    for k in xrange(tc.nofFnNodes):   
-        beamlet_stats = []
-        for i in range(c_nof_bf_units):
-            beamlet_stats_bf_unit = bf[k*c_nof_bf_units+i].st.read_and_verify_stats(statisticsAccumulatedNode[k][i])
-            beamlet_stats.append(beamlet_stats_bf_unit)
-        
-    # - Disable the block generator
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '>>> Disable the block generator')
-    tc.append_log(3, '>>>')
-    tc.append_log(3, '')
-    bg.write_disable()
-        
-    n+=1
 
-    
-###############################################################################
-# End
-tc.set_section_id('')
-tc.append_log(3, '')
-tc.append_log(3, '>>>')
-tc.append_log(0, '>>> Test bench result: %s' % tc.get_result())
-tc.append_log(3, '>>>')
+def gen_data_and_hex_files_bf_ss_wide(gen_hex=True):        
+    # Apply simple SS wide scheme to select e.g. nof_beams_per_subband=4 sets of equal subbands per bf_unit.
+    # . The nof_beams_per_subband must be <= c_nof_subbands=24, because that is the maximum number of different subbands that is available
+    # . In this simple scheme the nof_beams_per_subband needs to be a divider of c_nof_weights=256, so a power of 2
+    # . The settings for only 1 bf_unit are returned. 
+    nof_beams_per_subband = 4
+    select_buf = []  
+    for h in range(c_nof_bf_units):
+        for i in range(c_nof_sp_per_input_stream):  # iterates over the number of single ss units
+            select_buf_line = []
+            for j in range(nof_beams_per_subband):
+                for k in range(c_nof_weights/nof_beams_per_subband): 
+                    select_buf_line.append(i*c_nof_subbands + j) 
+            if (gen_hex == True): 
+                filename = "../../src/hex/ss_wide_" + str(h) + "_" + str(i) + ".hex"
+                mem_init_file.list_to_hex(list_in=select_buf_line, filename=filename, mem_width=ceil_log2(c_nof_subbands_per_stream), mem_depth=c_nof_weights)
+            if (h==0):
+                select_buf.append(select_buf_line)
+    return select_buf    
+
+def gen_data_and_hex_files_bf_weights(gen_hex=True, sel='noise', ampl=1.0):    
+    weightsBfUnit=[]
+    ampl = ampl * 1.0 # Force to float
+    for i in range(c_nof_signal_paths):
+        singleList_real   = dsp_test_weights.create_waveform(sel, ampl, seed=2*i, noiseLevel=0, length=c_nof_weights)
+        singleList_imag   = dsp_test_weights.create_waveform(sel, ampl, seed=2*i+1, noiseLevel=0, length=c_nof_weights)
+        singleList_real   = dsp_test_weights.quantize_waveform(singleList_real)
+        singleList_imag   = dsp_test_weights.quantize_waveform(singleList_imag)
+        if c_debug_print and i==0:
+            print "singleList_real = %s" % singleList_real
+        weightsSignalPath = dsp_test_weights.concatenate_two_lists(singleList_real, singleList_imag, c_in_weight_w)
+        if (gen_hex == True):
+            filename = "../../src/hex/weights_" + str(i) + ".hex"
+            mem_init_file.list_to_hex(list_in=weightsSignalPath, filename=filename, mem_width=2*c_in_weight_w, mem_depth=c_nof_weights)
+        weightsBfUnit.append(weightsSignalPath)
+    return weightsBfUnit    
+
+
+if __name__ == "__main__":      
+  
+  n=0
+  for rep in xrange(tc.repeat):
+      
+      tc.append_log(3, '>>> Rep %d' % rep)
+  
+      ################################################################################
+      ##
+      ## Create settings for ss_wide in bf_unit
+      ##
+      ################################################################################
+      select_buf = gen_data_and_hex_files_bf_ss_wide(c_gen_hex_files) 
+  
+      ################################################################################
+      ##
+      ## Initialize the blockgenerators
+      ##
+      ################################################################################
+      # - Write settings to the block generator 
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '>>> Write settings to the block generator')
+      tc.append_log(3, '>>>')
+      bg.write_block_gen_settings(c_samples_per_packet, c_blocks_per_sync, c_gapsize, c_mem_low_addr, c_mem_high_addr, c_bsn_init)
+      
+      # - Create a list with the input data and write it to the RAMs of the block generator
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '>>> Write data to the waveform RAM of all channels')
+      tc.append_log(3, '>>>')
+  
+      inputData = []
+      for i in xrange(c_nof_input_streams):
+          dataList = bg.generate_data_list(c_nof_sp_per_input_stream, c_nof_subbands, 2048*i*4, i, c_in_dat_w)
+          print dataList
+          print ""
+          bg.write_waveform_ram(dataList, i)
+          dataListComplex = bg.convert_concatenated_to_complex(dataList, c_in_dat_w)
+          inputData.append(dataListComplex)
+          print dataListComplex
+      ################################################################################
+      ##
+      ## Create and Write the weight factors 
+      ##
+      ################################################################################
 
-sys.exit(tc.get_result())
\ No newline at end of file
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '>>> Create and write weightfactors for all signal paths on all bf_units ')
+      tc.append_log(3, '>>>')
+     
+      weightsNodes = []
+      for k in xrange(tc.nofFnNodes):                    
+          weightsBf = []
+          for i in range(c_nof_bf_units):
+              weightsBfUnit=[]
+              for j in range(c_nof_signal_paths):
+                  weightsSignalPath = bf[k*c_nof_bf_units+i].generate_weights(c_nof_weights, i+j, i, c_in_weight_w)
+                  bf[k*c_nof_bf_units+i].write_weights(weightsSignalPath, j) 
+                  weightsSignalPathComplex = bg.convert_concatenated_to_complex(weightsSignalPath, c_in_weight_w)
+                  weightsBfUnit.append(weightsSignalPathComplex)
+              weightsBf.append(weightsBfUnit)
+          weightsNodes.append(weightsBf)
+      
+      ################################################################################
+      ##
+      ## Create and Write the selection buffers
+      ##
+      ################################################################################
+      for i in range(tc.nofFnNodes):
+          for j in xrange(c_nof_bf_units):
+              for k in range(c_nof_input_streams):
+                  bf[i*c_nof_bf_units + j].ss_wide[k].write_selects(flatten(select_buf)); 
+  
+      # - Enable the block generator
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '>>> Enable the block generator')
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '')
+      bg.write_enable()
+      
+      ################################################################################
+      ##
+      ## Calculate the reference values
+      ##
+      ################################################################################
+      statisticsAccumulatedNode = []
+      for k in xrange(tc.nofFnNodes):   
+          statisticsAccumulated = []                 
+          for i in range(c_nof_bf_units):
+              statisticsAccumulated.append(bf[k*c_nof_bf_units+i].calculate_beamlets(inputData, select_buf, weightsNodes[k][i], c_in_weight_w, c_blocks_per_sync))
+          statisticsAccumulatedNode.append(statisticsAccumulated)
+  
+      ################################################################################
+      ##
+      ## Read out the beamlet statistics 
+      ##
+      ################################################################################
+      # Wait a while before reading out the statistics
+      if tc.sim == True: 
+          current_time = io.simIO.getSimTime()
+          wait_time = current_time[0] + 2*c_blocks_per_sync * c_nof_weights * c_clk_period
+          do_until_gt(io.simIO.getSimTime, wait_time, s_timeout=3600)
+      else:
+          tc.sleep(1)
+          
+      tc.append_log(3, '>>>')
+      tc.append_log(2, '>>> Rep = %d, n = %d: Read the Beamlet Statistics of all bf_units' % (rep, n))
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '')
+      
+      for k in xrange(tc.nofFnNodes):   
+          beamlet_stats = []
+          for i in range(c_nof_bf_units):
+              beamlet_stats_bf_unit = bf[k*c_nof_bf_units+i].st.read_and_verify_stats(statisticsAccumulatedNode[k][i])
+              beamlet_stats.append(beamlet_stats_bf_unit)
+          
+      # - Disable the block generator
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '>>> Disable the block generator')
+      tc.append_log(3, '>>>')
+      tc.append_log(3, '')
+      bg.write_disable()
+          
+      n+=1
+  
+      
+  ###############################################################################
+  # End
+  tc.set_section_id('')
+  tc.append_log(3, '')
+  tc.append_log(3, '>>>')
+  tc.append_log(0, '>>> Test bench result: %s' % tc.get_result())
+  tc.append_log(3, '>>>')
+  
+  sys.exit(tc.get_result())
\ No newline at end of file