diff -wubir squid-3.2.1//src/adaptation/icap/Xaction.cc squid-3.2.1//src/adaptation/icap/Xaction.cc
--- squid-3.2.1//src/adaptation/icap/Xaction.cc	2012-08-15 07:24:19.000000000 +0400
+++ squid-3.2.1//src/adaptation/icap/Xaction.cc	2012-08-27 12:01:38.822888615 +0400
@@ -42,7 +42,8 @@
         ignoreLastWrite(false),
         connector(NULL), reader(NULL), writer(NULL), closer(NULL),
         alep(new AccessLogEntry),
-        al(*alep)
+        al(*alep),
+        cs(NULL)
 {
     debugs(93,3, typeName << " constructed, this=" << this <<
            " [icapx" << id << ']'); // we should not call virtual status() here
@@ -166,8 +167,8 @@
 
     // TODO: service bypass status may differ from that of a transaction
     typedef CommCbMemFunT<Adaptation::Icap::Xaction, CommConnectCbParams> ConnectDialer;
     connector = JobCallback(93,3, ConnectDialer, this, Adaptation::Icap::Xaction::noteCommConnected);
-    Comm::ConnOpener *cs = new Comm::ConnOpener(connection, connector, TheConfig.connect_timeout(service().cfg().bypass));
+    cs = new Comm::ConnOpener(connection, connector, TheConfig.connect_timeout(service().cfg().bypass));
     cs->setHost(s.cfg().host.termedBuf());
     AsyncJob::Start(cs);
 }
@@ -222,6 +223,8 @@
 // connection with the ICAP service established
 void Adaptation::Icap::Xaction::noteCommConnected(const CommConnectCbParams &io)
 {
+    cs = NULL;
+
     if (io.flag == COMM_TIMEOUT) {
         handleCommTimedout();
         return;
@@ -506,6 +509,12 @@
 void Adaptation::Icap::Xaction::swanSong()
 {
     // kids should sing first and then call the parent method.
+    if (cs)
+    {
+       debugs(93,6, HERE << id << " about to notify ConnOpener!");
+       CallJobHere(93, 3, cs, Comm::ConnOpener, noteAbort);
+       cs = NULL;
+    }
 
     closeConnection(); // TODO: rename because we do not always close
 
diff -wubir squid-3.2.1//src/adaptation/icap/Xaction.h squid-3.2.1//src/adaptation/icap/Xaction.h
--- squid-3.2.1//src/adaptation/icap/Xaction.h	2012-08-15 07:24:19.000000000 +0400
+++ squid-3.2.1//src/adaptation/icap/Xaction.h	2012-08-24 18:18:31.998889205 +0400
@@ -42,6 +42,7 @@
 #include "AccessLogEntry.h"
 #include "HttpReply.h"
 #include "ipcache.h"
+#include "comm/ConnOpener.h"
 
 class CommConnectCbParams;
 
@@ -188,6 +189,7 @@
     timeval icap_tio_finish;   /*time when the last byte of the ICAP responsewas received*/
 
 private:
+    Comm::ConnOpener *cs;
     //CBDATA_CLASS2(Xaction);
 };
 
diff -wubir squid-3.2.1//src/comm/ConnOpener.h squid-3.2.1//src/comm/ConnOpener.h
--- squid-3.2.1//src/comm/ConnOpener.h	2012-08-15 07:24:19.000000000 +0400
+++ squid-3.2.1//src/comm/ConnOpener.h	2012-08-27 11:51:24.694908049 +0400
@@ -21,6 +21,8 @@
     virtual void swanSong();
 
 public:
+    void noteAbort() { mustStop("externally aborted"); }
+
     typedef CbcPointer<ConnOpener> Pointer;
 
     virtual bool doneAll() const;

