diff --git a/src/libcore/unstable/finally.rs b/src/libcore/unstable/finally.rs
index 4d2daa6f150..559287b5297 100644
--- a/src/libcore/unstable/finally.rs
+++ b/src/libcore/unstable/finally.rs
@@ -25,7 +25,7 @@ do || {
 
 use ops::Drop;
 
-#[cfg(test)] use task::failing;
+#[cfg(test)] use task::{failing, spawn};
 
 pub trait Finally<T> {
     fn finally(&self, dtor: &fn()) -> T;
@@ -41,6 +41,26 @@ impl<'self,T> Finally<T> for &'self fn() -> T {
     }
 }
 
+impl<T> Finally<T> for ~fn() -> T {
+    fn finally(&self, dtor: &fn()) -> T {
+        let _d = Finallyalizer {
+            dtor: dtor
+        };
+
+        (*self)()
+    }
+}
+
+impl<T> Finally<T> for @fn() -> T {
+    fn finally(&self, dtor: &fn()) -> T {
+        let _d = Finallyalizer {
+            dtor: dtor
+        };
+
+        (*self)()
+    }
+}
+
 struct Finallyalizer<'self> {
     dtor: &'self fn()
 }
@@ -96,3 +116,24 @@ fn test_compact() {
     do_some_fallible_work.finally(
         but_always_run_this_function);
 }
+
+#[test]
+fn test_owned() {
+    fn spawn_with_finalizer(f: ~fn()) {
+        do spawn { do f.finally { } }
+    }
+    let owned: ~fn() = || { };
+    spawn_with_finalizer(owned);
+}
+
+#[test]
+fn test_managed() {
+    let i = @mut 10;
+    let managed: @fn() -> int = || {
+        let r = *i;
+        *i += 10;
+        r
+    };
+    assert!(do managed.finally {} == 10);
+    assert!(*i == 20);
+}
\ No newline at end of file