diff --git a/src/include/libpmem2.h b/src/include/libpmem2.h
index 752fb1cca74d02f7a1e83f8f65f2c8c494ccb642..4d2e6027cf4bd0d712757484f9292146f2d5abcc 100644
--- a/src/include/libpmem2.h
+++ b/src/include/libpmem2.h
@@ -70,6 +70,7 @@ extern "C" {
 #define PMEM2_E_NO_ACCESS			(-100032)
 #define PMEM2_E_VM_RESERVATION_NOT_EMPTY	(-100033)
 #define PMEM2_E_MAP_EXISTS			(-100034)
+#define PMEM2_E_FILE_DESCRIPTOR_NOT_SET		(-100035)
 
 /* source setup */
 
@@ -79,6 +80,9 @@ int pmem2_source_from_fd(struct pmem2_source **src, int fd);
 int pmem2_source_from_anon(struct pmem2_source **src, size_t size);
 #ifdef _WIN32
 int pmem2_source_from_handle(struct pmem2_source **src, HANDLE handle);
+int pmem2_source_get_handle(const struct pmem2_source *src, HANDLE *h);
+#else
+int pmem2_source_get_fd(const struct pmem2_source *src, int *fd);
 #endif
 
 int pmem2_source_size(const struct pmem2_source *src, size_t *size);
diff --git a/src/libpmem2/libpmem2.def b/src/libpmem2/libpmem2.def
index c8bdbc39d9a68857a55200225a398d37fa22ee33..ccda52c7258a514d2d52d2ff0bbbe5d610093745 100644
--- a/src/libpmem2/libpmem2.def
+++ b/src/libpmem2/libpmem2.def
@@ -45,6 +45,7 @@ EXPORTS
 	pmem2_source_from_anon
 	pmem2_source_from_fd
 	pmem2_source_from_handle
+	pmem2_source_get_handle
 	pmem2_source_size
 	pmem2_vm_reservation_delete
 	pmem2_vm_reservation_get_address
diff --git a/src/libpmem2/libpmem2.link.in b/src/libpmem2/libpmem2.link.in
index 0bb0edafed1995fd4c3354882a602dd377466bb5..320b7e7e35a02e00db58cc7f2a5c10b6d1c38f3f 100644
--- a/src/libpmem2/libpmem2.link.in
+++ b/src/libpmem2/libpmem2.link.in
@@ -40,6 +40,7 @@ LIBPMEM2_1.0 {
 		pmem2_source_from_anon;
 		pmem2_source_from_fd;
 		pmem2_source_from_handle;
+		pmem2_source_get_fd;
 		pmem2_source_size;
 		pmem2_vm_reservation_delete;
 		pmem2_vm_reservation_get_address;
diff --git a/src/libpmem2/source_posix.c b/src/libpmem2/source_posix.c
index 422d48d9f568a5d373d53fb59dfec82a59a3c516..92f618609776dc6b7e201c6113eb5f55379b7192 100644
--- a/src/libpmem2/source_posix.c
+++ b/src/libpmem2/source_posix.c
@@ -174,3 +174,23 @@ pmem2_source_alignment(const struct pmem2_source *src, size_t *alignment)
 
 	return 0;
 }
+
+/*
+ * pmem2_source_get_fd -- get file descriptor from provided source
+ */
+int
+pmem2_source_get_fd(const struct pmem2_source *src, int *fd)
+{
+	LOG(3, "src type %d", src->type);
+	PMEM2_ERR_CLR();
+
+	if (src->type == PMEM2_SOURCE_FD) {
+		*fd = src->value.fd;
+	} else {
+		ERR(
+			"File descriptor is not set, source type does not support fd");
+		return PMEM2_E_FILE_DESCRIPTOR_NOT_SET;
+	}
+
+	return 0;
+}
diff --git a/src/libpmem2/source_windows.c b/src/libpmem2/source_windows.c
index ea7d03a9011c40a20c921fb2592ca82dc143b3b3..fb813273e9c454d147024e80c157a81315476f0e 100644
--- a/src/libpmem2/source_windows.c
+++ b/src/libpmem2/source_windows.c
@@ -161,3 +161,23 @@ pmem2_source_alignment(const struct pmem2_source *src, size_t *alignment)
 
 	return 0;
 }
+
+/*
+ * pmem2_source_get_handle -- get file handler from provided source
+ */
+int
+pmem2_source_get_handle(const struct pmem2_source *src, HANDLE *h)
+{
+	LOG(3, "src type %d", src->type);
+	PMEM2_ERR_CLR();
+
+	if (src->type == PMEM2_SOURCE_HANDLE) {
+		*h = src->value.handle;
+	} else {
+		ERR(
+			"File handle is not set, source type does not support file handles");
+		return PMEM2_E_FILE_HANDLE_NOT_SET;
+	}
+
+	return 0;
+}
diff --git a/src/test/scope/out13.log.match b/src/test/scope/out13.log.match
index 8a9fdb4b0f48e8b1c9a219e1d41937bf34073001..0bf8d66c22b8a8202b44b3f0ff97eed8a9270ca2 100644
--- a/src/test/scope/out13.log.match
+++ b/src/test/scope/out13.log.match
@@ -31,6 +31,7 @@ pmem2_source_device_id$(nW)
 pmem2_source_device_usc$(nW)
 pmem2_source_from_anon$(nW)
 pmem2_source_from_fd$(nW)
+pmem2_source_get_fd$(nW)
 pmem2_source_size$(nW)
 pmem2_vm_reservation_delete$(nW)
 pmem2_vm_reservation_get_address$(nW)
diff --git a/src/test/scope/out14.log.match b/src/test/scope/out14.log.match
index eb93f12f1c7f112208e2d82bcfbdeacb34a65e40..3c80cd7997e39d07d5ba482a495e23895eed1658 100644
--- a/src/test/scope/out14.log.match
+++ b/src/test/scope/out14.log.match
@@ -36,6 +36,7 @@ pmem2_source_device_usc
 pmem2_source_from_anon
 pmem2_source_from_fd
 pmem2_source_from_handle
+pmem2_source_get_handle
 pmem2_source_size
 pmem2_vm_reservation_delete
 pmem2_vm_reservation_get_address