diff --git a/meson.build b/meson.build
index 7df0932a100305180ca86283d69d6081137b512f..99574da82dc8cdc746a639f385f35f973e8fcff9 100644
--- a/meson.build
+++ b/meson.build
@@ -11,7 +11,7 @@ datadir = get_option('datadir')
 
 gnome = import('gnome')
 
-gio_dep = dependency('gio-2.0', version: '>= 2.44')
+gio_dep = dependency('gio-2.0', version: '>= 2.46')
 gtk_dep = dependency('gtk4', version: '>= 4.0')
 
 conf = configuration_data()
@@ -28,8 +28,8 @@ config_h = declare_dependency(
 )
 
 cflags = []
-cflags += ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_44',
-           '-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_44']
+cflags += ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_46',
+           '-DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_46']
 cflags += ['-DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_0',
            '-DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_0']
 
diff --git a/src/rugby-list-store.c b/src/rugby-list-store.c
index 9e2533e7a18bb127b5c238e861a3e83d00ba6b00..bb4fae3ba3a8dcbb50c072413677ce8537b7f42e 100644
--- a/src/rugby-list-store.c
+++ b/src/rugby-list-store.c
@@ -14,10 +14,10 @@ struct _RugbyListStore
 {
     GObject parent_instance;
 
-    GSettings *settings;
-
-    GPtrArray *items;
     int score;
+
+    GListStore *items;
+    GSettings *settings;
 };
 
 static void rugby_list_store_list_model_iface_init (GListModelInterface *iface);
@@ -28,8 +28,7 @@ G_DEFINE_TYPE_WITH_CODE (RugbyListStore, rugby_list_store, G_TYPE_OBJECT,
 
 enum
 {
-    PROP_0,
-    PROP_SCORE,
+    PROP_SCORE = 1,
     N_PROPS
 };
 
@@ -38,17 +37,18 @@ static GParamSpec *properties[N_PROPS];
 // Helper functions
 
 static int
-sort_func (gconstpointer a,
-           gconstpointer b)
+sort_func (              gconstpointer a,
+                         gconstpointer b,
+           G_GNUC_UNUSED gpointer      user_data)
 {
     int atries, autries;
     int btries, butries;
 
-    g_object_get (*((gpointer *) a),
+    g_object_get ((gpointer) a,
                   "tries", &atries,
                   "utries", &autries,
                   NULL);
-    g_object_get (*((gpointer *) b),
+    g_object_get ((gpointer) b,
                   "tries", &btries,
                   "utries", &butries,
                   NULL);
@@ -69,12 +69,12 @@ process_data (RugbyListStore *self)
     int utry_points = g_settings_get_int (self->settings, "utry-points");
     int kick_points = g_settings_get_int (self->settings, "kick-points");
 
+    unsigned old_length = g_list_model_get_n_items (G_LIST_MODEL (self->items));
+    g_list_store_remove_all (self->items);
+
     int max_tries = self->score / try_points;
     int max_utries = self->score / utry_points;
 
-    unsigned old_length = self->items->len;
-    g_ptr_array_remove_range (self->items, 0, self->items->len);
-
     for (int tries = 0; tries <= max_tries; tries++)
     {
         for (int utries = 0; utries <= max_utries; utries++)
@@ -91,24 +91,20 @@ process_data (RugbyListStore *self)
                 RugbyPossibility *possibility = rugby_possibility_new (tries,
                                                                        utries,
                                                                        kicks);
-                g_ptr_array_add (self->items, possibility);
+                g_list_store_append (self->items, possibility);
+                g_object_unref (possibility);
             }
         }
     }
 
-    g_ptr_array_sort (self->items, sort_func);
-    g_list_model_items_changed (G_LIST_MODEL (self), 0, old_length, self->items->len);
-}
-
-static void
-on_score_changed (RugbyListStore *self)
-{
-    process_data (self);
+    g_list_store_sort (self->items, sort_func, NULL);
+    g_list_model_items_changed (G_LIST_MODEL (self), 0, old_length,
+                                g_list_model_get_n_items (G_LIST_MODEL (self->items)));
 }
 
 static void
-on_settings_changed (GSettings G_GNUC_UNUSED *settings,
-                     char      G_GNUC_UNUSED *key,
+on_settings_changed (G_GNUC_UNUSED GSettings *settings,
+                     G_GNUC_UNUSED char      *key,
                      gpointer                 user_data)
 {
     process_data (RUGBY_LIST_STORE (user_data));
@@ -127,7 +123,7 @@ rugby_list_store_get_n_items (GListModel *list)
 {
     RugbyListStore *self = RUGBY_LIST_STORE (list);
 
-    return self->items->len;
+    return g_list_model_get_n_items (G_LIST_MODEL (self->items));
 }
 
 static gpointer
@@ -136,9 +132,7 @@ rugby_list_store_get_item (GListModel *list,
 {
     RugbyListStore *self = RUGBY_LIST_STORE (list);
 
-    g_assert (position < self->items->len);
-
-    return g_object_ref (g_ptr_array_index (self->items, position));
+    return g_list_model_get_item (G_LIST_MODEL (self->items), position);
 }
 
 static void
@@ -157,20 +151,11 @@ rugby_list_store_dispose (GObject *object)
     RugbyListStore *self = RUGBY_LIST_STORE (object);
 
     g_clear_object (&self->settings);
+    g_clear_object (&self->items);
 
     G_OBJECT_CLASS (rugby_list_store_parent_class)->dispose (object);
 }
 
-static void
-rugby_list_store_finalize (GObject *object)
-{
-    RugbyListStore *self = RUGBY_LIST_STORE (object);
-
-    g_ptr_array_unref (self->items);
-
-    G_OBJECT_CLASS (rugby_list_store_parent_class)->finalize (object);
-}
-
 static void
 rugby_list_store_get_property (GObject    *object,
                                unsigned    prop_id,
@@ -213,7 +198,6 @@ rugby_list_store_class_init (RugbyListStoreClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
     object_class->dispose = rugby_list_store_dispose;
-    object_class->finalize = rugby_list_store_finalize;
     object_class->get_property = rugby_list_store_get_property;
     object_class->set_property = rugby_list_store_set_property;
 
@@ -234,7 +218,7 @@ rugby_list_store_init (RugbyListStore *self)
                       G_CALLBACK (on_settings_changed), self);
 
     self->score = 0;
-    self->items = g_ptr_array_new_with_free_func (g_object_unref);
+    self->items = g_list_store_new (RUGBY_TYPE_POSSIBILITY);
 }
 
 // Public functions
@@ -256,7 +240,7 @@ rugby_list_store_set_score (RugbyListStore *self,
     if (score != self->score)
     {
         self->score = score;
-        on_score_changed (self);
+        process_data (self);
         g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SCORE]);
     }
 }