diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py
index f6dcc7502ccc6f5723186995d5a5d2a85e144c01..d40f0c235e1f0ff18d0c873d818d79483c528eb3 100644
--- a/ebpfcat/ebpfcat.py
+++ b/ebpfcat/ebpfcat.py
@@ -223,8 +223,10 @@ class EBPFTerminal(Terminal):
                 f"Incompatible Terminal: {self.vendorId}:{self.productCode}")
         await self.to_operational(2)
         self.pdos = {}
-        if self.has_mailbox():
-            await self.parse_pdos()
+        outbits, inbits = await self.parse_pdos()
+        self.pdo_out_sz = int((outbits + 7) // 8)
+        self.pdo_in_sz = int((inbits + 7) // 8)
+        await self.write_pdo_sm()
 
     def allocate(self, packet, readonly):
         """allocate space in packet for the pdos of this terminal
diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py
index e21e8679c5972974a9221129b7aa199318df5f0f..da465695c166e6c79d102dbc29e8a791102837ff 100644
--- a/ebpfcat/ethercat.py
+++ b/ebpfcat/ethercat.py
@@ -450,8 +450,16 @@ class Terminal:
             elif mode == 6:
                 self.mbx_out_off = offset
                 self.mbx_out_sz = size
-        s = await self.read(0x800, data=0x80)
-        print(absolute, " ".join(f"{c:02x} {'|' if i % 8 == 7 else ''}" for i, c in enumerate(s)))
+            else:
+                print("wrong mode")
+
+    async def write_pdo_sm(self):
+        await self.write(0x816, "B", 0)
+        await self.write(0x812, "H", self.pdo_out_sz)
+        await self.write(0x816, "B", self.pdo_out_sz > 0)
+        await self.write(0x81E, "B", 0)
+        await self.write(0x81A, "H", self.pdo_in_sz)
+        await self.write(0x81E, "B", self.pdo_in_sz > 0)
 
     async def parse_pdos(self):
         async def parse_eeprom(s):
@@ -492,16 +500,18 @@ class Terminal:
                         (sm, bitpos // 8,
                          {8: "B", 16: "H", 32: "I", 64: "Q"}[bits])
                 bitpos += bits
+            return bitpos
 
         self.pdos = {}
         if self.has_mailbox():
-            await parse(parse_sdo(0x1c12, 2))
-            await parse(parse_sdo(0x1c13, 3))
+            return (await parse(parse_sdo(0x1c12, 2)),
+                    await parse(parse_sdo(0x1c13, 3)))
         else:
-            if 50 in self.eeprom:
+            return (
                 await parse(parse_eeprom(self.eeprom[50]))
-            if 51 in self.eeprom:
+                if 50 in self.eeprom else 0,
                 await parse(parse_eeprom(self.eeprom[51]))
+                if 51 in self.eeprom else 0)
 
     async def parse_pdo(self, index, sm):
         assignment = await self.sdo_read(index)
diff --git a/ebpfcat/ethercat_test.py b/ebpfcat/ethercat_test.py
index 60b6a76609b567c609a3ec0b95a31788d04046da..a000ec64c77289b61f205e8e0028e900a4f4e94a 100644
--- a/ebpfcat/ethercat_test.py
+++ b/ebpfcat/ethercat_test.py
@@ -42,6 +42,8 @@ class MockEtherCat:
     async def roundtrip(self, *args, data=None):
         if data is not None:
             args += data,
+        if not self.expected:
+            self.test.fail(f"missing {args}")
         self.test.assertEqual(args, self.expected.pop(0))
         return self.results.pop(0)
 
@@ -70,7 +72,7 @@ class MockTerminal(Terminal):
         self.test_sdo = data["sdo"]
         await self.apply_eeprom()
 
-    async def to_operational(self, state):
+    async def to_operational(self, state=8):
         self.operational = state
 
     async def sdo_read(self, index, subindex=None):
@@ -119,8 +121,14 @@ class Tests(TestCase):
             (ECCmd.FPWR, 4, 0x800, 0x80),
             (ECCmd.FPWR, 4, 0x800, H('00108000260001018010800022000102'
                                      '00110000040000038011100020000104')),
+            (ECCmd.FPWR, 4, 2070, 'B', 0),  # disable sync manager
+            (ECCmd.FPWR, 4, 2066, 'H', 0),  # set sync manager size
+            (ECCmd.FPWR, 4, 2070, 'B', False),  # disable 0-length sync manager
+            (ECCmd.FPWR, 4, 2078, 'B', 0),  # disable other sync manager
+            (ECCmd.FPWR, 4, 2074, 'H', 16),  # set sync manager size
+            (ECCmd.FPWR, 4, 2078, 'B', True),  # enable sync manager
         ]
-        ec.results = [None, None]
+        ec.results = [None, None, None, None, None, None, None, None]
         await ti.initialize(-1, 4)
         ai = AnalogInput(ti.channel1.value)
         SyncGroup.packet_index = 0x66554433
@@ -169,8 +177,14 @@ class Tests(TestCase):
             (ECCmd.FPWR, 7, 0x800, 0x80),
             (ECCmd.FPWR, 7, 0x800, H('0010800026000101801080002200010'
                                      '200110800240001038011000000000004')),
+            (ECCmd.FPWR, 7, 2070, 'B', 0),  # disable sync manager
+            (ECCmd.FPWR, 7, 2066, 'H', 8),  # set sync manager size
+            (ECCmd.FPWR, 7, 2070, 'B', True),  # enable sync manager
+            (ECCmd.FPWR, 7, 2078, 'B', 0),  # disable other sync manager
+            (ECCmd.FPWR, 7, 2074, 'H', 0),  # set sync manager size
+            (ECCmd.FPWR, 7, 2078, 'B', False),  # disable 0-length sync manager
         ]
-        ec.results = [None, None]
+        ec.results = [None, None, None, None, None, None, None, None]
         await ti.initialize(-2, 7)
         ao = AnalogOutput(ti.ch1_value)
         SyncGroup.packet_index = 0x55443322