Index: uspace/lib/cpp/include/__bits/thread/packaged_task.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/thread/packaged_task.hpp	(revision d3ba97d6e61083813fb07c4f7839ef6fa7cbc03c)
+++ uspace/lib/cpp/include/__bits/thread/packaged_task.hpp	(revision 72786f3865c321f768ecc1b80b5c08199f1db9b6)
@@ -179,5 +179,23 @@
             void make_ready_at_thread_exit(Args...)
             {
-                // TODO: implement
+                if (!state_)
+                    throw future_error{make_error_code(future_errc::no_state)};
+                if (state_->is_set())
+                {
+                    throw future_error{
+                        make_error_code(future_errc::promise_already_satisfied)
+                    };
+                }
+
+                try
+                {
+                    state_->set_value(invoke(func_, args...), false);
+                }
+                catch(const exception& __exception)
+                {
+                    state_->set_exception(make_exception_ptr(__exception), false);
+                }
+
+                aux::set_state_value_at_thread_exit(state_);
             }
 
Index: uspace/lib/cpp/include/__bits/thread/promise.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/thread/promise.hpp	(revision d3ba97d6e61083813fb07c4f7839ef6fa7cbc03c)
+++ uspace/lib/cpp/include/__bits/thread/promise.hpp	(revision 72786f3865c321f768ecc1b80b5c08199f1db9b6)
@@ -106,5 +106,5 @@
 
                     state_->set_exception_ptr(ptr, false);
-                    // TODO: Mark it as 'has_exception' when thread terminates.
+                    aux::set_state_exception_at_thread_exit(state_);
                 }
 
@@ -226,5 +226,5 @@
 
                 this->state_->set_value(val, false);
-                // TODO: schedule it to be set as ready when thread exits
+                aux::set_state_value_at_thread_exit(state_);
             }
 
@@ -241,5 +241,5 @@
 
                 this->state_->set_value(forward<R>(val), false);
-                // TODO: schedule it to be set as ready when thread exits
+                aux::set_state_value_at_thread_exit(state_);
             }
     };
@@ -312,5 +312,5 @@
 
                 this->state_->set_value(&val, false);
-                // TODO: schedule it to be set as ready when thread exits
+                aux::set_state_value_at_thread_exit(state_);
             }
     };
Index: uspace/lib/cpp/include/__bits/thread/shared_state.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/thread/shared_state.hpp	(revision d3ba97d6e61083813fb07c4f7839ef6fa7cbc03c)
+++ uspace/lib/cpp/include/__bits/thread/shared_state.hpp	(revision 72786f3865c321f768ecc1b80b5c08199f1db9b6)
@@ -371,4 +371,26 @@
             }
     };
+
+    /**
+     * Note: The following two functions should:
+     *   1) Increment refcount.
+     *   2) Store ptr to a vector of shared_state_base ptrs
+     *      (as those have ::mark_set member functions).
+     *   3) If not done already, register a function
+     *      executing all these in the thread_atexit function
+     *      once that is implemented.
+     */
+
+    template<class R>
+    void set_state_value_at_thread_exit(shared_state<R>* state)
+    {
+        // TODO: implement
+    }
+
+    template<class R>
+    void set_state_exception_at_thread_exit(shared_state<R>* state)
+    {
+        // TODO: implement
+    }
 }
 
