Index: uspace/lib/c/include/ipc/services.h
===================================================================
--- uspace/lib/c/include/ipc/services.h	(revision ca95ccde2d2ffa7c530aaac0b982f569eaaf95cf)
+++ uspace/lib/c/include/ipc/services.h	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -58,4 +58,5 @@
 #define SERVICE_NAME_DISPLAY  "hid/display"
 #define SERVICE_NAME_WNDMGT   "hid/display"
+#define SERVICE_NAME_HR       "hr"
 #define SERVICE_NAME_DHCP     "net/dhcp"
 #define SERVICE_NAME_DNSR     "net/dnsr"
Index: uspace/lib/device/include/hr.h
===================================================================
--- uspace/lib/device/include/hr.h	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
+++ uspace/lib/device/include/hr.h	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2024 Miroslav Cimerman
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdevice
+ * @{
+ */
+/**
+ * @file
+ */
+
+#ifndef LIBDEVICE_HR_H
+#define LIBDEVICE_HR_H
+
+#include <async.h>
+#include <errno.h>
+#include <loc.h>
+
+typedef struct hr {
+	async_sess_t *sess;
+} hr_t;
+
+typedef enum hr_level {
+	hr_l_0 = 0,
+	hr_l_1 = 1,
+	hr_l_5 = 5,
+	hr_l_linear = 254,
+	hr_l_empty = 255
+} hr_level_t;
+
+typedef struct hr_config {
+	char *name;
+	service_id_t *devs;
+	size_t dev_no;
+	hr_level_t level;
+} hr_config_t;
+
+extern errno_t hr_sess_init(hr_t **);
+extern void hr_sess_destroy(hr_t *);
+
+extern errno_t hr_create(hr_t *, hr_config_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/device/include/ipc/hr.h
===================================================================
--- uspace/lib/device/include/ipc/hr.h	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
+++ uspace/lib/device/include/ipc/hr.h	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2024 Miroslav Cimerman
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdevice
+ * @{
+ */
+/** @file
+ */
+
+#ifndef LIBDEVICE_IPC_HR_H
+#define LIBDEVICE_IPC_HR_H
+
+#include <ipc/common.h>
+
+typedef enum {
+	HR_CREATE = IPC_FIRST_USER_METHOD
+} hr_request_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/device/meson.build
===================================================================
--- uspace/lib/device/meson.build	(revision ca95ccde2d2ffa7c530aaac0b982f569eaaf95cf)
+++ uspace/lib/device/meson.build	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -32,4 +32,5 @@
 	'src/devman.c',
 	'src/device/led_dev.c',
+	'src/hr.c',
 	'src/io/chardev.c',
 	'src/io/chardev_srv.c',
Index: uspace/lib/device/src/hr.c
===================================================================
--- uspace/lib/device/src/hr.c	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
+++ uspace/lib/device/src/hr.c	(revision 12cbf25eb6600e54e4225574fff10dbd9b607c16)
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2024 Miroslav Cimerman
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdevice
+ * @{
+ */
+/**
+ * @file
+ */
+
+#include <abi/ipc/interfaces.h>
+#include <async.h>
+#include <hr.h>
+#include <ipc/hr.h>
+#include <ipc/services.h>
+#include <loc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <str.h>
+
+errno_t hr_sess_init(hr_t **rhr)
+{
+	errno_t rc;
+
+	hr_t *hr = calloc(1, sizeof(hr_t));
+	if (hr == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	service_id_t hr_svcid;
+
+	rc = loc_service_get_id(SERVICE_NAME_HR, &hr_svcid, IPC_FLAG_BLOCKING);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
+	hr->sess = loc_service_connect(hr_svcid, INTERFACE_HR,
+	    IPC_FLAG_BLOCKING);
+	if (hr->sess == NULL) {
+		rc = EIO;
+		goto error;
+	}
+
+	*rhr = hr;
+	return EOK;
+error:
+	if (hr != NULL)
+		free(hr);
+	*rhr = NULL;
+	return rc;
+}
+
+void hr_sess_destroy(hr_t *hr)
+{
+	if (hr == NULL)
+		return;
+
+	async_hangup(hr->sess);
+	free(hr);
+}
+
+errno_t hr_create(hr_t *hr, hr_config_t *hr_config)
+{
+	errno_t rc, retval;
+	async_exch_t *exch;
+	aid_t req;
+
+	exch = async_exchange_begin(hr->sess);
+	if (exch == NULL) {
+		return EINVAL;
+	}
+
+	req = async_send_1(exch, HR_CREATE, hr_config->level, NULL);
+
+	rc = async_data_write_start(exch, hr_config->name,
+	    str_size(hr_config->name));
+	if (rc != EOK) {
+		async_exchange_end(exch);
+		async_forget(req);
+		return rc;
+	}
+
+	rc = async_data_write_start(exch, hr_config->devs,
+	    sizeof(service_id_t) * hr_config->dev_no);
+	if (rc != EOK) {
+		async_exchange_end(exch);
+		async_forget(req);
+		return rc;
+	}
+
+	async_exchange_end(exch);
+	async_wait_for(req, &retval);
+	if (retval != EOK)
+		return retval;
+
+	return EOK;
+}
+
+/** @}
+ */
