Support for WDM subscriptions over connections

-- Various changes supporting use of WDM subscriptions over connection-oriented transports.
As part of this effort, a number of general bugs were also fixed.

-- Use AutoRequestAck feature of ExchangeContext for all WRM subscription exchanges.  This
allows the code in SubscriptionClient and SubscriptionHandler classes to be neutral with
regard to connection-oriented/conectionless transports when sending Weave messages.

-- Re-wrote the handling of subscription termination in the SubscriptionClient and
SubscriptionHandler classes.  This greatly simplified the logic, making it easier to reason
about the correctness of the code.  This change also resolves WEAV-2367.

-- Added code to detect binding failures and terminate any associated subscriptions.  This
ensures, for example, that a subscription is terminated whenever its underlying connection
is lost.  This change also fixed a long-standing bug related to connectionless subscriptions
wherein a session failure would not immediate result in the failure of a subscription.

-- Fixed a bug in SubscriptionClient where the OnSubscriptionTerminated event was not
delivered to the application in certain cases.  This left the application unaware that the
underlying subscription was gone.  This fix necessitated various changes to the WDM
functional tests which had been coded to assume the erroneous behavior.

-- Fixed a bug in SubscriptionClient and SubscriptionHandler where the standalone ACK for a
StatusReport received in response to a SubscribeCancelRequest would never be sent.

-- Revised ifdefs in SubscriptionClient and UdpateClient so that both can be built with WRM
disabled. (Note that there are various hard dependencies on WRM in the test tools unrelated
to subscription/update support.  These were not addressed.)

-- Added interface documentation describing new subscription termination behavior.

-- Minor logging clean-ups in TraitData and StatusReportStr().

Updated WDM functional tests

-- Updated the happy-based WDM functional tests to accommodate changes to the
SubscriptionClient and SubscriptionHandler implementations introduced as a result of adding
support for WDM over connection-oriented transports.

-- Changed numerous python test scripts that have hard-coded dependencies on particular C++
method names appearing in log output.

-- Fixed logic bugs in the MockWdmSubscriptionInitiator/Responder classes that depended on
the existence of particular bugs in SubscriptionClient and SubscriptionHandler, which have
now been fixed.

-- Added additional logging as an aid to understanding the behavior of the
MockWdmSubscriptionInitiator/Responder classes.

-- Added option to TestWdmNext tool to enable use of WDM over a TCP connection.  Note that,
as of yet, there are no automated tests that exercise this feature.
diff --git a/src/lib/profiles/data-management/Current/NotificationEngine.cpp b/src/lib/profiles/data-management/Current/NotificationEngine.cpp
index 7ef39f5..82031ac 100644
--- a/src/lib/profiles/data-management/Current/NotificationEngine.cpp
+++ b/src/lib/profiles/data-management/Current/NotificationEngine.cpp
@@ -1121,13 +1121,17 @@
 {
     WEAVE_ERROR err = WEAVE_NO_ERROR;
 
-    err = aSubHandler->SendNotificationRequest(aBuffer);
-    SuccessOrExit(err);
-
     // We can only have 1 notify in flight for any given subscription - increment and break out.
     mNumNotifiesInFlight++;
 
+    err = aSubHandler->SendNotificationRequest(aBuffer);
+    SuccessOrExit(err);
+
 exit:
+    if (err != WEAVE_NO_ERROR)
+    {
+        mNumNotifiesInFlight--;
+    }
     return err;
 }
 
@@ -1583,7 +1587,7 @@
     {
         // abort subscription, squash error, signal to upper
         // layers that the subscription is done
-        aSubHandler->HandleSubscriptionTerminated(err, NULL);
+        aSubHandler->TerminateSubscription(err, NULL, false);
 
         aSubscriptionHandled = true;
         err                  = WEAVE_NO_ERROR;
diff --git a/src/lib/profiles/data-management/Current/SubscriptionClient.cpp b/src/lib/profiles/data-management/Current/SubscriptionClient.cpp
index 92c750f..4716396 100644
--- a/src/lib/profiles/data-management/Current/SubscriptionClient.cpp
+++ b/src/lib/profiles/data-management/Current/SubscriptionClient.cpp
@@ -43,8 +43,6 @@
 #include <Weave/Support/FibonacciUtils.h>
 #include <SystemLayer/SystemStats.h>
 
-#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
-
 namespace nl {
 namespace Weave {
 namespace Profiles {
@@ -127,6 +125,10 @@
     mAppState                               = apAppState;
     mEventCallback                          = aEventCallback;
 
+    // Set the protocol callback on the binding object so that the SubscriptionClient gets
+    // notified of changes in the binding's state.
+    mBinding->SetProtocolLayerCallback(BindingEventCallback, this);
+
     if (NULL == apCatalog)
     {
         mDataSinkCatalog = NULL;
@@ -190,8 +192,8 @@
     case kState_Resubscribe_Holdoff:
         return "RETRY";
 
-    case kState_Aborting:
-        return "ABTNG";
+    case kState_Terminated:
+        return "TERM";
     }
     return "N/A";
 }
@@ -247,7 +249,7 @@
     if (mCurrentState == kState_Resubscribe_Holdoff)
     {
         // cancel timer
-        SubscriptionEngine::GetInstance()->GetExchangeManager()->MessageLayer->SystemLayer->CancelTimer(OnTimerCallback, this);
+        CancelSubscriptionTimer();
 
         // app doesn't need to know since it triggered this
         AbortSubscription();
@@ -262,7 +264,7 @@
     if (mCurrentState == kState_Resubscribe_Holdoff)
     {
         // cancel timer
-        SubscriptionEngine::GetInstance()->GetExchangeManager()->MessageLayer->SystemLayer->CancelTimer(OnTimerCallback, this);
+        CancelSubscriptionTimer();
         MoveToState(kState_Initialized);
     }
 
@@ -387,10 +389,6 @@
     // If the binding is ready...
     if (mBinding->IsReady())
     {
-        // Using the binding, form and send a SubscribeRequest to the publisher.
-        err = SendSubscribeRequest();
-        SuccessOrExit(err);
-
         // Enter the Subscribing state.
         if (IsInitiator())
         {
@@ -401,6 +399,10 @@
             MoveToState(kState_Subscribing_IdAssigned);
         }
 
+        // Using the binding, form and send a SubscribeRequest to the publisher.
+        err = SendSubscribeRequest();
+        SuccessOrExit(err);
+
         err = RefreshTimer();
         SuccessOrExit(err);
     }
@@ -415,7 +417,7 @@
 
     if (WEAVE_NO_ERROR != err)
     {
-        HandleSubscriptionTerminated(IsRetryEnabled(), err, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     _Release();
@@ -433,12 +435,6 @@
     }
     else if (mBinding->CanBePrepared())
     {
-        // Set the protocol callback on the binding object.  NOTE: This should only happen once the
-        // app has explicitly started the subscription process by calling either InitiateSubscription() or
-        // InitiateCounterSubscription().  Otherwise the client object might receive callbacks from
-        // the binding before it's ready.
-        mBinding->SetProtocolLayerCallback(BindingEventCallback, this);
-
         // Ask the application prepare the binding by delivering a PrepareRequested API event to it via the
         // binding's callback.  At some point the binding will callback into the SubscriptionClient signaling
         // that preparation has completed (successfully or otherwise).  Note that this callback can happen
@@ -485,7 +481,7 @@
         mSubscriptionId = outSubscribeParam.mSubscribeRequestPrepareNeeded.mSubscriptionId;
     }
 
-    VerifyOrExit(kState_Initialized == mCurrentState, err = WEAVE_ERROR_INCORRECT_STATE);
+    VerifyOrExit((kState_Subscribing == mCurrentState || kState_Subscribing_IdAssigned == mCurrentState), err = WEAVE_ERROR_INCORRECT_STATE);
     VerifyOrExit((outSubscribeParam.mSubscribeRequestPrepareNeeded.mTimeoutSecMin <= kMaxTimeoutSec) ||
                      (kNoTimeOut == outSubscribeParam.mSubscribeRequestPrepareNeeded.mTimeoutSecMin),
                  err = WEAVE_ERROR_INVALID_ARGUMENT);
@@ -692,7 +688,7 @@
 #endif // WEAVE_CONFIG_DATA_MANAGEMENT_ENABLE_SCHEMA_CHECK
 
     err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, msgType, msgBuf,
-                           nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
+                              nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
     msgBuf = NULL;
     SuccessOrExit(err);
 
@@ -755,14 +751,33 @@
 {
     WeaveLogIfFalse(mRefCount > 0);
 
-    --mRefCount;
-
-    if (0 == mRefCount)
+    // If releasing the last reference...
+    if (1 == mRefCount)
     {
+        // Just to be safe, call AbortSubscription() to ensure that the subscription
+        // is properly terminated. If the state transition logic is correct everywhere
+        // else in the code, the subscription will already have been terminated and
+        // this call will be a no-op.
+        AbortSubscription();
+
+        // Clean up resources/state associated with the client object.
         _Cleanup();
 
+        // Return the client to the Free state.
+        // NOTE: mRefCount is set to zero here solely to satisfy automated tests that look for
+        // a specific reference count in the "Moving to [ FREE]" log message.
+        mRefCount = 0;
+        MoveToState(kState_Free);
+
+        // Re-initialize all state data.
+        InitAsFree();
+
         SYSTEM_STATS_DECREMENT(nl::Weave::System::Stats::kWDM_NumSubscriptionClients);
     }
+    else
+    {
+        --mRefCount;
+    }
 }
 
 Binding * SubscriptionClient::GetBinding() const
@@ -792,8 +807,10 @@
     mEC->AppState          = this;
     mEC->OnMessageReceived = OnMessageReceivedFromLocallyInitiatedExchange;
     mEC->OnResponseTimeout = OnResponseTimeout;
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
     mEC->OnSendError       = OnSendError;
     mEC->OnAckRcvd         = NULL;
+#endif
 
     inParam.mExchangeStart.mEC     = mEC;
     inParam.mExchangeStart.mClient = this;
@@ -816,8 +833,10 @@
         mEC->AppState          = NULL;
         mEC->OnMessageReceived = NULL;
         mEC->OnResponseTimeout = NULL;
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
         mEC->OnSendError       = NULL;
         mEC->OnAckRcvd         = NULL;
+#endif
         if (aAbortNow)
         {
             mEC->Abort();
@@ -830,17 +849,40 @@
     }
 }
 
-#if WDM_ENABLE_SUBSCRIPTION_CANCEL
+/**
+ * Gracefully end a client subscription
+ *
+ * Gracefully terminates the client end of a subscription.  If subscription cancel
+ * support is enabled, a SubscribeCancelRequest message is sent to the subscription
+ * publisher and the system awaits a reply before terminating the subscription;
+ * otherwise the subscription is immediately terminated in a similar manner to
+ * AbortSubscription().  If a mutual subscription exists, the counter subscription
+ * is terminated as well.
+ *
+ * While awaiting a response to a SubscribeCancelRequest, the \c SubscriptionClient
+ * enters the \c Canceling state.
+ *
+ * Once the termination process begins, the \c SubscriptionClient object enters the
+ * `Terminated` state and an \c OnSubscriptionTerminated event is delivered to
+ * the application's event handler.  Note that, if cancel support is _not_ enabled,
+ * the event handler may be called synchronously within the call to EndSubscription().
+ *
+ * After the application's event handler returns, the \c SubscriptionClient object enters
+ * the `Initialized` state.   At this point the \c SubscriptionClient object may be used
+ * to initiate another subscription, or it may be freed by calling the Free() method.
+ */
 WEAVE_ERROR SubscriptionClient::EndSubscription()
 {
+    WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetClientId(this),
+                   GetStateStr(), __func__, mRefCount);
+
+#if WDM_ENABLE_SUBSCRIPTION_CANCEL
+
     WEAVE_ERROR err       = WEAVE_NO_ERROR;
     PacketBuffer * msgBuf = NULL;
     nl::Weave::TLV::TLVWriter writer;
     SubscribeCancelRequest::Builder request;
 
-    WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetClientId(this),
-                   GetStateStr(), __func__, mRefCount);
-
     // Make sure we're not freed by accident.
     _AddRef();
 
@@ -853,19 +895,18 @@
         // fall through
     case kState_Subscribing_IdAssigned:
 
-        WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s: subscription not established yet, abort",
-                       SubscriptionEngine::GetInstance()->GetClientId(this), GetStateStr(), __func__);
-
-        _AbortSubscription();
-
-        ExitNow();
+        // If the subscription is not full established, simply terminate it without
+        // informing the peer.
+        TerminateSubscription(WEAVE_NO_ERROR, NULL, false);
         break;
 
     case kState_SubscriptionEstablished_Confirming:
         // forget we're in the middle of confirmation, as the outcome
         // has become irrelevant
         FlushExistingExchangeContext();
+
         // fall through
+
     case kState_SubscriptionEstablished_Idle:
         msgBuf = PacketBuffer::NewWithAvailableSize(request.kBaseMessageSubscribeId_PayloadLen);
         VerifyOrExit(NULL != msgBuf, err = WEAVE_ERROR_NO_MEMORY);
@@ -883,7 +924,7 @@
 
         // NOTE: State could be changed if there is a sync error callback from message layer
         err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, kMsgType_SubscribeCancelRequest, msgBuf,
-                               nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
+                                  nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
         msgBuf = NULL;
         SuccessOrExit(err);
 
@@ -907,75 +948,16 @@
     _Release();
 
     return err;
-}
 
 #else // WDM_ENABLE_SUBSCRIPTION_CANCEL
 
-WEAVE_ERROR SubscriptionClient::EndSubscription()
-{
-    AbortSubscription();
-
+    // When Cancel support is not enabled, simply terminate the subscription without
+    // informing the peer.
+    mConfig = kConfig_Down;
+    TerminateSubscription(WEAVE_NO_ERROR, NULL, false);
     return WEAVE_NO_ERROR;
-}
 
 #endif // WDM_ENABLE_SUBSCRIPTION_CANCEL
-
-void SubscriptionClient::_AbortSubscription()
-{
-    WEAVE_ERROR err          = WEAVE_NO_ERROR;
-
-    WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetClientId(this),
-                   GetStateStr(), __func__, mRefCount);
-
-    // Make sure we're not freed by accident.
-    _AddRef();
-
-    if (kState_Free == mCurrentState)
-    {
-        // This must not happen
-        ExitNow(err = WEAVE_ERROR_INCORRECT_STATE);
-    }
-    else if (kState_Initialized == mCurrentState || kState_Aborting == mCurrentState)
-    {
-        FlushExistingExchangeContext(true);
-
-        // we're already aborted, so there is nothing else to flush
-        ExitNow();
-    }
-    else
-    {
-        // This is an intermediate state for external calls during the abort process
-        uint64_t peerNodeId                = mBinding->GetPeerNodeId();
-        uint64_t subscriptionId            = mSubscriptionId;
-        bool deliverSubTerminatedToCatalog = ((NULL != mDataSinkCatalog) && (mCurrentState >= kState_NotifyDataSinkOnAbort_Begin) &&
-                                              (mCurrentState <= kState_NotifyDataSinkOnAbort_End));
-
-        MoveToState(kState_Aborting);
-
-        if (deliverSubTerminatedToCatalog)
-        {
-            // iterate through the whole catalog and deliver kEventSubscriptionTerminated event
-            mDataSinkCatalog->DispatchEvent(TraitDataSink::kEventSubscriptionTerminated, NULL);
-        }
-
-        // Note that ref count is not touched at here, as _Abort doesn't change the ownership
-        FlushExistingExchangeContext(true);
-        (void) RefreshTimer();
-
-        mRetryCounter = 0;
-        mSubscriptionId = 0;
-
-        MoveToState(kState_Initialized);
-
-#if WDM_ENABLE_SUBSCRIPTION_PUBLISHER
-        SubscriptionEngine::GetInstance()->UpdateHandlerLiveness(peerNodeId, subscriptionId, true);
-#endif // WDM_ENABLE_SUBSCRIPTION_PUBLISHER
-    }
-
-exit:
-    WeaveLogFunctError(err);
-
-    _Release();
 }
 
 void SubscriptionClient::_Cleanup(void)
@@ -992,93 +974,128 @@
 
     mDataSinkCatalog->Iterate(CleanupUpdatableSinkTrait, this);
 #endif // WEAVE_CONFIG_ENABLE_WDM_UPDATE
-
-    Reset();
-
-    MoveToState(kState_Free);
 }
 
+/**
+ * Abort a client subscription
+ *
+ * Terminates the client end of a subscription, without notifying the subscription
+ * publisher and without delivering an \c OnSubscriptionTerminated event to the
+ * application's event handler.  If a mutual subscription exists, the counter
+ * subscription is terminated as well.
+ *
+ * Upon calling AbortSubscription(), the \c SubscriptionClient object enters the
+ * `Terminated` state. Once the termination process completes, the object enters
+ * the `Initialized` state. Both transitions happen synchronously within the call
+ * to AbortSubscription().
+ *
+ * After AbortSubscription() returns, the \c SubscriptionClient object may be used to
+ * initiate another subscription, or it may be freed by calling the Free() method.
+ */
 void SubscriptionClient::AbortSubscription(void)
 {
-    mConfig = kConfig_Down;
-
-    _AbortSubscription();
-}
-
-void SubscriptionClient::HandleSubscriptionTerminated(bool aWillRetry, WEAVE_ERROR aReason,
-                                                      StatusReporting::StatusReport * aStatusReportPtr)
-{
-    void * const pAppState     = mAppState;
-    EventCallback callbackFunc = mEventCallback;
-
     WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetClientId(this),
                    GetStateStr(), __func__, mRefCount);
 
-    _AddRef();
+    // Immediately terminate any active or in progress subscription.  Since Abort
+    // is always synchronous in nature, suppress the OnSubscriptionTerminated callback
+    // to the application (but not the SubscriptionTerminated event to the trait handlers).
+    mConfig = kConfig_Down;
+    TerminateSubscription(WEAVE_NO_ERROR, NULL, true);
+}
 
-    if (!aWillRetry)
+void SubscriptionClient::TerminateSubscription(WEAVE_ERROR aReason, StatusReporting::StatusReport * aStatusReport, bool suppressAppCallback)
+{
+    // If the SubscriptionClient is active...
+    if (mCurrentState != kState_Initialized && mCurrentState != kState_Terminated)
     {
-        AbortSubscription();
-    }
-    else
-    {
-        // We do not need to perform a full-fledged subscription
-        // abort.  On the other hand, we can safely flush existing
-        // exchange context as any communication on that exchange
-        // context should be considered an error.
-        const bool abortExchangeContext = true;
-        FlushExistingExchangeContext(abortExchangeContext);
-    }
+        const ClientState prevState = mCurrentState;
 
-    if (NULL != callbackFunc)
-    {
-        InEventParam inParam;
-        OutEventParam outParam;
+        WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetClientId(this),
+                       GetStateStr(), __func__, mRefCount);
 
-        inParam.Clear();
-        outParam.Clear();
+        // Ensure that the client object isn't freed while any callbacks are active.
+        _AddRef();
 
-        inParam.mSubscriptionTerminated.mReason            = aReason;
-        inParam.mSubscriptionTerminated.mClient            = this;
-        inParam.mSubscriptionTerminated.mWillRetry         = aWillRetry;
-        inParam.mSubscriptionTerminated.mIsStatusCodeValid = (aStatusReportPtr != NULL);
-        if (aStatusReportPtr != NULL)
+        // Abort any in-progress exchange.
+        FlushExistingExchangeContext(true);
+
+        // Stop the subscription timer
+        CancelSubscriptionTimer();
+
+        MoveToState(kState_Terminated);
+
+        if (prevState >= kState_Subscribing && prevState <= kState_Canceling)
         {
-            inParam.mSubscriptionTerminated.mStatusProfileId   = aStatusReportPtr->mProfileId;
-            inParam.mSubscriptionTerminated.mStatusCode        = aStatusReportPtr->mStatusCode;
-            inParam.mSubscriptionTerminated.mAdditionalInfoPtr = &(aStatusReportPtr->mAdditionalInfo);
+#if WDM_ENABLE_SUBSCRIPTION_PUBLISHER
+            const uint64_t subscriptionId = mSubscriptionId;
+            const uint64_t peerNodeId = mBinding->GetPeerNodeId();
+#endif // WDM_ENABLE_SUBSCRIPTION_PUBLISHER
+
+            // Deliver SubscriptionTerminated event to trait handlers.
+            if (NULL != mDataSinkCatalog)
+            {
+                mDataSinkCatalog->DispatchEvent(TraitDataSink::kEventSubscriptionTerminated, NULL);
+            }
+
+            // Deliver OnSubscriptionTerminated event to application.
+            if (NULL != mEventCallback && !suppressAppCallback)
+            {
+                InEventParam inParam;
+                OutEventParam outParam;
+
+                inParam.Clear();
+                outParam.Clear();
+
+                inParam.mSubscriptionTerminated.mReason            = aReason;
+                inParam.mSubscriptionTerminated.mClient            = this;
+                inParam.mSubscriptionTerminated.mWillRetry         = (ShouldSubscribe() && IsRetryEnabled());
+                if (aStatusReport != NULL)
+                {
+                    inParam.mSubscriptionTerminated.mIsStatusCodeValid = true;
+                    inParam.mSubscriptionTerminated.mStatusProfileId   = aStatusReport->mProfileId;
+                    inParam.mSubscriptionTerminated.mStatusCode        = aStatusReport->mStatusCode;
+                    inParam.mSubscriptionTerminated.mAdditionalInfoPtr = &(aStatusReport->mAdditionalInfo);
+                }
+
+                mEventCallback(mAppState, kEvent_OnSubscriptionTerminated, inParam, outParam);
+            }
+
+#if WDM_ENABLE_SUBSCRIPTION_PUBLISHER
+            SubscriptionEngine::GetInstance()->UpdateHandlerLiveness(peerNodeId, subscriptionId, true);
+#endif // WDM_ENABLE_SUBSCRIPTION_PUBLISHER
         }
 
-        callbackFunc(pAppState, kEvent_OnSubscriptionTerminated, inParam, outParam);
-    }
-    else
-    {
-        WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d) app layer callback skipped",
-                       SubscriptionEngine::GetInstance()->GetClientId(this), GetStateStr(), __func__, mRefCount);
-    }
+        if (mCurrentState == kState_Terminated)
+        {
+            if (ShouldSubscribe() && IsRetryEnabled())
+            {
+                SetRetryTimer(aReason);
+            }
+            else
+            {
+                MoveToState(kState_Initialized);
+                mRetryCounter = 0;
+                mSubscriptionId = 0;
+            }
+        }
 
-    if (aWillRetry && ShouldSubscribe())
-    {
-        SetRetryTimer(aReason);
+        _Release();
     }
-
-    _Release();
 }
 
 void SubscriptionClient::SetRetryTimer(WEAVE_ERROR aReason)
 {
     WEAVE_ERROR err                   = WEAVE_NO_ERROR;
-    ClientState entryState            = mCurrentState;
-    ResubscribePolicyCallback entryCb = mResubscribePolicyCallback;
+
+    _AddRef();
 
     // this check serves to see whether we already have a timer set
     // and if resubscribes are enabled
-    if (entryCb && entryState < kState_Resubscribe_Holdoff)
+    if (ShouldSubscribe() && IsRetryEnabled() && mCurrentState != kState_Resubscribe_Holdoff)
     {
         uint32_t timeoutMsec = 0;
 
-        _AddRef();
-
         MoveToState(kState_Resubscribe_Holdoff);
 
         ResubscribeParam param;
@@ -1100,15 +1117,29 @@
     // all errors are considered fatal in this function
     if (err != WEAVE_NO_ERROR)
     {
-        HandleSubscriptionTerminated(false, err, NULL);
+        mConfig = kConfig_Down;
+        TerminateSubscription(err, NULL, false);
     }
 
-    if (entryCb && (entryState < kState_Resubscribe_Holdoff))
-    {
-        _Release();
-    }
+    _Release();
 }
 
+void SubscriptionClient::CancelSubscriptionTimer(void)
+{
+    SubscriptionEngine::GetInstance()->GetExchangeManager()->MessageLayer->SystemLayer->CancelTimer(OnTimerCallback, this);
+}
+
+/**
+ * Free a \c SubscriptionClient object.
+ *
+ * Frees the \c SubscriptionClient object.  If a subscription is active or in-progress, the
+ * subscription is immediately terminated in a similar manner to calling AbortSubscription().
+ * If any update requests are in progress, they are similarly aborted.
+ *
+ * The application is responsible for calling Free() exactly once during the lifetime of
+ * a \c SubscriptionClient object. After Free() is called, no further references should be
+ * made to the object.
+ */
 void SubscriptionClient::Free()
 {
     WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetClientId(this),
@@ -1117,11 +1148,8 @@
     WeaveLogIfFalse(kState_Free != mCurrentState);
     WeaveLogIfFalse(mRefCount > 0);
 
-    // Abort the subscription if we're not already aborted
-    if (kState_Initialized < mCurrentState)
-    {
-        AbortSubscription();
-    }
+    // Abort the subscription if active.
+    AbortSubscription();
 
 #if WEAVE_CONFIG_ENABLE_WDM_UPDATE
     AbortUpdates(WEAVE_NO_ERROR);
@@ -1136,9 +1164,6 @@
 {
     SubscriptionClient * const pClient = reinterpret_cast<SubscriptionClient *>(aAppState);
 
-    bool failed = false;
-    WEAVE_ERROR err = WEAVE_NO_ERROR;
-
     pClient->_AddRef();
 
     switch (aEvent)
@@ -1153,41 +1178,61 @@
             }
         }
 #endif
-        // Binding is ready. We can send the subscription req now.
+        // The binding is ready.  If the SubscriptionClient is still in a state where
+        // a subscription is desired, go send the subscription request now.
         if (pClient->mCurrentState == kState_Initialized && pClient->ShouldSubscribe())
         {
             pClient->_InitiateSubscription();
         }
         break;
 
-    case Binding::kEvent_BindingFailed:
-        failed = true;
-        err = aInParam.BindingFailed.Reason;
+    case Binding::kEvent_PrepareFailed:
+
+#if WEAVE_CONFIG_ENABLE_WDM_UPDATE
+        if (pClient->IsUpdatePendingOrInProgress())
+        {
+            pClient->StartUpdateRetryTimer(aInParam.PrepareFailed.Reason);
+        }
+#endif // WEAVE_CONFIG_ENABLE_WDM_UPDATE
+
+        // Binding preparation failed.  If the SubscriptionClient is still in a state where
+        // a subscription is desired, arm the subscription retry timer.
+        if (pClient->mCurrentState == kState_Initialized && pClient->ShouldSubscribe())
+        {
+            pClient->SetRetryTimer(aInParam.PrepareFailed.Reason);
+        }
+
         break;
 
-    case Binding::kEvent_PrepareFailed:
-        failed = true;
-        err = aInParam.PrepareFailed.Reason;
+    case Binding::kEvent_BindingFailed:
+
+        // The binding has failed.  This can happen because an underling connection has closed,
+        // or a security session has failed.
+
+        // Cancel any in-progress Update request and arrange to re-try it after a delay.
+#if WEAVE_CONFIG_ENABLE_WDM_UPDATE
+        pClient->mUpdateClient.CancelUpdate();
+        if (pClient->IsUpdatePendingOrInProgress())
+        {
+            pClient->StartUpdateRetryTimer(aInParam.BindingFailed.Reason);
+        }
+#endif // WEAVE_CONFIG_ENABLE_WDM_UPDATE
+
+        // If a subscription is in-progress, established or being canceled, terminate the
+        // subscription immediately. Do nothing if the SubscriptionClient is idle (Initialized)
+        // or waiting to re-subscribe (Resubscribe_Holdoff). In those cases, when the time arrives
+        // to subscribe again, the binding will be re-prepared.
+        if (pClient->IsInProgressOrEstablished() || pClient->mCurrentState == kState_Canceling)
+        {
+            pClient->TerminateSubscription(aInParam.BindingFailed.Reason, NULL, false);
+        }
+
         break;
 
     default:
         Binding::DefaultEventHandler(aAppState, aEvent, aInParam, aOutParam);
     }
 
-    if (failed)
-    {
-#if WEAVE_CONFIG_ENABLE_WDM_UPDATE
-        if (pClient->IsUpdatePendingOrInProgress())
-        {
-            pClient->StartUpdateRetryTimer(err);
-        }
-#endif // WEAVE_CONFIG_ENABLE_WDM_UPDATE
-        if (pClient->ShouldSubscribe())
-        {
-            pClient->SetRetryTimer(err);
-        }
-    }
-
     pClient->_Release();
 }
 
@@ -1197,6 +1242,7 @@
 
     pClient->TimerEventHandler();
 }
+
 WEAVE_ERROR SubscriptionClient::RefreshTimer(void)
 {
     WEAVE_ERROR err      = WEAVE_NO_ERROR;
@@ -1207,7 +1253,7 @@
                    GetStateStr(), __func__, mRefCount);
 
     // Cancel timer first
-    SubscriptionEngine::GetInstance()->GetExchangeManager()->MessageLayer->SystemLayer->CancelTimer(OnTimerCallback, this);
+    CancelSubscriptionTimer();
 
     // Arm timer according to current state
     switch (mCurrentState)
@@ -1228,7 +1274,14 @@
     case kState_SubscriptionEstablished_Idle:
         if (kNoTimeOut != mLivenessTimeoutMsec)
         {
-            if (IsInitiator())
+            timeoutMsec = mLivenessTimeoutMsec;
+            isTimerNeeded = true;
+
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
+
+            // If the subscription is over Weave Reliable Messaging and the local node
+            // is the subscription initiator...
+            if (IsInitiator() && mBinding->IsWRMTransport())
             {
                 // Calculate margin to reserve for WRM activity, so we send out SubscribeConfirm earlier
                 // Note that wrap around could happen, if the system is configured with excessive delays and number of retries
@@ -1236,26 +1289,23 @@
                 const uint32_t marginMsec = (defaultWRMPConfig.mMaxRetrans + 1) * defaultWRMPConfig.mInitialRetransTimeout;
 
                 // If the margin is smaller than the desired liveness timeout, set a timer for the difference.
-                // Otherwise, set the timer to 0 (which will fire immediately)
-                if (marginMsec < mLivenessTimeoutMsec)
+                // Otherwise, fail with an error.
+                if (marginMsec < timeoutMsec)
                 {
-                    timeoutMsec = mLivenessTimeoutMsec - marginMsec;
+                    timeoutMsec = timeoutMsec - marginMsec;
                 }
                 else
                 {
                     // This is a system configuration problem
-                    WeaveLogError(DataManagement,
-                                  "Client[%u] Liveness period (%" PRIu32 " msec) <= margin reserved for WRM (%" PRIu32 " msec)",
-                                  SubscriptionEngine::GetInstance()->GetClientId(this), mLivenessTimeoutMsec, marginMsec);
+                    WeaveLogDetail(DataManagement,
+                                   "Client[%u] Liveness period (%" PRIu32 " msec) <= margin reserved for WRM (%" PRIu32 " msec)",
+                                   SubscriptionEngine::GetInstance()->GetClientId(this), mLivenessTimeoutMsec, marginMsec);
 
                     ExitNow(err = WEAVE_ERROR_TIMEOUT);
                 }
             }
-            else
-            {
-                timeoutMsec = mLivenessTimeoutMsec;
-            }
-            isTimerNeeded = true;
+
+#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
 
             WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] %s Ref(%d) Set timer for liveness confirmation to %" PRIu32 " msec",
                            SubscriptionEngine::GetInstance()->GetClientId(this), GetStateStr(), __func__, mRefCount, timeoutMsec);
@@ -1264,9 +1314,6 @@
     case kState_SubscriptionEstablished_Confirming:
         // Do nothing
         break;
-    case kState_Aborting:
-        // Do nothing
-        break;
     default:
         ExitNow(err = WEAVE_ERROR_INCORRECT_STATE);
     }
@@ -1335,7 +1382,7 @@
 
             // NOTE: State could be changed if there is a send error callback from message layer
             err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, kMsgType_SubscribeConfirmRequest, msgBuf,
-                                   nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
+                                      nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
             msgBuf = NULL;
             SuccessOrExit(err);
 
@@ -1388,7 +1435,7 @@
 
     if (err != WEAVE_NO_ERROR)
     {
-        HandleSubscriptionTerminated(IsRetryEnabled(), err, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     if (!skipTimerCheck)
@@ -1601,8 +1648,7 @@
         nl::Weave::Encoding::LittleEndian::Write32(p, nl::Weave::Profiles::kWeaveProfile_Common);
         nl::Weave::Encoding::LittleEndian::Write16(p, nl::Weave::Profiles::Common::kStatus_Success);
 
-        err    = aEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_Common, nl::Weave::Profiles::Common::kMsgType_StatusReport,
-                               msgBuf, aEC->HasPeerRequestedAck() ? nl::Weave::ExchangeContext::kSendFlag_RequestAck : 0);
+        err    = aEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_Common, nl::Weave::Profiles::Common::kMsgType_StatusReport, msgBuf);
         msgBuf = NULL;
         SuccessOrExit(err);
     }
@@ -1632,7 +1678,7 @@
     if (WEAVE_NO_ERROR != err)
     {
         // If we're not aborted yet, make a callback to app layer
-        HandleSubscriptionTerminated(IsRetryEnabled(), err, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     _Release();
@@ -1656,8 +1702,6 @@
     // Make sure we're not freed by accident
     _AddRef();
 
-    mBinding->AdjustResponseTimeout(aEC);
-
     VerifyOrExit(NULL != msgBuf, err = WEAVE_ERROR_NO_MEMORY);
 
     // Verify the cancel request is truly from the publisher.  If not, reject the request with
@@ -1675,24 +1719,26 @@
     nl::Weave::Encoding::LittleEndian::Write16(p, statusCode);
     msgBuf->SetDataLength(statusReportLen);
 
-    err    = aEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_Common, nl::Weave::Profiles::Common::kMsgType_StatusReport, msgBuf,
-                           aEC->HasPeerRequestedAck() ? nl::Weave::ExchangeContext::kSendFlag_RequestAck : 0);
+    err    = aEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_Common, nl::Weave::Profiles::Common::kMsgType_StatusReport, msgBuf);
     msgBuf = NULL;
     SuccessOrExit(err);
 
+    // Proactively close the exchange.  This prevents the call to TerminateSubscription()
+    // below from aborting the exchange, which, when using WRM, would prevent the
+    // StatusReport message from being re-transmitted if necessary.
+    FlushExistingExchangeContext();
+
 exit:
     WeaveLogFunctError(err);
 
-    if (NULL != msgBuf)
-    {
-        PacketBuffer::Free(msgBuf);
-        msgBuf = NULL;
-    }
+    PacketBuffer::Free(msgBuf);
 
-    // In either case, the subscription is already canceled, move to kConfig_Down and kState_Initialized
-    if ((WEAVE_NO_ERROR != err) || canceled)
+    // If the subscription was canceled, or if an error occurred while handing
+    // the Cancel request, terminate the subscription and notify the application.
+    if (canceled || WEAVE_NO_ERROR != err)
     {
-        HandleSubscriptionTerminated(false, err, NULL);
+        mConfig = kConfig_Down;
+        TerminateSubscription(err, NULL, false);
     }
 
     _Release();
@@ -1752,7 +1798,7 @@
 
     if ((subscribeRequestFailed) || (WEAVE_NO_ERROR != err))
     {
-        pClient->HandleSubscriptionTerminated(pClient->IsRetryEnabled(), err, NULL);
+        pClient->TerminateSubscription(err, NULL, false);
     }
 
     pClient->_Release();
@@ -1784,8 +1830,7 @@
 
     WEAVE_ERROR err              = WEAVE_NO_ERROR;
     SubscriptionClient * pClient = reinterpret_cast<SubscriptionClient *>(aEC->AppState);
-    InEventParam inParam;
-    OutEventParam outParam;
+    bool terminateSubscription = false;
     bool retainExchangeContext = false;
     bool isStatusReportValid   = false;
     nl::Weave::Profiles::StatusReporting::StatusReport status;
@@ -1886,22 +1931,31 @@
             err = pClient->RefreshTimer();
             SuccessOrExit(err);
 
+            // Release the response buffer before initiating any callbacks to reduce overall
+            // buffer pressure.
+            PacketBuffer::Free(aPayload);
+            aPayload = NULL;
+
 #if WDM_ENABLE_SUBSCRIPTION_PUBLISHER
             SubscriptionEngine::GetInstance()->UpdateHandlerLiveness(pClient->mBinding->GetPeerNodeId(), pClient->mSubscriptionId);
 #endif // WDM_ENABLE_SUBSCRIPTION_PUBLISHER
 
             pClient->mRetryCounter = 0;
 
-            inParam.mSubscriptionActivity.mClient = pClient;
-            pClient->mEventCallback(pClient->mAppState, kEvent_OnSubscriptionActivity, inParam, outParam);
+            {
+                InEventParam inParam;
+                OutEventParam outParam;
 
-            inParam.Clear();
-            inParam.mSubscriptionEstablished.mSubscriptionId = pClient->mSubscriptionId;
-            inParam.mSubscriptionEstablished.mClient         = pClient;
+                // Emit an OnSubscriptionActivity event to the application.
+                inParam.mSubscriptionActivity.mClient = pClient;
+                pClient->mEventCallback(pClient->mAppState, kEvent_OnSubscriptionActivity, inParam, outParam);
 
-            // it's allowed to cancel or even abandon this subscription right inside this callback
-            pClient->mEventCallback(pClient->mAppState, kEvent_OnSubscriptionEstablished, inParam, outParam);
-            // since the state could have been changed, we must not assume anything
+                // Emit an OnSubscriptionEstablished event to the application.
+                // Note that it's allowed to cancel or even abandon this subscription right inside this callback.
+                inParam.mSubscriptionEstablished.mSubscriptionId = pClient->mSubscriptionId;
+                inParam.mSubscriptionEstablished.mClient         = pClient;
+                pClient->mEventCallback(pClient->mAppState, kEvent_OnSubscriptionEstablished, inParam, outParam);
+            }
 
 #if WEAVE_CONFIG_ENABLE_WDM_UPDATE
             pClient->LockUpdateMutex();
@@ -1925,40 +1979,47 @@
         break;
 
     case kState_SubscriptionEstablished_Confirming:
-        if (isStatusReportValid && status.success())
+
+        // Verify the response is a status report.
+        VerifyOrExit(isStatusReportValid, err = WEAVE_ERROR_INVALID_MESSAGE_TYPE);
+
+        // Verify that response is Success.
+        VerifyOrExit(status.success(), err = WEAVE_ERROR_STATUS_REPORT_RECEIVED);
+
+        // Close the exchange context and move back to idle state
+        pClient->FlushExistingExchangeContext();
+        pClient->MoveToState(kState_SubscriptionEstablished_Idle);
+
+        WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] liveness confirmed",
+                       SubscriptionEngine::GetInstance()->GetClientId(pClient), pClient->GetStateStr());
+
+        // Emit an OnSubscriptionActivity event
         {
-            // Status Report (success) for Subscribe Confirm request
-            // confirmed, move back to idle state
-            pClient->FlushExistingExchangeContext();
-            pClient->MoveToState(kState_SubscriptionEstablished_Idle);
-
-            WeaveLogDetail(DataManagement, "Client[%u] [%5.5s] liveness confirmed",
-                           SubscriptionEngine::GetInstance()->GetClientId(pClient), pClient->GetStateStr());
-
-            // Emit an OnSubscriptionActivity event
+            InEventParam inParam;
+            OutEventParam outParam;
             inParam.mSubscriptionActivity.mClient = pClient;
             pClient->mEventCallback(pClient->mAppState, kEvent_OnSubscriptionActivity, inParam, outParam);
+        }
 
-            err = pClient->RefreshTimer();
-            SuccessOrExit(err);
+        // Restart the subscription timer.
+        err = pClient->RefreshTimer();
+        SuccessOrExit(err);
 
 #if WDM_ENABLE_SUBSCRIPTION_PUBLISHER
-            SubscriptionEngine::GetInstance()->UpdateHandlerLiveness(pClient->mBinding->GetPeerNodeId(), pClient->mSubscriptionId);
+        SubscriptionEngine::GetInstance()->UpdateHandlerLiveness(pClient->mBinding->GetPeerNodeId(), pClient->mSubscriptionId);
 #endif // WDM_ENABLE_SUBSCRIPTION_PUBLISHER
-        }
-        else
-        {
-            // anything else is a failure, tear down the subscription
-            ExitNow(err = WEAVE_ERROR_INVALID_MESSAGE_TYPE);
-        }
+
         break;
 
 #if WDM_ENABLE_SUBSCRIPTION_CANCEL
     case kState_Canceling:
-        // It doesn't really matter what we receive from the other end, as we're heading out
-        // call abort silently without callback to upper layer, for this subscription was canceled by the upper layer
-        pClient->_AbortSubscription();
-        ExitNow();
+
+        // Verify the response is a status report.
+        // NOTE: It doesn't really matter what status code we receive from the other end as
+        // the subscription is being terminated regardless.
+        VerifyOrExit(isStatusReportValid, err = WEAVE_ERROR_INVALID_MESSAGE_TYPE);
+        terminateSubscription = true;
+
         break;
 #endif // WDM_ENABLE_SUBSCRIPTION_CANCEL
 
@@ -1971,23 +2032,26 @@
 exit:
     WeaveLogFunctError(err);
 
-    if (NULL != aPayload)
-    {
-        PacketBuffer::Free(aPayload);
-        aPayload = NULL;
-    }
-
+    // If the exchange is over, close the exchange context.
     if (!retainExchangeContext)
     {
         pClient->FlushExistingExchangeContext();
     }
 
-    if (err != WEAVE_NO_ERROR)
+    // Terminate the subscription if indicated, or if an unexpected error occurred.
+    // Pass the status report information to the application's OnSubscriptionTerminated
+    // callback if its pertinent in this case.
+    if (terminateSubscription || err != WEAVE_NO_ERROR)
     {
-        // if we're already aborted, this call becomes a no-op
-        pClient->HandleSubscriptionTerminated(pClient->IsRetryEnabled(), err, isStatusReportValid ? &status : NULL);
+        pClient->TerminateSubscription(err, (err == WEAVE_ERROR_STATUS_REPORT_RECEIVED) ? &status : NULL, false);
     }
 
+    // Free the message buffer if it hasn't been done already.  Note that in the case the
+    // response was a status report, this must be done *after* the call to TerminateSubscription
+    // as the StatusReport object that is passed to that method may contain a pointer into
+    // the buffer.
+    PacketBuffer::Free(aPayload);
+
     pClient->_Release();
 }
 
@@ -2686,7 +2750,7 @@
     if (needToResubscribe && IsInProgressOrEstablished())
     {
         WeaveLogDetail(DataManagement, "UpdateResponse: triggering resubscription");
-        HandleSubscriptionTerminated(IsRetryEnabled(), err, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     UnlockUpdateMutex();
@@ -2760,9 +2824,6 @@
 {
     SubscriptionClient * const pSubClient = reinterpret_cast<SubscriptionClient *>(aAppState);
 
-    VerifyOrExit(!(pSubClient->IsAborting()),
-            WeaveLogDetail(DataManagement, "<UpdateEventCallback> subscription has been aborted"));
-
     switch (aEvent)
     {
     case UpdateClient::kEvent_UpdateComplete:
@@ -2788,7 +2849,6 @@
         break;
     }
 
-exit:
     return;
 }
 
@@ -2905,7 +2965,7 @@
 
     if (mResubscribeNeeded && IsInProgressOrEstablished())
     {
-        HandleSubscriptionTerminated(IsRetryEnabled(), WEAVE_NO_ERROR, NULL);
+        TerminateSubscription(WEAVE_NO_ERROR, NULL, false);
     }
 
     // If there's an error code, notify the application
@@ -3022,7 +3082,7 @@
 
     if ((numPendingPathsDeleted > 0) && IsInProgressOrEstablished())
     {
-        HandleSubscriptionTerminated(IsRetryEnabled(), WEAVE_ERROR_WDM_VERSION_MISMATCH, NULL);
+        TerminateSubscription(WEAVE_ERROR_WDM_VERSION_MISMATCH, NULL, false);
     }
 
 exit:
@@ -3371,5 +3431,3 @@
 }; // namespace Profiles
 }; // namespace Weave
 }; // namespace nl
-
-#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
diff --git a/src/lib/profiles/data-management/Current/SubscriptionClient.h b/src/lib/profiles/data-management/Current/SubscriptionClient.h
index 5b1b5ab..c718532 100644
--- a/src/lib/profiles/data-management/Current/SubscriptionClient.h
+++ b/src/lib/profiles/data-management/Current/SubscriptionClient.h
@@ -79,19 +79,16 @@
          * ::nl::Weave::Profiles::DataManagement_Current::SubscriptionClient::EventCallback
          * will indicate whether a resubscribe will be automatically attempted.
          *
-         * If no retry will be attempted, the state of the client will be
-         * `Aborted`. No more downcalls into the application will be made.
-         * Otherwise, the state will not be aborted or freed. Downcalls will
-         * continue.
+         * During the event handler call, the state of the client will be `Terminated`.
+         * If no retry will be attempted, the state of the client will transition to
+         * `Initialized` when the event handler returns.  Otherwise, the state will
+         * transition to `ResubscribeHoldoff` and an attempt will be made to re-establish
+         * the subscription after the hold-off time.
          *
          * The application may call AbortSubscription() or Free() in this state.
          *
          * The parameters sent will also include an error code indicating the
-         * reason for ending the subscription. There are no guarantees for the
-         * state of
-         * ::nl::Weave::Profiles::DataManagement_Current::SubscriptionClient::mBinding
-         * or
-         * ::nl::Weave::Profiles::DataManagement_Current::SubscriptionClient::mEC.
+         * reason for ending the subscription.
          *
          * The subscription could have been terminated for a number of reasons
          * (WRM ACK missing, ExchangeContext allocation failure, response
@@ -380,7 +377,8 @@
     bool IsEstablished() { return (mCurrentState >= kState_Established_Begin && mCurrentState <= kState_Established_End); }
     bool IsEstablishedIdle() { return (mCurrentState == kState_SubscriptionEstablished_Idle); }
     bool IsFree() { return (mCurrentState == kState_Free); }
-    bool IsAborting() { return (mCurrentState == kState_Aborting); }
+    bool IsCanceling() const { return (mCurrentState == kState_Canceling); }
+    bool IsTerminated() { return (mCurrentState == kState_Terminated); }
     bool IsInResubscribeHoldoff() { return (mCurrentState == kState_Resubscribe_Holdoff); }
 
     void IndicateActivity(void);
@@ -413,30 +411,27 @@
 
     enum ClientState
     {
-        kState_Free        = 0,
-        kState_Initialized = 1,
+        kState_Free                                 = 0,
+        kState_Initialized                          = 1,
+        kState_Subscribing                          = 2,
+        kState_Subscribing_IdAssigned               = 3,
+        kState_SubscriptionEstablished_Idle         = 4,
+        kState_SubscriptionEstablished_Confirming   = 5,
+        kState_Canceling                            = 6,
+        kState_Resubscribe_Holdoff                  = 7,
+        kState_Terminated                           = 8,
 
-        kState_Subscribing                        = 2,
-        kState_Subscribing_IdAssigned             = 3,
-        kState_SubscriptionEstablished_Idle       = 4,
-        kState_SubscriptionEstablished_Confirming = 5,
-        kState_Canceling                          = 6,
-
-        kState_Resubscribe_Holdoff = 7,
-
-        kState_NotifyDataSinkOnAbort_Begin = kState_Subscribing,
-        kState_NotifyDataSinkOnAbort_End   = kState_Canceling,
-        kState_TimerTick_Begin             = kState_Subscribing,
-        kState_TimerTick_End               = kState_Resubscribe_Holdoff,
+        kState_NotifyDataSinkOnAbort_Begin          = kState_Subscribing,
+        kState_NotifyDataSinkOnAbort_End            = kState_Canceling,
+        kState_TimerTick_Begin                      = kState_Subscribing,
+        kState_TimerTick_End                        = kState_Resubscribe_Holdoff,
 
         // Note that these are the same as the allowed states in NotificationRequestHandler
-        kState_InProgressOrEstablished_Begin = kState_Subscribing,
-        kState_InProgressOrEstablished_End   = kState_SubscriptionEstablished_Confirming,
+        kState_InProgressOrEstablished_Begin        = kState_Subscribing,
+        kState_InProgressOrEstablished_End          = kState_SubscriptionEstablished_Confirming,
 
-        kState_Established_Begin = kState_SubscriptionEstablished_Idle,
-        kState_Established_End   = kState_SubscriptionEstablished_Confirming,
-
-        kState_Aborting = 8,
+        kState_Established_Begin                    = kState_SubscriptionEstablished_Idle,
+        kState_Established_End                      = kState_SubscriptionEstablished_Confirming,
     };
 
     ClientState mCurrentState;
@@ -501,7 +496,6 @@
     void _InitiateSubscription(void);
     WEAVE_ERROR SendSubscribeRequest(void);
 
-    void _AbortSubscription();
     void _Cleanup();
 
     WEAVE_ERROR ProcessDataList(nl::Weave::TLV::TLVReader & aReader);
@@ -509,8 +503,7 @@
     void _AddRef(void);
     void _Release(void);
 
-    void HandleSubscriptionTerminated(bool aWillRetry, WEAVE_ERROR aReason,
-                                      nl::Weave::Profiles::StatusReporting::StatusReport * aStatusReportPtr);
+    void TerminateSubscription(WEAVE_ERROR aReason, Profiles::StatusReporting::StatusReport * aStatusReport, bool suppressAppCallback);
     WEAVE_ERROR _PrepareBinding(void);
 
     WEAVE_ERROR ReplaceExchangeContext(void);
@@ -528,7 +521,8 @@
     void TimerEventHandler(void);
     WEAVE_ERROR RefreshTimer(void);
 
-    void SetRetryTimer(WEAVE_ERROR aReason);
+    void SetRetryTimer(WEAVE_ERROR aReason); // TODO: rename to SetResubscribeTimer()
+    void CancelSubscriptionTimer(void);
 
     void MoveToState(const ClientState aTargetState);
 
diff --git a/src/lib/profiles/data-management/Current/SubscriptionEngine.cpp b/src/lib/profiles/data-management/Current/SubscriptionEngine.cpp
index 2d53824..386770e 100644
--- a/src/lib/profiles/data-management/Current/SubscriptionEngine.cpp
+++ b/src/lib/profiles/data-management/Current/SubscriptionEngine.cpp
@@ -38,8 +38,6 @@
 #include <Weave/Support/WeaveFaultInjection.h>
 #include <SystemLayer/SystemStats.h>
 
-#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
-
 namespace nl {
 namespace Weave {
 namespace Profiles {
@@ -302,9 +300,7 @@
 {
     WEAVE_ERROR err = WEAVE_NO_ERROR;
 
-    err = nl::Weave::WeaveServerBase::SendStatusReport(aEC, aProfileId, aStatusCode, WEAVE_NO_ERROR,
-                                                       aEC->HasPeerRequestedAck() ? nl::Weave::ExchangeContext::kSendFlag_RequestAck
-                                                                                  : 0);
+    err = nl::Weave::WeaveServerBase::SendStatusReport(aEC, aProfileId, aStatusCode, WEAVE_NO_ERROR);
     WeaveLogFunctError(err);
 
     return err;
@@ -320,6 +316,13 @@
 {
     nl::Weave::ExchangeContext::MessageReceiveFunct func = OnUnknownMsgType;
 
+    // If the message was received over UDP and the peer requested an ACK, arrange for
+    // any message sent as a response to also request an ACK.
+    if (aMsgInfo->InCon == NULL && GetFlag(aMsgInfo->Flags, kWeaveMessageFlag_PeerRequestedAck))
+    {
+        aEC->SetAutoRequestAck(true);
+    }
+
     switch (aMsgType)
     {
 #if WDM_ENABLE_SUBSCRIPTION_CLIENT
@@ -831,7 +834,7 @@
             WeaveLogDetail(DataManagement, "Client[%d] [%5.5s] bound mutual subscription is going away", GetClientId(pClient),
                            pClient->GetStateStr());
 
-            pClient->HandleSubscriptionTerminated(pClient->IsRetryEnabled(), err, NULL);
+            pClient->TerminateSubscription(err, NULL, false);
         }
     }
 
@@ -886,7 +889,7 @@
             WeaveLogDetail(DataManagement, "Handler[%d] [%5.5s] bound mutual subscription is going away", GetHandlerId(pHandler),
                            pHandler->GetStateStr());
 
-            pHandler->HandleSubscriptionTerminated(err, NULL);
+            pHandler->TerminateSubscription(err, NULL, false);
         }
     }
 
@@ -1036,7 +1039,7 @@
         switch (mHandlers[i].mCurrentState)
         {
         case SubscriptionHandler::kState_Free:
-        case SubscriptionHandler::kState_Aborted:
+        case SubscriptionHandler::kState_Terminated:
             break;
         default:
             mHandlers[i].AbortSubscription();
@@ -1099,19 +1102,12 @@
         ExitNow(err = WEAVE_ERROR_NO_MEMORY);
     }
 
+    // Configure the binding to communicate back to the sender of the Subscribe request. Later,
+    // after the subscription is established, this binding will be used to initiate unsolicited
+    // exchanges with the client, e.g. to deliver notifications.
     err = binding->BeginConfiguration().ConfigureFromMessage(aMsgInfo, aPktInfo).PrepareBinding();
     SuccessOrExit(err);
 
-    // If the peer requested an ACK, we need to ensure that the exchange context will automatically
-    // request an ACK when we send messages out on this exchange.
-    //
-    // In future exchanges that we initiate to this peer, the binding will automatically vend out exchange
-    // contexts with this auto-ack bit set due to the binding configuration that happens in the line above.
-    if (aMsgInfo->Flags & kWeaveMessageFlag_PeerRequestedAck)
-    {
-        aEC->SetAutoRequestAck(true);
-    }
-
     if (pEngine->mIsPublisherEnabled && (NULL != pEngine->mEventCallback))
     {
         outParam.mIncomingSubscribeRequest.mAutoClosePriorSubscription = true;
@@ -1159,7 +1155,7 @@
 
                     if (nodeId == aEC->PeerNodeId)
                     {
-                        pEngine->mHandlers[i].HandleSubscriptionTerminated(err, NULL);
+                        pEngine->mHandlers[i].TerminateSubscription(err, NULL, false);
                     }
                 }
             }
@@ -2083,5 +2079,3 @@
 }; // namespace Profiles
 }; // namespace Weave
 }; // namespace nl
-
-#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
diff --git a/src/lib/profiles/data-management/Current/SubscriptionHandler.cpp b/src/lib/profiles/data-management/Current/SubscriptionHandler.cpp
index f0de69f..12edb52 100644
--- a/src/lib/profiles/data-management/Current/SubscriptionHandler.cpp
+++ b/src/lib/profiles/data-management/Current/SubscriptionHandler.cpp
@@ -44,8 +44,6 @@
 
 #include <Weave/Profiles/status-report/StatusReportProfile.h>
 
-#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
-
 namespace nl {
 namespace Weave {
 namespace Profiles {
@@ -149,6 +147,27 @@
     }
 }
 
+/**
+ * Gracefully end a publisher subscription
+ *
+ * Gracefully terminates the publisher end of a subscription.  If subscription cancel
+ * support is enabled, a SubscribeCancelRequest message is sent to the subscription
+ * client and the system awaits a reply before terminating the subscription;
+ * otherwise the subscription is immediately terminated in a similar manner to
+ * AbortSubscription().  If a mutual subscription exists, the counter subscription
+ * from the publisher back to the client is terminated as well.
+ *
+ * While awaiting a response to a SubscribeCancelRequest, the \c SubscriptionHandler
+ * enters the \c Canceling state.
+ *
+ * Once the termination process begins, the \c SubscriptionHandler object enters the
+ * `Terminated` state and an \c OnSubscriptionTerminated event is delivered to
+ * the application's event handler.  Note that, if cancel support is _not_ enabled,
+ * the event handler may be called synchronously within the call to EndSubscription().
+ *
+ * After the application's event handler returns, if there are no additional references
+ * to the \c SubscriptionHandler object, the object is freed.
+ */
 WEAVE_ERROR SubscriptionHandler::EndSubscription(const uint32_t aReasonProfileId, const uint16_t aReasonStatusCode)
 {
     WEAVE_ERROR err   = WEAVE_NO_ERROR;
@@ -173,8 +192,7 @@
             nl::Weave::Encoding::LittleEndian::Write16(p, aReasonStatusCode);
             msgBuf->SetDataLength(statusReportLen);
 
-            err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_Common, nl::Weave::Profiles::Common::kMsgType_StatusReport,
-                                   msgBuf, mEC->HasPeerRequestedAck() ? nl::Weave::ExchangeContext::kSendFlag_RequestAck : 0);
+            err    = mEC->SendMessage(Profiles::kWeaveProfile_Common, Profiles::Common::kMsgType_StatusReport, msgBuf);
             msgBuf = NULL;
             SuccessOrExit(err);
 
@@ -632,10 +650,13 @@
 
     WeaveLogIfFalse(0 == mRefCount);
 
+    // Maintain a reference for the duration of this method.
     _AddRef();
 
+    // Capture the binding and arrange to receive event callbacks.
     aBinding->AddRef();
     mBinding = aBinding;
+    mBinding->SetProtocolLayerCallback(BindingEventCallback, this);
 
     mPeerNodeId     = aMsgInfo->SourceNodeId;
     mBytesOffloaded = 0;
@@ -644,9 +665,10 @@
     // The ownership has been transferred to this subscription
     aEC = NULL;
 
-    // Add reference when we enter this initial state
+    // Add reference when we enter this initial subscribing state.
     // This is needed because the app layer doesn't automatically get hold of this instance,
-    // but we need this instance to be around until we clear the protocol state machine (by entering aborted)
+    // but we need this instance to be around until we clear the protocol state machine
+    // (by entering Terminated)
     _AddRef();
     MoveToState(kState_Subscribing_Evaluating);
 
@@ -764,7 +786,7 @@
 
     // Note we're sending back a message using an EC initiated by the client
     err     = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, kMsgType_NotificationRequest, aMsgBuf,
-                           nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
+                               nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
     aMsgBuf = NULL;
     SuccessOrExit(err);
 
@@ -781,7 +803,7 @@
 
     if (WEAVE_NO_ERROR != err)
     {
-        HandleSubscriptionTerminated(err, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     _Release();
@@ -862,8 +884,7 @@
     SuccessOrExit(err);
 
     // Note we're sending back a message using an EC initiated by the client
-    err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, kMsgType_SubscribeResponse, msgBuf,
-                           nl::Weave::ExchangeContext::kSendFlag_RequestAck);
+    err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, kMsgType_SubscribeResponse, msgBuf);
     msgBuf = NULL;
     SuccessOrExit(err);
 
@@ -881,7 +902,7 @@
 
     if (WEAVE_NO_ERROR != err)
     {
-        HandleSubscriptionTerminated(err, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     _Release();
@@ -903,8 +924,10 @@
 {
     mEC->AppState          = this;
     mEC->OnResponseTimeout = OnResponseTimeout;
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
     mEC->OnSendError       = OnSendError;
     mEC->OnAckRcvd         = OnAckReceived;
+#endif
     mEC->OnMessageReceived = OnMessageReceivedFromLocallyHeldExchange;
 }
 
@@ -946,8 +969,10 @@
         mEC->AppState          = NULL;
         mEC->OnMessageReceived = NULL;
         mEC->OnResponseTimeout = NULL;
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
         mEC->OnSendError       = NULL;
         mEC->OnAckRcvd         = NULL;
+#endif
         if (aAbortNow)
         {
             mEC->Abort();
@@ -1014,8 +1039,8 @@
         SuccessOrExit(err);
 
         // NOTE: State could be changed if there is a sync error callback from message layer
-        err    = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, kMsgType_SubscribeCancelRequest, msgBuf,
-                               nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
+        err    = mEC->SendMessage(Profiles::kWeaveProfile_WDM, kMsgType_SubscribeCancelRequest, msgBuf,
+                                  ExchangeContext::kSendFlag_ExpectResponse);
         msgBuf = NULL;
         SuccessOrExit(err);
 
@@ -1069,186 +1094,123 @@
 {
     WeaveLogIfFalse(mRefCount > 0);
 
-    --mRefCount;
-
-    if (0 == mRefCount)
+    // If releasing the last reference...
+    if (1 == mRefCount)
     {
-        SYSTEM_STATS_DECREMENT(nl::Weave::System::Stats::kWDM_NumSubscriptionHandlers);
+        // Just to be safe, call AbortSubscription() to ensure that the subscription
+        // is properly terminated. If the state transition logic is correct everywhere
+        // else in the code, the subscription will already have been terminated and
+        // this call will be a no-op.
         AbortSubscription();
-    }
-}
 
-void SubscriptionHandler::HandleSubscriptionTerminated(WEAVE_ERROR aReason, StatusReporting::StatusReport * aStatusReportPtr)
-{
-    void * const appState      = mAppState;
-    EventCallback callbackFunc = mEventCallback;
-    uint64_t peerNodeId;
+        // Return the handler to the Free state.
+        // NOTE: mRefCount is set to zero here solely to satisfy automated tests that look for
+        // a specific reference count in the "Moving to [ FREE]" log message.
+        mRefCount = 0;
+        MoveToState(kState_Free);
 
-    WeaveLogDetail(DataManagement, "Handler[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetHandlerId(this),
-                   GetStateStr(), __func__, mRefCount);
+        // Re-initialize all state data.
+        InitAsFree();
 
-    _AddRef();
-
-    // Retain a copy of the NodeId before AbortSubscription wipes it. We'll then stuff it back into mNodeId
-    // momentarily so that the application can still observe that field on the ensuing up-call.
-    // After the up-call returns, we'll nuke it back to 0.
-    //
-    // NOTE: This is a quick fix that has the least impact to the behaviors in this file. There's a lot that
-    // leaves to be desired around AddRef/_Release and its interactions with AbortSubscription. As part of cleaning
-    // that up, we'll find a better approach for retaining peer node ID through the up-call (see WEAV-2367).
-    peerNodeId = mPeerNodeId;
-
-    // Flush most internal states, except for mRefCount and mCurrentState
-    // move to kState_Aborted
-    AbortSubscription();
-
-    mPeerNodeId = peerNodeId;
-
-    // Make app layer callback in kState_Aborted
-    // Note that mRefCount should still be more than 0 when we make this callback.
-    // Since this function does not call _AddRef, it is possible if the app
-    // calls Free() that we'll exit the app callback in a free state.
-    // In that case, we won't have any cleanup to do.
-    // On the other hand, if the caller of this function has AddRef'ed,
-    // the state after exiting the app callback could be Aborted.
-    // In that case, we still won't have cleanup, since everything will
-    // be cleaned up upon _Release by the caller of this func.
-    if (NULL != callbackFunc)
-    {
-        InEventParam inParam;
-        OutEventParam outParam;
-
-        inParam.Clear();
-        outParam.Clear();
-
-        inParam.mSubscriptionTerminated.mReason  = aReason;
-        inParam.mSubscriptionTerminated.mHandler = this;
-        if (aStatusReportPtr != NULL)
-        {
-            inParam.mSubscriptionTerminated.mStatusProfileId   = aStatusReportPtr->mProfileId;
-            inParam.mSubscriptionTerminated.mStatusCode        = aStatusReportPtr->mStatusCode;
-            inParam.mSubscriptionTerminated.mAdditionalInfoPtr = &(aStatusReportPtr->mAdditionalInfo);
-        }
-
-        callbackFunc(appState, kEvent_OnSubscriptionTerminated, inParam, outParam);
+        SYSTEM_STATS_DECREMENT(nl::Weave::System::Stats::kWDM_NumSubscriptionHandlers);
     }
     else
     {
-        WeaveLogDetail(DataManagement, "Handler[%u] [%5.5s] %s Ref(%d) app layer callback skipped",
-                       SubscriptionEngine::GetInstance()->GetHandlerId(this), GetStateStr(), __func__, mRefCount);
+        --mRefCount;
     }
-
-    mPeerNodeId = 0;
-
-    _Release();
 }
 
-void SubscriptionHandler::AbortSubscription()
+void SubscriptionHandler::TerminateSubscription(WEAVE_ERROR aReason, StatusReporting::StatusReport * aStatusReport, bool suppressAppCallback)
 {
-    WEAVE_ERROR err          = WEAVE_NO_ERROR;
-    const bool nullReference = (0 == mRefCount);
-
-    if (!nullReference)
+    if (!IsFree() && !IsTerminated())
     {
-        // only do verbose logging if we're still referenced by someone
         WeaveLogDetail(DataManagement, "Handler[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetHandlerId(this),
                        GetStateStr(), __func__, mRefCount);
 
-        // Make sure we're not freed by accident.
-        // NOTE: In the last Abort call from _Release, mRefCount is already 0.
-        // In that case, we do not need this AddRef/Release pair, and we move to FREE state.
+        bool isNotifying = IsNotifying();
+
         _AddRef();
-    }
 
-    if (kState_Free == mCurrentState)
-    {
-        // This must not happen
-        ExitNow(err = WEAVE_ERROR_INCORRECT_STATE);
-    }
-    else if (kState_Aborted == mCurrentState || kState_Aborting == mCurrentState)
-    {
-        // we're already aborted, so there is nothing else to flush
-        ExitNow();
-    }
-    else
-    {
-        // This is an intermediate state for external calls during the abort process
-        uint64_t peerNodeId            = mPeerNodeId;
-        uint64_t subscriptionId        = mSubscriptionId;
-        bool notifyEngineCleanupNeeded = false;
+        // Advance to the Terminated state. The handler will remain in this state until
+        // it is freed.
+        MoveToState(kState_Terminated);
 
-        // If we were previously in a notifying state, we must tell NE so that it can do some clean-up.
-        // However, we should wait till the subscription state has moved to aborting before attempting
-        // to do so.
-        if (IsNotifying())
-        {
-            notifyEngineCleanupNeeded = true;
-        }
-
-        MoveToState(kState_Aborting);
-
-        if (notifyEngineCleanupNeeded)
-        {
-            const bool notifySuccessfullyDelivered = true;
-
-            SubscriptionEngine::GetInstance()->GetNotificationEngine()->OnNotifyConfirm(this, !notifySuccessfullyDelivered);
-        }
-
-        mBinding->SetProtocolLayerCallback(NULL, NULL);
-
-        mBinding->Release();
-        mBinding = NULL;
-
+        // Abort any in-progress exchange.
         FlushExistingExchangeContext(true);
-        mLivenessTimeoutMsec           = kNoTimeout;
-        mPeerNodeId                    = 0;
-        mSubscriptionId                = 0;
-        mIsInitiator                   = false;
-        mAppState                      = NULL;
-        mEventCallback                 = NULL;
-        mMaxNotificationSize           = 0;
-        mSubscribeToAllEvents          = false;
-        mCurProcessingTraitInstanceIdx = 0;
-        mCurrentImportance             = kImportanceType_Invalid;
-        (void) RefreshTimer();
+
+        // Clear any outstanding timer.
+        (void)RefreshTimer();
+
+        // If a notify was in progress, inform the notification engine that the notify message
+        // wasn't delivered, so that it can do some clean-up.
+        if (isNotifying)
+        {
+            SubscriptionEngine::GetInstance()->GetNotificationEngine()->OnNotifyConfirm(this, false);
+        }
+
+        // Deliver OnSubscriptionTerminated event to application.
+        if (NULL != mEventCallback && !suppressAppCallback)
+        {
+            InEventParam inParam;
+            OutEventParam outParam;
+
+            inParam.Clear();
+            outParam.Clear();
+
+            inParam.mSubscriptionTerminated.mReason  = aReason;
+            inParam.mSubscriptionTerminated.mHandler = this;
+            if (aStatusReport != NULL)
+            {
+                inParam.mSubscriptionTerminated.mIsStatusCodeValid = true;
+                inParam.mSubscriptionTerminated.mStatusProfileId   = aStatusReport->mProfileId;
+                inParam.mSubscriptionTerminated.mStatusCode        = aStatusReport->mStatusCode;
+                inParam.mSubscriptionTerminated.mAdditionalInfoPtr = &(aStatusReport->mAdditionalInfo);
+            }
+
+            mEventCallback(mAppState, kEvent_OnSubscriptionTerminated, inParam, outParam);
+        }
 
         // release all trait instances back to the shared pool
         SubscriptionEngine::GetInstance()->ReclaimTraitInfo(this);
 
-        mTraitInstanceList = NULL;
-        mNumTraitInstances = 0;
-
-        memset(mSelfVendedEvents, 0, sizeof(mSelfVendedEvents));
-        memset(mLastScheduledEventId, 0, sizeof(mLastScheduledEventId));
-
-        MoveToState(kState_Aborted);
-
-        // decrease the ref we added when we first started the protocol state machine
-        // now we've cleared this state machine (nothing for the protocol anymore),
-        // this instance doesn't need to be around any more
-        _Release();
-
 #if WDM_ENABLE_SUBSCRIPTION_CLIENT
-        (void) SubscriptionEngine::GetInstance()->UpdateClientLiveness(peerNodeId, subscriptionId, true);
+        (void) SubscriptionEngine::GetInstance()->UpdateClientLiveness(mPeerNodeId, mSubscriptionId, true);
 #endif // WDM_ENABLE_SUBSCRIPTION_CLIENT
-    }
 
-exit:
-    WeaveLogFunctError(err);
+        // Release the binding.
+        mBinding->SetProtocolLayerCallback(NULL, NULL);
+        mBinding->Release();
+        mBinding = NULL;
 
-    if (nullReference)
-    {
-        // No one is referencing us, move to FREE
-        MoveToState(kState_Free);
-    }
-    else
-    {
-        // Note that this call could lower ref count to 0 and cause this instance to be freed
-        // this is because we have an extra _Release when we first move into Aborting state
+        // Release the ref added when the subscription arrived.
+        _Release();
+
+        // Release the ref added above.  Note that, in most instances, this will be the
+        // last reference, resulting in the handler transitioning to the Free state.
         _Release();
     }
 }
 
+/**
+ * Abort a publisher subscription
+ *
+ * Terminates the publisher end of a subscription, without notifying the subscription
+ * client and without delivering an \c OnSubscriptionTerminated event to the application's
+ * event handler.  If a mutual subscription exists, the counter subscription from the
+ * publisher back to the client is terminated as well.
+ *
+ * Upon calling AbortSubscription(), the \c SubscriptionHandler object enters the
+ * `Terminated` state.  If there are no additional references to the object when
+ * the termination process completes, the \c SubscriptionHandler object is freed.
+ */
+void SubscriptionHandler::AbortSubscription()
+{
+    WeaveLogDetail(DataManagement, "Handler[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetHandlerId(this),
+                   GetStateStr(), __func__, mRefCount);
+
+    TerminateSubscription(WEAVE_NO_ERROR, NULL, true);
+}
+
 #if WDM_ENABLE_SUBSCRIPTION_CANCEL
 void SubscriptionHandler::CancelRequestHandler(nl::Weave::ExchangeContext * aEC, const nl::Inet::IPPacketInfo * aPktInfo,
                                                const nl::Weave::WeaveMessageInfo * aMsgInfo, PacketBuffer * aPayload)
@@ -1267,8 +1229,6 @@
     // Make sure we're not freed by accident.
     _AddRef();
 
-    mBinding->AdjustResponseTimeout(aEC);
-
     VerifyOrExit(NULL != msgBuf, err = WEAVE_ERROR_NO_MEMORY);
 
     // Verify the cancel request is truly from the client.  If not, reject the request with
@@ -1286,29 +1246,56 @@
     nl::Weave::Encoding::LittleEndian::Write16(p, statusCode);
     msgBuf->SetDataLength(statusReportLen);
 
-    err    = aEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_Common, nl::Weave::Profiles::Common::kMsgType_StatusReport, msgBuf,
-                           aEC->HasPeerRequestedAck() ? nl::Weave::ExchangeContext::kSendFlag_RequestAck : 0);
+    err    = aEC->SendMessage(Profiles::kWeaveProfile_Common, Profiles::Common::kMsgType_StatusReport, msgBuf);
     msgBuf = NULL;
     SuccessOrExit(err);
 
+    // Proactively close the exchange.  This prevents the call to TerminateSubscription()
+    // below from aborting the exchange, which, when using WRM, would prevent the
+    // StatusReport message from being re-transmitted if necessary.
+    FlushExistingExchangeContext();
+
 exit:
     WeaveLogFunctError(err);
 
-    if (NULL != msgBuf)
-    {
-        PacketBuffer::Free(msgBuf);
-        msgBuf = NULL;
-    }
+    PacketBuffer::Free(msgBuf);
 
-    if (canceled)
+    // If the subscription was canceled, or if an error occurred while handing
+    // the Cancel request, terminate the subscription and notify the application.
+    if (canceled || WEAVE_NO_ERROR != err)
     {
-        HandleSubscriptionTerminated(WEAVE_ERROR_TRANSACTION_CANCELED, NULL);
+        TerminateSubscription(err, NULL, false);
     }
 
     _Release();
 }
 #endif // WDM_ENABLE_SUBSCRIPTION_CANCEL
 
+
+void SubscriptionHandler::BindingEventCallback(void * const aAppState, const Binding::EventType aEvent,
+                                               const Binding::InEventParam & aInParam, Binding::OutEventParam & aOutParam)
+{
+    SubscriptionHandler * const pHandler = reinterpret_cast<SubscriptionHandler *>(aAppState);
+
+    // NOTE: This handler is only registered on the binding after the binding has been
+    // prepared. Thus the only meaningful event that can occur is BindingFailed.
+
+    switch (aEvent)
+    {
+    case Binding::kEvent_BindingFailed:
+
+        // The binding has failed.  This can happen because an underling connection has closed,
+        // or a security session has failed.  When this occurs, simply terminate the subscription.
+        //
+        pHandler->TerminateSubscription(aInParam.BindingFailed.Reason, NULL, false);
+
+        break;
+
+    default:
+        Binding::DefaultEventHandler(aAppState, aEvent, aInParam, aOutParam);
+    }
+}
+
 void SubscriptionHandler::OnTimerCallback(System::Layer * aSystemLayer, void * aAppState, System::Error)
 {
     SubscriptionHandler * const pHandler = reinterpret_cast<SubscriptionHandler *>(aAppState);
@@ -1348,7 +1335,7 @@
             VerifyOrExit(WEAVE_SYSTEM_NO_ERROR == err, /* no-op */);
         }
         break;
-    case kState_Aborting:
+    case kState_Terminated:
         // Do nothing
         break;
     default:
@@ -1391,7 +1378,7 @@
 exit:
     if (ShouldCleanUp)
     {
-        HandleSubscriptionTerminated(WEAVE_ERROR_TIMEOUT, NULL);
+        TerminateSubscription(WEAVE_ERROR_TIMEOUT, NULL, false);
     }
 
     if (!skipTimerCheck)
@@ -1478,11 +1465,8 @@
     case kState_Canceling:
         return "CANCL";
 
-    case kState_Aborting:
-        return "ABTNG";
-
-    case kState_Aborted:
-        return "ABORT";
+    case kState_Terminated:
+        return "TERM";
     }
     return "N/A";
 }
@@ -1507,6 +1491,8 @@
 #endif // #if WEAVE_DETAIL_LOGGING
 }
 
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
+
 void SubscriptionHandler::OnAckReceived(ExchangeContext * aEC, void * aMsgSpecificContext)
 {
     WEAVE_ERROR err                      = WEAVE_NO_ERROR;
@@ -1551,12 +1537,14 @@
 
     if (WEAVE_NO_ERROR != err)
     {
-        pHandler->HandleSubscriptionTerminated(err, NULL);
+        pHandler->TerminateSubscription(err, NULL, false);
     }
 
     pHandler->_Release();
 }
 
+#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
+
 void SubscriptionHandler::OnSendError(ExchangeContext * aEC, WEAVE_ERROR aErrorCode, void * aMsgSpecificContext)
 {
     SubscriptionHandler * const pHandler = reinterpret_cast<SubscriptionHandler *>(aEC->AppState);
@@ -1566,7 +1554,7 @@
 
     // Make sure we're not freed by accident.
     pHandler->_AddRef();
-    pHandler->HandleSubscriptionTerminated(aErrorCode, NULL);
+    pHandler->TerminateSubscription(aErrorCode, NULL, false);
     pHandler->_Release();
 
     // Run it again to do more useful work.
@@ -1583,7 +1571,7 @@
 
     // Make sure we're not freed by accident.
     pHandler->_AddRef();
-    pHandler->HandleSubscriptionTerminated(WEAVE_ERROR_TIMEOUT, NULL);
+    pHandler->TerminateSubscription(WEAVE_ERROR_TIMEOUT, NULL, false);
     pHandler->_Release();
 }
 
@@ -1596,13 +1584,13 @@
     // Status Report for Notification request when subscription is alive
     // Status Report for Cancel request
 
-    WEAVE_ERROR err                      = WEAVE_NO_ERROR;
-    SubscriptionHandler * const pHandler = reinterpret_cast<SubscriptionHandler *>(aEC->AppState);
-
-    bool RetainExchangeContext                 = false;
+    WEAVE_ERROR err                            = WEAVE_NO_ERROR;
+    SubscriptionHandler * const pHandler       = reinterpret_cast<SubscriptionHandler *>(aEC->AppState);
+    bool terminateSubscription                 = false;
+    bool retainExchangeContext                 = false;
     bool isStatusReportValid                   = false;
     bool isNotificationRejectedForInvalidValue = false;
-    nl::Weave::Profiles::StatusReporting::StatusReport status;
+    StatusReporting::StatusReport status;
 
     WeaveLogDetail(DataManagement, "Handler[%u] [%5.5s] %s Ref(%d)", SubscriptionEngine::GetInstance()->GetHandlerId(pHandler),
                    pHandler->GetStateStr(), __func__, pHandler->mRefCount);
@@ -1651,7 +1639,7 @@
         }
 
         // only retain the EC if we're good to continue processing
-        RetainExchangeContext = true;
+        retainExchangeContext = true;
 
         // Only prompt the NotificationEngine if we received a status report indicating success. Otherwise, the subscription will
         // get torn down and as part of that clean-up, a similar invocation of OnNotifyConfirm will happen.
@@ -1685,7 +1673,7 @@
         }
 
         // don't call flush for us in the end
-        RetainExchangeContext = true;
+        retainExchangeContext = true;
 
         // Only prompt the NotificationEngine if we received a status report indicating success. Otherwise, the subscription will
         // get torn down and as part of that clean-up, a similar invocation of OnNotifyConfirm will happen.
@@ -1715,9 +1703,13 @@
 
 #if WDM_ENABLE_SUBSCRIPTION_CANCEL
     case kState_Canceling:
-        // response for cancel request while subscription is alive. close the exchange context
-        // call abort silently without callback to upper layer, for this subscription was canceled by the upper layer
-        pHandler->AbortSubscription();
+
+        // Verify the response is a status report.
+        // NOTE: It doesn't really matter what status code we receive from the other end as
+        // the subscription is being terminated regardless.
+        VerifyOrExit(isStatusReportValid, err = WEAVE_ERROR_INVALID_MESSAGE_TYPE);
+        terminateSubscription = true;
+
         break;
 #endif // WDM_ENABLE_SUBSCRIPTION_CANCEL
 
@@ -1730,22 +1722,26 @@
 exit:
     WeaveLogFunctError(err);
 
-    if (NULL != aPayload)
-    {
-        PacketBuffer::Free(aPayload);
-        aPayload = NULL;
-    }
-
-    if (!RetainExchangeContext)
+    // If the exchange is over, close the exchange context.
+    if (!retainExchangeContext)
     {
         pHandler->FlushExistingExchangeContext();
     }
 
-    if (WEAVE_NO_ERROR != err)
+    // Terminate the subscription if indicated, or if an unexpected error occurred.
+    // Pass the status report information to the application's OnSubscriptionTerminated
+    // callback if its pertinent in this case.
+    if (terminateSubscription || err != WEAVE_NO_ERROR)
     {
-        pHandler->HandleSubscriptionTerminated(err, isStatusReportValid ? &status : NULL);
+        pHandler->TerminateSubscription(err, (err == WEAVE_ERROR_STATUS_REPORT_RECEIVED) ? &status : NULL, false);
     }
 
+    // Free the message buffer if it hasn't been done already.  Note that in the case the
+    // response was a status report, this must be done *after* the call to TerminateSubscription
+    // as the StatusReport object that is passed to that method may contain a pointer into
+    // the buffer.
+    PacketBuffer::Free(aPayload);
+
     pHandler->_Release();
 }
 
@@ -1761,5 +1757,3 @@
 }; // namespace Profiles
 }; // namespace Weave
 }; // namespace nl
-
-#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
diff --git a/src/lib/profiles/data-management/Current/SubscriptionHandler.h b/src/lib/profiles/data-management/Current/SubscriptionHandler.h
index d4d74a1..ccd09d4 100644
--- a/src/lib/profiles/data-management/Current/SubscriptionHandler.h
+++ b/src/lib/profiles/data-management/Current/SubscriptionHandler.h
@@ -123,6 +123,7 @@
             SubscriptionHandler * mHandler;
             WEAVE_ERROR mReason;
 
+            bool mIsStatusCodeValid;
             uint32_t mStatusProfileId;
             uint16_t mStatusCode;
             ReferencedTLVData * mAdditionalInfoPtr;
@@ -178,7 +179,8 @@
     {
         return (mCurrentState >= kState_Subscribing_Evaluating && mCurrentState <= kState_SubscriptionEstablished_Notifying);
     }
-    bool IsAborted() { return (mCurrentState == kState_Aborted); }
+    bool IsCanceling() const { return (mCurrentState == kState_Canceling); }
+    bool IsTerminated() { return (mCurrentState == kState_Terminated); }
     bool IsFree() { return (mCurrentState == kState_Free); }
 
     uint32_t GetMaxNotificationSize(void) const { return mMaxNotificationSize == 0 ? UINT16_MAX : mMaxNotificationSize; }
@@ -209,12 +211,10 @@
         kState_SubscriptionEstablished_Idle      = 5,
         kState_SubscriptionEstablished_Notifying = 6,
         kState_Canceling                         = 7,
+        kState_Terminated                        = 8,
 
-        kState_SubscriptionInfoValid_Begin = kState_Subscribing,
-        kState_SubscriptionInfoValid_End   = kState_Canceling,
-
-        kState_Aborting = 9,
-        kState_Aborted  = 10,
+        kState_SubscriptionInfoValid_Begin       = kState_Subscribing,
+        kState_SubscriptionInfoValid_End         = kState_Canceling,
     };
 
     HandlerState mCurrentState;
@@ -275,7 +275,7 @@
 
     void _AddRef(void);
     void _Release(void);
-    void HandleSubscriptionTerminated(WEAVE_ERROR aReason, nl::Weave::Profiles::StatusReporting::StatusReport * aStatusReportPtr);
+    void TerminateSubscription(WEAVE_ERROR aReason, Profiles::StatusReporting::StatusReport * aStatusReport, bool suppressAppCallback);
     void MoveToState(const HandlerState aTargetState);
     const char * GetStateStr() const;
 
@@ -312,6 +312,8 @@
     inline WEAVE_ERROR ParseSubscriptionId(SubscribeRequest::Parser & aRequest, uint32_t & aRejectReasonProfileId,
                                            uint16_t & aRejectReasonStatusCode, const uint64_t aRandomNumber);
 
+    static void BindingEventCallback(void * const apAppState, const Binding::EventType aEvent,
+                                     const Binding::InEventParam & aInParam, Binding::OutEventParam & aOutParam);
     static void OnTimerCallback(System::Layer * aSystemLayer, void * aAppState, System::Error aErrorCode);
     static void OnAckReceived(ExchangeContext * aEC, void * aMsgSpecificContext);
     static void OnSendError(ExchangeContext * aEC, WEAVE_ERROR aErrorCode, void * aMsgSpecificContext);
diff --git a/src/lib/profiles/data-management/Current/TraitData.cpp b/src/lib/profiles/data-management/Current/TraitData.cpp
index e4b7456..f6ba343 100644
--- a/src/lib/profiles/data-management/Current/TraitData.cpp
+++ b/src/lib/profiles/data-management/Current/TraitData.cpp
@@ -1081,6 +1081,12 @@
     mHasValidVersion = true;
 }
 
+void TraitDataSink::ClearVersion(void)
+{
+    WeaveLogDetail(DataManagement, "Trait %08x version: cleared", mSchemaEngine->GetProfileId());
+    mHasValidVersion = false;
+}
+
 void TraitDataSink::SetLastNotifyVersion(uint64_t aVersion)
 {
     WeaveLogDetail(DataManagement, "Trait %08x last notify version: 0x%" PRIx64 " -> 0x%" PRIx64 "", mSchemaEngine->GetProfileId(), mLastNotifyVersion,
@@ -1192,7 +1198,7 @@
         else
         {
             // We need to clear this since we don't have a good version of data anymore.
-            mHasValidVersion = false;
+            ClearVersion();
         }
     }
     else
diff --git a/src/lib/profiles/data-management/Current/TraitData.h b/src/lib/profiles/data-management/Current/TraitData.h
index d21a25f..8e4ea9d 100644
--- a/src/lib/profiles/data-management/Current/TraitData.h
+++ b/src/lib/profiles/data-management/Current/TraitData.h
@@ -708,7 +708,7 @@
     virtual UpdateEncoder * GetUpdateEncoder() { return NULL; }
 
     /* Subclass can invoke this to clear out their version */
-    void ClearVersion(void) { mHasValidVersion = false; }
+    void ClearVersion(void);
 
 protected: // ISetDataDelegate
     virtual WEAVE_ERROR SetLeafData(PropertyPathHandle aLeafHandle, nl::Weave::TLV::TLVReader & aReader) __OVERRIDE = 0;
diff --git a/src/lib/profiles/data-management/Current/UpdateClient.cpp b/src/lib/profiles/data-management/Current/UpdateClient.cpp
index 84f1c45..75e594c 100644
--- a/src/lib/profiles/data-management/Current/UpdateClient.cpp
+++ b/src/lib/profiles/data-management/Current/UpdateClient.cpp
@@ -38,7 +38,7 @@
 #include <SystemLayer/SystemFaultInjection.h>
 #include <SystemLayer/SystemStats.h>
 
-#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING && WEAVE_CONFIG_ENABLE_WDM_UPDATE
+#if WEAVE_CONFIG_ENABLE_WDM_UPDATE
 
 namespace nl {
 namespace Weave {
@@ -56,8 +56,10 @@
         mEC->AppState          = NULL;
         mEC->OnMessageReceived = NULL;
         mEC->OnResponseTimeout = NULL;
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
         mEC->OnSendError       = NULL;
         mEC->OnAckRcvd         = NULL;
+#endif
 
         if (aAbortNow)
         {
@@ -131,7 +133,9 @@
     mEC->AppState = this;
     mEC->OnMessageReceived = OnMessageReceived;
     mEC->OnResponseTimeout = OnResponseTimeout;
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
     mEC->OnSendError = OnSendError;
+#endif
 
 #if WEAVE_CONFIG_DATA_MANAGEMENT_ENABLE_SCHEMA_CHECK
     reader.Init(aBuf);
@@ -161,10 +165,12 @@
                 0, 1));
 
     // Use WRM's SendError fault to fail asynchronously
+#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
     WEAVE_FAULT_INJECT(FaultInjection::kFault_WDM_UpdateRequestSendErrorAsync,
             nl::Weave::FaultInjection::GetManager().FailAtFault(
                 nl::Weave::FaultInjection::kFault_WRMSendError,
                 0, 1));
+#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING
 
     err = mEC->SendMessage(nl::Weave::Profiles::kWeaveProfile_WDM, msgType, aBuf,
             nl::Weave::ExchangeContext::kSendFlag_ExpectResponse);
diff --git a/src/lib/profiles/data-management/Current/UpdateEncoder.cpp b/src/lib/profiles/data-management/Current/UpdateEncoder.cpp
index f7813b2..800f9c3 100644
--- a/src/lib/profiles/data-management/Current/UpdateEncoder.cpp
+++ b/src/lib/profiles/data-management/Current/UpdateEncoder.cpp
@@ -33,7 +33,7 @@
 #include <SystemLayer/SystemStats.h>
 #include <Weave/Support/WeaveFaultInjection.h>
 
-#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING && WEAVE_CONFIG_ENABLE_WDM_UPDATE
+#if WEAVE_CONFIG_ENABLE_WDM_UPDATE
 
 namespace nl {
 namespace Weave {
@@ -539,4 +539,4 @@
 }; // namespace Weave
 }; // namespace nl
 
-#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING && WEAVE_CONFIG_ENABLE_WDM_UPDATE
+#endif // WEAVE_CONFIG_ENABLE_WDM_UPDATE
diff --git a/src/lib/profiles/data-management/Current/UpdateEncoder.h b/src/lib/profiles/data-management/Current/UpdateEncoder.h
index 874f2f7..6ca95f4 100644
--- a/src/lib/profiles/data-management/Current/UpdateEncoder.h
+++ b/src/lib/profiles/data-management/Current/UpdateEncoder.h
@@ -26,7 +26,7 @@
 #ifndef _WEAVE_DATA_MANAGEMENT_UPDATE_ENCODER_CURRENT_H
 #define _WEAVE_DATA_MANAGEMENT_UPDATE_ENCODER_CURRENT_H
 
-#if WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING && WEAVE_CONFIG_ENABLE_WDM_UPDATE
+#if WEAVE_CONFIG_ENABLE_WDM_UPDATE
 
 #ifndef __STDC_FORMAT_MACROS
 #define __STDC_FORMAT_MACROS
@@ -173,6 +173,6 @@
 }; // namespace Weave
 }; // namespace nl
 
-#endif // WEAVE_CONFIG_ENABLE_RELIABLE_MESSAGING && WEAVE_CONFIG_ENABLE_WDM_UPDATE
+#endif // WEAVE_CONFIG_ENABLE_WDM_UPDATE
 
 #endif // _WEAVE_DATA_MANAGEMENT_UPDATE_ENCODER_CURRENT_H
diff --git a/src/lib/support/StatusReportStr.cpp b/src/lib/support/StatusReportStr.cpp
index 2fdcc87..81462b8 100644
--- a/src/lib/support/StatusReportStr.cpp
+++ b/src/lib/support/StatusReportStr.cpp
@@ -140,6 +140,7 @@
         switch (statusCode)
         {
         case nl::Weave::Profiles::Common::kStatus_Success                               : fmt = "[ Common(%08" PRIX32 "):%" PRIu16 " ] Success"; break;
+        case nl::Weave::Profiles::Common::kStatus_Canceled                              : fmt = "[ Common(%08" PRIX32 "):%" PRIu16 " ] Canceled"; break;
         case nl::Weave::Profiles::Common::kStatus_BadRequest                            : fmt = "[ Common(%08" PRIX32 "):%" PRIu16 " ] Bad/malformed request"; break;
         case nl::Weave::Profiles::Common::kStatus_UnsupportedMessage                    : fmt = "[ Common(%08" PRIX32 "):%" PRIu16 " ] Unrecognized/unsupported message"; break;
         case nl::Weave::Profiles::Common::kStatus_UnexpectedMessage                     : fmt = "[ Common(%08" PRIX32 "):%" PRIu16 " ] Unexpected message"; break;
diff --git a/src/test-apps/MockWdmNodeOptions.cpp b/src/test-apps/MockWdmNodeOptions.cpp
index 1246312..ea90ff2 100644
--- a/src/test-apps/MockWdmNodeOptions.cpp
+++ b/src/test-apps/MockWdmNodeOptions.cpp
@@ -36,6 +36,7 @@
     mWdmRoleInTest(0),
     mEnableMutualSubscription(false),
     mTestCaseId(NULL),
+    mUseTCP(false),
     mEnableStopTest(false),
     mNumDataChangeBeforeCancellation(NULL),
     mFinalStatus(NULL),
@@ -61,6 +62,7 @@
     static OptionDef optionDefs[] =
     {
         { "test-case",                                      kArgumentRequired,  kToolOpt_TestCaseId },
+        { "tcp",                                            kNoArgument,        kToolOpt_UseTCP },
         { "enable-stop",                                    kNoArgument,        kToolOpt_EnableStopTest },
         { "total-count",                                    kArgumentRequired,  kToolOpt_NumDataChangeBeforeCancellation },
         { "final-status",                                   kArgumentRequired,  kToolOpt_FinalStatus },
@@ -138,6 +140,9 @@
         "  --test-case <test case id>\n"
         "       Further configure device behavior with this test case id\n"
         "\n"
+        "  --tcp\n"
+        "       Use tcp when initiating an interaction with a publisher\n"
+        "\n"
         "  --enable-stop\n"
         "       Terminate WDM Next test in advance for Happy test\n"
         "\n"
@@ -418,6 +423,9 @@
         }
         mTestCaseId = strdup(arg);
         break;
+    case kToolOpt_UseTCP:
+        mUseTCP = true;
+        break;
     case kToolOpt_EnableStopTest:
         mEnableStopTest = true;
         break;
diff --git a/src/test-apps/MockWdmNodeOptions.h b/src/test-apps/MockWdmNodeOptions.h
index 030d3e6..6834916 100644
--- a/src/test-apps/MockWdmNodeOptions.h
+++ b/src/test-apps/MockWdmNodeOptions.h
@@ -42,6 +42,7 @@
     kToolOpt_WdmInitMutualSubscription,
     kToolOpt_WdmRespMutualSubscription,
     kToolOpt_TestCaseId,
+    kToolOpt_UseTCP,
     kToolOpt_EnableStopTest,
     kToolOpt_NumDataChangeBeforeCancellation,
     kToolOpt_FinalStatus,
@@ -132,6 +133,7 @@
     int mWdmRoleInTest;
     bool mEnableMutualSubscription;
     const char * mTestCaseId;
+    bool mUseTCP;
     bool mEnableStopTest;
     const char * mNumDataChangeBeforeCancellation;
     const char * mFinalStatus;
diff --git a/src/test-apps/MockWdmSubscriptionInitiator.cpp b/src/test-apps/MockWdmSubscriptionInitiator.cpp
index c7300b7..77d311c 100644
--- a/src/test-apps/MockWdmSubscriptionInitiator.cpp
+++ b/src/test-apps/MockWdmSubscriptionInitiator.cpp
@@ -134,6 +134,7 @@
     int mTestCaseId;
     int mTestSecurityMode;
     uint32_t mKeyId;
+    bool mUseTCP;
 
     TraitPath mTraitPaths[4];
     VersionedTraitPath mVersionedTraitPaths[4];
@@ -381,6 +382,8 @@
         mTestCaseId = kTestCase_TestTrait;
     }
 
+    mUseTCP = aConfig.mUseTCP;
+
     mTestSecurityMode = aTestSecurityMode;
 
     mKeyId = aKeyId;
@@ -705,12 +708,18 @@
 
     Binding::Configuration bindingConfig = mBinding->BeginConfiguration()
         .Target_NodeId(mPublisherNodeId) // TODO: aPublisherNodeId
-        .Transport_UDP_WRM()
-        .Transport_DefaultWRMPConfig(gWRMPConfig)
-
-        // (default) max num of msec between any outgoing message and next incoming message (could be a response to it)
         .Exchange_ResponseTimeoutMsec(kResponseTimeoutMsec);
 
+    if (mUseTCP)
+    {
+        bindingConfig.Transport_TCP();
+    }
+    else
+    {
+        bindingConfig.Transport_UDP_WRM()
+            .Transport_DefaultWRMPConfig(gWRMPConfig);
+    }
+
     if (nl::Weave::kWeaveSubnetId_NotSpecified != mPublisherSubnetId)
     {
         bindingConfig.TargetAddress_WeaveFabric(mPublisherSubnetId);
@@ -777,13 +786,13 @@
     case nl::Weave::Binding::kEvent_PrepareFailed:
         // Don't fail; let the protocol retry.
         //err = aInParam.PrepareFailed.Reason;
-        WeaveLogDetail(DataManagement, "kEvent_PrepareFailed: reason %d", err);
+        WeaveLogDetail(DataManagement, "kEvent_PrepareFailed: reason %s", ::nl::ErrorStr(aInParam.PrepareFailed.Reason));
         break;
 
     case nl::Weave::Binding::kEvent_BindingFailed:
         // Don't fail; let the protocol retry.
         //err = aInParam.BindingFailed.Reason;
-        WeaveLogDetail(DataManagement, "kEvent_BindingFailed: reason %d", err);
+        WeaveLogDetail(DataManagement, "kEvent_BindingFailed: reason %s", ::nl::ErrorStr(aInParam.PrepareFailed.Reason));
         break;
 
     case nl::Weave::Binding::kEvent_BindingReady:
@@ -1090,11 +1099,15 @@
 
         break;
     case SubscriptionClient::kEvent_OnSubscriptionTerminated:
-        WeaveLogDetail(DataManagement, "Client->kEvent_OnSubscriptionTerminated. Reason: %u, peer = 0x%" PRIX64 "\n",
-                aInParam.mSubscriptionTerminated.mReason,
-                aInParam.mSubscriptionTerminated.mClient->GetPeerNodeId());
+        WeaveLogDetail(DataManagement, "Client->kEvent_OnSubscriptionTerminated. peer = 0x%" PRIX64 ", %s: %s",
+                aInParam.mSubscriptionTerminated.mClient->GetPeerNodeId(),
+                (aInParam.mSubscriptionTerminated.mIsStatusCodeValid) ? "Status Report" : "Error",
+                (aInParam.mSubscriptionTerminated.mIsStatusCodeValid)
+                    ? ::nl::StatusReportStr(aInParam.mSubscriptionTerminated.mStatusProfileId, aInParam.mSubscriptionTerminated.mStatusCode)
+                    : ::nl::ErrorStr(aInParam.mSubscriptionTerminated.mReason));
 
         initiator->mWillRetry = aInParam.mSubscriptionTerminated.mWillRetry;
+        WeaveLogDetail(DataManagement, "mWillRetry is %s", aInParam.mSubscriptionTerminated.mWillRetry ? "true" : "false");
 
         switch (gFinalStatus)
         {
@@ -1261,8 +1274,9 @@
             initiator->mExchangeMgr->MessageLayer->SystemLayer->CancelTimer(HandleDataFlipTimeout, initiator);
         }
 
-        if (initiator->mEnableRetry == false || initiator->mWillRetry == false)
+        if (initiator->mEnableRetry == false)
         {
+            WeaveLogDetail(DataManagement, "%s %d", __FUNCTION__, __LINE__);
             HandlePublisherRelease();
             if (gEvaluateSuccessIteration == true)
             {
@@ -1288,8 +1302,11 @@
     WEAVE_ERROR err;
     MockWdmSubscriptionInitiatorImpl * const initiator = reinterpret_cast<MockWdmSubscriptionInitiatorImpl *>(aAppState);
 
+    WeaveLogDetail(DataManagement, "%s %d", __FUNCTION__, __LINE__);
+
     if (gIsMutualSubscription == true)
     {
+        WeaveLogDetail(DataManagement, "%s %d", __FUNCTION__, __LINE__);
         gEvaluateSuccessIteration = true;
         initiator->mWillRetry = false;
     }
@@ -1315,9 +1332,11 @@
 
 void MockWdmSubscriptionInitiatorImpl::HandlePublisherComplete()
 {
+    WeaveLogDetail(DataManagement, "%s %d", __FUNCTION__, __LINE__);
 
     if (gIsMutualSubscription == true)
     {
+        WeaveLogDetail(DataManagement, "%s %d", __FUNCTION__, __LINE__);
         gEvaluateSuccessIteration = true;
     }
 
@@ -1571,7 +1590,7 @@
     {
         if (
 #if WEAVE_CONFIG_ENABLE_WDM_UPDATE
-                false == initiator->mSubscriptionClient->IsUpdatePendingOrInProgress() && initiator->mUpdateTiming == MockWdmNodeOptions::kTiming_NoSub ||
+                (false == initiator->mSubscriptionClient->IsUpdatePendingOrInProgress() && initiator->mUpdateTiming == MockWdmNodeOptions::kTiming_NoSub) ||
 #endif
                 (initiator->mSubscriptionClient->IsEstablishedIdle() && (gIsMutualSubscription == false || gSubscriptionHandler->IsEstablishedIdle())))
         {
diff --git a/src/test-apps/MockWdmSubscriptionResponder.cpp b/src/test-apps/MockWdmSubscriptionResponder.cpp
index 8a0fa26..c3d6846 100644
--- a/src/test-apps/MockWdmSubscriptionResponder.cpp
+++ b/src/test-apps/MockWdmSubscriptionResponder.cpp
@@ -771,9 +771,12 @@
         break;
 
     case SubscriptionHandler::kEvent_OnSubscriptionTerminated:
-        WeaveLogDetail(DataManagement, "Publisher->kEvent_OnSubscriptionTerminated. Reason: %u, peer = 0x%" PRIX64 "\n",
-                aInParam.mSubscriptionTerminated.mReason,
-                aInParam.mSubscriptionTerminated.mHandler->GetPeerNodeId());
+        WeaveLogDetail(DataManagement, "Publisher->kEvent_OnSubscriptionTerminated. peer = 0x%" PRIX64 ", %s: %s",
+                aInParam.mSubscriptionTerminated.mHandler->GetPeerNodeId(),
+                (aInParam.mSubscriptionTerminated.mIsStatusCodeValid) ? "Status Report" : "Error",
+                (aInParam.mSubscriptionTerminated.mIsStatusCodeValid)
+                    ? ::nl::StatusReportStr(aInParam.mSubscriptionTerminated.mStatusProfileId, aInParam.mSubscriptionTerminated.mStatusCode)
+                    : ::nl::ErrorStr(aInParam.mSubscriptionTerminated.mReason));
         switch (gFinalStatus)
         {
         case kPublisherCancel:
@@ -793,7 +796,6 @@
         {
             //responder->mExchangeMgr->MessageLayer->SystemLayer->CancelTimer(HandleDataFlipTimeout, aAppState);
         }
-        HandleClientRelease(responder);
         HandlePublisherRelease();
         gResponderState.init();
         responder->onCompleteTest();
@@ -1008,7 +1010,9 @@
         }
         if (gFinalStatus == kClientAbort)
         {
-            (void)responder->mSubscriptionClient->AbortSubscription();
+            responder->mSubscriptionClient->AbortSubscription();
+            responder->mSubscriptionClient->Free();
+            responder->mSubscriptionClient = NULL;
         }
     }
 }
diff --git a/src/test-apps/TestEventLogging.cpp b/src/test-apps/TestEventLogging.cpp
index 2c25c06..f9756e1 100644
--- a/src/test-apps/TestEventLogging.cpp
+++ b/src/test-apps/TestEventLogging.cpp
@@ -147,7 +147,7 @@
     GetVendedEvent(nl::Weave::Profiles::DataManagement::ImportanceType inImportance);
 
     void SetActive(void) { mCurrentState = kState_Subscribing_Evaluating; }
-    void SetAborted(void) { mCurrentState = kState_Aborted; }
+    void SetTerminated(void) { mCurrentState = kState_Terminated; }
     void SetEstablishedIdle(void) { mCurrentState = kState_SubscriptionEstablished_Idle; }
     void SetExchangeContext(nl::Weave::ExchangeContext * aEC) { mEC = aEC; }
 
diff --git a/src/test-apps/TestWdmNext.cpp b/src/test-apps/TestWdmNext.cpp
index 8d93e95..cffab7b 100644
--- a/src/test-apps/TestWdmNext.cpp
+++ b/src/test-apps/TestWdmNext.cpp
@@ -265,6 +265,7 @@
 
     for (uint32_t iteration = 1; iteration <= gTestWdmNextOptions.mTestIterations; iteration++)
     {
+        Done = false;
 
 #ifdef ENABLE_WDMPERFDATA
 
@@ -355,10 +356,13 @@
             MockEventGenerator::GetInstance()->Init(&ExchangeMgr, gEventGenerator, gMockWdmNodeOptions.mTimeBetweenEvents, true);
         }
 
+        printf("Start service network loop\n");
         while (!Done)
         {
             ServiceNetwork(sleepTime);
         }
+        printf("End service network loop\n");
+
         MockEventGenerator::GetInstance()->SetEventGeneratorStop();
 
         if (gEventGenerator != NULL)
@@ -383,8 +387,6 @@
         }
 
 
-        Done = false;
-
 #ifdef ENABLE_WDMPERFDATA
 
         TimeRef();
@@ -417,7 +419,6 @@
         }
 
         printf("Current completed test iteration is %d\n", iteration);
-
     }
 
     MockWdmSubscriptionInitiator::GetInstance()->PrintVersionsLog();
@@ -454,11 +455,13 @@
 {
     if (gMockWdmNodeOptions.mEnableStopTest)
     {
+        printf("HandleWdmCompleteTest: Done = true\n");
         Done = true;
     }
 }
 
 static void HandleError()
 {
+    printf("HandleError: Done = true\n");
     Done = true;
 }
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_12.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_12.py
index ceb3fc1..53ae88f 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_12.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_12.py
@@ -39,7 +39,7 @@
         wdm_next_args['client_clear_state_between_iterations'] = True
         wdm_next_args['test_client_iterations'] = 10
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'] )]
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_15.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_15.py
index b4eadb9..8190210 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_15.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_15.py
@@ -42,7 +42,7 @@
         wdm_next_args['timeout'] = 60 * 15 * wdm_next_args['test_client_iterations']
 
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_17.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_17.py
index e142c6b..d33a350 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_17.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_17.py
@@ -44,7 +44,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] \[.+\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_18.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_18.py
index 73867a8..b610e11 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_18.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_18.py
@@ -44,7 +44,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] \[.+\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_19.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_19.py
index a230419..82bf065 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_19.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_19.py
@@ -43,9 +43,8 @@
         wdm_next_args['client_inter_event_period'] = 2000
 
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_20.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_20.py
index 527e836..397d0d6 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_20.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_20.py
@@ -45,7 +45,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_21.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_21.py
index c50ae7b..1f0146b 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_21.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_21.py
@@ -37,11 +37,10 @@
         wdm_next_args['enable_client_flip'] = 1
         wdm_next_args['test_client_iterations'] = 10
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              # Service is always sending notification to device when device try to mutual subscription
                                              # therefore it is set as wdm_next_args['test_client_iterations'] instead of 1, which seems not match with protocol
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_22.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_22.py
index b66a380..510819b 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_22.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_22.py
@@ -45,7 +45,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] \[.+\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_23.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_23.py
index a2d47ef..64be72f 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_23.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_23.py
@@ -45,7 +45,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] \[.+\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_24.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_24.py
index 6bda151..80a3f49 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_24.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_24.py
@@ -45,7 +45,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_25.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_25.py
index 863fee7..67afbb4 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_25.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_25.py
@@ -43,9 +43,8 @@
         wdm_next_args['client_inter_event_period'] = 2000
 
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_application_key_01.py b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_application_key_01.py
index 44063ef..3e14ae1 100755
--- a/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_application_key_01.py
+++ b/src/test-apps/happy/tests/service/wdmNext/test_weave_wdm_next_service_mutual_subscribe_application_key_01.py
@@ -43,7 +43,6 @@
         wdm_next_args['client_log_check'] = [('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] \[.+\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_03.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_03.py
index 4c87d59..220d9fe 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_03.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_03.py
@@ -54,13 +54,13 @@
         wdm_next_args['server_clear_state_between_iterations'] = True        
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription Ref', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']), 
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_04.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_04.py
index 5b80e6c..388dfbf 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_04.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_04.py
@@ -60,7 +60,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_07.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_07.py
index 4d52271..42bed29 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_07.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_07.py
@@ -54,13 +54,13 @@
         wdm_next_args['server_clear_state_between_iterations'] = True
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_08.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_08.py
index f9d974d..3b59460 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_08.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_08.py
@@ -60,7 +60,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_11.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_11.py
index 08aae0a..24ffa40 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_11.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_11.py
@@ -60,7 +60,7 @@
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_12.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_12.py
index 332d664..127cf2e 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_12.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_12.py
@@ -61,7 +61,7 @@
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_15.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_15.py
index 7066181..d7b3b5a 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_15.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_15.py
@@ -55,12 +55,12 @@
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count'] + 1)),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_16.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_16.py
index 91bc539..98ffc9d 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_16.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_16.py
@@ -60,7 +60,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_19.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_19.py
index 79eb75f..2e34cd6 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_19.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_19.py
@@ -54,13 +54,13 @@
         wdm_next_args['server_clear_state_between_iterations'] = True
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_20.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_20.py
index 6bfe0e7..be1a764 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_20.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_20.py
@@ -61,7 +61,7 @@
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_23.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_23.py
index 7825b49..83d96fa 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_23.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_23.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_24.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_24.py
index 0cdd30a..f49a791 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_24.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_24.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_27.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_27.py
index 3ea8235..60d15df 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_27.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_27.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_28.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_28.py
index e0e1d7a..8a8f9ab 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_28.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_28.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_31.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_31.py
index a655066..077ce8e 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_31.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_31.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_32.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_32.py
index a4b1dbe..f8f3b49 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_32.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_32.py
@@ -50,7 +50,7 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_35.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_35.py
index 809ee32..7eeb57e 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_35.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_35.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 1
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count'] + 1)),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_36.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_36.py
index 9a03157..2982a4a 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_36.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_36.py
@@ -50,7 +50,7 @@
         wdm_next_args['enable_server_flip'] = 1
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count'] + 1)),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_39.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_39.py
index 07e28fb..b880839 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_39.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_39.py
@@ -50,12 +50,12 @@
         wdm_next_args['enable_server_flip'] = 1
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count'] + 1)),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_40.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_40.py
index b04b409..0ff52f0 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_40.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_40.py
@@ -50,7 +50,7 @@
         wdm_next_args['enable_server_flip'] = 1
 
         wdm_next_args['client_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count'] + 1)),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_46.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_46.py
index 6d3144b..107a48a 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_46.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_46.py
@@ -59,7 +59,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_47.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_47.py
index a9d6703..4546ef1 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_47.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_47.py
@@ -60,7 +60,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_50.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_50.py
index 03c65db..63ece93 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_50.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_50.py
@@ -58,7 +58,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_51.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_51.py
index f9b0c50..91c4835 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_51.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_51.py
@@ -59,7 +59,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_54.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_54.py
index 08c3501..d6be5f1 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_54.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_54.py
@@ -59,7 +59,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_55.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_55.py
index 60bc777..70febbd 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_55.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_55.py
@@ -60,7 +60,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_58.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_58.py
index c49878c..16cef47 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_58.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_58.py
@@ -58,7 +58,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_59.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_59.py
index ba455b2..7d344b6 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_59.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_59.py
@@ -59,7 +59,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_62.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_62.py
index 698b9ec..d25fe8d 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_62.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_62.py
@@ -62,7 +62,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_63.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_63.py
index 540c47a..a3ac4c1 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_63.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_63.py
@@ -62,7 +62,7 @@
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_64.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_64.py
index e21bb29..3103ba9 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_64.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_64.py
@@ -64,7 +64,7 @@
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_client_count'] + 1)),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Error retrieving data from trait', wdm_next_args['test_client_iterations']),
                                              ('trait property is too big so that it fails to fit in the packet', wdm_next_args['test_client_iterations']),
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_65.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_65.py
index e4979f5..3b11b12 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_65.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_mutual_subscribe_65.py
@@ -64,7 +64,7 @@
         wdm_next_args['server_log_check'] = [('TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] ),
                                              ('bound mutual subscription is going away', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations']),
                                              ('Error retrieving data from trait', wdm_next_args['test_client_iterations'] * 2),
                                              ('trait property is too big so that it fails to fit in the packet', wdm_next_args['test_client_iterations']),
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_02.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_02.py
index 8406e93..5550ab3 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_02.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_02.py
@@ -53,11 +53,11 @@
         wdm_next_args['client_clear_state_between_iterations'] = True
         wdm_next_args['server_clear_state_between_iterations'] = True
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TimerEventHandler Ref\(\d+\) Timeout',  wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
         wdm_next_args['test_case_name'] = ['L02: Stress One way Subscribe: Root path. Null Version. Client aborts']
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_03.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_03.py
index 7153c28..392d5f0 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_03.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_03.py
@@ -54,7 +54,7 @@
         wdm_next_args['server_clear_state_between_iterations'] = True
 
         wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(CANCL)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(CANCL)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] CancelRequestHandler Ref\(\d+\)', wdm_next_args['test_client_iterations']),
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_04.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_04.py
index 6a5ec92..45eb739 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_04.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_04.py
@@ -53,11 +53,11 @@
         wdm_next_args['client_clear_state_between_iterations'] = True
         wdm_next_args['server_clear_state_between_iterations'] = True
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_06.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_06.py
index 63751d8..205969c 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_06.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_06.py
@@ -53,11 +53,11 @@
         wdm_next_args['client_clear_state_between_iterations'] = True
         wdm_next_args['server_clear_state_between_iterations'] = True
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[ALIVE\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[ALIVE\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count'] + 1)),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
         wdm_next_args['test_case_name'] = ['L06: Stress One way Subscribe: Root path. Null Version. Mutate data in Publisher. Client aborts']
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_07.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_07.py
index b3d8077..1d2cad4 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_07.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_07.py
@@ -52,7 +52,7 @@
 
         wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] CancelRequestHandler Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_08.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_08.py
index 406cb76..11d6e41 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_08.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_08.py
@@ -49,11 +49,10 @@
         wdm_next_args['timer_server_period'] = 0
         wdm_next_args['enable_server_flip'] = 0
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
-        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
         wdm_next_args['test_case_name'] = ['B04: One way Subscribe: Root path. Null Version. Publisher aborts']
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_09.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_09.py
index cd21dc6..a6cb897 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_09.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_09.py
@@ -50,7 +50,7 @@
         wdm_next_args['enable_server_flip'] = 0
 
         wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] CancelRequestHandler Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_10.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_10.py
index 083fdf8..d7c74b1 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_10.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_10.py
@@ -49,10 +49,9 @@
         wdm_next_args['timer_server_period'] = 4000
         wdm_next_args['enable_server_flip'] = 0
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
-        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
         wdm_next_args['test_case_name'] = ['C06: One way Subscribe: Root path, Null Version, Idle, Publisher Abort']
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_12.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_12.py
index f607b13..a5d4f2f 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_12.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_12.py
@@ -48,7 +48,7 @@
         wdm_next_args['timer_server_period'] = 5000
         wdm_next_args['enable_server_flip'] = 1
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * wdm_next_args['total_server_count'] + 1),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_13.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_13.py
index 350d2de..9c605f8 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_13.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_13.py
@@ -49,13 +49,13 @@
         wdm_next_args['timer_server_period'] = 4000
         wdm_next_args['enable_server_flip'] = 1
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * wdm_next_args['total_server_count'] + 1),
                                              ('0 ==> 100 ==> 101 ==> 102 ==> 103 ==> 104 ==> 105 ==> 106 ==> 107 ==> 108 ==> 109 ==> 110', 2),
                                              ('0 ==> 200 ==> 201 ==> 202 ==> 203 ==> 204 ==> 205 ==> 206 ==> 207 ==> 208 ==> 209 ==> 210', 1),
                                              ('0 ==> 300 ==> 301 ==> 302 ==> 303 ==> 304 ==> 305 ==> 306 ==> 307 ==> 308 ==> 309 ==> 310', 1)]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TimerEventHandler Ref\(\d+\) Timeout', wdm_next_args['test_client_iterations']),
-                                             ('Handler\[0\] \[(ALIVE|CONFM)\] AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
 
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_14.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_14.py
index 9361774..7a9fb50 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_14.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_14.py
@@ -56,7 +56,7 @@
         wdm_next_args['server_inter_event_period'] = 2000
 
         wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[CANCL\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations'])]
+                                             ('Client\[0\] \[CANCL\] TerminateSubscription ', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] CancelRequestHandler', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_15.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_15.py
index 96a24c3..93427d7 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_15.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_15.py
@@ -55,8 +55,8 @@
 
         wdm_next_args['server_inter_event_period'] = 2000
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations'])]
-        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations'])]
+        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
         wdm_next_args['test_case_name'] = ['L08: Stress One way Subscribe: Publisher Continuous Events. Publisher mutates trait data. Client aborts']
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_16.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_16.py
index 8c8049f..01f627b 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_16.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_16.py
@@ -56,7 +56,7 @@
         wdm_next_args['server_inter_event_period'] = 2000
 
         wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[CANCL\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations'])]
+                                             ('Client\[0\] \[CANCL\] TerminateSubscription ', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] CancelRequestHandler', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_17.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_17.py
index 3e10783..4bd1989 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_17.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_one_way_subscribe_17.py
@@ -55,9 +55,9 @@
 
         wdm_next_args['server_inter_event_period'] = 2000
 
-        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+        wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
-        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] HandleSubscriptionTerminated', wdm_next_args['test_client_iterations']),
+        wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Handler\[0\] Moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['test_tag'] = self.__class__.__name__[19:].upper()
         wdm_next_args['test_case_name'] = ['L10: Stress One way Subscribe: Publisher Continuous Events. Client cancels']
diff --git a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_oneway_subscribe_faults.py b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_oneway_subscribe_faults.py
index 000968d..faf461d 100755
--- a/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_oneway_subscribe_faults.py
+++ b/src/test-apps/happy/tests/standalone/wdmNext/test_weave_wdm_next_oneway_subscribe_faults.py
@@ -64,7 +64,7 @@
         wdm_next_args['enable_server_flip'] = 1
 
         wdm_next_args['client_log_check'] = [('Client\[0\] \[(ALIVE|CONFM)\] EndSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
-                                             ('Client\[0\] \[CANCL\] _AbortSubscription Ref\(\d+\)', wdm_next_args['test_client_iterations']),
+                                             ('Client\[0\] \[CANCL\] TerminateSubscription ', wdm_next_args['test_client_iterations']),
                                              ('Client->kEvent_OnNotificationProcessed', wdm_next_args['test_client_iterations'] * (wdm_next_args['total_server_count']) +1),
                                              ('Client\[0\] moving to \[ FREE\] Ref\(0\)', wdm_next_args['test_client_iterations'])]
         wdm_next_args['server_log_check'] = [('Handler\[0\] \[(ALIVE|CONFM)\] CancelRequestHandler', wdm_next_args['test_client_iterations']),