diff --git a/debian/changelog b/debian/changelog
index 884310e919c5c0e9cecb2c037569e41ce57534a0..ab6ab0787b21dcf0fe152071a37755d6e8fb2f00 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,40 @@
+nvidia-settings (525.147.05-1~deb12u1) bookworm; urgency=medium
+
+  * Rebuild for bookworm.
+
+ -- Andreas Beckmann <anbe@debian.org>  Mon, 12 Feb 2024 00:39:29 +0100
+
+nvidia-settings (525.147.05-1) unstable; urgency=medium
+
+  * New upstream release 525.147.05.
+  * Build for ppc64el.
+
+ -- Andreas Beckmann <anbe@debian.org>  Fri, 26 Jan 2024 19:29:45 +0100
+
+nvidia-settings (525.125.06-1~deb12u1) bookworm; urgency=medium
+
+  * Rebuild for bookworm.
+
+ -- Andreas Beckmann <anbe@debian.org>  Wed, 12 Jul 2023 11:01:23 +0200
+
+nvidia-settings (525.125.06-1) unstable; urgency=medium
+
+  * New upstream release 525.125.06.
+  * New upstream release 525.105.17.
+    - Fixed a bug that could cause the nvidia-settings control panel to
+      crash when resetting the display layout.
+  * Upload to unstable.
+
+ -- Andreas Beckmann <anbe@debian.org>  Tue, 11 Jul 2023 23:27:45 +0200
+
+nvidia-settings (525.85.05-2) experimental; urgency=medium
+
+  * Move source package back to contrib.
+  * libxnvctrl0, libxnvctrl-dev are now built by src:libxnvctrl.
+  * Upload to experimental.
+
+ -- Andreas Beckmann <anbe@debian.org>  Tue, 18 Apr 2023 22:28:02 +0200
+
 nvidia-settings (525.85.05-1) unstable; urgency=medium
 
   * New upstream release 525.85.05.
diff --git a/debian/control b/debian/control
index d9a6b3bda419adceb4313be3223aaab12578e13a..3cd072a832b820b571e69decf97d46778faea248 100644
--- a/debian/control
+++ b/debian/control
@@ -1,5 +1,5 @@
 Source: nvidia-settings
-Section: x11
+Section: contrib/x11
 Priority: optional
 Maintainer: Debian NVIDIA Maintainers <pkg-nvidia-devel@lists.alioth.debian.org>
 Uploaders:
@@ -26,13 +26,11 @@ Vcs-Browser: https://salsa.debian.org/nvidia-team/nvidia-settings
 Vcs-Git: https://salsa.debian.org/nvidia-team/nvidia-settings.git
 
 Package: nvidia-settings
-Section: contrib/x11
-Architecture: amd64 arm64
+Architecture: amd64 arm64 ppc64el
 Pre-Depends:
  nvidia-installer-cleanup,
 Depends:
  , ${nvidia}-alternative
- , libxnvctrl0 (= ${binary:Version})
  , ${shlibs:Depends}, ${misc:Depends}
 Recommends:
  , libgl1-${nvidia}-glvnd-glx
@@ -50,32 +48,3 @@ Description: tool for configuring the NVIDIA graphics driver${nvidia:VariantDesc
  .
  Values such as brightness and gamma, XVideo attributes, temperature,
  and OpenGL settings can be queried and configured via nvidia-settings.
-
-Package: libxnvctrl0
-Section: libs
-Architecture: any
-Multi-Arch: same
-Pre-Depends: ${misc:Pre-Depends}
-Depends:
- ${shlibs:Depends}, ${misc:Depends}
-Description: NV-CONTROL X extension (runtime library)
- The NV-CONTROL X extension provides a mechanism for X clients to
- query and set configuration parameters of the NVIDIA X driver.
- State set by the NV-CONTROL X extension is assumed to be persistent
- only for the current server generation.
- .
- This package contains the shared library.
-
-Package: libxnvctrl-dev
-Section: libdevel
-Architecture: any
-Multi-Arch: same
-Depends:
- libxnvctrl0 (= ${binary:Version}),
- libx11-dev,
- ${misc:Depends}
-Description: NV-CONTROL X extension (development files)
- The NV-CONTROL X extension provides a mechanism for X clients to
- query and set configuration parameters of the NVIDIA X driver.
- State set by the NV-CONTROL X extension is assumed to be persistent
- only for the current server generation.
diff --git a/debian/copyright b/debian/copyright
index ed8f54b67d3180edd09b1ead56f72359d6800227..a606761199d2ec26720dfa9b21dddf3ed0b86731 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -2,9 +2,15 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: nvidia-settings
 Upstream-Contact: NVIDIA Corporation
 Source: https://download.nvidia.com/XFree86/nvidia-settings/
+Disclaimer:
+ This package is not part of the GNU/Linux Debian distribution. It is
+ provided in the contrib archive area as a convenience to Debian users.
+ The contents of this source package are freely licensed under the Expat,
+ GPL, and other licenses, but it is only useful in combination with the
+ proprietary NVIDIA drivers in non-free.
 
 Files: *
-Copyright: (C) 2004-2021 NVIDIA Corporation
+Copyright: (C) 2004-2023 NVIDIA Corporation
 License: GPL-2
 
 Files: samples/*
@@ -96,7 +102,7 @@ License: Expat
 Files: debian/*
 Copyright: © 2004-2010 Randall Donald <rdonald@debian.org>
            © 2009-2010 Fathi Boudra <fabo@debian.org>
-           © 2011-2023 Andreas Beckmann <anbe@debian.org>
+           © 2011-2024 Andreas Beckmann <anbe@debian.org>
            © 2017      Luca Boccassi <bluca@debian.org>
 License: GPL-2
 
diff --git a/debian/libxnvctrl-dev.docs b/debian/libxnvctrl-dev.docs
deleted file mode 100644
index 2eedfcc1bbc7bed144245811044d5b9c1cb1ddb1..0000000000000000000000000000000000000000
--- a/debian/libxnvctrl-dev.docs
+++ /dev/null
@@ -1,2 +0,0 @@
-doc/NV-CONTROL-API.txt
-doc/FRAMELOCK.txt
diff --git a/debian/libxnvctrl-dev.examples b/debian/libxnvctrl-dev.examples
deleted file mode 100644
index f1e0cd1328a255e5e4c19430ef5d3459895973ba..0000000000000000000000000000000000000000
--- a/debian/libxnvctrl-dev.examples
+++ /dev/null
@@ -1,4 +0,0 @@
-samples/README
-samples/Makefile
-utils.mk
-samples/*.c
diff --git a/debian/libxnvctrl-dev.install b/debian/libxnvctrl-dev.install
deleted file mode 100644
index 8d08a92ca068fce2e7f200e342372e0fc20dcedd..0000000000000000000000000000000000000000
--- a/debian/libxnvctrl-dev.install
+++ /dev/null
@@ -1,4 +0,0 @@
-src/libXNVCtrl/NVCtrl.h /usr/include/NVCtrl/
-src/libXNVCtrl/NVCtrlLib.h /usr/include/NVCtrl/
-src/libXNVCtrl/_out/debian/libXNVCtrl.a /usr/lib/${DEB_HOST_MULTIARCH}/
-src/libXNVCtrl/_out/debian/libXNVCtrl.so /usr/lib/${DEB_HOST_MULTIARCH}/
diff --git a/debian/libxnvctrl0.install b/debian/libxnvctrl0.install
deleted file mode 100644
index 0958d1b2d5d13d374d6261708d13950aa07356ce..0000000000000000000000000000000000000000
--- a/debian/libxnvctrl0.install
+++ /dev/null
@@ -1 +0,0 @@
-src/libXNVCtrl/_out/debian/libXNVCtrl.so.*	usr/lib/${DEB_HOST_MULTIARCH}/
diff --git a/debian/libxnvctrl0.symbols b/debian/libxnvctrl0.symbols
deleted file mode 100644
index 134e51a588dafa5125b3d48225b80129d1969942..0000000000000000000000000000000000000000
--- a/debian/libxnvctrl0.symbols
+++ /dev/null
@@ -1,34 +0,0 @@
-libXNVCtrl.so.0 #PACKAGE# #MINVER#
-* Build-Depends-Package: libxnvctrl-dev
-#MISSING: 390.67# NV_ID@Base 337
- XNVCTRLBindWarpPixmapName@Base 313
- XNVCTRLIsNvScreen@Base 0
- XNVCTRLQueryAttribute@Base 0
- XNVCTRLQueryAttributePermissions@Base 0
- XNVCTRLQueryBinaryData@Base 0
- XNVCTRLQueryBinaryDataAttributePermissions@Base 0
- XNVCTRLQueryExtension@Base 0
- XNVCTRLQueryGvoColorConversion@Base 0
- XNVCTRLQueryStringAttribute@Base 0
- XNVCTRLQueryStringAttributePermissions@Base 0
- XNVCTRLQueryStringOperationAttributePermissions@Base 0
- XNVCTRLQueryTargetAttribute64@Base 0
- XNVCTRLQueryTargetAttribute@Base 0
- XNVCTRLQueryTargetBinaryData@Base 0
- XNVCTRLQueryTargetCount@Base 0
- XNVCTRLQueryTargetStringAttribute@Base 0
- XNVCTRLQueryValidAttributeValues@Base 0
- XNVCTRLQueryValidTargetAttributeValues@Base 0
- XNVCTRLQueryValidTargetStringAttributeValues@Base 0
- XNVCTRLQueryVersion@Base 0
- XNVCTRLSetAttribute@Base 0
- XNVCTRLSetAttributeAndGetStatus@Base 0
- XNVCTRLSetGvoColorConversion@Base 0
- XNVCTRLSetStringAttribute@Base 0
- XNVCTRLSetTargetAttribute@Base 0
- XNVCTRLSetTargetAttributeAndGetStatus@Base 0
- XNVCTRLSetTargetStringAttribute@Base 0
- XNVCTRLStringOperation@Base 0
- XNVCtrlSelectNotify@Base 0
- XNVCtrlSelectTargetNotify@Base 0
-#MISSING: 390.67# pNV_ID@Base 337
diff --git a/debian/nvidia-settings.desktop.in b/debian/nvidia-settings.desktop.in
deleted file mode 100644
index 7f11284dc46b353817d76810e2733d14084e7483..0000000000000000000000000000000000000000
--- a/debian/nvidia-settings.desktop.in
+++ /dev/null
@@ -1,31 +0,0 @@
-[Desktop Entry]
-Version=1.0
-Type=Application
-Exec=nvidia-settings
-Terminal=false
-Categories=HardwareSettings;System;Settings;
-Icon=nvidia-settings#VARIANT#
-Name=NVIDIA X Server Settings#VARIANT_DESC#
-Comment=Configure NVIDIA X Server Settings#VARIANT_DESC#
-
-# Translations provided by Sun Microsystems
-Name[de]=NVIDIA X-Server-Einstellungen
-Name[es]=Valores de configuración del servidor NVIDIA X
-Name[fr]=Paramètres du serveur X NVIDIA
-Name[it]=NVIDIA X Server Settings
-Name[ja]=NVIDIA X サーバー設定
-Name[ko]=NVIDIA X 서버 설정
-Name[pt_BR]=Configurações do NVIDIA X Server
-Name[zh_CN]=NVIDIA X 服务器设置
-Name[zh_HK]=NVIDIA X 伺服器設定
-Name[zh_TW]=NVIDIA X 伺服器設定
-Comment[de]=Konfigurieren der NVIDIA X-Server-Einstellungen
-Comment[es]=Establezca los valores de configuración del servidor NVIDIA X
-Comment[fr]=Configurer les paramètres du serveur X NVIDIA
-Comment[it]=Configura NVIDIA X Server Settings
-Comment[ja]=NVIDIA X サーバー設定を構成します
-Comment[ko]=NVIDIA X 서버 설정 구성
-Comment[pt_BR]=Definir &configurações de gerenciamento de usuário...
-Comment[zh_CN]=配置 NVIDIA X 服务器设置
-Comment[zh_HK]=配置 NVIDIA X 伺服器設定
-Comment[zh_TW]=配置 NVIDIA X 伺服器設定
diff --git a/debian/nvidia-settings.desktop.in b/debian/nvidia-settings.desktop.in
new file mode 120000
index 0000000000000000000000000000000000000000..5f6372e566a9d57fdfb5ab4db2f09111a0834725
--- /dev/null
+++ b/debian/nvidia-settings.desktop.in
@@ -0,0 +1 @@
+../doc/nvidia-settings.desktop
\ No newline at end of file
diff --git a/debian/patches/10_libxnvctrl_so_0.diff b/debian/patches/10_libxnvctrl_so_0.diff
deleted file mode 100644
index 53064d6d9f7e4c244d79b5681251badfc242ce50..0000000000000000000000000000000000000000
--- a/debian/patches/10_libxnvctrl_so_0.diff
+++ /dev/null
@@ -1,44 +0,0 @@
-Author: Andreas Beckmann <debian@abeckmann.de>
-Description: build a shared library for libXNVCtrl
-Bug-Debian: https://bugs.debian.org/666909
-
---- a/src/libXNVCtrl/Makefile
-+++ b/src/libXNVCtrl/Makefile
-@@ -50,8 +50,11 @@ LDFLAGS += $(XNVCTRL_LDFLAGS)
- 
- .PHONY: all
- all: $(LIBXNVCTRL)
-+all: $(LIBXNVCTRL_a)
-+all: $(LIBXNVCTRL_so)
- 
- .PHONY: clean
- clean:
- 	rm -rf $(LIBXNVCTRL) *~ \
- 		$(OUTPUTDIR)/*.o $(OUTPUTDIR)/*.d
-+	rm -f $(LIBXNVCTRL_a) $(LIBXNVCTRL_so) $(LIBXNVCTRL_so).*
---- a/src/libXNVCtrl/xnvctrl.mk
-+++ b/src/libXNVCtrl/xnvctrl.mk
-@@ -37,7 +37,9 @@ endif
- XNVCTRL_CFLAGS ?=
- 
- 
--LIBXNVCTRL = $(OUTPUTDIR)/libXNVCtrl.a
-+LIBXNVCTRL_a = $(OUTPUTDIR)/libXNVCtrl.a
-+LIBXNVCTRL_so = $(OUTPUTDIR)/libXNVCtrl.so
-+LIBXNVCTRL = $(LIBXNVCTRL_so)
- 
- LIBXNVCTRL_SRC = $(XNVCTRL_DIR)/NVCtrl.c
- 
-@@ -45,5 +47,11 @@ LIBXNVCTRL_OBJ = $(call BUILD_OBJECT_LIS
- 
- $(eval $(call DEFINE_OBJECT_RULE,TARGET,$(LIBXNVCTRL_SRC)))
- 
--$(LIBXNVCTRL) : $(LIBXNVCTRL_OBJ)
-+$(LIBXNVCTRL_a) : $(LIBXNVCTRL_OBJ)
- 	$(call quiet_cmd,AR) ru $@ $(LIBXNVCTRL_OBJ)
-+
-+$(LIBXNVCTRL_so) : $(LIBXNVCTRL_OBJ)
-+	$(RM) $@ $@.*
-+	$(CC) -shared -Wl,-soname=$(@F).0 -o $@.0.0.0 $(LDFLAGS) $^ -lXext -lX11
-+	ln -s $(@F).0.0.0 $@.0
-+	ln -s $(@F).0 $@
diff --git a/debian/patches/12_nvidia-settings.desktop.diff b/debian/patches/12_nvidia-settings.desktop.diff
index 39f2282355776cb3df9458270965be65dac61902..381b03cbe60068b25f6b643a70aba476097564aa 100644
--- a/debian/patches/12_nvidia-settings.desktop.diff
+++ b/debian/patches/12_nvidia-settings.desktop.diff
@@ -9,15 +9,17 @@ Forwarded: not-needed
 +Version=1.0
  Type=Application
 -Encoding=UTF-8
-+Exec=nvidia-settings
-+Terminal=false
-+Categories=HardwareSettings;System;Settings;
-+Icon=nvidia-settings
- Name=NVIDIA X Server Settings
- Comment=Configure NVIDIA X Server Settings
+-Name=NVIDIA X Server Settings
+-Comment=Configure NVIDIA X Server Settings
 -Exec=__UTILS_PATH__/nvidia-settings
 -Icon=__PIXMAP_PATH__/nvidia-settings.png
 -Categories=__NVIDIA_SETTINGS_DESKTOP_CATEGORIES__
++Exec=nvidia-settings
++Terminal=false
++Categories=HardwareSettings;System;Settings;
++Icon=nvidia-settings#VARIANT#
++Name=NVIDIA X Server Settings#VARIANT_DESC#
++Comment=Configure NVIDIA X Server Settings#VARIANT_DESC#
  
  # Translation by Marcin Mikołajczak
  Name[pl]=Ustawienia serwera X NVIDIA
diff --git a/debian/patches/series b/debian/patches/series
index d5ba55e2e2fffe43c76af3cec7bf54c7fc1908e1..122e720a03a3ca65a3a858af771b723b00a63608 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,5 +1,4 @@
 link-order.diff
-10_libxnvctrl_so_0.diff
 12_nvidia-settings.desktop.diff
 typos.diff
 kfreebsd-hurd.diff
diff --git a/debian/rules b/debian/rules
index 5efee5d49e96d333562705c12021ad58b0510108..bf56bec96b19b12b59a2c01bddc6b28de2ec808f 100755
--- a/debian/rules
+++ b/debian/rules
@@ -31,12 +31,25 @@ include debian/rules.defs
 NVIDIA_LEGACY		?=
 NVIDIA_TESLA		?=
 NVIDIA_RELEASE		 = $(DEB_VERSION_UPSTREAM)
-variant			 = $(if $(NVIDIA_TESLA),tesla-$(NVIDIA_TESLA),$(if $(NVIDIA_LEGACY),legacy-$(NVIDIA_LEGACY)xx))
-variant_description	 = $(if $(NVIDIA_TESLA), (Tesla $(NVIDIA_TESLA) version),$(if $(NVIDIA_LEGACY), ($(NVIDIA_LEGACY)xx legacy version)))
+empty			 =
+variant			 =
+variant_description	 =
+ifneq (,$(NVIDIA_LEGACY))
+variant			 = legacy-$(NVIDIA_LEGACY)xx))
+variant_description	 = $(empty) ($(NVIDIA_LEGACY)xx legacy version)))
+endif
+ifneq (,$(NVIDIA_TESLA))
+variant			 = tesla-$(NVIDIA_TESLA)
+variant_description	 = $(empty) (Tesla $(NVIDIA_TESLA) version)
+endif
+ifeq (yes,$(NVIDIA_TESLA))
+variant			 = tesla
+variant_description	 = $(empty) (Tesla version)
+endif
 -variant		 = $(if $(variant),-$(variant))
 nvidia			 = nvidia$(-variant)
 nvidia_private		 = nvidia/$(if $(variant),$(variant),current)
-watch_version		?= $(or $(NVIDIA_TESLA),$(NVIDIA_LEGACY))
+watch_version		?= $(or $(filter-out yes,$(NVIDIA_TESLA)),$(NVIDIA_LEGACY))
 
 ALL_CONTROL	:= $(wildcard debian/nvidia-settings.*)
 VARIANT_CONTROL	:= $(wildcard debian/nvidia-settings$(-variant).*)
@@ -53,14 +66,7 @@ AUTOCLEAN	 = $(filter-out $(AUTOKEEP),$(AUTOGEN))
 %:
 	dh $@
 
-ifeq (,$(filter nvidia-settings,$(shell dh_listpackages)))
 override_dh_auto_build: $(AUTOGEN)
-	CC_ONLY_CFLAGS="$(CPPFLAGS)" dh_auto_build --sourcedirectory=src/libXNVCtrl
-
-override_dh_auto_install:
-else
-override_dh_auto_build: $(AUTOGEN)
-	CC_ONLY_CFLAGS="$(CPPFLAGS)" dh_auto_build --sourcedirectory=src/libXNVCtrl
 	CC_ONLY_CFLAGS="$(CPPFLAGS)" dh_auto_build -O--parallel
 	$(MAKE) -C samples
 
@@ -69,7 +75,6 @@ override_dh_auto_install:
 	install -m 0755 samples/$(OUTPUTDIR)/nv-control-dpy debian/tmp/usr/bin/
 	install -d -m 0755 debian/tmp/usr/share/icons/hicolor/128x128/apps/
 	install -m 0644 doc/nvidia-settings.png debian/tmp/usr/share/icons/hicolor/128x128/apps/nvidia-settings$(-variant).png
-endif
 
 override_dh_auto_clean:
 	dh_auto_clean -- BUILD_GTK3LIB=1
diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml
index bfed02b3642e188bbb8bf7225d8c1bd2d5527a35..c3d1fdf3872c8432ffe07f442d927fd4911a6b8b 100644
--- a/debian/salsa-ci.yml
+++ b/debian/salsa-ci.yml
@@ -1,7 +1,7 @@
 ---
 include:
-  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
-  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
+  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
 
 variables:
   SALSA_CI_COMPONENTS: 'main contrib non-free'
+  SALSA_CI_DISABLE_BUILD_PACKAGE_I386: 1
diff --git a/doc/version.mk b/doc/version.mk
index 36f573873ecf76141759e9e85268e2021c2ad673..dae35ac2315e7ed874c063beacadec078b9447d1 100644
--- a/doc/version.mk
+++ b/doc/version.mk
@@ -1,4 +1,4 @@
-NVIDIA_VERSION = 525.85.05
+NVIDIA_VERSION = 525.147.05
 
 # This file.
 VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))
diff --git a/samples/version.mk b/samples/version.mk
index 36f573873ecf76141759e9e85268e2021c2ad673..dae35ac2315e7ed874c063beacadec078b9447d1 100644
--- a/samples/version.mk
+++ b/samples/version.mk
@@ -1,4 +1,4 @@
-NVIDIA_VERSION = 525.85.05
+NVIDIA_VERSION = 525.147.05
 
 # This file.
 VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))
diff --git a/src/gtk+-2.x/ctkslimm.c b/src/gtk+-2.x/ctkslimm.c
index ed1ca88770a2b0d441ebc5715d73c854f0662dd7..d476f59956084e3cc65db8e19b9c39779ed0914e 100644
--- a/src/gtk+-2.x/ctkslimm.c
+++ b/src/gtk+-2.x/ctkslimm.c
@@ -1292,7 +1292,7 @@ static nvDisplayPtr setup_display(CtkMMDialog *ctk_mmdialog)
 void update_mosaic_dialog_ui(CtkMMDialog *ctk_mmdialog, nvLayoutPtr layout)
 {
     nvModeLineItemPtr iter;
-    char *id;
+    char *id = NULL;
 
     if (ctk_mmdialog == NULL) {
         return;
@@ -1300,6 +1300,7 @@ void update_mosaic_dialog_ui(CtkMMDialog *ctk_mmdialog, nvLayoutPtr layout)
 
     if (layout) {
         ctk_mmdialog->layout = layout;
+        ctk_mmdialog->cur_modeline = NULL;
     }
 
     parse_slimm_layout(ctk_mmdialog,
@@ -1307,12 +1308,14 @@ void update_mosaic_dialog_ui(CtkMMDialog *ctk_mmdialog, nvLayoutPtr layout)
                        &ctk_mmdialog->h_overlap_parsed,
                        &ctk_mmdialog->v_overlap_parsed);
 
-    id = g_strdup(ctk_mmdialog->cur_modeline->data.identifier);
+    if (ctk_mmdialog->cur_modeline) {
+        id = g_strdup(ctk_mmdialog->cur_modeline->data.identifier);
+    }
 
     setup_display(ctk_mmdialog);
 
     iter = ctk_mmdialog->modelines;
-    while (iter->next) {
+    while (id && iter->next) {
         if (strcmp(id, iter->modeline->data.identifier) == 0) {
             ctk_mmdialog->cur_modeline = iter->modeline;
             break;
diff --git a/src/libXNVCtrl/version.mk b/src/libXNVCtrl/version.mk
index 36f573873ecf76141759e9e85268e2021c2ad673..dae35ac2315e7ed874c063beacadec078b9447d1 100644
--- a/src/libXNVCtrl/version.mk
+++ b/src/libXNVCtrl/version.mk
@@ -1,4 +1,4 @@
-NVIDIA_VERSION = 525.85.05
+NVIDIA_VERSION = 525.147.05
 
 # This file.
 VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))
diff --git a/src/nvml.h b/src/nvml.h
index 0da0f8c0f73a5728c06c77bc2e02c6a4b25c5d02..9ac2324180ae72e0215147d376c7dd5cecb7fe2b 100644
--- a/src/nvml.h
+++ b/src/nvml.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 1993-2022 NVIDIA Corporation.  All rights reserved.
+ * Copyright 1993-2023 NVIDIA Corporation.  All rights reserved.
  *
  * NOTICE TO USER:
  *
@@ -525,6 +525,7 @@ typedef enum nvmlValueType_enum
     NVML_VALUE_TYPE_UNSIGNED_LONG = 2,
     NVML_VALUE_TYPE_UNSIGNED_LONG_LONG = 3,
     NVML_VALUE_TYPE_SIGNED_LONG_LONG = 4,
+    NVML_VALUE_TYPE_SIGNED_INT = 5,
 
     // Keep this last
     NVML_VALUE_TYPE_COUNT
@@ -537,6 +538,7 @@ typedef enum nvmlValueType_enum
 typedef union nvmlValue_st
 {
     double dVal;                    //!< If the value is double
+    int siVal;                      //!< If the value is signed long long
     unsigned int uiVal;             //!< If the value is unsigned int
     unsigned long ulVal;            //!< If the value is unsigned long
     unsigned long long ullVal;      //!< If the value is unsigned long long
@@ -1730,7 +1732,39 @@ typedef struct nvmlGpuDynamicPstatesInfo_st
 
 #define NVML_FI_DEV_PCIE_L0_TO_RECOVERY_COUNTER       169 //!< Device PEX error recovery counter
 
-#define NVML_FI_MAX 170 //!< One greater than the largest field ID defined above
+/*
+ * PCIe error counter
+ */
+#define NVML_FI_DEV_PCIE_COUNT_CORRECTABLE_ERRORS     173
+#define NVML_FI_DEV_PCIE_COUNT_NAKS_RECEIVED          174
+#define NVML_FI_DEV_PCIE_COUNT_RECEIVER_ERROR         175
+#define NVML_FI_DEV_PCIE_COUNT_BAD_TLP                176
+#define NVML_FI_DEV_PCIE_COUNT_NAKS_SENT              177
+#define NVML_FI_DEV_PCIE_COUNT_BAD_DLLP               178
+#define NVML_FI_DEV_PCIE_COUNT_NON_FATAL_ERROR        179
+#define NVML_FI_DEV_PCIE_COUNT_FATAL_ERROR            180
+#define NVML_FI_DEV_PCIE_COUNT_UNSUPPORTED_REQ        181
+#define NVML_FI_DEV_PCIE_COUNT_LCRC_ERROR             182 
+
+/**
+ * Retrieves power usage for this GPU in milliwatts.
+ * It is only available if power management mode is supported. See \ref nvmlDeviceGetPowerManagementMode and
+ * \ref nvmlDeviceGetPowerUsage.
+ */
+#define NVML_FI_DEV_POWER_AVERAGE                     185 //!< GPU power averaged over 1 sec interval, supported on Ampere (except GA100) or newer architectures.
+#define NVML_FI_DEV_POWER_INSTANT                     186 //!< Current GPU power, supported on all architectures.
+
+/**
+ * GPU T.Limit temperature thresholds in degree Celsius
+ *
+ * These fields are supported on Ada and later architectures and supersedes \ref nvmlDeviceGetTemperatureThreshold.
+ */
+#define NVML_FI_DEV_TEMPERATURE_SHUTDOWN_TLIMIT       193 //!< T.Limit temperature after which GPU may shut down for HW protection
+#define NVML_FI_DEV_TEMPERATURE_SLOWDOWN_TLIMIT       194 //!< T.Limit temperature after which GPU may begin HW slowdown
+#define NVML_FI_DEV_TEMPERATURE_MEM_MAX_TLIMIT        195 //!< T.Limit temperature after which GPU may begin SW slowdown due to memory temperature
+#define NVML_FI_DEV_TEMPERATURE_GPU_MAX_TLIMIT        196 //!< T.Limit temperature after which GPU may be throttled below base clock
+
+#define NVML_FI_MAX 197 //!< One greater than the largest field ID defined above
 
 /**
  * Information for a Field Value Sample
@@ -2140,7 +2174,7 @@ typedef struct nvmlEncoderSessionInfo_st
  */
 typedef enum nvmlFBCSessionType_enum
 {
-    NVML_FBC_SESSION_TYPE_UNKNOWN = 0,     //!< Unknwon
+    NVML_FBC_SESSION_TYPE_UNKNOWN = 0,     //!< Unknown
     NVML_FBC_SESSION_TYPE_TOSYS,           //!< ToSys
     NVML_FBC_SESSION_TYPE_CUDA,            //!< Cuda
     NVML_FBC_SESSION_TYPE_VID,             //!< Vid
@@ -3641,6 +3675,20 @@ nvmlReturn_t DECLDIR nvmlDeviceGetClockInfo(nvmlDevice_t device, nvmlClockType_t
  */
 nvmlReturn_t DECLDIR nvmlDeviceGetMaxClockInfo(nvmlDevice_t device, nvmlClockType_t type, unsigned int *clock);
 
+/**
+ * Retrieve the GPCCLK VF offset value
+ * @param[in]   device                         The identifier of the target device
+ * @param[out]  offset                         The retrieved GPCCLK VF offset value
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetGpcClkVfOffset(nvmlDevice_t device, int *offset);
+
 /**
  * Retrieves the current setting of a clock that applications will use unless an overspec situation occurs.
  * Can be changed using \ref nvmlDeviceSetApplicationsClocks.
@@ -4097,6 +4145,14 @@ nvmlReturn_t DECLDIR nvmlDeviceGetTemperature(nvmlDevice_t device, nvmlTemperatu
  *
  * See \ref nvmlTemperatureThresholds_t for details on available temperature thresholds.
  *
+ * Note: This API is no longer the preferred interface for retrieving the following temperature thresholds
+ * on Ada and later architectures: NVML_TEMPERATURE_THRESHOLD_SHUTDOWN, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN,
+ * NVML_TEMPERATURE_THRESHOLD_MEM_MAX and NVML_TEMPERATURE_THRESHOLD_GPU_MAX.
+ *
+ * Support for reading these temperature thresholds for Ada and later architectures would be removed from this
+ * API in future releases. Please use \ref nvmlDeviceGetFieldValues with NVML_FI_DEV_TEMPERATURE_* fields to retrieve
+ * temperature thresholds on these architectures.
+ *
  * @param device                               The identifier of the target device
  * @param thresholdType                        The type of threshold value queried
  * @param temp                                 Reference in which to return the temperature reading
@@ -4237,6 +4293,113 @@ nvmlReturn_t DECLDIR nvmlDeviceGetSupportedClocksThrottleReasons(nvmlDevice_t de
  */
 nvmlReturn_t DECLDIR nvmlDeviceGetPowerState(nvmlDevice_t device, nvmlPstates_t *pState);
 
+/**
+ * Retrieve performance monitor samples from the associated subdevice.
+ *
+ * @param device
+ * @param pDynamicPstatesInfo
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a pDynamicPstatesInfo has been set
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a pDynamicPstatesInfo is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetDynamicPstatesInfo(nvmlDevice_t device, nvmlGpuDynamicPstatesInfo_t *pDynamicPstatesInfo);
+
+/**
+ * Retrieve the MemClk (Memory Clock) VF offset value.
+ * @param[in]   device                         The identifier of the target device
+ * @param[out]  offset                         The retrieved MemClk VF offset value
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetMemClkVfOffset(nvmlDevice_t device, int *offset);
+
+/**
+ * Retrieve min and max clocks of some clock domain for a given PState
+ *
+ * @param device                               The identifier of the target device
+ * @param type                                 Clock domain
+ * @param pstate                               PState to query
+ * @param minClockMHz                          Reference in which to return min clock frequency
+ * @param maxClockMHz                          Reference in which to return max clock frequency
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if everything worked
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device, \a type or \a pstate are invalid or both
+ *                                                  \a minClockMHz and \a maxClockMHz are NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetMinMaxClockOfPState(nvmlDevice_t device, nvmlClockType_t type, nvmlPstates_t pstate,
+                                                      unsigned int * minClockMHz, unsigned int * maxClockMHz);
+
+/**
+ * Get all supported Performance States (P-States) for the device.
+ *
+ * The returned array would contain a contiguous list of valid P-States supported by
+ * the device. If the number of supported P-States is fewer than the size of the array
+ * supplied missing elements would contain \a NVML_PSTATE_UNKNOWN.
+ *
+ * The number of elements in the returned list will never exceed \a NVML_MAX_GPU_PERF_PSTATES.
+ *
+ * @param device                               The identifier of the target device
+ * @param pstates                              Container to return the list of performance states
+ *                                             supported by device
+ * @param size                                 Size of the supplied \a pstates array in bytes
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a pstates array has been retrieved
+ *         - \ref NVML_ERROR_INSUFFICIENT_SIZE if the the container supplied was not large enough to
+ *                                             hold the resulting list
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device or \a pstates is invalid
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support performance state readings
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetSupportedPerformanceStates(nvmlDevice_t device,
+                                                             nvmlPstates_t *pstates, unsigned int size);
+
+/**
+ * Retrieve the GPCCLK min max VF offset value.
+ * @param[in]   device                         The identifier of the target device
+ * @param[out]  minOffset                      The retrieved GPCCLK VF min offset value
+ * @param[out]  maxOffset                      The retrieved GPCCLK VF max offset value
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetGpcClkMinMaxVfOffset(nvmlDevice_t device,
+                                                       int *minOffset, int *maxOffset);
+
+/**
+ * Retrieve the MemClk (Memory Clock) min max VF offset value.
+ * @param[in]   device                         The identifier of the target device
+ * @param[out]  minOffset                      The retrieved MemClk VF min offset value
+ * @param[out]  maxOffset                      The retrieved MemClk VF max offset value
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetMemClkMinMaxVfOffset(nvmlDevice_t device,
+                                                       int *minOffset, int *maxOffset);
+
 /**
  * This API has been deprecated.
  *
@@ -4336,7 +4499,12 @@ nvmlReturn_t DECLDIR nvmlDeviceGetPowerManagementDefaultLimit(nvmlDevice_t devic
  *
  * For Fermi &tm; or newer fully supported devices.
  *
- * On Fermi and Kepler GPUs the reading is accurate to within +/- 5% of current power draw.
+ * On Fermi and Kepler GPUs the reading is accurate to within +/- 5% of current power draw. On Ampere
+ * (except GA100) or newer GPUs, the API returns power averaged over 1 sec interval. On GA100 and
+ * older architectures, instantaneous power is returned.
+ *
+ * See \ref NVML_FI_DEV_POWER_AVERAGE and \ref NVML_FI_DEV_POWER_INSTANT to query specific power
+ * values.
  *
  * It is only available if power management mode is supported. See \ref nvmlDeviceGetPowerManagementMode.
  *
@@ -4792,10 +4960,10 @@ nvmlReturn_t DECLDIR nvmlDeviceGetEncoderStats (nvmlDevice_t device, unsigned in
  * Retrieves information about active encoder sessions on a target device.
  *
  * An array of active encoder sessions is returned in the caller-supplied buffer pointed at by \a sessionInfos. The
- * array elememt count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions
+ * array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions
  * written to the buffer.
  *
- * If the supplied buffer is not large enough to accomodate the active session array, the function returns
+ * If the supplied buffer is not large enough to accommodate the active session array, the function returns
  * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlEncoderSessionInfo_t array required in \a sessionCount.
  * To query the number of active encoder sessions, call this function with *sessionCount = 0.  The code will return
  * NVML_SUCCESS with number of active encoder sessions updated in *sessionCount.
@@ -4844,7 +5012,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetDecoderUtilization(nvmlDevice_t device, unsign
 * For Maxwell &tm; or newer fully supported devices.
 *
 * @param device                            The identifier of the target device
-* @param fbcStats                          Reference to nvmlFBCStats_t structure contianing NvFBC stats
+* @param fbcStats                          Reference to nvmlFBCStats_t structure containing NvFBC stats
 *
 * @return
 *         - \ref NVML_SUCCESS                  if \a fbcStats is fetched
@@ -4862,7 +5030,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetFBCStats(nvmlDevice_t device, nvmlFBCStats_t *
 * array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions
 * written to the buffer.
 *
-* If the supplied buffer is not large enough to accomodate the active session array, the function returns
+* If the supplied buffer is not large enough to accommodate the active session array, the function returns
 * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlFBCSessionInfo_t array required in \a sessionCount.
 * To query the number of active FBC sessions, call this function with *sessionCount = 0.  The code will return
 * NVML_SUCCESS with number of active FBC sessions updated in *sessionCount.
@@ -5339,6 +5507,41 @@ nvmlReturn_t DECLDIR nvmlDeviceGetPcieSpeed(nvmlDevice_t device, unsigned int *p
  */
 nvmlReturn_t DECLDIR nvmlDeviceGetAdaptiveClockInfoStatus(nvmlDevice_t device, unsigned int *adaptiveClockStatus);
 
+/**
+ * Get the type of the GPU Bus (PCIe, PCI, ...)
+ *
+ * @param device                               The identifier of the target device
+ * @param type                                 The PCI Bus type
+ *
+ * return
+ *         - \ref NVML_SUCCESS                 if the bus \a type is successfully retreived
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \device is invalid or \type is NULL
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *type);
+
+/**
+ * Get fabric information associated with the device.
+ *
+ * %HOPPER_OR_NEWER%
+ *
+ * On Hopper + NVSwitch systems, GPU is registered with the NVIDIA Fabric Manager
+ * Upon successful registration, the GPU is added to the NVLink fabric to enable
+ * peer-to-peer communication.
+ * This API reports the current state of the GPU in the NVLink fabric
+ * along with other useful information.
+ *
+ * @param device                               The identifier of the target device
+ * @param gpuFabricInfo                        Information about GPU fabric state
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 Upon success
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     If \a device doesn't support gpu fabric
+ */
+nvmlReturn_t DECLDIR nvmlDeviceGetGpuFabricInfo(nvmlDevice_t device, nvmlGpuFabricInfo_t *gpuFabricInfo);
+
+
 /**
  * @}
  */
@@ -5501,7 +5704,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetRetiredPages(nvmlDevice_t device, nvmlPageReti
  * The address information provided from this API is the hardware address of the page that was retired.  Note
  * that this does not match the virtual address used in CUDA, but will match the address information in XID 63
  *
- * \note nvmlDeviceGetRetiredPages_v2 adds an additional timestamps paramter to return the time of each page's
+ * \note nvmlDeviceGetRetiredPages_v2 adds an additional timestamps parameter to return the time of each page's
  *       retirement.
  *
  * For Kepler &tm; or newer fully supported devices.
@@ -5838,7 +6041,7 @@ typedef enum nvmlClockLimitId_enum {
  * Set clocks that device will lock to.
  *
  * Sets the clocks that the device will be running at to the value in the range of minGpuClockMHz to maxGpuClockMHz.
- * Setting this will supercede application clock values and take effect regardless if a cuda app is running.
+ * Setting this will supersede application clock values and take effect regardless if a cuda app is running.
  * See /ref nvmlDeviceSetApplicationsClocks
  *
  * Can be used as a setting to request constant performance.
@@ -6105,6 +6308,60 @@ nvmlReturn_t DECLDIR nvmlDeviceSetGpuOperationMode(nvmlDevice_t device, nvmlGpuO
  */
 nvmlReturn_t DECLDIR nvmlDeviceSetAPIRestriction(nvmlDevice_t device, nvmlRestrictedAPI_t apiType, nvmlEnableState_t isRestricted);
 
+/**
+ * Sets the speed of a specified fan.
+ *
+ * WARNING: This function changes the fan control policy to manual. It means that YOU have to monitor
+ *          the temperature and adjust the fan speed accordingly.
+ *          If you set the fan speed too low you can burn your GPU!
+ *          Use nvmlDeviceSetDefaultFanSpeed_v2 to restore default control policy.
+ *
+ * For all cuda-capable discrete products with fans that are Maxwell or Newer.
+ *
+ * device                                The identifier of the target device
+ * fan                                   The index of the fan, starting at zero
+ * speed                                 The target speed of the fan [0-100] in % of max speed
+ *
+ * return
+ *        NVML_SUCCESS                   if the fan speed has been set
+ *        NVML_ERROR_UNINITIALIZED       if the library has not been successfully initialized
+ *        NVML_ERROR_INVALID_ARGUMENT    if the device is not valid, or the speed is outside acceptable ranges,
+ *                                              or if the fan index doesn't reference an actual fan.
+ *        NVML_ERROR_NOT_SUPPORTED       if the device is older than Maxwell.
+ *        NVML_ERROR_UNKNOWN             if there was an unexpected error.
+ */
+nvmlReturn_t DECLDIR nvmlDeviceSetFanSpeed_v2(nvmlDevice_t device, unsigned int fan, unsigned int speed);
+
+/**
+ * Set the GPCCLK VF offset value
+ * @param[in]   device                         The identifier of the target device
+ * @param[in]   offset                         The GPCCLK VF offset value to set
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a offset has been set
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceSetGpcClkVfOffset(nvmlDevice_t device, int offset);
+
+/**
+ * Set the MemClk (Memory Clock) VF offset value. It requires elevated privileges.
+ * @param[in]   device                         The identifier of the target device
+ * @param[in]   offset                         The MemClk VF offset value to set
+ *
+ * @return
+ *         - \ref NVML_SUCCESS                 if \a offset has been set
+ *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
+ *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
+ *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
+ *         - \ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible
+ *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
+ */
+nvmlReturn_t DECLDIR nvmlDeviceSetMemClkVfOffset(nvmlDevice_t device, int offset);
+
 /**
  * @}
  */
@@ -6955,7 +7212,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetVgpuCapabilities(nvmlDevice_t device, nvmlDevi
  * pointed at by \a vgpuTypeIds. The element count of nvmlVgpuTypeId_t array is passed in \a vgpuCount, and \a vgpuCount
  * is used to return the number of vGPU types written to the buffer.
  *
- * If the supplied buffer is not large enough to accomodate the vGPU type array, the function returns
+ * If the supplied buffer is not large enough to accommodate the vGPU type array, the function returns
  * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuTypeId_t array required in \a vgpuCount.
  * To query the number of vGPU types supported for the GPU, call this function with *vgpuCount = 0.
  * The code will return NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU types are supported.
@@ -6984,9 +7241,9 @@ nvmlReturn_t DECLDIR nvmlDeviceGetSupportedVgpus(nvmlDevice_t device, unsigned i
  * can concurrently run on a device.  For example, if only one vGPU type is allowed at a time on a device, then the creatable
  * list will be restricted to whatever vGPU type is already running on the device.
  *
- * If the supplied buffer is not large enough to accomodate the vGPU type array, the function returns
+ * If the supplied buffer is not large enough to accommodate the vGPU type array, the function returns
  * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuTypeId_t array required in \a vgpuCount.
- * To query the number of vGPU types createable for the GPU, call this function with *vgpuCount = 0.
+ * To query the number of vGPU types that can be created for the GPU, call this function with *vgpuCount = 0.
  * The code will return NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU types are creatable.
  *
  * @param device                   The identifier of the target device
@@ -7066,7 +7323,7 @@ nvmlReturn_t DECLDIR nvmlVgpuTypeGetGpuInstanceProfileId(nvmlVgpuTypeId_t vgpuTy
  *
  * @param vgpuTypeId               Handle to vGPU type
  * @param deviceID                 Device ID and vendor ID of the device contained in single 32 bit value
- * @param subsystemID              Subsytem ID and subsytem vendor ID of the device contained in single 32 bit value
+ * @param subsystemID              Subsystem ID and subsystem vendor ID of the device contained in single 32 bit value
  *
  * @return
  *         - \ref NVML_SUCCESS                 successful completion
@@ -7205,10 +7462,10 @@ nvmlReturn_t DECLDIR nvmlVgpuTypeGetMaxInstancesPerVm(nvmlVgpuTypeId_t vgpuTypeI
  * Retrieve the active vGPU instances on a device.
  *
  * An array of active vGPU instances is returned in the caller-supplied buffer pointed at by \a vgpuInstances. The
- * array elememt count is passed in \a vgpuCount, and \a vgpuCount is used to return the number of vGPU instances
+ * array element count is passed in \a vgpuCount, and \a vgpuCount is used to return the number of vGPU instances
  * written to the buffer.
  *
- * If the supplied buffer is not large enough to accomodate the vGPU instance array, the function returns
+ * If the supplied buffer is not large enough to accommodate the vGPU instance array, the function returns
  * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuInstance_t array required in \a vgpuCount.
  * To query the number of active vGPU instances, call this function with *vgpuCount = 0.  The code will return
  * NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU Types are supported.
@@ -7409,7 +7666,7 @@ nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEccMode(nvmlVgpuInstance_t vgpuInstance,
  * @param encoderCapacity          Reference to an unsigned int for the encoder capacity
  *
  * @return
- *         - \ref NVML_SUCCESS                 if \a encoderCapacity has been retrived
+ *         - \ref NVML_SUCCESS                 if \a encoderCapacity has been retrieved
  *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
  *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a vgpuInstance is 0, or \a encoderQueryType is invalid
  *         - \ref NVML_ERROR_NOT_FOUND         if \a vgpuInstance does not match a valid active vGPU instance on the system
@@ -7462,7 +7719,7 @@ nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEncoderStats(nvmlVgpuInstance_t vgpuInst
  * array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions
  * written to the buffer.
  *
- * If the supplied buffer is not large enough to accomodate the active session array, the function returns
+ * If the supplied buffer is not large enough to accommodate the active session array, the function returns
  * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlEncoderSessionInfo_t array required in \a sessionCount.
  * To query the number of active encoder sessions, call this function with *sessionCount = 0. The code will return
  * NVML_SUCCESS with number of active encoder sessions updated in *sessionCount.
@@ -7492,7 +7749,7 @@ nvmlReturn_t DECLDIR nvmlVgpuInstanceGetEncoderSessions(nvmlVgpuInstance_t vgpuI
 * For Maxwell &tm; or newer fully supported devices.
 *
 * @param vgpuInstance                      Identifier of the target vGPU instance
-* @param fbcStats                          Reference to nvmlFBCStats_t structure contianing NvFBC stats
+* @param fbcStats                          Reference to nvmlFBCStats_t structure containing NvFBC stats
 *
 * @return
 *         - \ref NVML_SUCCESS                  if \a fbcStats is fetched
@@ -7510,7 +7767,7 @@ nvmlReturn_t DECLDIR nvmlVgpuInstanceGetFBCStats(nvmlVgpuInstance_t vgpuInstance
 * array element count is passed in \a sessionCount, and \a sessionCount is used to return the number of sessions
 * written to the buffer.
 *
-* If the supplied buffer is not large enough to accomodate the active session array, the function returns
+* If the supplied buffer is not large enough to accommodate the active session array, the function returns
 * NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlFBCSessionInfo_t array required in \a sessionCount.
 * To query the number of active FBC sessions, call this function with *sessionCount = 0.  The code will return
 * NVML_SUCCESS with number of active FBC sessions updated in *sessionCount.
@@ -7620,7 +7877,7 @@ typedef struct nvmlVgpuMetadata_st
     char                     guestDriverVersion[NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE]; //!< Version of driver installed in guest
     char                     hostDriverVersion[NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE];  //!< Version of driver installed in host
     unsigned int             reserved[6];                                                //!< Reserved for internal use
-    unsigned int             vgpuVirtualizationCaps;                                     //!< vGPU virtualizaion capabilities bitfileld
+    unsigned int             vgpuVirtualizationCaps;                                     //!< vGPU virtualization capabilities bitfield
     unsigned int             guestVgpuVersion;                                           //!< vGPU version of guest driver
     unsigned int             opaqueDataSize;                                             //!< Size of opaque data field in bytes
     char                     opaqueData[4];                                              //!< Opaque data
@@ -7634,7 +7891,7 @@ typedef struct nvmlVgpuPgpuMetadata_st
     unsigned int            version;                                                    //!< Current version of the structure
     unsigned int            revision;                                                   //!< Current revision of the structure
     char                    hostDriverVersion[NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE];  //!< Host driver version
-    unsigned int            pgpuVirtualizationCaps;                                     //!< Pgpu virtualizaion capabilities bitfileld
+    unsigned int            pgpuVirtualizationCaps;                                     //!< Pgpu virtualization capabilities bitfield
     unsigned int            reserved[5];                                                //!< Reserved for internal use
     nvmlVgpuVersion_t       hostSupportedVgpuRange;                                     //!< vGPU version range supported by host driver
     unsigned int            opaqueDataSize;                                             //!< Size of opaque data field in bytes
@@ -7732,7 +7989,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetVgpuMetadata(nvmlDevice_t device, nvmlVgpuPgpu
  *
  * The caller passes in a buffer via \a compatibilityInfo, into which a compatibility information structure is written. The
  * structure defines the states in which the vGPU / VM may be booted on the physical GPU. If the vGPU / VM compatibility
- * with the physical GPU is limited, a limit code indicates the factor limiting compability.
+ * with the physical GPU is limited, a limit code indicates the factor limiting compatability.
  * (see \ref nvmlVgpuPgpuCompatibilityLimitCode_t for details).
  *
  * Note: vGPU compatibility does not take into account dynamic capacity conditions that may limit a system's ability to
@@ -9022,216 +9279,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetMigDeviceHandleByIndex(nvmlDevice_t device, un
  */
 nvmlReturn_t DECLDIR nvmlDeviceGetDeviceHandleFromMigDeviceHandle(nvmlDevice_t migDevice, nvmlDevice_t *device);
 
-/**
- * Get the type of the GPU Bus (PCIe, PCI, ...)
- *
- * @param device                               The identifier of the target device
- * @param type                                 The PCI Bus type
- *
- * return
- *         - \ref NVML_SUCCESS                 if the bus \a type is successfully retreived
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \device is invalid or \type is NULL
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *type);
-
-/**
- * Retrieve performance monitor samples from the associated subdevice.
- *
- * @param device
- * @param pDynamicPstatesInfo
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a pDynamicPstatesInfo has been set
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a pDynamicPstatesInfo is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetDynamicPstatesInfo(nvmlDevice_t device, nvmlGpuDynamicPstatesInfo_t *pDynamicPstatesInfo);
-
-/**
- * Sets the speed of a specified fan.
- *
- * WARNING: This function changes the fan control policy to manual. It means that YOU have to monitor
- *          the temperature and adjust the fan speed accordingly.
- *          If you set the fan speed too low you can burn your GPU!
- *          Use nvmlDeviceSetDefaultFanSpeed_v2 to restore default control policy.
- *
- * For all cuda-capable discrete products with fans that are Maxwell or Newer.
- *
- * device                                The identifier of the target device
- * fan                                   The index of the fan, starting at zero
- * speed                                 The target speed of the fan [0-100] in % of max speed
- *
- * return
- *        NVML_SUCCESS                   if the fan speed has been set
- *        NVML_ERROR_UNINITIALIZED       if the library has not been successfully initialized
- *        NVML_ERROR_INVALID_ARGUMENT    if the device is not valid, or the speed is outside acceptable ranges,
- *                                              or if the fan index doesn't reference an actual fan.
- *        NVML_ERROR_NOT_SUPPORTED       if the device is older than Maxwell.
- *        NVML_ERROR_UNKNOWN             if there was an unexpected error.
- */
-nvmlReturn_t DECLDIR nvmlDeviceSetFanSpeed_v2(nvmlDevice_t device, unsigned int fan, unsigned int speed);
-
-/**
- * Retrieve the GPCCLK VF offset value
- * @param[in]   device                         The identifier of the target device
- * @param[out]  offset                         The retrieved GPCCLK VF offset value
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetGpcClkVfOffset(nvmlDevice_t device, int *offset);
-
-/**
- * Set the GPCCLK VF offset value
- * @param[in]   device                         The identifier of the target device
- * @param[in]   offset                         The GPCCLK VF offset value to set
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a offset has been set
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceSetGpcClkVfOffset(nvmlDevice_t device, int offset);
-
-/**
- * Retrieve the MemClk (Memory Clock) VF offset value.
- * @param[in]   device                         The identifier of the target device
- * @param[out]  offset                         The retrieved MemClk VF offset value
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetMemClkVfOffset(nvmlDevice_t device, int *offset);
-
-/**
- * Set the MemClk (Memory Clock) VF offset value. It requires elevated privileges.
- * @param[in]   device                         The identifier of the target device
- * @param[in]   offset                         The MemClk VF offset value to set
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a offset has been set
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceSetMemClkVfOffset(nvmlDevice_t device, int offset);
-
-/**
- * Retrieve min and max clocks of some clock domain for a given PState
- *
- * @param device                               The identifier of the target device
- * @param type                                 Clock domain
- * @param pstate                               PState to query
- * @param minClockMHz                          Reference in which to return min clock frequency
- * @param maxClockMHz                          Reference in which to return max clock frequency
- *
- * @return
- *         - \ref NVML_SUCCESS                 if everything worked
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device, \a type or \a pstate are invalid or both
- *                                                  \a minClockMHz and \a maxClockMHz are NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetMinMaxClockOfPState(nvmlDevice_t device, nvmlClockType_t type, nvmlPstates_t pstate,
-                                                      unsigned int * minClockMHz, unsigned int * maxClockMHz);
-
-/**
- * Get all supported Performance States (P-States) for the device.
- *
- * The returned array would contain a contiguous list of valid P-States supported by
- * the device. If the number of supported P-States is fewer than the size of the array
- * supplied missing elements would contain \a NVML_PSTATE_UNKNOWN.
- *
- * The number of elements in the returned list will never exceed \a NVML_MAX_GPU_PERF_PSTATES.
- *
- * @param device                               The identifier of the target device
- * @param pstates                              Container to return the list of performance states
- *                                             supported by device
- * @param size                                 Size of the supplied \a pstates array in bytes
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a pstates array has been retrieved
- *         - \ref NVML_ERROR_INSUFFICIENT_SIZE if the the container supplied was not large enough to
- *                                             hold the resulting list
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device or \a pstates is invalid
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support performance state readings
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetSupportedPerformanceStates(nvmlDevice_t device,
-                                                             nvmlPstates_t *pstates, unsigned int size);
-
-/**
- * Retrieve the GPCCLK min max VF offset value.
- * @param[in]   device                         The identifier of the target device
- * @param[out]  minOffset                      The retrieved GPCCLK VF min offset value
- * @param[out]  maxOffset                      The retrieved GPCCLK VF max offset value
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetGpcClkMinMaxVfOffset(nvmlDevice_t device,
-                                                       int *minOffset, int *maxOffset);
-
-/**
- * Retrieve the MemClk (Memory Clock) min max VF offset value.
- * @param[in]   device                         The identifier of the target device
- * @param[out]  minOffset                      The retrieved MemClk VF min offset value
- * @param[out]  maxOffset                      The retrieved MemClk VF max offset value
- *
- * @return
- *         - \ref NVML_SUCCESS                 if \a offset has been successfully queried
- *         - \ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized
- *         - \ref NVML_ERROR_INVALID_ARGUMENT  if \a device is invalid or \a offset is NULL
- *         - \ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature
- *         - \ref NVML_ERROR_UNKNOWN           on any unexpected error
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetMemClkMinMaxVfOffset(nvmlDevice_t device,
-                                                       int *minOffset, int *maxOffset);
-
-/**
- * Get fabric information associated with the device.
- *
- * %HOPPER_OR_NEWER%
- *
- * On Hopper + NVSwitch systems, GPU is registered with the NVIDIA Fabric Manager
- * Upon successful registration, the GPU is added to the NVLink fabric to enable
- * peer-to-peer communication.
- * This API reports the current state of the GPU in the NVLink fabric
- * along with other useful information.
- *
- * @param device                               The identifier of the target device
- * @param gpuFabricInfo                        Information about GPU fabric state
- *
- * @return
- *         - \ref NVML_SUCCESS                 Upon success
- *         - \ref NVML_ERROR_NOT_SUPPORTED     If \a device doesn't support gpu fabric
- */
-nvmlReturn_t DECLDIR nvmlDeviceGetGpuFabricInfo(nvmlDevice_t device, nvmlGpuFabricInfo_t *gpuFabricInfo);
-
-/** @} */
+/** @} */ // @defgroup nvmlMultiInstanceGPU
 
 /***************************************************************************************************/
 /** @defgroup GPM NVML GPM
diff --git a/src/version.mk b/src/version.mk
index 36f573873ecf76141759e9e85268e2021c2ad673..dae35ac2315e7ed874c063beacadec078b9447d1 100644
--- a/src/version.mk
+++ b/src/version.mk
@@ -1,4 +1,4 @@
-NVIDIA_VERSION = 525.85.05
+NVIDIA_VERSION = 525.147.05
 
 # This file.
 VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))
diff --git a/version.mk b/version.mk
index 36f573873ecf76141759e9e85268e2021c2ad673..dae35ac2315e7ed874c063beacadec078b9447d1 100644
--- a/version.mk
+++ b/version.mk
@@ -1,4 +1,4 @@
-NVIDIA_VERSION = 525.85.05
+NVIDIA_VERSION = 525.147.05
 
 # This file.
 VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))