diff --git a/gnu/local.mk b/gnu/local.mk
index 250901f6d9..b35fd0af31 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1592,7 +1592,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/rtags-separate-rct.patch			\
   %D%/packages/patches/racket-store-checksum-override.patch	\
   %D%/packages/patches/remake-impure-dirs.patch			\
-  %D%/packages/patches/retroarch-disable-online-updater.patch	\
+  %D%/packages/patches/retroarch-RARCH_LIBRETRO_DIRECTORY.patch	\
   %D%/packages/patches/rnp-add-version.cmake.patch		\
   %D%/packages/patches/rnp-disable-ruby-rnp-tests.patch		\
   %D%/packages/patches/rnp-unbundle-googletest.patch		\
diff --git a/gnu/packages/emulators.scm b/gnu/packages/emulators.scm
index eca003f738..6c28b9d9d2 100644
--- a/gnu/packages/emulators.scm
+++ b/gnu/packages/emulators.scm
@@ -1274,7 +1274,7 @@ as RetroArch.")
 (define-public retroarch
   (package
     (name "retroarch")
-    (version "1.8.1")
+    (version "1.9.0")
     (source
      (origin
        (method git-fetch)
@@ -1283,18 +1283,9 @@ as RetroArch.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0y7rcpz7psf8k3agsrq277jdm651vbnn9xpqvmj2in1a786idya7"))
+        (base32 "1n0dcv85vqrdr79psnf009hi4r2mvsgsjbghrrc9pm5g7ywwwcvp"))
        (patches
-        (search-patches "retroarch-disable-online-updater.patch"))
-       (modules '((guix build utils)))
-       (snippet
-        '(begin
-           ;; Don't suggest using the Online Updater if available: it never
-           ;; is.  This disables translation of this particular message.
-           (substitute* (find-files "menu/drivers" "\\.c$")
-             (("msg_hash_to_str\\(MSG_MISSING_ASSETS\\)")
-              "\"Warning: Missing assets, go get some\""))
-           #t))))
+        (search-patches "retroarch-RARCH_LIBRETRO_DIRECTORY.patch"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
@@ -1329,7 +1320,9 @@ as RetroArch.")
                        '("--enable-neon" "--enable-floathard")
                        '())
                  (string-append "--prefix=" out)
-                 (string-append "--global-config-dir=" etc)
+                 ;; Non-free software are available through the core updater,
+                 ;; disable it.  See <http://issues.guix.gnu.org/issue/38360>.
+                 "--disable-update_cores"
                  "--disable-builtinminiupnpc")))))))
     (inputs
      `(("alsa-lib" ,alsa-lib)
@@ -1355,6 +1348,11 @@ as RetroArch.")
      `(("pkg-config" ,pkg-config)
        ("wayland-protocols" ,wayland-protocols)
        ("which" ,which)))
+    (native-search-paths
+     (list (search-path-specification
+            (variable "RARCH_LIBRETRO_DIRECTORY")
+            (separator #f)              ; single entry
+            (files '("lib/libretro")))))
     (home-page "https://www.libretro.com/")
     (synopsis "Reference frontend for the libretro API")
     (description
diff --git a/gnu/packages/patches/retroarch-RARCH_LIBRETRO_DIRECTORY.patch b/gnu/packages/patches/retroarch-RARCH_LIBRETRO_DIRECTORY.patch
new file mode 100644
index 0000000000..1adfa12769
--- /dev/null
+++ b/gnu/packages/patches/retroarch-RARCH_LIBRETRO_DIRECTORY.patch
@@ -0,0 +1,28 @@
+From 4bbdc3cfed132eb2631af7c5512f0ef88257b4d9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= <iyzsong@member.fsf.org>
+Date: Wed, 17 Feb 2021 19:09:15 +0800
+Subject: [PATCH] Allow set libretro_directory via environment variable
+
+---
+ configuration.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/configuration.c b/configuration.c
+index 8457c586ed..b619a4bbfd 100644
+--- a/configuration.c
++++ b/configuration.c
+@@ -3101,6 +3101,11 @@ static bool config_load_file(global_t *global,
+       configuration_set_string(settings,
+             settings->paths.directory_libretro, tmp_str);
+ 
++   if (getenv("RARCH_LIBRETRO_DIRECTORY"))
++      configuration_set_string(settings,
++            settings->paths.directory_libretro,
++            getenv("RARCH_LIBRETRO_DIRECTORY"));
++
+ #ifndef HAVE_DYNAMIC
+    if (config_get_path(conf, "libretro_path", tmp_str, path_size))
+       path_set(RARCH_PATH_CORE, tmp_str);
+-- 
+2.30.0
+
diff --git a/gnu/packages/patches/retroarch-disable-online-updater.patch b/gnu/packages/patches/retroarch-disable-online-updater.patch
deleted file mode 100644
index ea74cc5409..0000000000
--- a/gnu/packages/patches/retroarch-disable-online-updater.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Tobias Geerinckx-Rice <me@tobias.gr>
-Date: Fri, 29 Nov 2019 20:32:54 +0100
-Subject: [PATCH]: gnu: retroarch: Disable the on-line updater.
-
-This disables the entire ‘Online Updater’ sub-menu to address
-<http://issues.guix.gnu.org/issue/38360>.  Perhaps that is more than is
-necessary.
-
-diff -Naur a/menu/menu_displaylist.c b/menu/menu_displaylist.c
---- a/menu/menu_displaylist.c	1970-01-01 01:00:01.000000000 +0100
-+++ b/menu/menu_displaylist.c	2019-11-29 18:35:27.467948854 +0100
-@@ -8444,11 +8444,6 @@
-                      MENU_ENUM_LABEL_NETPLAY,
-                      PARSE_ACTION, false) == 0)
-                   count++;
--            if (settings->bools.menu_show_online_updater)
--               if (menu_displaylist_parse_settings_enum(info->list,
--                     MENU_ENUM_LABEL_ONLINE_UPDATER,
--                     PARSE_ACTION, false) == 0)
--                  count++;
-             if (menu_displaylist_parse_settings_enum(info->list,
-                   MENU_ENUM_LABEL_SETTINGS, PARSE_ACTION, false) == 0)
-                count++;
-diff -Naur retroarch.a/menu/menu_setting.c retroarch.c/menu/menu_setting.c
---- a/menu/menu_setting.c	1970-01-01 01:00:01.000000000 +0100
-+++ b/menu/menu_setting.c	2019-11-29 18:35:35.753957312 +0100
-@@ -7291,14 +7291,6 @@
-                &group_info,
-                &subgroup_info,
-                parent_group);
--
--         CONFIG_ACTION(
--               list, list_info,
--               MENU_ENUM_LABEL_ONLINE_UPDATER,
--               MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER,
--               &group_info,
--               &subgroup_info,
--               parent_group);
- #endif
- 
-          CONFIG_ACTION(
