diff --git a/sysmocom/suites/4g/iperf3_ul.py b/sysmocom/suites/4g/iperf3_ul.py
index e243774..ae6da51 100755
--- a/sysmocom/suites/4g/iperf3_ul.py
+++ b/sysmocom/suites/4g/iperf3_ul.py
@@ -6,43 +6,92 @@
 if os.path.isdir(os.path.join(os.path.dirname(__file__), 'templates')):
   tenv.set_overlay_template_dir(os.path.join(os.path.dirname(__file__), 'templates'))
 
+# Retrieve the number of physical ue from the test suite configuration.
+test_config = tenv.config_test_specific()
+nof_ue = int(test_config.get("nof_physical_ue", 1))
+
+print(f'Number of physical ue: {nof_ue}')
+
+ue_li = []
+
+# Get the ue from the test configuration.
+for n in range(0, nof_ue):
+  ue_li.append(tenv.modem())
+  print(f'ue index{n}: {ue_li[n]}')
+
 epc = tenv.epc()
 enb = tenv.enb()
-ue = tenv.modem()
-iperf3srv = tenv.iperf3srv({'addr': epc.tun_addr()})
-iperf3srv.set_run_node(epc.run_node())
-iperf3cli = iperf3srv.create_client()
-iperf3cli.set_run_node(ue.run_node())
 
-epc.subscriber_add(ue)
+iperf3srv = []
+for n in range(0, nof_ue):
+  iperf3srv.append(tenv.iperf3srv({'addr': epc.tun_addr()}))
+  iperf3srv[n].set_run_node(epc.run_node())
+  iperf3srv[n].set_port(iperf3srv[n].DEFAULT_SRV_PORT + n)
+
+# Set the iperf clients in the ue.
+iperf3cli = []
+for n in range(0, nof_ue):
+  iperf3cli.append(iperf3srv[n].create_client())
+  iperf3cli[n].set_run_node(ue_li[n].run_node())
+
+for n in range(0, nof_ue):
+  epc.subscriber_add(ue_li[n])
 epc.start()
-enb.ue_add(ue)
+
+enb.ue_add(ue_li[0])
 enb.start(epc)
 
 print('waiting for ENB to connect to EPC...')
 wait(epc.enb_is_connected, enb)
 print('ENB is connected to EPC')
 
-ue.connect(enb)
+for n in range(0, nof_ue):
+  ue_li[n].connect(enb)
 
-max_rate = enb.ue_max_rate(downlink=False, num_carriers=ue.num_carriers)
+for n in range(0, nof_ue):
+  iperf3srv[n].start()
 
-iperf3srv.start()
-proc = iperf3cli.prepare_test_proc(iperf3cli.DIR_UL, ue.netns(), bitrate=max_rate)
+proc_li = []
 
-print('waiting for UE to attach...')
-wait(ue.is_registered)
-print('UE is attached')
+# Attach all the ue's.
+for n in range(0, nof_ue):
+  max_rate = enb.ue_max_rate(downlink=False, num_carriers=ue_li[n].num_carriers)
+  client = iperf3cli[n].prepare_test_proc(iperf3cli[n].DIR_UL, ue_li[n].netns(), bitrate=max_rate)
+  print(f'Iperf client type: {type(client)}')
+  proc_li.append(client)
 
-print("Running iperf3 client to %s through %s" % (str(iperf3cli), ue.netns()))
-proc.launch_sync()
-iperf3srv.stop()
+for n in range(0, nof_ue):
+  print(f'waiting for UE {n} to attach...')
+  wait(ue_li[n].is_registered)
+  print(f'UE {n} is attached')
 
-iperf3cli.print_results()
-iperf3srv.print_results(iperf3cli.proto() == iperf3cli.PROTO_UDP)
+# Execute the iperfs and wait for its finish.
+try:
+  for proc in proc_li:
+    proc.launch()
+  for proc in proc_li:
+    proc.wait()
+except Exception as e:
+  for proc in proc_li:
+    try:
+      proc.terminate()
+    except Exception:
+      print("Exception while terminanting process %r" % repr(process))
+  raise e
+
+for n in range(0, nof_ue):
+  iperf3cli[n].print_results()
+  iperf3srv[n].print_results(iperf3cli[n].proto() == iperf3cli[n].PROTO_UDP)
 
 # 80% of the maximum rate for half of the test duration
-half_duration = int(round(iperf3cli.time_sec() / 2))
-res_str = ue.verify_metric(max_rate * 0.8, operation='max_rolling_avg', metric='ul_brate', criterion='gt', window=half_duration)
-print(res_str)
-test.set_report_stdout(res_str)
+out = ''
+for n in range(0, nof_ue):
+  half_duration = int(round(iperf3cli[n].time_sec() / 2))
+  max_rate = enb.ue_max_rate(downlink=False, num_carriers=ue_li[n].num_carriers)
+  res_str = ue_li[n].verify_metric(max_rate * 0.8, operation='max_rolling_avg', metric='ul_brate', criterion='gt', window=half_duration)
+  print(res_str)
+  out += res_str
+  if n != nof_ue - 1:
+    out += '\n'
+
+test.set_report_stdout(out)
