diff --git a/core/src/main/java/haveno/core/trade/Trade.java b/core/src/main/java/haveno/core/trade/Trade.java
index 5a4ddeb2a4..19cab12662 100644
--- a/core/src/main/java/haveno/core/trade/Trade.java
+++ b/core/src/main/java/haveno/core/trade/Trade.java
@@ -620,7 +620,7 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
 
         // skip initialization if trade is complete
         // starting in v1.0.19, seller resends payment received message until acked or stored in mailbox
-        if (isPayoutUnlocked() && isCompleted() && !getProtocol().needsToResendPaymentReceivedMessages()) {
+        if (isFinished()) {
             clearAndShutDown();
             return;
         }
@@ -774,6 +774,10 @@ public abstract class Trade extends XmrWalletBase implements Tradable, Model {
         isFullyInitialized = true;
     }
 
+    public boolean isFinished() {
+        return isPayoutUnlocked() && isCompleted() && !getProtocol().needsToResendPaymentReceivedMessages();
+    }
+
     public void resetToPaymentSentState() {
         setState(Trade.State.BUYER_SENT_PAYMENT_SENT_MSG);
         for (TradePeer peer : getAllPeers()) peer.setPaymentReceivedMessage(null);
diff --git a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java
index 372c26b5da..290e2cce6e 100644
--- a/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java
+++ b/core/src/main/java/haveno/core/trade/protocol/TradeProtocol.java
@@ -165,7 +165,6 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
             }
         } else if (networkEnvelope instanceof AckMessage) {
             onAckMessage((AckMessage) networkEnvelope, peer);
-            trade.onAckMessage((AckMessage) networkEnvelope, peer); // notify trade listeners
         }
     }
 
@@ -210,11 +209,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
             onMailboxMessage(tradeMessage, mailboxMessage.getSenderNodeAddress());
         } else if (mailboxMessage instanceof AckMessage) {
             AckMessage ackMessage = (AckMessage) mailboxMessage;
-            if (!trade.isCompleted()) {
-                // We only apply the msg if we have not already completed the trade
-                onAckMessage(ackMessage, mailboxMessage.getSenderNodeAddress());
-            }
-            // In any case we remove the msg
+            onAckMessage(ackMessage, mailboxMessage.getSenderNodeAddress());
             processModel.getP2PService().getMailboxMessageService().removeMailboxMsg(ackMessage);
             log.info("Remove {} from the P2P network.", ackMessage.getClass().getSimpleName());
         }
@@ -242,7 +237,7 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
     protected void onInitialized() {
 
         // listen for direct messages unless completed
-        if (!trade.isCompleted()) processModel.getP2PService().addDecryptedDirectMessageListener(this);
+        if (!trade.isFinished()) processModel.getP2PService().addDecryptedDirectMessageListener(this);
 
         // initialize trade
         synchronized (trade.getLock()) {
@@ -719,6 +714,9 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
 
     private void onAckMessage(AckMessage ackMessage, NodeAddress sender) {
 
+        // ignore if trade is completely finished
+        if (trade.isFinished())  return;
+
         // get trade peer
         TradePeer peer = trade.getTradePeer(sender);
         if (peer == null) {
@@ -791,6 +789,9 @@ public abstract class TradeProtocol implements DecryptedDirectMessageListener, D
             log.warn("Received AckMessage with error state for {}, sender={}, trade={} {}, messageUid={}, errorMessage={}", ackMessage.getSourceMsgClassName(), sender, trade.getClass().getSimpleName(), trade.getId(), ackMessage.getSourceUid(), ackMessage.getErrorMessage());
             handleError(ackMessage.getErrorMessage());
         }
+
+        // notify trade listeners
+        trade.onAckMessage(ackMessage, sender);
     }
 
     protected void sendAckMessage(NodeAddress peer, TradeMessage message, boolean result, @Nullable String errorMessage) {