diff --git a/decoder/include/etmv4/trc_pkt_elem_etmv4i.h b/decoder/include/etmv4/trc_pkt_elem_etmv4i.h
index 890baf1ba569..d2a774ecdd47 100644
--- a/decoder/include/etmv4/trc_pkt_elem_etmv4i.h
+++ b/decoder/include/etmv4/trc_pkt_elem_etmv4i.h
@@ -129,8 +129,8 @@ public:
 
     // address
     const uint8_t &getAddrMatch() const  { return addr_exact_match_idx; };
-    const ocsd_vaddr_t &getAddrVal() const { return v_addr.val; };
-    const uint8_t &getAddrIS() const { return v_addr_ISA; };
+    const ocsd_vaddr_t &getAddrVal() const { return v_addr[0].val; };
+    const uint8_t &getAddrIS() const { return v_addr_ISA[0]; };
 
     // ts
     const uint64_t getTS() const { return pkt_valid.bits.ts_valid ? ts.timestamp : 0; };
@@ -377,44 +377,64 @@ inline void EtmV4ITrcPacket::setExceptionInfo(const uint16_t excep_type, const u
 inline void EtmV4ITrcPacket::set64BitAddress(const uint64_t addr, const uint8_t IS, const uint8_t update_bits)
 {
     uint64_t update_mask = (uint64_t)-1;
-    v_addr.pkt_bits = update_bits;
-    v_addr.size = VA_64BIT;
-    if(v_addr.valid_bits < update_bits)
-        v_addr.valid_bits = update_bits;
+    v_addr[2] = v_addr[1];
+    v_addr[1] = v_addr[0];
+    v_addr_ISA[2] = v_addr_ISA[1];
+    v_addr_ISA[1] = v_addr_ISA[0];
+    v_addr[0].pkt_bits = update_bits;
+    v_addr[0].size = VA_64BIT;
+    if(v_addr[0].valid_bits < update_bits)
+        v_addr[0].valid_bits = update_bits;
 
     if(update_bits < 64) 
     {
         update_mask = ((uint64_t)1 << update_bits) - 1;
     }
-    v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask);
-    v_addr_ISA = IS;
+    v_addr[0].val = (v_addr[0].val & ~update_mask) | (addr & update_mask);
+    v_addr_ISA[0] = IS;
 }
 
 inline void EtmV4ITrcPacket::set32BitAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits)
 {
     ocsd_vaddr_t update_mask = OCSD_BIT_MASK(update_bits);
-    v_addr.pkt_bits = update_bits;
-    v_addr.size = VA_32BIT;
-    if((v_addr.valid_bits < update_bits) || (update_bits == 32) )  // account for dropping into AArch32
-        v_addr.valid_bits = update_bits;
+    v_addr[2] = v_addr[1];
+    v_addr[1] = v_addr[0];
+    v_addr_ISA[2] = v_addr_ISA[1];
+    v_addr_ISA[1] = v_addr_ISA[0];
+    v_addr[0].pkt_bits = update_bits;
+    v_addr[0].size = VA_32BIT;
+    if((v_addr[0].valid_bits < update_bits) || (update_bits == 32) )  // account for dropping into AArch32
+        v_addr[0].valid_bits = update_bits;
 
-    v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask);
-    v_addr_ISA = IS;
+    v_addr[0].val = (v_addr[0].val & ~update_mask) | (addr & update_mask);
+    v_addr_ISA[0] = IS;
 }
 
 inline void EtmV4ITrcPacket::updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits)
 {
     ocsd_vaddr_t update_mask = OCSD_BIT_MASK(update_bits);
-    v_addr.pkt_bits = update_bits;
-    if(v_addr.valid_bits < update_bits)
-        v_addr.valid_bits = update_bits;
+    v_addr[2] = v_addr[1];
+    v_addr[1] = v_addr[0];
+    v_addr_ISA[2] = v_addr_ISA[1];
+    v_addr_ISA[1] = v_addr_ISA[0];
+    v_addr[0].pkt_bits = update_bits;
+    if(v_addr[0].valid_bits < update_bits)
+        v_addr[0].valid_bits = update_bits;
 
-    v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask);
-    v_addr_ISA = IS;
+    v_addr[0].val = (v_addr[0].val & ~update_mask) | (addr & update_mask);
+    v_addr_ISA[0] = IS;
 }
 
 inline void EtmV4ITrcPacket::setAddressExactMatch(const uint8_t idx)
 {
+    ocsd_pkt_vaddr matchingAddr = v_addr[idx];
+    uint8_t matchingISA = v_addr_ISA[idx];
+    v_addr[2] = v_addr[1];
+    v_addr[1] = v_addr[0];
+    v_addr[0] = matchingAddr;
+    v_addr_ISA[2] = v_addr_ISA[1];
+    v_addr_ISA[1] = v_addr_ISA[0];
+    v_addr_ISA[0] = matchingISA;
     addr_exact_match_idx = idx;    
 }
 
diff --git a/decoder/include/etmv4/trc_pkt_types_etmv4.h b/decoder/include/etmv4/trc_pkt_types_etmv4.h
index 7f017370bb25..dc4b3f3b453b 100644
--- a/decoder/include/etmv4/trc_pkt_types_etmv4.h
+++ b/decoder/include/etmv4/trc_pkt_types_etmv4.h
@@ -168,8 +168,8 @@ typedef struct _ocsd_etmv4_i_pkt
 
     //** intra-packet data - valid across packets.
 
-    ocsd_pkt_vaddr v_addr;         //!< most recently broadcast address packet
-    uint8_t         v_addr_ISA;     //!< ISA for the address packet. (0 = IS0 / 1 = IS1)
+    ocsd_pkt_vaddr v_addr[3];       //!< most recently broadcast address packets
+    uint8_t         v_addr_ISA[3];  //!< ISA for the address packets. (0 = IS0 / 1 = IS1)
 
     etmv4_context_t context;        //!< current context for PE
 
diff --git a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
index 082198eae2ae..e98631794f3e 100644
--- a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
@@ -52,9 +52,12 @@ void EtmV4ITrcPacket::initStartState()
     pkt_valid.val = 0;
 
     // virtual address
-    v_addr.pkt_bits = 0;
-    v_addr.valid_bits = 0;
-    v_addr_ISA = 0;
+    for (uint8_t i = 0; i < 3; i++)
+    {
+        v_addr[i].pkt_bits = 0;
+        v_addr[i].valid_bits = 0;
+        v_addr_ISA[i] = 0;
+    }
 
     // timestamp
     ts.bits_changed = 0;
@@ -100,7 +103,7 @@ void EtmV4ITrcPacket::toString(std::string &str) const
         contextStr(ctxtStr);
     case ETM4_PKT_I_ADDR_L_32IS0:
     case ETM4_PKT_I_ADDR_L_32IS1:
-        trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 32) ? v_addr.pkt_bits : 0);
+        trcPrintableElem::getValStr(valStr, (v_addr[0].size == VA_64BIT) ? 64 : 32, v_addr[0].valid_bits, v_addr[0].val, true, (v_addr[0].pkt_bits < 32) ? v_addr[0].pkt_bits : 0);
         str += "; Addr=" + valStr + "; " + ctxtStr;
         break;
 
@@ -109,7 +112,7 @@ void EtmV4ITrcPacket::toString(std::string &str) const
         contextStr(ctxtStr);
     case ETM4_PKT_I_ADDR_L_64IS0:
     case ETM4_PKT_I_ADDR_L_64IS1:
-        trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 64) ? v_addr.pkt_bits : 0);
+        trcPrintableElem::getValStr(valStr, (v_addr[0].size == VA_64BIT) ? 64 : 32, v_addr[0].valid_bits, v_addr[0].val, true, (v_addr[0].pkt_bits < 64) ? v_addr[0].pkt_bits : 0);
         str += "; Addr=" + valStr + "; " + ctxtStr;
         break;
 
@@ -120,7 +123,7 @@ void EtmV4ITrcPacket::toString(std::string &str) const
 
     case ETM4_PKT_I_ADDR_S_IS0:
     case ETM4_PKT_I_ADDR_S_IS1:
-        trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits);
+        trcPrintableElem::getValStr(valStr, (v_addr[0].size == VA_64BIT) ? 64 : 32, v_addr[0].valid_bits, v_addr[0].val, true, v_addr[0].pkt_bits);
         str += "; Addr=" + valStr;
         break;
 
