Index: uspace/lib/cpp/Makefile
===================================================================
--- uspace/lib/cpp/Makefile	(revision 13f75257b73358de4470159fa18afda4c08fa5cc)
+++ uspace/lib/cpp/Makefile	(revision 78a794ab8e3216c900fa3525cb107af206bb76da)
@@ -40,4 +40,5 @@
 	src/condition_variable.cpp \
 	src/exception.cpp \
+	src/iomanip.cpp \
 	src/ios.cpp \
 	src/iostream.cpp \
Index: uspace/lib/cpp/include/impl/iomanip.hpp
===================================================================
--- uspace/lib/cpp/include/impl/iomanip.hpp	(revision 13f75257b73358de4470159fa18afda4c08fa5cc)
+++ uspace/lib/cpp/include/impl/iomanip.hpp	(revision 78a794ab8e3216c900fa3525cb107af206bb76da)
@@ -30,7 +30,26 @@
 #define LIBCPP_IOMANIP
 
-#error "<iomanip> is not implemented"
+#include <internal/iomanip.hpp>
+#include <iosfwd>
 
-// TODO: implement
+namespace std
+{
+    /**
+     * 27.7.4, standard manipulators:
+     */
+
+    aux::manip_wrapper<aux::resetiosflags_t> resetiosflags(ios_base::fmtflags mask);
+    aux::manip_wrapper<aux::setiosflags_t> setiosflags(ios_base::fmtflags mask);
+    aux::manip_wrapper<aux::setbase_t> setbase(int base);
+
+    template<class Char>
+    aux::setfill_t<Char> setfill(Char c)
+    {
+        return aux::setfill_t<Char>{c};
+    }
+
+    aux::manip_wrapper<aux::setprecision_t> setprecision(int prec);
+    aux::manip_wrapper<aux::setw_t> setw(int width);
+}
 
 #endif
Index: uspace/lib/cpp/include/internal/iomanip.hpp
===================================================================
--- uspace/lib/cpp/include/internal/iomanip.hpp	(revision 78a794ab8e3216c900fa3525cb107af206bb76da)
+++ uspace/lib/cpp/include/internal/iomanip.hpp	(revision 78a794ab8e3216c900fa3525cb107af206bb76da)
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2018 Jaroslav Jindrak
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LIBCPP_INTERNAL_IOMANIP
+#define LIBCPP_INTERNAL_IOMANIP
+
+#include <ios>
+#include <utility>
+
+namespace std::aux
+{
+    /**
+     * Note: This allows us to lower the amount
+     *       of code duplication in this module
+     *       as we can avoid operator<</>> overloading
+     *       for the manipulators.
+     */
+    template<class Manipulator>
+    struct manip_wrapper
+    {
+        template<class... Args>
+        manip_wrapper(Args&&... args)
+            : manipulator{forward<Args>(args)...}
+        { /* DUMMY BODY */ }
+
+        void operator()(ios_base& str)
+        {
+            manipulator(str);
+        }
+
+        Manipulator manipulator;
+    };
+    template<class Char, class Traits, class Manipulator>
+    basic_ostream<Char, Traits>& operator<<(
+        basic_ostream<Char, Traits>& os, manip_wrapper<Manipulator> manip
+    )
+    {
+        manip(os);
+
+        return os;
+    }
+
+    template<class Char, class Traits, class Manipulator>
+    basic_istream<Char, Traits>& operator>>(
+        basic_istream<Char, Traits>& is, manip_wrapper<Manipulator> manip
+    )
+    {
+        manip(is);
+
+        return is;
+    }
+
+    struct resetiosflags_t
+    {
+        resetiosflags_t(ios_base::fmtflags m);
+
+        void operator()(ios_base& str) const;
+
+        ios_base::fmtflags mask;
+    };
+
+    struct setiosflags_t
+    {
+        setiosflags_t(ios_base::fmtflags m);
+
+        void operator()(ios_base& str) const;
+
+        ios_base::fmtflags mask;
+    };
+
+    struct setbase_t
+    {
+        setbase_t(int b);
+
+        void operator()(ios_base& str) const;
+
+        int base;
+    };
+
+    /**
+     * Note: setfill is only for basic_ostream so
+     *       this is the only case where we overload
+     *       the appropriate operator again.
+     */
+    template<class Char>
+    struct setfill_t
+    {
+        setfill_t(Char c)
+            : fill{c}
+        { /* DUMMY BODY */ }
+
+        template<class Traits>
+        void operator()(basic_ios<Char, Traits>& str) const
+        {
+            str.fill(fill);
+        }
+
+        Char fill;
+    };
+
+    template<class Char, class Traits>
+    basic_ostream<Char, Traits>& operator<<(
+        basic_ostream<Char, Traits>& is,
+        setfill_t<Char> manip
+    )
+    {
+        manip(is);
+
+        return is;
+    }
+
+    struct setprecision_t
+    {
+        setprecision_t(int);
+
+        void operator()(ios_base&) const;
+
+        int prec;
+    };
+
+    struct setw_t
+    {
+        setw_t(int);
+
+        void operator()(ios_base&) const;
+
+        int width;
+    };
+}
+
+#endif
Index: uspace/lib/cpp/src/iomanip.cpp
===================================================================
--- uspace/lib/cpp/src/iomanip.cpp	(revision 78a794ab8e3216c900fa3525cb107af206bb76da)
+++ uspace/lib/cpp/src/iomanip.cpp	(revision 78a794ab8e3216c900fa3525cb107af206bb76da)
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2018 Jaroslav Jindrak
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <internal/iomanip.hpp>
+#include <iomanip>
+
+namespace std
+{
+    namespace aux
+    {
+        /**
+         * Manipulator return types:
+         */
+
+        resetiosflags_t::resetiosflags_t(ios_base::fmtflags m)
+            : mask{m}
+        { /* DUMMY BODY */ }
+
+        void resetiosflags_t::operator()(ios_base& str) const
+        {
+            str.setf(ios_base::fmtflags{0}, mask);
+        }
+
+        setiosflags_t::setiosflags_t(ios_base::fmtflags m)
+            : mask{m}
+        { /* DUMMY BODY */ }
+
+        void setiosflags_t::operator()(ios_base& str) const
+        {
+            str.setf(mask);
+        }
+
+        setbase_t::setbase_t(int b)
+            : base{b}
+        { /* DUMMY BODY */ }
+
+        void setbase_t::operator()(ios_base& str) const
+        {
+            str.setf(
+                base == 8  ? ios_base::oct :
+                base == 10 ? ios_base::dec :
+                base == 16 ? ios_base::hex :
+                ios_base::fmtflags{0},
+                ios_base::basefield
+            );
+        }
+
+        setprecision_t::setprecision_t(int p)
+            : prec{p}
+        { /* DUMMY BODY */ }
+
+        void setprecision_t::operator()(ios_base& str) const
+        {
+            str.precision(prec);
+        }
+
+        setw_t::setw_t(int w)
+            : width{w}
+        { /* DUMMY BODY */ }
+
+        void setw_t::operator()(ios_base& str) const
+        {
+            str.width(width);
+        }
+    }
+
+    /**
+     * Manipulators:
+     */
+
+    aux::manip_wrapper<aux::resetiosflags_t> resetiosflags(ios_base::fmtflags mask)
+    {
+        return aux::manip_wrapper<aux::resetiosflags_t>{mask};
+    }
+
+    aux::manip_wrapper<aux::setiosflags_t> setiosflags(ios_base::fmtflags mask)
+    {
+        return aux::manip_wrapper<aux::setiosflags_t>{mask};
+    }
+
+    aux::manip_wrapper<aux::setbase_t> setbase(int base)
+    {
+        return aux::manip_wrapper<aux::setbase_t>{base};
+    }
+
+    aux::manip_wrapper<aux::setprecision_t> setprecision(int prec)
+    {
+        return aux::manip_wrapper<aux::setprecision_t>{prec};
+    }
+
+    aux::manip_wrapper<aux::setw_t> setw(int width)
+    {
+        return aux::manip_wrapper<aux::setw_t>{width};
+    }
+}
