diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py
index 42c32a1cebdb4b4f2e0d753ad7b86f198080c764..b2be0eef6c824a208f02611c83928969d3051c5b 100644
--- a/ebpfcat/ebpfcat.py
+++ b/ebpfcat/ebpfcat.py
@@ -28,31 +28,30 @@ from .bpf import (
 
 
 class PacketDesc:
-    def __init__(self, position, size):
+    def __init__(self, sm, position, size):
+        self.sm = sm
         self.position = position
         self.size = size
 
     def __get__(self, instance, owner):
         if instance is None:
             return self
-        offset = instance.position_offset[self.position[0]]
+        offset = instance.position_offset[self.sm]
         if isinstance(instance, Struct):
             terminal = instance.terminal
             device = instance.device
         else:
             terminal = instance
             device = None
-        ret = PacketVar(terminal, (self.position[0],
-                                   self.position[1] + offset), self.size)
+        ret = PacketVar(terminal, self.sm, self.position + offset, self.size)
         if device is None:
             return ret
         else:
             return ret.get(device)
 
     def __set__(self, instance, value):
-        offset = instance.position_offset[self.position[0]]
-        ret = PacketVar(instance.terminal,
-                        (self.position[0], self.position[1] + offset),
+        offset = instance.position_offset[self.sm]
+        ret = PacketVar(instance.terminal, self.sm, self.position + offset,
                         self.size)
         return ret.set(instance.device, value)
 
@@ -66,8 +65,9 @@ class PacketVar(MemoryDesc):
         else:
             return self.size
 
-    def __init__(self, terminal, position, size):
+    def __init__(self, terminal, sm, position, size):
         self.terminal = terminal
+        self.sm = sm
         self.position = position
         self.size = size
 
@@ -119,8 +119,8 @@ class PacketVar(MemoryDesc):
                 return unpack_from("<" + self.size, data, start)[0]
 
     def _start(self, device):
-        base, offset = self.position
-        return device.sync_group.terminals[self.terminal][base] + offset
+        return device.sync_group.terminals[self.terminal][self.sm] \
+               + self.position
 
     def fmt_addr(self, device):
         return ("B" if isinstance(self.size, int) else self.size,
@@ -135,9 +135,9 @@ class Struct:
 
 
 class StructDesc:
-    def __init__(self, struct, *position_offset):
+    def __init__(self, struct, sm3=0, sm2=0):
         self.struct = struct
-        self.position_offset = position_offset
+        self.position_offset = {2: sm2, 3: sm3}
 
     def __get__(self, instance, owner):
         if instance is None:
@@ -209,7 +209,7 @@ class Device(SubProgram):
 
 class EBPFTerminal(Terminal):
     compatibility = None
-    position_offset = 0, 0
+    position_offset = {2: 0, 3: 0}
 
     async def initialize(self, relative, absolute):
         await super().initialize(relative, absolute)
@@ -220,14 +220,17 @@ class EBPFTerminal(Terminal):
                 f"({relative}, {absolute})")
 
     def allocate(self, packet, readonly):
+        """allocate space in packet for the pdos of this terminal
+
+        return a dict that contains the starting offset for each
+        sync manager"""
+        bases = {}
         if self.pdo_in_sz:
-            bases = [packet.size + packet.DATAGRAM_HEADER]
+            bases[3] = packet.size + packet.DATAGRAM_HEADER
             packet.append(ECCmd.FPRD, b"\0" * self.pdo_in_sz, 0,
                           self.position, self.pdo_in_off)
-        else:
-            bases = [None]
         if self.pdo_out_sz:
-            bases.append(packet.size + packet.DATAGRAM_HEADER)
+            bases[2] = packet.size + packet.DATAGRAM_HEADER
             if readonly:
                 packet.on_the_fly.append((packet.size, ECCmd.FPWR))
                 packet.append(ECCmd.NOP, b"\0" * self.pdo_out_sz, 0,
diff --git a/ebpfcat/terminals.py b/ebpfcat/terminals.py
index a6a8b00f8caa085c40caae3d0e291bafab77d768..331a15f786ac7963b1f50b9839394c41308b3057 100644
--- a/ebpfcat/terminals.py
+++ b/ebpfcat/terminals.py
@@ -30,40 +30,40 @@ class Skip(EBPFTerminal):
 class EL1808(EBPFTerminal):
     compatibility = {(2, 118501458)}
 
-    ch1 = PacketDesc((0, 0), 0)
-    ch2 = PacketDesc((0, 0), 1)
-    ch3 = PacketDesc((0, 0), 2)
-    ch4 = PacketDesc((0, 0), 3)
-    ch5 = PacketDesc((0, 0), 4)
-    ch6 = PacketDesc((0, 0), 5)
-    ch7 = PacketDesc((0, 0), 6)
-    ch8 = PacketDesc((0, 0), 7)
+    ch1 = PacketDesc(3, 0, 0)
+    ch2 = PacketDesc(3, 0, 1)
+    ch3 = PacketDesc(3, 0, 2)
+    ch4 = PacketDesc(3, 0, 3)
+    ch5 = PacketDesc(3, 0, 4)
+    ch6 = PacketDesc(3, 0, 5)
+    ch7 = PacketDesc(3, 0, 6)
+    ch8 = PacketDesc(3, 0, 7)
 
 
 class EL2808(EBPFTerminal):
     compatibility = {(2, 184037458)}
 
-    ch1 = PacketDesc((1, 0), 0)
-    ch2 = PacketDesc((1, 0), 1)
-    ch3 = PacketDesc((1, 0), 2)
-    ch4 = PacketDesc((1, 0), 3)
-    ch5 = PacketDesc((1, 0), 4)
-    ch6 = PacketDesc((1, 0), 5)
-    ch7 = PacketDesc((1, 0), 6)
-    ch8 = PacketDesc((1, 0), 7)
+    ch1 = PacketDesc(2, 0, 0)
+    ch2 = PacketDesc(2, 0, 1)
+    ch3 = PacketDesc(2, 0, 2)
+    ch4 = PacketDesc(2, 0, 3)
+    ch5 = PacketDesc(2, 0, 4)
+    ch6 = PacketDesc(2, 0, 5)
+    ch7 = PacketDesc(2, 0, 6)
+    ch8 = PacketDesc(2, 0, 7)
 
 
 class EL4104(EBPFTerminal):
-    ch1_value = PacketDesc((1, 0), 'H')
-    ch2_value = PacketDesc((1, 2), 'H')
-    ch3_value = PacketDesc((1, 4), 'H')
-    ch4_value = PacketDesc((1, 6), 'H')
+    ch1_value = PacketDesc(2, 0, 'H')
+    ch2_value = PacketDesc(2, 2, 'H')
+    ch3_value = PacketDesc(2, 4, 'H')
+    ch4_value = PacketDesc(2, 6, 'H')
 
 
 class EL3164(EBPFTerminal):
     class Channel(Struct):
-        attrs = PacketDesc((0, 0), 'H')
-        value = PacketDesc((0, 2), 'H')
+        attrs = PacketDesc(3, 0, 'H')
+        value = PacketDesc(3, 2, 'H')
 
     channel1 = Channel(0)
     channel2 = Channel(4)
@@ -76,41 +76,41 @@ class EK1101(EBPFTerminal):
 
 
 class EK1814(EBPFTerminal):
-    ch1 = PacketDesc((0, 0), 0)
-    ch2 = PacketDesc((0, 0), 1)
-    ch3 = PacketDesc((0, 0), 2)
-    ch4 = PacketDesc((0, 0), 3)
-    ch5 = PacketDesc((1, 0), 0)
-    ch6 = PacketDesc((1, 0), 1)
-    ch7 = PacketDesc((1, 0), 2)
-    ch8 = PacketDesc((1, 0), 3)
+    ch1 = PacketDesc(3, 0, 0)
+    ch2 = PacketDesc(3, 0, 1)
+    ch3 = PacketDesc(3, 0, 2)
+    ch4 = PacketDesc(3, 0, 3)
+    ch5 = PacketDesc(2, 0, 0)
+    ch6 = PacketDesc(2, 0, 1)
+    ch7 = PacketDesc(2, 0, 2)
+    ch8 = PacketDesc(2, 0, 3)
 
 
 class EL5042(EBPFTerminal):
     compatibility = {(2, 330444882)}
     class Channel(Struct):
-        position = PacketDesc((0, 2), "q")
-        warning = PacketDesc((0, 0), 0)
-        error = PacketDesc((0, 0), 1)
-        status = PacketDesc((0, 0), "H")
+        position = PacketDesc(3, 2, "q")
+        warning = PacketDesc(3, 0, 0)
+        error = PacketDesc(3, 0, 1)
+        status = PacketDesc(3, 0, "H")
 
-    channel1 = Channel(0, None, 0)
-    channel2 = Channel(10, None, 0x10)
+    channel1 = Channel(0, 0)
+    channel2 = Channel(10, 0x10)
 
 
 class EL6022(EBPFTerminal):
     class Channel(Struct):
-        transmit_accept = PacketDesc((0, 0), 0)
-        receive_request = PacketDesc((0, 0), 1)
-        init_accept = PacketDesc((0, 0), 2)
-        status = PacketDesc((0, 0), "H")
-        in_string = PacketDesc((0, 1), "23p")
-
-        transmit_request = PacketDesc((1, 0), 0)
-        receive_accept = PacketDesc((1, 0), 1)
-        init_request = PacketDesc((1, 0), 2)
-        control = PacketDesc((1, 0), "H")
-        out_string = PacketDesc((1, 1), "23p")
+        transmit_accept = PacketDesc(3, 0, 0)
+        receive_request = PacketDesc(3, 0, 1)
+        init_accept = PacketDesc(3, 0, 2)
+        status = PacketDesc(3, 0, "H")
+        in_string = PacketDesc(3, 1, "23p")
+
+        transmit_request = PacketDesc(2, 0, 0)
+        receive_accept = PacketDesc(2, 0, 1)
+        init_request = PacketDesc(2, 0, 2)
+        control = PacketDesc(2, 0, "H")
+        out_string = PacketDesc(2, 1, "23p")
 
     channel1 = Channel(0, 0)
     channel2 = Channel(24, 24)
@@ -118,8 +118,8 @@ class EL6022(EBPFTerminal):
 
 class EL7041(EBPFTerminal):
     compatibility = {(2, 461451346), (2, 461455442), (2, 460795986)}
-    velocity = PacketDesc((1, 6), "h")
-    enable = PacketDesc((1, 4), 0)
-    status = PacketDesc((0, 6), "H")
-    low_switch = PacketDesc((0, 1), 7)
-    high_switch = PacketDesc((0, 1), 8)
+    velocity = PacketDesc(2, 6, "h")
+    enable = PacketDesc(2, 4, 0)
+    status = PacketDesc(3, 6, "H")
+    low_switch = PacketDesc(3, 1, 7)
+    high_switch = PacketDesc(3, 1, 8)