Index: uspace/lib/cpp/include/__bits/thread/packaged_task.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/thread/packaged_task.hpp	(revision 72786f3865c321f768ecc1b80b5c08199f1db9b6)
+++ uspace/lib/cpp/include/__bits/thread/packaged_task.hpp	(revision 5ab9df434a5fdcf2d1cb3315c49a3fed7e5d0f52)
@@ -191,11 +191,11 @@
                 {
                     state_->set_value(invoke(func_, args...), false);
+                    aux::set_state_value_at_thread_exit(this->state_);
                 }
                 catch(const exception& __exception)
                 {
                     state_->set_exception(make_exception_ptr(__exception), false);
-                }
-
-                aux::set_state_value_at_thread_exit(state_);
+                    aux::set_state_exception_at_thread_exit(this->state_);
+                }
             }
 
Index: uspace/lib/cpp/include/__bits/thread/promise.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/thread/promise.hpp	(revision 72786f3865c321f768ecc1b80b5c08199f1db9b6)
+++ uspace/lib/cpp/include/__bits/thread/promise.hpp	(revision 5ab9df434a5fdcf2d1cb3315c49a3fed7e5d0f52)
@@ -225,6 +225,14 @@
                 }
 
-                this->state_->set_value(val, false);
-                aux::set_state_value_at_thread_exit(state_);
+                try
+                {
+                    state_->set_value(invoke(func_, args...), false);
+                    aux::set_state_value_at_thread_exit(this->state_);
+                }
+                catch(const exception& __exception)
+                {
+                    state_->set_exception(make_exception_ptr(__exception), false);
+                    aux::set_state_exception_at_thread_exit(this->state_);
+                }
             }
 
@@ -240,6 +248,14 @@
                 }
 
-                this->state_->set_value(forward<R>(val), false);
-                aux::set_state_value_at_thread_exit(state_);
+                try
+                {
+                    state_->set_value(invoke(func_, args...), false);
+                    aux::set_state_value_at_thread_exit(this->state_);
+                }
+                catch(const exception& __exception)
+                {
+                    state_->set_exception(make_exception_ptr(__exception), false);
+                    aux::set_state_exception_at_thread_exit(this->state_);
+                }
             }
     };
@@ -311,6 +327,14 @@
                 }
 
-                this->state_->set_value(&val, false);
-                aux::set_state_value_at_thread_exit(state_);
+                try
+                {
+                    state_->set_value(invoke(func_, args...), false);
+                    aux::set_state_value_at_thread_exit(this->state_);
+                }
+                catch(const exception& __exception)
+                {
+                    state_->set_exception(make_exception_ptr(__exception), false);
+                    aux::set_state_exception_at_thread_exit(this->state_);
+                }
             }
     };
