Index: kioslave/media/mediamanager/halbackend.cpp
===================================================================
--- kioslave/media/mediamanager/halbackend.cpp.orig	2011-05-31 13:41:55.000000000 +0200
+++ kioslave/media/mediamanager/halbackend.cpp	2011-05-31 13:42:48.317334543 +0200
@@ -1379,4 +1379,54 @@ QString HALBackend::unmount(const QStrin
     return QString();
 }
 
+bool HALBackend::teardown(const QString &_udi)
+{
+	const char* dm_udi = _udi.latin1();
+	const QString blockudi = libhal_device_get_property_QString(m_halContext, dm_udi, "volume.crypto_luks.clear.backing_volume");
+	if (!blockudi.isEmpty()) {
+		const char* udi = blockudi.latin1();
+		DBusMessage *dmesg, *reply;
+		DBusError error;
+		const char *options[2];
+
+		kdDebug() << "tearDown " << udi << "..." << endl;
+
+		dbus_error_init(&error);
+		DBusConnection *dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+		if (dbus_error_is_set(&error))
+		{
+			dbus_error_free(&error);
+			return false;
+		}
+
+		if (!(dmesg = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
+						"org.freedesktop.Hal.Device.Volume.Crypto",
+						"Teardown"))) {
+			kdDebug() << "teardown failed for " << udi << ": could not create dbus message\n";
+			return false;
+		}
+
+		dbus_error_init (&error);
+		if (!(reply = dbus_connection_send_with_reply_and_block (dbus_connection, dmesg, -1, &error)))
+		{
+			QString qerror;
+
+			kdDebug() << "teardown failed for " << udi << ": " << error.name << " " << error.message << endl;
+			qerror = QString("teardown failed for %1 because: %2").arg(udi).arg(error.name);
+			dbus_message_unref (dmesg);
+			dbus_error_free (&error);
+			return false;
+		}
+
+		kdDebug() << "teardown queued for " << udi << endl;
+
+		dbus_message_unref (dmesg);
+		dbus_message_unref (reply);
+       return true;
+	}
+
+	return false;
+}
+
+
 #include "halbackend.moc"
Index: kioslave/media/mediamanager/halbackend.h
===================================================================
--- kioslave/media/mediamanager/halbackend.h.orig	2011-05-31 13:39:05.000000000 +0200
+++ kioslave/media/mediamanager/halbackend.h	2011-05-31 13:42:48.317334543 +0200
@@ -85,6 +85,7 @@ public:
 	QString mount(const QString &id);
 	QString mount(const Medium *medium);
 	QString unmount(const QString &id);
+	bool teardown(const QString &_udi);
 
     static bool isHotplug( const QString & id );
 
Index: kioslave/media/mediamanager/mediamanager.cpp
===================================================================
--- kioslave/media/mediamanager/mediamanager.cpp.orig	2011-05-31 13:39:05.000000000 +0200
+++ kioslave/media/mediamanager/mediamanager.cpp	2011-05-31 13:43:07.916484054 +0200
@@ -232,6 +232,17 @@ QString MediaManager::unmount(const QStr
 #endif
 }
 
+bool MediaManager::teardown(const QString &name)
+{
+#ifdef COMPILE_HALBACKEND
+    if (!m_halbackend)
+        return false;
+    return m_halbackend->teardown(name);
+#else
+    return false;
+#endif
+}
+
 QString MediaManager::nameForLabel(const QString &label)
 {
     const QPtrList<Medium> media = m_mediaList.list();
Index: kioslave/media/mediamanager/mediamanager.h
===================================================================
--- kioslave/media/mediamanager/mediamanager.h.orig	2011-05-31 13:39:05.000000000 +0200
+++ kioslave/media/mediamanager/mediamanager.h	2011-05-31 13:42:48.318334448 +0200
@@ -47,6 +47,7 @@ k_dcop:
 
 	QString mount(const QString &uid);
 	QString unmount(const QString &uid);
+	bool teardown(const QString &uid); 
 
 	QString nameForLabel(const QString &label);
 	ASYNC setUserLabel(const QString &name, const QString &label);
Index: kioslave/media/mounthelper/kio_media_mounthelper.h
===================================================================
--- kioslave/media/mounthelper/kio_media_mounthelper.h.orig	2007-01-15 12:31:31.000000000 +0100
+++ kioslave/media/mounthelper/kio_media_mounthelper.h	2011-05-31 13:42:48.318334448 +0200
@@ -40,6 +40,8 @@ private:
 	QString m_errorStr;
 	QString m_device;
 	bool m_isCdrom;
+	bool isCryptMedia(QString);
+   bool teardown(QString);
 
 private slots:
 	void ejectFinished(KProcess* proc);
Index: kioslave/media/mounthelper/kio_media_mounthelper.cpp
===================================================================
--- kioslave/media/mounthelper/kio_media_mounthelper.cpp.orig	2007-05-14 09:55:40.000000000 +0200
+++ kioslave/media/mounthelper/kio_media_mounthelper.cpp	2011-05-31 13:42:48.319334353 +0200
@@ -27,6 +27,7 @@
 #include <dcopclient.h>
 #include <dcopref.h>
 #include <qtimer.h>
+#include <qregexp.h>
 #include <stdlib.h>
 #include <kdebug.h>
 #include <kglobal.h>
@@ -117,14 +118,17 @@ MountHelper::MountHelper() : KApplicatio
 			DCOPRef mediamanager("kded", "mediamanager");
 			DCOPReply reply = mediamanager.call( "unmount", medium.id());
 			if (reply.isValid())
-                            reply.get(m_errorStr);
-                        if (m_errorStr.isNull())
-                            invokeEject(device, true);
-                        else
-                            error();
+				reply.get(m_errorStr);
+			if (m_errorStr.isNull()) {
+				if (!teardown(medium.id()))
+					invokeEject(device, true);
+			} else
+				error();
 			m_device = device;
-		} else
-                    invokeEject(device, true);
+		} else {
+			if (!teardown(medium.id()))
+				invokeEject(device, true);
+		}
 	}
 	else
 	{
@@ -139,6 +143,19 @@ MountHelper::MountHelper() : KApplicatio
 	}
 }
 
+bool MountHelper::teardown(QString id)
+{
+	DCOPRef mediamanager("kded", "mediamanager");
+	DCOPReply reply = mediamanager.call( "teardown", id);
+	if (reply.isValid()) {
+	 	bool rep;
+	 	reply.get(rep);
+		kdDebug() << "reply from teardown: " << rep << endl;
+	    return rep;
+	}
+	    return false;
+}
+
 void MountHelper::invokeEject(const QString &device, bool quiet)
 {
 	KProcess *proc = new KProcess(this);