diff --git a/src/osmo_gsm_tester/obj/enb.py b/src/osmo_gsm_tester/obj/enb.py
index e0f7be0..3c1f771 100644
--- a/src/osmo_gsm_tester/obj/enb.py
+++ b/src/osmo_gsm_tester/obj/enb.py
@@ -99,6 +99,59 @@
     def num_prb(self):
         return self._num_prb
 
+    #reference: srsLTE.git srslte_symbol_sz()
+    def num_prb2symbol_sz(self, num_prb):
+        if num_prb <= 6:
+            return 128
+        if num_prb <= 15:
+            return 256
+        if num_prb <= 25:
+            return 384
+        if num_prb <= 50:
+            return 768
+        if num_prb <= 75:
+            return 1024
+        if num_prb <= 110:
+            return 1536
+        raise log.Error('invalid num_prb %r', num_prb)
+
+    def num_prb2base_srate(self, num_prb):
+        return self.num_prb2symbol_sz(num_prb) * 15 * 1000
+
+    def get_zmq_rf_dev_args(self):
+        base_srate = self.num_prb2base_srate(self.num_prb())
+        # Define all 8 possible RF ports (2x CA with 2x2 MIMO)
+        rf_dev_args = 'fail_on_disconnect=true' \
+                    + ',tx_port0=tcp://' + self.addr() + ':2000' \
+                    + ',tx_port1=tcp://' + self.addr() + ':2002' \
+                    + ',tx_port2=tcp://' + self.addr() + ':2004' \
+                    + ',tx_port3=tcp://' + self.addr() + ':2006' \
+                    + ',rx_port0=tcp://' + self.ue.addr() + ':2001' \
+                    + ',rx_port1=tcp://' + self.ue.addr() + ':2003' \
+                    + ',rx_port2=tcp://' + self.ue.addr() + ':2005' \
+                    + ',rx_port3=tcp://' + self.ue.addr() + ':2007'
+
+        if self._num_cells == 1:
+            # Single carrier
+            if self.num_ports() == 1:
+                # SISO
+                rf_dev_args += ',tx_freq0=2630e6,rx_freq0=2510e6'
+            elif self.num_ports() == 2:
+                # MIMO
+                rf_dev_args += ',tx_freq0=2630e6,tx_freq1=2630e6,rx_freq0=2510e6,rx_freq1=2510e6'
+        elif self._num_cells == 2:
+            # 2x class
+            if self.num_ports() == 1:
+                # SISO
+                rf_dev_args += ',tx_freq0=2630e6,tx_freq1=2650e6,rx_freq0=2510e6,rx_freq1=2530e6'
+            elif self.num_ports() == 2:
+                # MIMO
+                rf_dev_args += ',tx_freq0=2630e6,tx_freq1=2630e6,tx_freq2=2650e6,tx_freq3=2650e6,rx_freq0=2510e6,rx_freq1=2510e6,rx_freq2=2530e6,rx_freq3=2530e6'
+
+        rf_dev_args += ',id=enb,base_srate=' + str(base_srate)
+
+        return rf_dev_args
+
 ###################
 # PUBLIC (test API included)
 ###################
diff --git a/src/osmo_gsm_tester/obj/enb_amarisoft.py b/src/osmo_gsm_tester/obj/enb_amarisoft.py
index bb48880..ec7063c 100644
--- a/src/osmo_gsm_tester/obj/enb_amarisoft.py
+++ b/src/osmo_gsm_tester/obj/enb_amarisoft.py
@@ -27,25 +27,6 @@
 def rf_type_valid(rf_type_str):
     return rf_type_str in ('uhd', 'zmq')
 
-#reference: srsLTE.git srslte_symbol_sz()
-def num_prb2symbol_sz(num_prb):
-    if num_prb <= 6:
-        return 128
-    if num_prb <= 15:
-        return 256
-    if num_prb <= 25:
-        return 384
-    if num_prb <= 50:
-        return 768
-    if num_prb <= 75:
-        return 1024
-    if num_prb <= 110:
-        return 1536
-    raise log.Error('invalid num_prb %r', num_prb)
-
-def num_prb2base_srate(num_prb):
-    return num_prb2symbol_sz(num_prb) * 15 * 1000
-
 class AmarisoftENB(enb.eNodeB):
 
     REMOTE_DIR = '/osmo-gsm-tester-amarisoftenb'
@@ -174,15 +155,10 @@
 
         # We need to set some specific variables programatically here to match IP addresses:
         if self._conf.get('rf_dev_type') == 'zmq':
-            base_srate = num_prb2base_srate(self.num_prb())
-            rf_dev_args = 'fail_on_disconnect=true' \
-                        + ',tx_port0=tcp://' + self.addr() + ':2000' \
-                        + ',tx_port1=tcp://' + self.addr() + ':2002' \
-                        + ',rx_port0=tcp://' + self.ue.addr() + ':2001' \
-                        + ',rx_port1=tcp://' + self.ue.addr() + ':2003' \
-                        + ',id=enb,base_srate=' + str(base_srate)
+            base_srate = self.num_prb2base_srate(self.num_prb())
+            rf_dev_args = self.get_zmq_rf_dev_args()
             config.overlay(values, dict(enb=dict(sample_rate = base_srate / (1000*1000),
-                                                 rf_dev_args=rf_dev_args)))
+                                                 rf_dev_args = rf_dev_args)))
 
         # Set UHD frame size as a function of the cell bandwidth on B2XX
         if self._conf.get('rf_dev_type') == 'uhd' and values['enb'].get('rf_dev_args', None) is not None:
diff --git a/src/osmo_gsm_tester/obj/enb_srs.py b/src/osmo_gsm_tester/obj/enb_srs.py
index e657b04..243ffaa 100644
--- a/src/osmo_gsm_tester/obj/enb_srs.py
+++ b/src/osmo_gsm_tester/obj/enb_srs.py
@@ -27,25 +27,6 @@
 def rf_type_valid(rf_type_str):
     return rf_type_str in ('zmq', 'uhd', 'soapy', 'bladerf')
 
-#reference: srsLTE.git srslte_symbol_sz()
-def num_prb2symbol_sz(num_prb):
-    if num_prb <= 6:
-        return 128
-    if num_prb <= 15:
-        return 256
-    if num_prb <= 25:
-        return 384
-    if num_prb <= 50:
-        return 768
-    if num_prb <= 75:
-        return 1024
-    if num_prb <= 110:
-        return 1536
-    raise log.Error('invalid num_prb %r', num_prb)
-
-def num_prb2base_srate(num_prb):
-    return num_prb2symbol_sz(num_prb) * 15 * 1000
-
 class srsENB(enb.eNodeB):
 
     REMOTE_DIR = '/osmo-gsm-tester-srsenb'
@@ -194,14 +175,7 @@
 
         # We need to set some specific variables programatically here to match IP addresses:
         if self._conf.get('rf_dev_type') == 'zmq':
-            base_srate = num_prb2base_srate(self.num_prb())
-            rf_dev_args = 'fail_on_disconnect=true' \
-                        + ',tx_port=tcp://' + self.addr() + ':2000' \
-                        + ',tx_port2=tcp://' + self.addr() + ':2002' \
-                        + ',rx_port=tcp://' + self.ue.addr() + ':2001' \
-                        + ',rx_port2=tcp://' + self.ue.addr() + ':2003' \
-                        + ',tx_freq=2630e6,rx_freq=2510e6,tx_freq2=2650e6,rx_freq2=2530e6' \
-                        + ',id=enb,base_srate=' + str(base_srate)
+            rf_dev_args = self.get_zmq_rf_dev_args()
             config.overlay(values, dict(enb=dict(rf_dev_args=rf_dev_args)))
 
         # Set UHD frame size as a function of the cell bandwidth on B2XX
