Index: uspace/lib/cpp/include/__bits/thread/future.hpp
===================================================================
--- uspace/lib/cpp/include/__bits/thread/future.hpp	(revision 0f43be54a81e8b4daef0368d9b12560336d1ef42)
+++ uspace/lib/cpp/include/__bits/thread/future.hpp	(revision 0d299c931cd7cf49fef4a6c23392d667408330fb)
@@ -43,4 +43,11 @@
     namespace aux
     {
+        /**
+         * Note: Because of shared_future, this base class
+         *       does implement copy constructor and copy
+         *       assignment operator. This means that the
+         *       children (std::future) need to delete this
+         *       constructor and operator themselves.
+         */
         template<class R>
         class future_base
@@ -51,5 +58,9 @@
                 { /* DUMMY BODY */ }
 
-                future_base(const future_base&) = delete;
+                future_base(const future_base& rhs)
+                    : state_{rhs.state_}
+                {
+                    state_->increment();
+                }
 
                 future_base(future_base&& rhs) noexcept
@@ -75,5 +86,13 @@
                 }
 
-                future_base& operator=(const future_base&) = delete;
+                future_base& operator=(const future_base& rhs)
+                {
+                    release_state_();
+                    state_ = rhs.state_;
+
+                    state_->increment();
+
+                    return *this;
+                }
 
                 future_base& operator=(future_base&& rhs) noexcept
@@ -154,4 +173,6 @@
     class future: public aux::future_base<R>
     {
+        friend class shared_future<R>;
+
         public:
             future() noexcept
@@ -175,5 +196,5 @@
             shared_future<R> share()
             {
-                return shared_future<R>(move(*this));
+                return shared_future<R>{move(*this)};
             }
 
@@ -194,4 +215,6 @@
     class future<R&>: public aux::future_base<R*>
     {
+        friend class shared_future<R&>;
+
         public:
             future() noexcept
@@ -215,5 +238,5 @@
             shared_future<R&> share()
             {
-                return shared_future<R&>(move(*this));
+                return shared_future<R&>{move(*this)};
             }
 
@@ -235,4 +258,6 @@
     class future<void>: public aux::future_base<void>
     {
+        friend class shared_future<void>;
+
         public:
             future() noexcept
@@ -254,8 +279,10 @@
             future& operator=(future&& rhs) noexcept = default;
 
-            /* shared_future<void> share() */
-            /* { */
-            /*     return shared_future<void>(move(*this)); */
-            /* } */
+            /**
+             * Note: This is just forward declaration, implementation
+             *       provided in shared_future.hpp to avoid problems
+             *       with incomplete types.
+             */
+            shared_future<void> share();
 
             void get()
