diff --git a/extern/glow-extras b/extern/glow-extras
index 4b01559cc666838552b11990693b9150bdcbdda8..c1cffa010f80ab1327996c2bbe6f8bb748fae438 160000
--- a/extern/glow-extras
+++ b/extern/glow-extras
@@ -1 +1 @@
-Subproject commit 4b01559cc666838552b11990693b9150bdcbdda8
+Subproject commit c1cffa010f80ab1327996c2bbe6f8bb748fae438
diff --git a/samples/basic/viewer/main.cc b/samples/basic/viewer/main.cc
index a93b2e5f08ff4c4e92bf5c2a882e39f2669d217f..957e5865548ffcb41397cc95f467cf94aa4fdebc 100644
--- a/samples/basic/viewer/main.cc
+++ b/samples/basic/viewer/main.cc
@@ -31,16 +31,16 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
 {
     {
         // In this case a Picker is defined for the Renderable (Picking Texture filled) but no callback will be executed.
-        gv::view(pos, col, gv::pick(), "Picker defined without callback");
+        gv::view(pos, col, gv::Picker::pick(), "Picker defined without callback");
     }
 
     {
         // Only on_left_click callback defined
-        gv::view(pos, col, gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result {
+        gv::view(pos, col, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result {
             std::cout << "Something has been picked! ON_LEFT_CLICK"
-                      << "ID: " << face_id.id << std::endl;
-            std::cout << "World_Position" << world_pos << std::endl;
-            std::cout << "Normal" << normal << std::endl;
+                      << "ID: " << (int)face_id << std::endl;
+            std::cout << "World_Position " << world_pos << std::endl;
+            std::cout << "Normal " << normal << std::endl;
             picking_result res;
             res.picking_color = tg::color3::cyan;
             return res;
@@ -50,9 +50,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
 
     {
         // Only on_left_click callback defined - LineRenderable - uncolored
-        gv::view(gv::lines(pos), gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+        gv::view(gv::lines(pos), gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
             std::cout << "Something has been picked! ON_LEFT_CLICK"
-                      << "ID: " << face_id.id << std::endl;
+                      << "ID: " << int(face_id) << std::endl;
             std::cout << "World_Position" << world_pos << std::endl;
             std::cout << "Normal" << normal << std::endl;
         }),
@@ -73,13 +73,13 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
         pos2.copy_from(pos);
 
         gv::interactive([&](auto) {
-            gv::view(pos2, col, gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+            gv::view(pos2, col, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
                 std::cout << "Something has been picked! ON_LEFT_CLICK"
-                          << "ID: " << int(face_id.f_id) << std::endl;
+                          << "ID: " << int(face_id) << std::endl;
                 std::cout << "World_Position" << world_pos << std::endl;
                 std::cout << "Normal" << normal << std::endl;
 
-                face_index_i = face_id.f_id;
+                face_index_i = face_id;
                 world_pos_i = world_pos;
                 normal_i = normal;
             }),
@@ -110,7 +110,6 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
 
     {
         /* Picking in interactive mode with ImGui example. Does only work for MeshRenderable in the given configuration because face_indices are not included in Point- or LineRenderables.*/
-
         pm::vertex_index vertex_index_i;
         uint32_t vertex_id_i;
         tg::pos3 world_pos_i;
@@ -127,18 +126,19 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
         // auto pos2 = copy._Get_rest()._Myfirst._Val;
 
         gv::interactive([&](auto) {
-            gv::view(gv::points(pos2), gv::pick().on_left_click([&vertex_index_i, &world_pos_i, &normal_i](pick_id vertex_id, tg::pos3 world_pos, tg::vec3 normal) {
-                std::cout << "Something has been picked! ON_LEFT_CLICK"
-                          << "ID: " << int(vertex_id.v_id) << std::endl;
-                std::cout << "World_Position" << world_pos << std::endl;
-                std::cout << "Normal" << normal << std::endl;
+            gv::view(gv::points(pos2),
+                     gv::Picker::pick().onLeftClick([&vertex_index_i, &world_pos_i, &normal_i](pm::vertex_index vertex_id, tg::pos3 world_pos, tg::vec3 normal) {
+                         std::cout << "Something has been picked! ON_LEFT_CLICK"
+                                   << "ID: " << int(vertex_id) << std::endl;
+                         std::cout << "World_Position" << world_pos << std::endl;
+                         std::cout << "Normal" << normal << std::endl;
 
-                vertex_index_i = vertex_id.v_id;
-                world_pos_i = world_pos;
-                normal_i = normal;
+                         vertex_index_i = vertex_id;
+                         world_pos_i = world_pos;
+                         normal_i = normal;
 
-                return;
-            }),
+                         return;
+                     }),
                      "picking interactive mode - PointRenderable");
 
             ImGui::Begin("Picking");
@@ -166,9 +166,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
 
     {
         // Only on_left_click callback defined - PointRenderable - uncolored
-        gv::view(gv::points(pos), gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+        gv::view(gv::points(pos), gv::Picker::pick().onLeftClick([&](pm::vertex_index vertex_id, tg::pos3 world_pos, tg::vec3 normal) {
             std::cout << "Something has been picked! ON_LEFT_CLICK"
-                      << "ID: " << face_id.id << std::endl;
+                      << "ID: " << int(vertex_id) << std::endl;
             std::cout << "World_Position" << world_pos << std::endl;
             std::cout << "Normal" << normal << std::endl;
             return;
@@ -179,9 +179,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
     {
         // Only on_left_click callback defined - PointRenderable - uncolored - square billboards - NOT WORKING APPROPRIATELY
         gv::view(gv::points(pos).point_size_world(0.03f).camera_facing().square(),
-                 gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+                 gv::Picker::pick().onLeftClick([&](pm::vertex_index vertex_id, tg::pos3 world_pos, tg::vec3 normal) {
                      std::cout << "Something has been picked! ON_LEFT_CLICK"
-                               << "ID: " << face_id.id << std::endl;
+                               << "ID: " << int(vertex_id) << std::endl;
                      std::cout << "World_Position" << world_pos << std::endl;
                      std::cout << "Normal" << normal << std::endl;
                      return;
@@ -191,9 +191,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
 
     {
         // Only on_right_click callback defined
-        gv::view(pos, col, gv::pick().on_right_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+        gv::view(pos, col, gv::Picker::pick().onRightClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
             std::cout << "Something has been picked! ON_RIGHT_CLICK"
-                      << "ID: " << face_id.id << std::endl;
+                      << "ID: " << int(face_id) << std::endl;
             return;
         }),
                  "picking MeshRenderable - callback on right click");
@@ -201,9 +201,9 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
 
     {
         // Only on_hover callback defined
-        gv::view(pos, col, gv::pick().on_hover([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+        gv::view(pos, col, gv::Picker::pick().onHover([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
             std::cout << "Something has been picked! ON_HOVER"
-                      << "ID: " << face_id.id << std::endl;
+                      << "ID: " << (int)face_id << std::endl;
             return;
         }),
                  "picking MeshRenderable - callback on hover");
@@ -212,20 +212,20 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
     {
         // On_hover, on_right_click, and on_left_click callbacks defined simultaneously
         gv::view(pos, col,
-                 gv::pick()
-                     .on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+                 gv::Picker::pick()
+                     .onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
                          std::cout << "Something has been picked! ON_LEFT_CLICK"
-                                   << "ID: " << face_id.id << std::endl;
+                                   << "ID: " << int(face_id) << std::endl;
                          return;
                      })
-                     .on_right_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+                     .onRightClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
                          std::cout << "Something has been picked! ON_RIGHT_CLICK"
-                                   << "ID: " << face_id.id << std::endl;
+                                   << "ID: " << int(face_id) << std::endl;
                          return;
                      })
-                     .on_hover([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+                     .onHover([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) {
                          std::cout << "Something has been picked! ON_HOVER"
-                                   << "ID: " << face_id.id << std::endl;
+                                   << "ID: " << int(face_id) << std::endl;
                          return;
                      }),
                  "picking MeshRenderable - multiple callbacks: on left click, on right click, on hover"
@@ -234,25 +234,60 @@ void simple_picking(pm::Mesh& m, pm::vertex_attribute<tg::pos3>& pos, pm::face_a
     }
 
     {
-        // User defined IDs check
-        auto id_f = pm::face_attribute<int>(pos.mesh());
-        int32_t id = 0;
-        std::vector<pick_id> ids;
-
-        for (auto f : pos.mesh().faces())
+        // User-defined Picking IDs - MeshRenderable
+        pm::face_attribute<int32_t> fa = pm::face_attribute<int32_t>(m);
+        int i = 0;
+        for (auto f : m.faces())
         {
-            pick_id pid;
-            pid.id = id;
-            ids.push_back(pid);
-            id++;
+            fa[f] = 1000 + i;
+            i++;
         }
-
-        gv::view(pos, col, ids, gv::pick().on_left_click([&](pick_id face_id, tg::pos3 world_pos, tg::vec3 normal) {
+        gv::view(pos, col, gv::Picker::pick(fa).onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result {
             std::cout << "Something has been picked! ON_LEFT_CLICK"
-                      << "ID: " << face_id.id << std::endl;
-            return;
+                      << "ID: " << (int)face_id << std::endl;
+            std::cout << "World_Position" << world_pos << std::endl;
+            std::cout << "Normal" << normal << std::endl;
+            picking_result res;
+            res.picking_color = tg::color3::cyan;
+            return res;
         }),
-                 "picking MeshRenderable - user defined primitive IDs");
+                 "simple picking: callback on left click - user-defined IDs");
+    }
+
+    {
+        auto v = gv::view(pos, "Multiple renderables");
+
+        // Check multiple Renderables.
+        gv::view(pos, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result {
+            std::cout << "Something has been picked! PICKER 1 "
+                      << "ID: " << (int)face_id << std::endl;
+            std::cout << "World_Position" << world_pos << std::endl;
+            std::cout << "Normal" << normal << std::endl;
+            picking_result res;
+            res.picking_color = tg::color3::cyan;
+            return res;
+        }));
+
+        pm::Mesh m2;
+        m2.copy_from(m);
+
+        pm::vertex_attribute<tg::pos3> pos2(m2);
+        pos2.copy_from(pos);
+
+        for (auto p : m2.vertices())
+        {
+            pos2[p] = pos2[p] + tg::vec3(2, 2, 2);
+        }
+
+        gv::view(pos2, gv::Picker::pick().onLeftClick([&](pm::face_index face_id, tg::pos3 world_pos, tg::vec3 normal) -> picking_result {
+            std::cout << "Something has been picked! PICKER 2 "
+                      << "ID: " << (int)face_id << std::endl;
+            std::cout << "World_Position" << world_pos << std::endl;
+            std::cout << "Normal" << normal << std::endl;
+            picking_result res;
+            res.picking_color = tg::color3::cyan;
+            return res;
+        }));
     }
 }