diff --git a/data/fonts/Font-Awesome-5-Regular.otf b/data/fonts/Font-Awesome-5-Regular.otf
new file mode 100644
index 0000000000000000000000000000000000000000..6ed924bb5aa6a694a024f02ebc0333d4c60c661b
Binary files /dev/null and b/data/fonts/Font-Awesome-5-Regular.otf differ
diff --git a/data/fonts/Font-Awesome-5-Solid.otf b/data/fonts/Font-Awesome-5-Solid.otf
new file mode 100644
index 0000000000000000000000000000000000000000..1916c44949b404c10c041ca67a484856134e44a2
Binary files /dev/null and b/data/fonts/Font-Awesome-5-Solid.otf differ
diff --git a/data/fonts/Roboto-Bold.ttf b/data/fonts/Roboto-Bold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..d3f01ad245b628f386ac95786f53167038720eb2
Binary files /dev/null and b/data/fonts/Roboto-Bold.ttf differ
diff --git a/data/fonts/Roboto-Regular.ttf b/data/fonts/Roboto-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..2c97eeadffe1a34bd67d3ff1c3887fd53e22c2ca
Binary files /dev/null and b/data/fonts/Roboto-Regular.ttf differ
diff --git a/extern/glow-extras b/extern/glow-extras
index 9375016f32691bd4f268339e98607ec4d3331991..a8e6e907d1ba5fbcb8c9bea476b271cff86f5cbc 160000
--- a/extern/glow-extras
+++ b/extern/glow-extras
@@ -1 +1 @@
-Subproject commit 9375016f32691bd4f268339e98607ec4d3331991
+Subproject commit a8e6e907d1ba5fbcb8c9bea476b271cff86f5cbc
diff --git a/samples/wip/vector-2D/Vector2DSample.cc b/samples/wip/vector-2D/Vector2DSample.cc
index 1f415ee15aeea6dbb0692880b9cfd8af216ae513..6c3bdb45785321e8c71dbf0ac9e59c9748d738ad 100644
--- a/samples/wip/vector-2D/Vector2DSample.cc
+++ b/samples/wip/vector-2D/Vector2DSample.cc
@@ -1,17 +1,28 @@
 #include "Vector2DSample.hh"
 
 #include <glow/common/scoped_gl.hh>
+#include <glow/common/str_utils.hh>
 
+#include <glow-extras/vector/debug.hh>
 #include <glow-extras/vector/graphics2D.hh>
 
 #include <typed-geometry/tg.hh>
 
+static std::string const sDataPath = glow::util::pathOf(__FILE__) + "/../../../data/";
+
 void Vector2DSample::init()
 {
     setGui(GlfwApp::Gui::ImGui);
     GlfwApp::init(); // call to base!
 
-    // TODO
+    // load fonts
+    mVectorRenderer.loadFontFromFile("sans", sDataPath + "fonts/Roboto-Regular.ttf");
+    mVectorRenderer.loadFontFromFile("sans-bold", sDataPath + "fonts/Roboto-Bold.ttf");
+
+    mVectorRenderer.loadFontFromFile("fa", sDataPath + "fonts/Font-Awesome-5-Solid.otf");
+    mVectorRenderer.loadFontFromFile("fa-regular", sDataPath + "fonts/Font-Awesome-5-Regular.otf");
+
+    mVectorRenderer.addFallbackFont("sans", "fa"); // if not found in sans, use fa
 }
 
 void Vector2DSample::render(float elapsedSeconds)
@@ -37,6 +48,16 @@ void Vector2DSample::render(float elapsedSeconds)
         ll.set_stroke_width(3);
         ll.stroke();
 
+        ll.set_fill_color(0, 0, 0, 1);
+        ll.set_font_face("sans");
+        ll.set_font_size(20.f);
+        ll.text(10, 250, "Hello World!");
+
+        ll.set_font_face("fa");
+        ll.text(10, 200, u8"\uf080 \uf126 \uf382 \uf6d5");
+        ll.set_font_face("sans");
+        ll.text(10, 225, u8"Hello World! \uf080");
+
         mVectorRenderer.render(img, getWindowWidth(), getWindowHeight());
     }
 
@@ -110,6 +131,22 @@ void Vector2DSample::render(float elapsedSeconds)
                    glow::vector::paint2D::box_gradient({{x - 25, y - 15}, {x + 25, y + 15}}, 5, 8, tg::color4::red, tg::color4::blue));
             g.draw(tg::aabb2({x - 40, y - 30}, {x + 40, y + 30}), {0, 0, 0});
             next();
+
+            // text
+            g.text({x, y}, "I am Text.", "sans");
+            next();
+
+            g.text({x, y}, "I am Centered.", {"sans", 14, glow::vector::text_align::middle_center});
+            next();
+
+            g.text_box({x, y}, 100, "I is automatically wrapped around.", {"sans", 18, glow::vector::text_align::middle_center});
+            next();
+
+            g.text_box({x, y}, 100, "I has\nnew lines\nin me.", {"sans", 18, glow::vector::text_align::middle_center});
+            next();
+
+            g.text_box({x, y}, 100, u8"\uf080 \uf126 \uf382 \uf6d5", {"fa", 28, glow::vector::text_align::middle_center});
+            next();
         }
 
         // TODO: more