diff --git a/0018-nvme-TP4126-fixes-1.patch b/0018-nvme-TP4126-fixes-1.patch
index 1614696..f0cde69 100644
--- a/0018-nvme-TP4126-fixes-1.patch
+++ b/0018-nvme-TP4126-fixes-1.patch
@@ -23,7 +23,7 @@ index 17bead15e..5ac41cffa 100644
 -from . import util
 +
 +import gi
-+gi.require_version("BlockDev", "3.0")
++gi.require_version("BlockDev", "2.0")
 +
 +from gi.repository import BlockDev as blockdev
  
diff --git a/0019-nvme-hostnqn_from_active_fabrics_connection.patch b/0019-nvme-hostnqn_from_active_fabrics_connection.patch
new file mode 100644
index 0000000..6115340
--- /dev/null
+++ b/0019-nvme-hostnqn_from_active_fabrics_connection.patch
@@ -0,0 +1,58 @@
+From 63da3cb8a40500c889c8faa4326f81d16997a3c8 Mon Sep 17 00:00:00 2001
+From: Tomas Bzatek <tbzatek@redhat.com>
+Date: Mon, 27 Nov 2023 18:55:55 +0100
+Subject: [PATCH] nvme: Retrieve HostNQN from a first active fabrics connection
+
+When no /etc/hostnqn exists, look for any active NVMe over Fabrics
+connections and take the values from a first one, rather than
+generating new ones.
+---
+ blivet/nvme.py | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+diff --git a/blivet/nvme.py b/blivet/nvme.py
+index 5ac41cffa..2e4686e68 100644
+--- a/blivet/nvme.py
++++ b/blivet/nvme.py
+@@ -18,6 +18,7 @@
+ #
+ 
+ import os
++import glob
+ 
+ from . import errors
+ 
+@@ -54,6 +55,22 @@ def __call__(self):
+     def __deepcopy__(self, memo_dict):  # pylint: disable=unused-argument
+         return self
+ 
++    def _retrieve_fabrics_hostnqn(self):
++        for d in glob.glob('/sys/class/nvme-fabrics/ctl/nvme*/'):
++            try:
++                # invalidate old values
++                self._hostnqn = None
++                self._hostid = None
++                # read from sysfs
++                with open(os.path.join(d, 'hostnqn')) as f:
++                    self._hostnqn = f.readline().strip()
++                with open(os.path.join(d, 'hostid')) as f:
++                    self._hostid = f.readline().strip()
++                if self._hostnqn:
++                    break
++            except Exception:  # pylint: disable=broad-except
++                pass
++
+     def startup(self):
+         if self.started:
+             return
+@@ -61,6 +78,10 @@ def startup(self):
+         self._hostnqn = blockdev.nvme_get_host_nqn()
+         self._hostid = blockdev.nvme_get_host_id()
+         if not self._hostnqn:
++            # see if there are any active fabrics connections and take their values over
++            self._retrieve_fabrics_hostnqn()
++        if not self._hostnqn:
++            # generate new values
+             self._hostnqn = blockdev.nvme_generate_host_nqn()
+         if not self._hostnqn:
+             raise errors.NVMeError("Failed to generate HostNQN")
diff --git a/0020-nvme-add_unit_tests.patch b/0020-nvme-add_unit_tests.patch
new file mode 100644
index 0000000..aaf9df2
--- /dev/null
+++ b/0020-nvme-add_unit_tests.patch
@@ -0,0 +1,67 @@
+From c807e234dfd07f3d0005c71501f0300284cd580b Mon Sep 17 00:00:00 2001
+From: Vojtech Trefny <vtrefny@redhat.com>
+Date: Wed, 6 Dec 2023 11:47:31 +0100
+Subject: [PATCH] tests: Add a simple unit test for the NVMe module
+
+---
+ tests/unit_tests/__init__.py  |  1 +
+ tests/unit_tests/nvme_test.py | 38 +++++++++++++++++++++++++++++++++++
+ 2 files changed, 39 insertions(+)
+ create mode 100644 tests/unit_tests/nvme_test.py
+
+diff --git a/tests/unit_tests/__init__.py b/tests/unit_tests/__init__.py
+index 589366e0f..62bef67f5 100644
+--- a/tests/unit_tests/__init__.py
++++ b/tests/unit_tests/__init__.py
+@@ -9,6 +9,7 @@
+ from .devicetree_test import *
+ from .events_test import *
+ from .misc_test import *
++from .nvme_test import *
+ from .parentlist_test import *
+ from .populator_test import *
+ from .size_test import *
+diff --git a/tests/unit_tests/nvme_test.py b/tests/unit_tests/nvme_test.py
+new file mode 100644
+index 000000000..cb948687f
+--- /dev/null
++++ b/tests/unit_tests/nvme_test.py
+@@ -0,0 +1,38 @@
++import unittest
++
++try:
++    from unittest.mock import patch
++except ImportError:
++    from mock import patch
++
++from blivet.nvme import nvme
++
++
++class NVMeModuleTestCase(unittest.TestCase):
++
++    host_nqn = "nqn.2014-08.org.nvmexpress:uuid:01234567-8900-abcd-efff-abcdabcdabcd"
++
++    @patch("blivet.nvme.os")
++    @patch("blivet.nvme.blockdev")
++    def test_nvme_module(self, bd, os):
++        self.assertIsNotNone(nvme)
++        bd.nvme_get_host_nqn.return_value = self.host_nqn
++        bd.nvme_get_host_id.return_value = None  # None = generate from host_nqn
++        os.path.isdir.return_value = False
++
++        # startup
++        with patch.object(nvme, "write") as write:
++            nvme.startup()
++            write.assert_called_once_with("/", overwrite=False)
++
++        self.assertTrue(nvme.started)
++        self.assertEqual(nvme._hostnqn, self.host_nqn)
++        self.assertEqual(nvme._hostid, "01234567-8900-abcd-efff-abcdabcdabcd")
++
++        # write
++        with patch("blivet.nvme.open") as op:
++            nvme.write("/test")
++
++            os.makedirs.assert_called_with("/test/etc/nvme/", 0o755)
++            op.assert_any_call("/test/etc/nvme/hostnqn", "w")
++            op.assert_any_call("/test/etc/nvme/hostid", "w")
diff --git a/python-blivet.spec b/python-blivet.spec
index 93dbee0..de6a0fe 100644
--- a/python-blivet.spec
+++ b/python-blivet.spec
@@ -23,7 +23,7 @@ Version: 3.6.0
 
 #%%global prerelease .b2
 # prerelease, if defined, should be something like .a1, .b1, .b2.dev1, or .c2
-Release: 10%{?prerelease}%{?dist}
+Release: 11%{?prerelease}%{?dist}
 Epoch: 1
 License: LGPLv2+
 %global realname blivet
@@ -48,6 +48,8 @@ Patch14: 0015-Add-support-for-filesystem-online-resize.patch
 Patch15: 0016-Backport-iSCSI-initiator-name-related-fixes.patch
 Patch16: 0017-nvme-additional-rpms-for-dracut.patch
 Patch17: 0018-nvme-TP4126-fixes-1.patch
+Patch18: 0019-nvme-hostnqn_from_active_fabrics_connection.patch
+Patch19: 0020-nvme-add_unit_tests.patch
 
 # Versions of required components (done so we make sure the buildrequires
 # match the requires versions of things).
@@ -211,6 +213,10 @@ configuration.
 %endif
 
 %changelog
+* Mon Dec 11 2023 Tomas Bzatek <tbzatek@redhat.com> - 3.6.0-11
+- nvme: Retrieve HostNQN from a first active fabrics connection
+- tests: Add a simple unit test for the NVMe module
+  Resolves: RHEL-11541
 
 * Tue Sep 26 2023 Tomas Bzatek <tbzatek@redhat.com> - 3.6.0-10
 - nvme: Require additional rpms for dracut