From 8e280b99d4cd7e65345ca8729f71a07376333a80 Mon Sep 17 00:00:00 2001
From: Manfred Karrer <mk@nucleo.io>
Date: Sat, 14 Mar 2015 09:37:52 +0100
Subject: [PATCH] Add rollBackOnFault to all tasks

---
 .../availability/tasks/GetPeerAddress.java    |  2 +-
 ...ProcessReportOfferAvailabilityMessage.java |  2 +-
 .../tasks/RequestIsOfferAvailable.java        |  2 +-
 .../tasks/AddOfferToRemoteOfferBook.java      |  2 +
 .../tasks/BroadcastCreateOfferFeeTx.java      |  2 +-
 .../placeoffer/tasks/CreateOfferFeeTx.java    |  2 +
 .../placeoffer/tasks/ValidateOffer.java       |  2 +
 .../trade/offerer/BuyerAsOffererProtocol.java | 55 +++++++++--------
 .../RespondToTakeOfferRequestMessage.java     | 10 +--
 .../trade/offerer/tasks/CreateDepositTx.java  |  2 +
 .../ProcessPayoutTxPublishedMessage.java      |  2 +
 ...RequestOffererPublishDepositTxMessage.java |  2 +
 .../tasks/ProcessRequestTakeOfferMessage.java |  2 +
 .../ProcessTakeOfferFeePayedMessage.java      |  2 +
 .../tasks/RespondToTakeOfferRequest.java      | 28 ++++++---
 .../tasks/SendBankTransferInitedMessage.java  |  2 +
 .../offerer/tasks/SendDepositTxIdToTaker.java |  2 +
 .../tasks/SendTakerDepositPaymentRequest.java |  2 +
 ...etupListenerForBlockChainConfirmation.java |  2 +
 .../tasks/SignAndPublishDepositTx.java        |  2 +
 .../trade/offerer/tasks/SignPayoutTx.java     |  2 +
 .../offerer/tasks/VerifyAndSignContract.java  |  2 +
 .../tasks/VerifyTakeOfferFeePayment.java      |  4 +-
 .../offerer/tasks/VerifyTakerAccount.java     |  2 +
 .../trade/taker/SellerAsTakerProtocol.java    | 61 ++++++++++---------
 .../taker/tasks/CreateAndSignContract.java    |  2 +
 .../trade/taker/tasks/GetPeerAddress.java     | 14 ++++-
 .../trade/taker/tasks/PayDeposit.java         |  2 +
 .../trade/taker/tasks/PayTakeOfferFee.java    |  7 +++
 .../ProcessBankTransferInitedMessage.java     |  2 +
 .../ProcessDepositTxPublishedMessage.java     |  2 +
 ...ocessRespondToTakeOfferRequestMessage.java |  8 ++-
 ...cessTakerDepositPaymentRequestMessage.java |  2 +
 .../trade/taker/tasks/RequestTakeOffer.java   | 11 +++-
 .../taker/tasks/SendPayoutTxToOfferer.java    |  2 +
 .../tasks/SendSignedTakerDepositTxAsHex.java  |  4 +-
 .../tasks/SendTakeOfferFeePayedMessage.java   |  6 +-
 .../taker/tasks/SignAndPublishPayoutTx.java   |  2 +
 .../taker/tasks/TakerCommitDepositTx.java     |  2 +
 .../taker/tasks/VerifyOfferFeePayment.java    |  2 +
 .../taker/tasks/VerifyOffererAccount.java     |  2 +
 .../io/bitsquare/util/taskrunner/Task.java    |  5 +-
 42 files changed, 190 insertions(+), 83 deletions(-)

diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java
index 283f59d79f..853e69ed26 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/GetPeerAddress.java
@@ -55,7 +55,7 @@ public class GetPeerAddress extends Task<CheckOfferAvailabilityModel> {
     }
 
     @Override
-    protected void applyErrorState() {
+    protected void rollBackOnFault() {
         model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/ProcessReportOfferAvailabilityMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/ProcessReportOfferAvailabilityMessage.java
index 5fb857b52a..d92b44dc1b 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/ProcessReportOfferAvailabilityMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/ProcessReportOfferAvailabilityMessage.java
@@ -51,7 +51,7 @@ public class ProcessReportOfferAvailabilityMessage extends Task<CheckOfferAvaila
     }
 
     @Override
-    protected void applyErrorState() {
+    protected void rollBackOnFault() {
         model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java
index 70785a355a..66c944c596 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/tasks/RequestIsOfferAvailable.java
@@ -52,7 +52,7 @@ public class RequestIsOfferAvailable extends Task<CheckOfferAvailabilityModel> {
     }
 
     @Override
-    protected void applyErrorState() {
+    protected void rollBackOnFault() {
         if (model.getOffer().getState() != Offer.State.OFFERER_OFFLINE)
             model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
     }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java
index 00692b350e..eb77f26c70 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/AddOfferToRemoteOfferBook.java
@@ -41,5 +41,7 @@ public class AddOfferToRemoteOfferBook extends Task<PlaceOfferModel> {
                 (message, throwable) -> {
                     failed(throwable);
                 });
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java
index f5b7478fd2..be5a103847 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/BroadcastCreateOfferFeeTx.java
@@ -103,7 +103,7 @@ public class BroadcastCreateOfferFeeTx extends Task<PlaceOfferModel> {
         }
     }
 
-    protected void applyErrorState() {
+    protected void rollBackOnFault() {
         if (!removeOfferFailed && !addOfferFailed) {
             // If broadcast fails we need to remove offer from offerbook
             model.getOfferBookService().removeOffer(model.getOffer(),
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java
index bb6f9754f6..9c17948205 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/CreateOfferFeeTx.java
@@ -46,5 +46,7 @@ public class CreateOfferFeeTx extends Task<PlaceOfferModel> {
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java
index 2adc48753e..2a13aa9bc3 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/placeoffer/tasks/ValidateOffer.java
@@ -40,5 +40,7 @@ public class ValidateOffer extends Task<PlaceOfferModel> {
         } catch (Exception e) {
             failed(e);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java
index b36a9aa882..87b2a0de67 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/BuyerAsOffererProtocol.java
@@ -78,31 +78,6 @@ public class BuyerAsOffererProtocol {
     // Incoming message handling
     ///////////////////////////////////////////////////////////////////////////////////////////
 
-    private void handleMessage(Message message, Peer peer) {
-        log.trace("handleNewMessage: message = " + message.getClass().getSimpleName());
-        if (message instanceof TradeMessage) {
-            TradeMessage tradeMessage = (TradeMessage) message;
-            nonEmptyStringOf(tradeMessage.getTradeId());
-
-            if (tradeMessage instanceof RequestTakeOfferMessage) {
-                handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer);
-            }
-            else if (tradeMessage instanceof TakeOfferFeePayedMessage) {
-                handleTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage);
-            }
-
-            else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) {
-                handleRequestOffererPublishDepositTxMessage((RequestOffererPublishDepositTxMessage) tradeMessage);
-            }
-            else if (tradeMessage instanceof PayoutTxPublishedMessage) {
-                handlePayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage);
-            }
-            else {
-                log.error("Incoming tradeMessage not supported. " + tradeMessage);
-            }
-        }
-    }
-
     private void handleRequestTakeOfferMessage(RequestTakeOfferMessage tradeMessage, Peer peer) {
         model.setTradeMessage(tradeMessage);
         model.setPeer(peer);
@@ -205,4 +180,34 @@ public class BuyerAsOffererProtocol {
         taskRunner.addTasks(ProcessPayoutTxPublishedMessage.class);
         taskRunner.run();
     }
+
+
+    ///////////////////////////////////////////////////////////////////////////////////////////
+    // Massage dispatcher
+    ///////////////////////////////////////////////////////////////////////////////////////////
+   
+    private void handleMessage(Message message, Peer peer) {
+        log.trace("handleNewMessage: message = " + message.getClass().getSimpleName());
+        if (message instanceof TradeMessage) {
+            TradeMessage tradeMessage = (TradeMessage) message;
+            nonEmptyStringOf(tradeMessage.getTradeId());
+
+            if (tradeMessage instanceof RequestTakeOfferMessage) {
+                handleRequestTakeOfferMessage((RequestTakeOfferMessage) tradeMessage, peer);
+            }
+            else if (tradeMessage instanceof TakeOfferFeePayedMessage) {
+                handleTakeOfferFeePayedMessage((TakeOfferFeePayedMessage) tradeMessage);
+            }
+
+            else if (tradeMessage instanceof RequestOffererPublishDepositTxMessage) {
+                handleRequestOffererPublishDepositTxMessage((RequestOffererPublishDepositTxMessage) tradeMessage);
+            }
+            else if (tradeMessage instanceof PayoutTxPublishedMessage) {
+                handlePayoutTxPublishedMessage((PayoutTxPublishedMessage) tradeMessage);
+            }
+            else {
+                log.error("Incoming tradeMessage not supported. " + tradeMessage);
+            }
+        }
+    }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RespondToTakeOfferRequestMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RespondToTakeOfferRequestMessage.java
index d9e5a7a3d7..0f5eb01579 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RespondToTakeOfferRequestMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/messages/RespondToTakeOfferRequestMessage.java
@@ -26,11 +26,11 @@ import org.jetbrains.annotations.NotNull;
 public class RespondToTakeOfferRequestMessage implements Serializable, TradeMessage {
     private static final long serialVersionUID = 6177387534087739018L;
     private final String tradeId;
-    private final boolean takeOfferRequestAccepted;
+    private final boolean offerIsAvailable;
 
-    public RespondToTakeOfferRequestMessage(@NotNull String tradeId, boolean takeOfferRequestAccepted) {
+    public RespondToTakeOfferRequestMessage(@NotNull String tradeId, boolean offerIsAvailable) {
         this.tradeId = tradeId;
-        this.takeOfferRequestAccepted = takeOfferRequestAccepted;
+        this.offerIsAvailable = offerIsAvailable;
     }
 
     @Override
@@ -38,7 +38,7 @@ public class RespondToTakeOfferRequestMessage implements Serializable, TradeMess
         return tradeId;
     }
 
-    public boolean isTakeOfferRequestAccepted() {
-        return takeOfferRequestAccepted;
+    public boolean isOfferIsAvailable() {
+        return offerIsAvailable;
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java
index 6cedc9352f..bf5dbe37be 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/CreateDepositTx.java
@@ -60,5 +60,7 @@ public class CreateDepositTx extends Task<BuyerAsOffererModel> {
         } catch (InsufficientMoneyException e) {
             failed(e);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java
index dca1736fed..6bed50378c 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessPayoutTxPublishedMessage.java
@@ -52,5 +52,7 @@ public class ProcessPayoutTxPublishedMessage extends Task<BuyerAsOffererModel> {
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java
index 5c6783f329..140ff38e8b 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestOffererPublishDepositTxMessage.java
@@ -55,5 +55,7 @@ public class ProcessRequestOffererPublishDepositTxMessage extends Task<BuyerAsOf
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestTakeOfferMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestTakeOfferMessage.java
index d59e3e2b13..907a1655fa 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestTakeOfferMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessRequestTakeOfferMessage.java
@@ -42,5 +42,7 @@ public class ProcessRequestTakeOfferMessage extends Task<BuyerAsOffererModel> {
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessTakeOfferFeePayedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessTakeOfferFeePayedMessage.java
index 5ca464c255..30b36ba746 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessTakeOfferFeePayedMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/ProcessTakeOfferFeePayedMessage.java
@@ -51,5 +51,7 @@ public class ProcessTakeOfferFeePayedMessage extends Task<BuyerAsOffererModel> {
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RespondToTakeOfferRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RespondToTakeOfferRequest.java
index f124f4167e..1b489b74a6 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RespondToTakeOfferRequest.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/RespondToTakeOfferRequest.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
 
 public class RespondToTakeOfferRequest extends Task<BuyerAsOffererModel> {
     private static final Logger log = LoggerFactory.getLogger(RespondToTakeOfferRequest.class);
+    private boolean offerIsAvailable;
 
     public RespondToTakeOfferRequest(TaskRunner taskHandler, BuyerAsOffererModel model) {
         super(taskHandler, model);
@@ -37,27 +38,36 @@ public class RespondToTakeOfferRequest extends Task<BuyerAsOffererModel> {
 
     @Override
     protected void doRun() {
-        boolean takeOfferRequestAccepted = model.getOpenOffer().getState() == OpenOffer.State.OPEN;
-        if (!takeOfferRequestAccepted)
+        offerIsAvailable = model.getOpenOffer().getState() == OpenOffer.State.OPEN;
+
+        if (offerIsAvailable) {
+            model.getOpenOffer().setState(OpenOffer.State.OFFER_ACCEPTED);
+            Trade trade = new Trade(model.getOpenOffer().getOffer());
+            model.setTrade(trade);
+        }
+        else {
             log.info("Received take offer request but the offer not marked as open anymore.");
+        }
 
-        Trade trade = new Trade(model.getOpenOffer().getOffer());
-        model.setTrade(trade);
-        model.getOpenOffer().setState(OpenOffer.State.OFFER_ACCEPTED);
-
-        RespondToTakeOfferRequestMessage tradeMessage = new RespondToTakeOfferRequestMessage(trade.getId(), takeOfferRequestAccepted);
+        RespondToTakeOfferRequestMessage tradeMessage = new RespondToTakeOfferRequestMessage(model.getOpenOffer().getId(), offerIsAvailable);
         model.getTradeMessageService().sendMessage(model.getPeer(), tradeMessage, new SendMessageListener() {
             @Override
             public void handleResult() {
-                log.trace("RespondToTakeOfferRequestMessage successfully arrived at peer");
                 complete();
             }
 
             @Override
             public void handleFault() {
-                failed("AcceptTakeOfferRequestMessage did not arrive at peer");
+                failed();
             }
         });
+    }
 
+    @Override
+    protected void rollBackOnFault() {
+        if (offerIsAvailable && model.getOpenOffer().getState() == OpenOffer.State.OFFER_ACCEPTED) {
+            model.getOpenOffer().setState(OpenOffer.State.OPEN);
+            model.setTrade(null);
+        }
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferInitedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferInitedMessage.java
index 3821c0c794..793fa672a0 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferInitedMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendBankTransferInitedMessage.java
@@ -55,5 +55,7 @@ public class SendBankTransferInitedMessage extends Task<BuyerAsOffererModel> {
                 failed("Sending BankTransferInitedMessage failed.");
             }
         });
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java
index ca0ea826c6..29df03c6d2 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendDepositTxIdToTaker.java
@@ -52,5 +52,7 @@ public class SendDepositTxIdToTaker extends Task<BuyerAsOffererModel> {
                 failed("Sending DepositTxPublishedMessage failed.");
             }
         });
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java
index 2edae65d85..bd479b3cc8 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SendTakerDepositPaymentRequest.java
@@ -55,5 +55,7 @@ public class SendTakerDepositPaymentRequest extends Task<BuyerAsOffererModel> {
                 failed("RequestTakerDepositPaymentMessage did not arrive at peer");
             }
         });
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java
index 84c7acab5b..eaa4c3b27f 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SetupListenerForBlockChainConfirmation.java
@@ -54,5 +54,7 @@ public class SetupListenerForBlockChainConfirmation extends Task<BuyerAsOffererM
         });
         
         complete();
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java
index a57db6b393..ec6bc80241 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignAndPublishDepositTx.java
@@ -66,5 +66,7 @@ public class SignAndPublishDepositTx extends Task<BuyerAsOffererModel> {
         } catch (Exception e) {
             failed(e);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java
index 65333e81f8..6eecac037c 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/SignPayoutTx.java
@@ -61,6 +61,8 @@ public class SignPayoutTx extends Task<BuyerAsOffererModel> {
         } catch (Exception e) {
             failed(e);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
 
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java
index 8d8a9bf6ec..48a524cd86 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyAndSignContract.java
@@ -56,5 +56,7 @@ public class VerifyAndSignContract extends Task<BuyerAsOffererModel> {
         trade.setTakerContractSignature(signature);
 
         complete();
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java
index a45bf33944..5b37862a09 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakeOfferFeePayment.java
@@ -41,5 +41,7 @@ public class VerifyTakeOfferFeePayment extends Task<BuyerAsOffererModel> {
         
         complete();
     }
-
+    @Override
+    protected void rollBackOnFault() {
+    }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakerAccount.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakerAccount.java
index d22eed65a0..5a4973dd16 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakerAccount.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/offerer/tasks/VerifyTakerAccount.java
@@ -46,5 +46,7 @@ public class VerifyTakerAccount extends Task<BuyerAsOffererModel> {
         else {
             failed("Account registration validation for peer failed.");
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java
index c3e9b605ff..406aaf02fe 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/SellerAsTakerProtocol.java
@@ -68,6 +68,10 @@ public class SellerAsTakerProtocol {
     // Called from UI
     ///////////////////////////////////////////////////////////////////////////////////////////
 
+    public void cleanup() {
+        model.getTradeMessageService().removeMessageHandler(messageHandler);
+    }
+
     public void takeOffer() {
         model.getTradeMessageService().addMessageHandler(messageHandler);
 
@@ -86,39 +90,11 @@ public class SellerAsTakerProtocol {
         taskRunner.run();
     }
 
-    public void cleanup() {
-        model.getTradeMessageService().removeMessageHandler(messageHandler);
-    }
-
 
     ///////////////////////////////////////////////////////////////////////////////////////////
     // Incoming message handling
     ///////////////////////////////////////////////////////////////////////////////////////////
 
-    private void handleMessage(Message message, Peer sender) {
-        log.trace("handleNewMessage: message = " + message.getClass().getSimpleName());
-        if (message instanceof TradeMessage) {
-            TradeMessage tradeMessage = (TradeMessage) message;
-            nonEmptyStringOf(tradeMessage.getTradeId());
-
-            if (tradeMessage instanceof RespondToTakeOfferRequestMessage) {
-                handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage);
-            }
-            else if (tradeMessage instanceof TakerDepositPaymentRequestMessage) {
-                handleTakerDepositPaymentRequestMessage((TakerDepositPaymentRequestMessage) tradeMessage);
-            }
-            else if (tradeMessage instanceof DepositTxPublishedMessage) {
-                handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage);
-            }
-            else if (tradeMessage instanceof BankTransferStartedMessage) {
-                handleBankTransferInitedMessage((BankTransferStartedMessage) tradeMessage);
-            }
-            else {
-                log.error("Incoming message not supported. " + tradeMessage);
-            }
-        }
-    }
-
     private void handleRespondToTakeOfferRequestMessage(RespondToTakeOfferRequestMessage tradeMessage) {
         model.setTradeMessage(tradeMessage);
 
@@ -214,4 +190,33 @@ public class SellerAsTakerProtocol {
         );
         taskRunner.run();
     }
+    
+
+    ///////////////////////////////////////////////////////////////////////////////////////////
+    // Massage dispatcher
+    ///////////////////////////////////////////////////////////////////////////////////////////
+
+    private void handleMessage(Message message, Peer sender) {
+        log.trace("handleNewMessage: message = " + message.getClass().getSimpleName());
+        if (message instanceof TradeMessage) {
+            TradeMessage tradeMessage = (TradeMessage) message;
+            nonEmptyStringOf(tradeMessage.getTradeId());
+
+            if (tradeMessage instanceof RespondToTakeOfferRequestMessage) {
+                handleRespondToTakeOfferRequestMessage((RespondToTakeOfferRequestMessage) tradeMessage);
+            }
+            else if (tradeMessage instanceof TakerDepositPaymentRequestMessage) {
+                handleTakerDepositPaymentRequestMessage((TakerDepositPaymentRequestMessage) tradeMessage);
+            }
+            else if (tradeMessage instanceof DepositTxPublishedMessage) {
+                handleDepositTxPublishedMessage((DepositTxPublishedMessage) tradeMessage);
+            }
+            else if (tradeMessage instanceof BankTransferStartedMessage) {
+                handleBankTransferInitedMessage((BankTransferStartedMessage) tradeMessage);
+            }
+            else {
+                log.error("Incoming message not supported. " + tradeMessage);
+            }
+        }
+    }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java
index c94d1f35ce..98c7bd135c 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/CreateAndSignContract.java
@@ -55,5 +55,7 @@ public class CreateAndSignContract extends Task<SellerAsTakerModel> {
         trade.setTakerContractSignature(signature);
 
         complete();
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/GetPeerAddress.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/GetPeerAddress.java
index 34e1adc453..2dfb7687f1 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/GetPeerAddress.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/GetPeerAddress.java
@@ -18,6 +18,7 @@
 package io.bitsquare.trade.protocol.trade.taker.tasks;
 
 import io.bitsquare.network.Peer;
+import io.bitsquare.offer.Offer;
 import io.bitsquare.trade.listeners.GetPeerAddressListener;
 import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
 import io.bitsquare.util.taskrunner.Task;
@@ -31,23 +32,32 @@ public class GetPeerAddress extends Task<SellerAsTakerModel> {
 
     public GetPeerAddress(TaskRunner taskHandler, SellerAsTakerModel model) {
         super(taskHandler, model);
+        errorMessage = "DHT lookup for peer address failed. Maybe the offerer was offline for too long time.";
     }
 
     @Override
     protected void doRun() {
-        model.getTradeMessageService().getPeerAddress(model.getOffererMessagePublicKey(), new GetPeerAddressListener() {
+        model.getTradeMessageService().getPeerAddress(model.getOffer().getMessagePublicKey(), new GetPeerAddressListener() {
             @Override
             public void onResult(Peer peer) {
                 log.trace("Found peer: " + peer.toString());
+
                 model.setPeer(peer);
                 complete();
             }
 
             @Override
             public void onFailed() {
-                failed("DHT lookup for peer address failed.");
+                model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
+                failed();
             }
         });
     }
+
+    @Override
+    protected void rollBackOnFault() {
+        if (model.getOffer().getState() != Offer.State.OFFERER_OFFLINE)
+            model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
+    }
 }
 
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java
index c849d3ad49..975ede2d99 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayDeposit.java
@@ -55,5 +55,7 @@ public class PayDeposit extends Task<SellerAsTakerModel> {
         } catch (InsufficientMoneyException e) {
             failed(e);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayTakeOfferFee.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayTakeOfferFee.java
index 2ba476278a..b26866a65e 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayTakeOfferFee.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/PayTakeOfferFee.java
@@ -17,6 +17,7 @@
 
 package io.bitsquare.trade.protocol.trade.taker.tasks;
 
+import io.bitsquare.trade.Trade;
 import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
 import io.bitsquare.util.taskrunner.Task;
 import io.bitsquare.util.taskrunner.TaskRunner;
@@ -58,4 +59,10 @@ public class PayTakeOfferFee extends Task<SellerAsTakerModel> {
             failed(e);
         }
     }
+
+    @Override
+    protected void rollBackOnFault() {
+        // in error case take offer can be repeated so we reset the trade state
+        model.getTrade().setState(Trade.State.OPEN);
+    }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferInitedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferInitedMessage.java
index 89b2f2d974..10d6fd0561 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferInitedMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessBankTransferInitedMessage.java
@@ -52,5 +52,7 @@ public class ProcessBankTransferInitedMessage extends Task<SellerAsTakerModel> {
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java
index 2a029dd75f..2c34fd687f 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessDepositTxPublishedMessage.java
@@ -46,5 +46,7 @@ public class ProcessDepositTxPublishedMessage extends Task<SellerAsTakerModel> {
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRespondToTakeOfferRequestMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRespondToTakeOfferRequestMessage.java
index df3e9fcfc6..83b7f2ded2 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRespondToTakeOfferRequestMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessRespondToTakeOfferRequestMessage.java
@@ -40,7 +40,7 @@ public class ProcessRespondToTakeOfferRequestMessage extends Task<SellerAsTakerM
         try {
             checkTradeId(model.getTrade().getId(), model.getTradeMessage());
 
-            if (((RespondToTakeOfferRequestMessage) model.getTradeMessage()).isTakeOfferRequestAccepted()) {
+            if (((RespondToTakeOfferRequestMessage) model.getTradeMessage()).isOfferIsAvailable()) {
                 model.getTrade().setState(Trade.State.OFFERER_ACCEPTED);
                 complete();
             }
@@ -49,7 +49,11 @@ public class ProcessRespondToTakeOfferRequestMessage extends Task<SellerAsTakerM
                 failed("Requested offer rejected because it is not available anymore.");
             }
         } catch (Throwable t) {
-            failed( t);
+            failed(t);
         }
     }
+
+    @Override
+    protected void rollBackOnFault() {
+    }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java
index 9dd9483813..972f318cd0 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/ProcessTakerDepositPaymentRequestMessage.java
@@ -50,5 +50,7 @@ public class ProcessTakerDepositPaymentRequestMessage extends Task<SellerAsTaker
         } catch (Throwable t) {
             failed(t);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/RequestTakeOffer.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/RequestTakeOffer.java
index b0f60daf9f..eee3440827 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/RequestTakeOffer.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/RequestTakeOffer.java
@@ -17,6 +17,7 @@
 
 package io.bitsquare.trade.protocol.trade.taker.tasks;
 
+import io.bitsquare.offer.Offer;
 import io.bitsquare.trade.listeners.SendMessageListener;
 import io.bitsquare.trade.protocol.trade.taker.SellerAsTakerModel;
 import io.bitsquare.trade.protocol.trade.taker.messages.RequestTakeOfferMessage;
@@ -39,14 +40,20 @@ public class RequestTakeOffer extends Task<SellerAsTakerModel> {
                 new SendMessageListener() {
                     @Override
                     public void handleResult() {
-                        log.trace("Sending RequestTakeOfferMessage succeeded.");
                         complete();
                     }
 
                     @Override
                     public void handleFault() {
-                        failed("Sending RequestTakeOfferMessage failed.");
+                        model.getOffer().setState(Offer.State.OFFERER_OFFLINE);
+                        failed();
                     }
                 });
     }
+
+    @Override
+    protected void rollBackOnFault() {
+        if (model.getOffer().getState() != Offer.State.OFFERER_OFFLINE)
+            model.getOffer().setState(Offer.State.AVAILABILITY_CHECK_FAILED);
+    }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendPayoutTxToOfferer.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendPayoutTxToOfferer.java
index a8e39bcf3b..742bbb341d 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendPayoutTxToOfferer.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendPayoutTxToOfferer.java
@@ -48,5 +48,7 @@ public class SendPayoutTxToOfferer extends Task<SellerAsTakerModel> {
                 failed("Sending PayoutTxPublishedMessage failed.");
             }
         });
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTxAsHex.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTxAsHex.java
index 6c13407fd3..36f8575253 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTxAsHex.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendSignedTakerDepositTxAsHex.java
@@ -67,5 +67,7 @@ public class SendSignedTakerDepositTxAsHex extends Task<SellerAsTakerModel> {
             }
         });
     }
-
+    @Override
+    protected void rollBackOnFault() {
+    }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendTakeOfferFeePayedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendTakeOfferFeePayedMessage.java
index 2a7ea42060..83106c3f4c 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendTakeOfferFeePayedMessage.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SendTakeOfferFeePayedMessage.java
@@ -51,8 +51,12 @@ public class SendTakeOfferFeePayedMessage extends Task<SellerAsTakerModel> {
 
             @Override
             public void handleFault() {
-                failed("Sending TakeOfferFeePayedMessage failed.");
+                failed();
             }
         });
     }
+
+    @Override
+    protected void rollBackOnFault() {
+    }
 }
\ No newline at end of file
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java
index 0b21119cf5..26d18be4c3 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/SignAndPublishPayoutTx.java
@@ -71,5 +71,7 @@ public class SignAndPublishPayoutTx extends Task<SellerAsTakerModel> {
         } catch (AddressFormatException e) {
             failed(e);
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java
index b630dd170a..9d22a308b3 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/TakerCommitDepositTx.java
@@ -42,5 +42,7 @@ public class TakerCommitDepositTx extends Task<SellerAsTakerModel> {
         model.getTrade().setState(Trade.State.DEPOSIT_PUBLISHED);
 
         complete();
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java
index 5b559480b1..3ef9457b4a 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOfferFeePayment.java
@@ -39,5 +39,7 @@ public class VerifyOfferFeePayment extends Task<SellerAsTakerModel> {
             resultHandler.handleResult();
         }*/
         complete();
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java
index 74485c3786..d3fb1cb4ea 100644
--- a/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java
+++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/taker/tasks/VerifyOffererAccount.java
@@ -44,5 +44,7 @@ public class VerifyOffererAccount extends Task<SellerAsTakerModel> {
         else {
             failed("Account registration validation for peer faultHandler.onFault.");
         }
+    } @Override
+      protected void rollBackOnFault() {
     }
 }
diff --git a/core/src/main/java/io/bitsquare/util/taskrunner/Task.java b/core/src/main/java/io/bitsquare/util/taskrunner/Task.java
index 4eace2fc8e..5f23045959 100644
--- a/core/src/main/java/io/bitsquare/util/taskrunner/Task.java
+++ b/core/src/main/java/io/bitsquare/util/taskrunner/Task.java
@@ -47,8 +47,7 @@ public abstract class Task<T extends SharedModel> {
 
     abstract protected void doRun();
 
-    protected void applyErrorState() {
-    }
+    abstract protected void rollBackOnFault();
 
     private void interceptBeforeRun() {
         if (getClass() == taskToInterceptBeforeRun)
@@ -89,7 +88,7 @@ public abstract class Task<T extends SharedModel> {
     }
 
     protected void failed() {
-        applyErrorState();
+        rollBackOnFault();
         taskHandler.handleErrorMessage(errorMessage);
     }