diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike
index 4eba9ef7240fc8ddd5256e9a47439e57f157769b..bff071042fd4a061f9c6171d4c81d001297a6def 100644
--- a/lib/modules/Sql.pmod/pgsql.pike
+++ b/lib/modules/Sql.pmod/pgsql.pike
@@ -270,7 +270,8 @@ protected void create(void|string host, void|string database,
    && (t = time(1)) - lastping > MINPINGINTERVAL
    && (ret = !catch(proxy.c->start()->sendcmd(FLUSHSEND))))
     lastping = t;
-  return ret ? !!reconnected : -1;
+  // After catch(start()) we might have been destructed
+  return this && ret ? !!reconnected : -1;
 }
 
 //! Cancels all currently running queries in this session.
diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod
index b3e3f30113e7e2c802309e52e676e0100146da46..e675b162ec183fc40c83ea26b2e8ec98e1c42fda 100644
--- a/lib/modules/Sql.pmod/pgsql_util.pmod
+++ b/lib/modules/Sql.pmod/pgsql_util.pmod
@@ -1569,13 +1569,16 @@ class sql_result {
     array(Thread.MutexKey) reflock = ({ 0 });
     for (;;) {
       reflock[0] = closemux->lock(aborted);
-      if (!catch(plugbuffer = c->start(reflock)))
+      if (!catch(plugbuffer = c->start(reflock))) {
+        if (!this)				// If dead
+          return;
         if (plugbuffer)
           plugbuffer->sendcmd(_closeportal(plugbuffer, reflock));
         else {
           PD("Releasesession retry closemux %O\n", _portalname);
           continue;
         }
+      }
       break;
     }
     reflock[0] = 0;
@@ -1962,9 +1965,11 @@ class proxy {
       PD("%O\n", (string)plugbuffer);
       void|bufcon|conxsess cs;
       if (catch(cs = ci->start())) {
-        destruct(waitforauthready);
-        unnamedstatement = 0;
-        termlock = 1;
+        if (this) {				// Only if still alive
+          destruct(waitforauthready);
+          unnamedstatement = 0;
+          termlock = 1;
+        }
         return;
       } else {
         CHAIN(cs)->add_hstring(plugbuffer, 4, 4);