diff -urN -x .svn -x .hgignore -x .hg carlh/3.0/libs/ardour/ardour/port.h track-rm/libs/ardour/ardour/port.h
--- carlh/3.0/libs/ardour/ardour/port.h	2008-12-08 19:20:22.000000000 +0000
+++ track-rm/libs/ardour/ardour/port.h	2008-12-19 23:39:14.000000000 +0000
@@ -26,6 +26,7 @@
 #include <cstring>
 #include <sigc++/signal.h>
 #include <pbd/failed_constructor.h>
+#include <pbd/destructible.h>
 #include <ardour/ardour.h>
 #include <ardour/data_type.h>
 #include <jack/jack.h>
@@ -37,7 +38,7 @@
 
 /** Abstract base for ports
  */
-class Port : public virtual sigc::trackable {
+class Port : public virtual PBD::Destructible {
    public:
 	enum Flags {
 		IsInput = JackPortIsInput,
@@ -132,6 +133,10 @@
 	std::set<Port*> _connections;
 
 	static AudioEngine* engine;
+
+   private:
+
+        void port_going_away (Port *);
 };
 
 class PortConnectableByName {
diff -urN -x .svn -x .hgignore -x .hg carlh/3.0/libs/ardour/port.cc track-rm/libs/ardour/port.cc
--- carlh/3.0/libs/ardour/port.cc	2008-12-08 19:20:23.000000000 +0000
+++ track-rm/libs/ardour/port.cc	2008-12-19 23:39:15.000000000 +0000
@@ -34,6 +34,7 @@
 
 Port::~Port ()
 {
+	drop_references ();
 	disconnect_all ();
 }
 
@@ -59,6 +60,7 @@
 	result = _connections.insert (&other);
 
 	if (result.second) {
+		other.GoingAway.connect (sigc::bind (mem_fun (*this, &Port::port_going_away), &other));
 		return 0;
 	} else {
 		return 1;
@@ -131,6 +133,14 @@
 	return i;
 }
 
+void
+Port::port_going_away (Port* p)
+{
+	/* XXX: locking? */
+
+	disconnect (*p);
+}
+
 
 //-------------------------------------
 
@@ -377,3 +387,4 @@
 		_ext_port->reset ();
 	}
 }
+
