diff --git a/lib/wplua/value.c b/lib/wplua/value.c
index c4ed5fc274766624a7461e1fa6f8fbd6fbed0d55..85af2ec4da09dda69d46eeef8bfb4ba1bb9f945d 100644
--- a/lib/wplua/value.c
+++ b/lib/wplua/value.c
@@ -134,7 +134,7 @@ wplua_gvariant_to_lua (lua_State *L, GVariant  *variant)
       lua_settable (L, -3);
     }
   }
-  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("a?"))) {
+  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_ARRAY)) {
     gsize n_children, i;
     n_children = g_variant_n_children (variant);
     lua_createtable (L, n_children, 0);
@@ -142,7 +142,7 @@ wplua_gvariant_to_lua (lua_State *L, GVariant  *variant)
       g_autoptr (GVariant) value;
       value = g_variant_get_child_value (variant, i);
       wplua_gvariant_to_lua (L, value);
-      lua_seti (L, -2, i);
+      lua_seti (L, -2, i + 1);
     }
   }
   else {
diff --git a/tests/wplua/wplua.c b/tests/wplua/wplua.c
index b784f7371e613b0a5b04cfd5019286fc31ed1f2f..e83586a3c186132b674d77fec8fd2dfef8af5a58 100644
--- a/tests/wplua/wplua.c
+++ b/tests/wplua/wplua.c
@@ -558,6 +558,58 @@ test_wplua_convert_asv ()
   wplua_free (L);
 }
 
+static void
+test_wplua_convert_gvariant_array ()
+{
+  g_autoptr (GError) error = NULL;
+  lua_State *L = wplua_new ();
+
+  g_autoptr (GVariant) v = g_variant_new_parsed ("@av [ "
+      "<42>, <3.14>, <'foobar'>, <true>, "
+      "<@a{sv} { 'string': <'baz'> }> ]");
+  wplua_gvariant_to_lua (L, v);
+  lua_setglobal (L, "o");
+
+  const gchar code2[] =
+    "assert (o[1] == 42)\n"
+    "assert (math.abs (o[2] - 3.14) < 0.0000000001)\n"
+    "assert (o[3] == 'foobar')\n"
+    "assert (o[4] == true)\n"
+    "assert (o[5]['string'] == 'baz')\n";
+  wplua_load_buffer (L, code2, sizeof (code2) - 1, 0, 0, &error);
+  g_assert_no_error (error);
+
+  lua_getglobal (L, "o");
+  g_autoptr (GVariant) fromlua = wplua_lua_to_gvariant (L, -1);
+
+  gint64 test_int = 0;
+  g_assert_true (g_variant_lookup (fromlua, "1", "x", &test_int));
+  g_assert_cmpint (test_int, ==, 42);
+
+  gdouble test_double = 0;
+  g_assert_true (g_variant_lookup (fromlua, "2", "d", &test_double));
+  g_assert_cmpfloat_with_epsilon (test_double, 3.14, 0.0000000001);
+
+  const gchar *test_str = NULL;
+  g_assert_true (g_variant_lookup (fromlua, "3", "&s", &test_str));
+  g_assert_cmpstr (test_str, ==, "foobar");
+
+  gboolean test_boolean = FALSE;
+  g_assert_true (g_variant_lookup (fromlua, "4", "b", &test_boolean));
+  g_assert_true (test_boolean);
+
+  g_autoptr (GVariant) nested = NULL;
+  g_assert_true (g_variant_lookup (fromlua, "5", "@a{sv}", &nested));
+  g_assert_nonnull (nested);
+  g_assert_true (g_variant_is_of_type (nested, G_VARIANT_TYPE_VARDICT));
+
+  test_str = NULL;
+  g_assert_true (g_variant_lookup (nested, "string", "&s", &test_str));
+  g_assert_cmpstr (test_str, ==, "baz");
+
+  wplua_free (L);
+}
+
 static void
 test_wplua_script_arguments ()
 {
@@ -606,6 +658,8 @@ main (gint argc, gchar *argv[])
   g_test_add_func ("/wplua/sandbox/script", test_wplua_sandbox_script);
   g_test_add_func ("/wplua/sandbox/config", test_wplua_sandbox_config);
   g_test_add_func ("/wplua/convert/asv", test_wplua_convert_asv);
+  g_test_add_func ("/wplua/convert/gvariant_array",
+      test_wplua_convert_gvariant_array);
   g_test_add_func ("/wplua/script_arguments", test_wplua_script_arguments);
 
   return g_test_run ();