diff -U 3 -dHrN a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt	2025-08-21 16:22:49.000000000 +0200
+++ b/CMakeLists.txt	2025-08-28 09:40:46.121888001 +0200
@@ -98,6 +98,7 @@
 OPTION(INDI_INSTALL_UDEV_RULES "Install INDI udev rules" ON)
 
 # System provided or bundled libs
+OPTION(INDI_SYSTEM_HIDAPILIB "Use system provided hidapilib" OFF)
 OPTION(INDI_SYSTEM_HTTPLIB "Use system provided httplib" OFF)
 OPTION(INDI_SYSTEM_JSONLIB "Use system provided json library" OFF)
 
@@ -173,6 +174,19 @@
 # ##################################################################################################
 # ####################################  bundled libs  ##############################################
 # ##################################################################################################
+if(INDI_SYSTEM_HIDAPILIB)
+    find_package(hidapi REQUIRED)
+    set(SYSTEM_HIDAPILIB 1)
+    set(HIDAPILIB hidapi::libusb)
+    add_definitions(-D_USE_SYSTEM_HIDAPILIB)
+    message(STATUS "Using system provided hidapilib version ${hidapi_VERSION_STR}")
+else()
+    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs/hid)
+    set(SYSTEM_HIDAPILIB 0)
+    set(HIDAPILIB indi_hid)
+    message(STATUS "Using bundled hidapi")
+endif(INDI_SYSTEM_HIDAPILIB)
+
 if(INDI_SYSTEM_HTTPLIB)
     find_package(httplib REQUIRED)
     include_directories(${HTTPLIB_INCLUDE_DIR})
@@ -316,7 +330,9 @@
         add_subdirectory(libs/eventloop)
         add_subdirectory(libs/dsp)
         add_subdirectory(libs/fpack)
-        add_subdirectory(libs/hid)
+        if(NOT SYSTEM_HIDAPILIB)
+            add_subdirectory(libs/hid)
+        endif(NOT SYSTEM_HIDAPILIB)
 
         # #################################################
         # ########## INDI Driver Library ##################
diff -U 3 -dHrN a/drivers/focuser/activefocuser.h b/drivers/focuser/activefocuser.h
--- a/drivers/focuser/activefocuser.h	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/activefocuser.h	2025-08-28 09:17:55.589714091 +0200
@@ -20,7 +20,13 @@
 #include <cstring>
 #include <sstream>
 #include <unistd.h>
-#include "hidapi.h"
+
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
+
 #include "indifocuser.h"
 
 class ActiveFocuser : public INDI::Focuser
diff -U 3 -dHrN a/drivers/focuser/activefocuser_utils.h b/drivers/focuser/activefocuser_utils.h
--- a/drivers/focuser/activefocuser_utils.h	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/activefocuser_utils.h	2025-08-28 09:18:12.886106273 +0200
@@ -23,7 +23,13 @@
 
 #include <map>
 #include <string>
-#include <hidapi.h>
+
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
+
 #include <mutex>
 #include <future>
 #include <cstring>
@@ -130,4 +136,4 @@
         ~ActiveFocuserUtils() = delete;
         void operator=(const ActiveFocuserUtils &) = delete;
 
-};
\ Manca newline alla fine del file
+};
diff -U 3 -dHrN a/drivers/focuser/CMakeLists.txt b/drivers/focuser/CMakeLists.txt
--- a/drivers/focuser/CMakeLists.txt	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/CMakeLists.txt	2025-08-28 09:21:27.823380911 +0200
@@ -29,7 +29,7 @@
     fcusb.cpp)
 
 add_executable(indi_fcusb_focus ${fcusb_SRC})
-target_link_libraries(indi_fcusb_focus indidriver)
+target_link_libraries(indi_fcusb_focus indidriver ${HIDAPILIB})
 install(TARGETS indi_fcusb_focus RUNTIME DESTINATION bin)
 
 # ############### Rigelsys NFocus Focuser ################
@@ -180,7 +180,7 @@
 # focusmaster.cpp)
 
 # add_executable(indi_focusmaster_focus ${focusmaster_SRC})
-# target_link_libraries(indi_focusmaster_focus indidriver)
+# target_link_libraries(indi_focusmaster_focus indidriver ${HIDAPILIB})
 # install(TARGETS indi_focusmaster_focus RUNTIME DESTINATION bin)
 
 # ############### RainbowAstro RSF Focuser ################
@@ -310,7 +310,7 @@
     perfectstar.cpp)
 
 add_executable(indi_perfectstar_focus ${perfectstar_SRC})
-target_link_libraries(indi_perfectstar_focus indidriver)
+target_link_libraries(indi_perfectstar_focus indidriver ${HIDAPILIB})
 install(TARGETS indi_perfectstar_focus RUNTIME DESTINATION bin)
 
 # ############### Starlight Instruments EFS ################
@@ -318,7 +318,7 @@
     si_efs.cpp)
 
 add_executable(indi_siefs_focus ${siefs_SRC})
-target_link_libraries(indi_siefs_focus indidriver)
+target_link_libraries(indi_siefs_focus indidriver ${HIDAPILIB})
 install(TARGETS indi_siefs_focus RUNTIME DESTINATION bin)
 
 # ############### hitechfocus Focuser ################
@@ -326,7 +326,7 @@
     hitecastrodcfocuser.cpp)
 
 add_executable(indi_hitecastrodc_focus ${hitecastrodcfocuser_SRC})
-target_link_libraries(indi_hitecastrodc_focus indidriver)
+target_link_libraries(indi_hitecastrodc_focus indidriver ${HIDAPILIB})
 install(TARGETS indi_hitecastrodc_focus RUNTIME DESTINATION bin)
 
 # ############### DeepSky Dad AF1 ################
@@ -398,5 +398,5 @@
 
 add_executable(indi_activefocuser_focus ${activefocuser_SRC})
 
-target_link_libraries(indi_activefocuser_focus indidriver)
+target_link_libraries(indi_activefocuser_focus indidriver ${HIDAPILIB})
 install(TARGETS indi_activefocuser_focus RUNTIME DESTINATION bin)
diff -U 3 -dHrN a/drivers/focuser/fcusb.h b/drivers/focuser/fcusb.h
--- a/drivers/focuser/fcusb.h	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/fcusb.h	2025-08-28 09:18:19.927458679 +0200
@@ -21,7 +21,13 @@
 #pragma once
 
 #include "indifocuser.h"
-#include "hidapi.h"
+
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
+
 
 #include <map>
 
diff -U 3 -dHrN a/drivers/focuser/hitecastrodcfocuser.h b/drivers/focuser/hitecastrodcfocuser.h
--- a/drivers/focuser/hitecastrodcfocuser.h	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/hitecastrodcfocuser.h	2025-08-28 09:18:46.077956748 +0200
@@ -20,7 +20,12 @@
 
 #pragma once
 
-#include "hidapi.h"
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
+
 #include "indifocuser.h"
 #include "indiusbdevice.h"
 
diff -U 3 -dHrN a/drivers/focuser/perfectstar.h b/drivers/focuser/perfectstar.h
--- a/drivers/focuser/perfectstar.h	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/perfectstar.h	2025-08-28 09:18:54.070901012 +0200
@@ -21,7 +21,12 @@
 #pragma once
 
 #include "indifocuser.h"
-#include "hidapi.h"
+
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
 
 class PerfectStar : public INDI::Focuser
 {
diff -U 3 -dHrN a/drivers/focuser/si_efs.h b/drivers/focuser/si_efs.h
--- a/drivers/focuser/si_efs.h	2025-08-21 16:22:49.000000000 +0200
+++ b/drivers/focuser/si_efs.h	2025-08-28 09:19:03.526234039 +0200
@@ -21,7 +21,12 @@
 #pragma once
 
 #include "indifocuser.h"
-#include "hidapi.h"
+
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
 
 #include <map>
 
diff -U 3 -dHrN a/libs/hid/CMakeLists.txt b/libs/hid/CMakeLists.txt
--- a/libs/hid/CMakeLists.txt	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/hid/CMakeLists.txt	2025-08-28 09:31:09.700850665 +0200
@@ -1,11 +1,11 @@
 cmake_minimum_required(VERSION 3.13)
-project(hid C)
+project(indi_hid C)
 
 add_library(${PROJECT_NAME} OBJECT "")
 
 # Headers
 list(APPEND ${PROJECT_NAME}_HEADERS
-    hidapi.h
+    indi_hidapi.h
 )
 
 list(APPEND ${PROJECT_NAME}_PRIVATE_HEADERS
@@ -48,5 +48,5 @@
 endif()
 
 add_executable(indi_hid_test hidtest.cpp)
-target_link_libraries(indi_hid_test hid ${USB1_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${LIBS})
+target_link_libraries(indi_hid_test indi_hid ${USB1_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${LIBS})
 install(TARGETS indi_hid_test RUNTIME DESTINATION bin)
diff -U 3 -dHrN a/libs/hid/hidapi.h b/libs/hid/hidapi.h
--- a/libs/hid/hidapi.h	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/hid/hidapi.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,387 +0,0 @@
-/*
- HIDAPI - Multi-Platform library for communication with HID devices.
-
- Copyright (c) 2009 by Alan Ott, Signal 11 Software (8/22/2009)
- All Rights Reserved.
-
- Changes for use with SX Filter Wheel INDI Driver by CloudMakers - 11/6/2012
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- more details.
-
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
- The full GNU General Public License is included in this distribution in the
- file called LICENSE.
-
- These files may also be found in the public source code repository located:
- http://github.com/signal11/hidapi
-*/
-
-/** @file
- * @defgroup API hidapi API
- */
-
-#pragma once
-
-#include <wchar.h>
-
-#ifdef _WIN32
-#define HID_API_EXPORT __declspec(dllexport)
-#define HID_API_CALL
-#else
-#define HID_API_EXPORT /**< API export macro */
-#define HID_API_CALL   /**< API call macro */
-#endif
-
-#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-struct hid_device_;
-typedef struct hid_device_ hid_device; /**< opaque hidapi structure */
-
-/** hidapi info structure */
-struct hid_device_info
-{
-    /** Platform-specific device path */
-    char *path;
-    /** Device Vendor ID */
-    unsigned short vendor_id;
-    /** Device Product ID */
-    unsigned short product_id;
-    /** Serial Number */
-    wchar_t *serial_number;
-    /** Device Release Number in binary-coded decimal,
-        also known as Device Version Number */
-    unsigned short release_number;
-    /** Manufacturer String */
-    wchar_t *manufacturer_string;
-    /** Product string */
-    wchar_t *product_string;
-    /** Usage Page for this Device/Interface
-        (Windows/Mac only). */
-    unsigned short usage_page;
-    /** Usage for this Device/Interface
-        (Windows/Mac only).*/
-    unsigned short usage;
-    /** The USB interface which this logical device
-        represents. Valid on both Linux implementations
-        in all cases, and valid on the Windows implementation
-        only if the device contains more than one interface. */
-    int interface_number;
-
-    /** Pointer to the next device */
-    struct hid_device_info *next;
-};
-
-/** @brief Initialize the HIDAPI library.
-
-	This function initializes the HIDAPI library. Calling it is not
-	strictly necessary, as it will be called automatically by
-	hid_enumerate() and any of the hid_open_*() functions if it is
-	needed.  This function should be called at the beginning of
-	execution however, if there is a chance of HIDAPI handles
-	being opened by different threads simultaneously.
-
-	@ingroup API
-
-	@returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_init();
-
-/** @brief Finalize the HIDAPI library.
-
-	This function frees all of the static data associated with
-	HIDAPI. It should be called at the end of execution to avoid
-	memory leaks.
-
-	@ingroup API
-
-    @returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_exit();
-
-/** @brief Enumerate the HID Devices.
-
-	This function returns a linked list of all the HID devices
-	attached to the system which match vendor_id and product_id.
-	If @p vendor_id and @p product_id are both set to 0, then
-	all HID devices will be returned.
-
-	@ingroup API
-	@param vendor_id The Vendor ID (VID) of the types of device
-		to open.
-	@param product_id The Product ID (PID) of the types of
-		device to open.
-
-    @returns
-    	This function returns a pointer to a linked list of type
-    	struct #hid_device, containing information about the HID devices
-    	attached to the system, or NULL in the case of failure. Free
-    	this linked list by calling hid_free_enumeration().
-*/
-struct hid_device_info HID_API_EXPORT *HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
-
-/** @brief Free an enumeration Linked List
-
-    This function frees a linked list created by hid_enumerate().
-
-	@ingroup API
-    @param devs Pointer to a list of struct_device returned from
-    	      hid_enumerate().
-*/
-void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs);
-
-/** @brief Open a HID device using a Vendor ID (VID), Product ID
-	(PID) and optionally a serial number.
-
-	If @p serial_number is NULL, the first device with the
-	specified VID and PID is opened.
-
-	@ingroup API
-	@param vendor_id The Vendor ID (VID) of the device to open.
-	@param product_id The Product ID (PID) of the device to open.
-	@param serial_number The Serial Number of the device to open
-		               (Optionally NULL).
-
-	@returns
-		This function returns a pointer to a #hid_device object on
-		success or NULL on failure.
-*/
-HID_API_EXPORT hid_device *HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id,
-        const wchar_t *serial_number);
-
-/** @brief Open a HID device by its path name.
-
-	The path name be determined by calling hid_enumerate(), or a
-	platform-specific path name can be used (eg: /dev/hidraw0 on
-	Linux).
-
-	@ingroup API
-    @param path The path name of the device to open
-
-	@returns
-		This function returns a pointer to a #hid_device object on
-		success or NULL on failure.
-*/
-HID_API_EXPORT hid_device *HID_API_CALL hid_open_path(const char *path);
-
-/** @brief Write an Output report to a HID device.
-
-	The first byte of @p data[] must contain the Report ID. For
-	devices which only support a single report, this must be set
-	to 0x0. The remaining bytes contain the report data. Since
-	the Report ID is mandatory, calls to hid_write() will always
-	contain one more byte than the report contains. For example,
-	if a hid report is 16 bytes long, 17 bytes must be passed to
-	hid_write(), the Report ID (or 0x0, for devices with a
-	single report), followed by the report data (16 bytes). In
-	this example, the length passed in would be 17.
-
-	hid_write() will send the data on the first OUT endpoint, if
-	one exists. If it does not, it will send the data through
-	the Control Endpoint (Endpoint 0).
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param data The data to send, including the report number as
-		the first byte.
-	@param length The length in bytes of the data to send.
-
-	@returns
-		This function returns the actual number of bytes written and
-		-1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length);
-
-/** @brief Read an Input report from a HID device with timeout.
-
-	Input reports are returned
-	to the host through the INTERRUPT IN endpoint. The first byte will
-	contain the Report number if the device uses numbered reports.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param data A buffer to put the read data into.
-	@param length The number of bytes to read. For devices with
-		multiple reports, make sure to read an extra byte for
-		the report number.
-	@param milliseconds timeout in milliseconds or -1 for blocking wait.
-
-	@returns
-		This function returns the actual number of bytes read and
-		-1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);
-
-/** @brief Read an Input report from a HID device.
-
-	Input reports are returned
-    to the host through the INTERRUPT IN endpoint. The first byte will
-	contain the Report number if the device uses numbered reports.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param data A buffer to put the read data into.
-	@param length The number of bytes to read. For devices with
-		multiple reports, make sure to read an extra byte for
-		the report number.
-
-	@returns
-		This function returns the actual number of bytes read and
-		-1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);
-
-/** @brief Set the device handle to be non-blocking.
-
-	In non-blocking mode calls to hid_read() will return
-	immediately with a value of 0 if there is no data to be
-	read. In blocking mode, hid_read() will wait (block) until
-	there is data to read before returning.
-
-	Nonblocking can be turned on and off at any time.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param nonblock enable or not the nonblocking reads
-	 - 1 to enable nonblocking
-	 - 0 to disable nonblocking.
-
-	@returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock);
-
-/** @brief Send a Feature report to the device.
-
-	Feature reports are sent over the Control endpoint as a
-	Set_Report transfer.  The first byte of @p data[] must
-	contain the Report ID. For devices which only support a
-	single report, this must be set to 0x0. The remaining bytes
-	contain the report data. Since the Report ID is mandatory,
-	calls to hid_send_feature_report() will always contain one
-	more byte than the report contains. For example, if a hid
-	report is 16 bytes long, 17 bytes must be passed to
-	hid_send_feature_report(): the Report ID (or 0x0, for
-	devices which do not use numbered reports), followed by the
-	report data (16 bytes). In this example, the length passed
-	in would be 17.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param data The data to send, including the report number as
-		the first byte.
-	@param length The length in bytes of the data to send, including
-		the report number.
-
-	@returns
-		This function returns the actual number of bytes written and
-		-1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length);
-
-/** @brief Get a feature report from a HID device.
-
-	Make sure to set the first byte of @p data[] to the Report
-	ID of the report to be read.  Make sure to allow space for
-	this extra byte in @p data[].
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param data A buffer to put the read data into, including
-		the Report ID. Set the first byte of @p data[] to the
-		Report ID of the report to be read.
-	@param length The number of bytes to read, including an
-		extra byte for the report ID. The buffer can be longer
-		than the actual report.
-
-	@returns
-		This function returns the number of bytes read and
-		-1 on error.
-*/
-int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);
-
-/** @brief Close a HID device.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-*/
-void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device);
-
-/** @brief Get The Manufacturer String from a HID device.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param string A wide string buffer to put the data into.
-	@param maxlen The length of the buffer in multiples of wchar_t.
-
-	@returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen);
-
-/** @brief Get The Product String from a HID device.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param string A wide string buffer to put the data into.
-	@param maxlen The length of the buffer in multiples of wchar_t.
-
-	@returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen);
-
-/** @brief Get The Serial Number String from a HID device.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param string A wide string buffer to put the data into.
-	@param maxlen The length of the buffer in multiples of wchar_t.
-
-	@returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen);
-
-/** @brief Get a string from a HID device, based on its string index.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-	@param string_index The index of the string to get.
-	@param string A wide string buffer to put the data into.
-	@param maxlen The length of the buffer in multiples of wchar_t.
-
-	@returns
-		This function returns 0 on success and -1 on error.
-*/
-int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen);
-
-/** @brief Get a string describing the last error which occurred.
-
-	@ingroup API
-	@param device A device handle returned from hid_open().
-
-	@returns
-		This function returns a string containing the last error
-		which occurred or NULL if none has occurred.
-*/
-HID_API_EXPORT const wchar_t *HID_API_CALL hid_error(hid_device *device);
-
-#ifdef __cplusplus
-}
-#endif
diff -U 3 -dHrN a/libs/hid/hid_libusb.c b/libs/hid/hid_libusb.c
--- a/libs/hid/hid_libusb.c	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/hid/hid_libusb.c	2025-08-28 09:16:07.756897882 +0200
@@ -33,7 +33,7 @@
 
 #define _GNU_SOURCE // needed for wcsdup() before glibc 2.10
 
-#include "hidapi.h"
+#include "indi_hidapi.h"
 #include "locale_compat.h"
 
 /* GNU / LibUSB */
diff -U 3 -dHrN a/libs/hid/hid_mac.c b/libs/hid/hid_mac.c
--- a/libs/hid/hid_mac.c	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/hid/hid_mac.c	2025-08-28 09:16:15.136525044 +0200
@@ -29,7 +29,7 @@
 
 /* See Apple Technical Note TN2187 for details on IOHidManager. */
 
-#include "hidapi.h"
+#include "indi_hidapi.h"
 
 #include <IOKit/hid/IOHIDManager.h>
 #include <IOKit/hid/IOHIDKeys.h>
diff -U 3 -dHrN a/libs/hid/hidtest.cpp b/libs/hid/hidtest.cpp
--- a/libs/hid/hidtest.cpp	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/hid/hidtest.cpp	2025-08-28 09:16:36.357838345 +0200
@@ -18,7 +18,7 @@
 #include <wchar.h>
 #include <string.h>
 #include <stdlib.h>
-#include "hidapi.h"
+#include "indi_hidapi.h"
 
 // Headers needed for sleeping.
 #ifdef _WIN32
diff -U 3 -dHrN a/libs/hid/hid_win.c b/libs/hid/hid_win.c
--- a/libs/hid/hid_win.c	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/hid/hid_win.c	2025-08-28 09:16:29.413420865 +0200
@@ -65,7 +65,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "hidapi.h"
+#include "indi_hidapi.h"
 
 #ifdef _MSC_VER
 // Thanks Microsoft, but I know how to use strncpy().
diff -U 3 -dHrN a/libs/hid/indi_hidapi.h b/libs/hid/indi_hidapi.h
--- a/libs/hid/indi_hidapi.h	1970-01-01 01:00:00.000000000 +0100
+++ b/libs/hid/indi_hidapi.h	2025-08-21 16:22:49.000000000 +0200
@@ -0,0 +1,387 @@
+/*
+ HIDAPI - Multi-Platform library for communication with HID devices.
+
+ Copyright (c) 2009 by Alan Ott, Signal 11 Software (8/22/2009)
+ All Rights Reserved.
+
+ Changes for use with SX Filter Wheel INDI Driver by CloudMakers - 11/6/2012
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ more details.
+
+ You should have received a copy of the GNU General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ The full GNU General Public License is included in this distribution in the
+ file called LICENSE.
+
+ These files may also be found in the public source code repository located:
+ http://github.com/signal11/hidapi
+*/
+
+/** @file
+ * @defgroup API hidapi API
+ */
+
+#pragma once
+
+#include <wchar.h>
+
+#ifdef _WIN32
+#define HID_API_EXPORT __declspec(dllexport)
+#define HID_API_CALL
+#else
+#define HID_API_EXPORT /**< API export macro */
+#define HID_API_CALL   /**< API call macro */
+#endif
+
+#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct hid_device_;
+typedef struct hid_device_ hid_device; /**< opaque hidapi structure */
+
+/** hidapi info structure */
+struct hid_device_info
+{
+    /** Platform-specific device path */
+    char *path;
+    /** Device Vendor ID */
+    unsigned short vendor_id;
+    /** Device Product ID */
+    unsigned short product_id;
+    /** Serial Number */
+    wchar_t *serial_number;
+    /** Device Release Number in binary-coded decimal,
+        also known as Device Version Number */
+    unsigned short release_number;
+    /** Manufacturer String */
+    wchar_t *manufacturer_string;
+    /** Product string */
+    wchar_t *product_string;
+    /** Usage Page for this Device/Interface
+        (Windows/Mac only). */
+    unsigned short usage_page;
+    /** Usage for this Device/Interface
+        (Windows/Mac only).*/
+    unsigned short usage;
+    /** The USB interface which this logical device
+        represents. Valid on both Linux implementations
+        in all cases, and valid on the Windows implementation
+        only if the device contains more than one interface. */
+    int interface_number;
+
+    /** Pointer to the next device */
+    struct hid_device_info *next;
+};
+
+/** @brief Initialize the HIDAPI library.
+
+	This function initializes the HIDAPI library. Calling it is not
+	strictly necessary, as it will be called automatically by
+	hid_enumerate() and any of the hid_open_*() functions if it is
+	needed.  This function should be called at the beginning of
+	execution however, if there is a chance of HIDAPI handles
+	being opened by different threads simultaneously.
+
+	@ingroup API
+
+	@returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_init();
+
+/** @brief Finalize the HIDAPI library.
+
+	This function frees all of the static data associated with
+	HIDAPI. It should be called at the end of execution to avoid
+	memory leaks.
+
+	@ingroup API
+
+    @returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_exit();
+
+/** @brief Enumerate the HID Devices.
+
+	This function returns a linked list of all the HID devices
+	attached to the system which match vendor_id and product_id.
+	If @p vendor_id and @p product_id are both set to 0, then
+	all HID devices will be returned.
+
+	@ingroup API
+	@param vendor_id The Vendor ID (VID) of the types of device
+		to open.
+	@param product_id The Product ID (PID) of the types of
+		device to open.
+
+    @returns
+    	This function returns a pointer to a linked list of type
+    	struct #hid_device, containing information about the HID devices
+    	attached to the system, or NULL in the case of failure. Free
+    	this linked list by calling hid_free_enumeration().
+*/
+struct hid_device_info HID_API_EXPORT *HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);
+
+/** @brief Free an enumeration Linked List
+
+    This function frees a linked list created by hid_enumerate().
+
+	@ingroup API
+    @param devs Pointer to a list of struct_device returned from
+    	      hid_enumerate().
+*/
+void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs);
+
+/** @brief Open a HID device using a Vendor ID (VID), Product ID
+	(PID) and optionally a serial number.
+
+	If @p serial_number is NULL, the first device with the
+	specified VID and PID is opened.
+
+	@ingroup API
+	@param vendor_id The Vendor ID (VID) of the device to open.
+	@param product_id The Product ID (PID) of the device to open.
+	@param serial_number The Serial Number of the device to open
+		               (Optionally NULL).
+
+	@returns
+		This function returns a pointer to a #hid_device object on
+		success or NULL on failure.
+*/
+HID_API_EXPORT hid_device *HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id,
+        const wchar_t *serial_number);
+
+/** @brief Open a HID device by its path name.
+
+	The path name be determined by calling hid_enumerate(), or a
+	platform-specific path name can be used (eg: /dev/hidraw0 on
+	Linux).
+
+	@ingroup API
+    @param path The path name of the device to open
+
+	@returns
+		This function returns a pointer to a #hid_device object on
+		success or NULL on failure.
+*/
+HID_API_EXPORT hid_device *HID_API_CALL hid_open_path(const char *path);
+
+/** @brief Write an Output report to a HID device.
+
+	The first byte of @p data[] must contain the Report ID. For
+	devices which only support a single report, this must be set
+	to 0x0. The remaining bytes contain the report data. Since
+	the Report ID is mandatory, calls to hid_write() will always
+	contain one more byte than the report contains. For example,
+	if a hid report is 16 bytes long, 17 bytes must be passed to
+	hid_write(), the Report ID (or 0x0, for devices with a
+	single report), followed by the report data (16 bytes). In
+	this example, the length passed in would be 17.
+
+	hid_write() will send the data on the first OUT endpoint, if
+	one exists. If it does not, it will send the data through
+	the Control Endpoint (Endpoint 0).
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param data The data to send, including the report number as
+		the first byte.
+	@param length The length in bytes of the data to send.
+
+	@returns
+		This function returns the actual number of bytes written and
+		-1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length);
+
+/** @brief Read an Input report from a HID device with timeout.
+
+	Input reports are returned
+	to the host through the INTERRUPT IN endpoint. The first byte will
+	contain the Report number if the device uses numbered reports.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param data A buffer to put the read data into.
+	@param length The number of bytes to read. For devices with
+		multiple reports, make sure to read an extra byte for
+		the report number.
+	@param milliseconds timeout in milliseconds or -1 for blocking wait.
+
+	@returns
+		This function returns the actual number of bytes read and
+		-1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);
+
+/** @brief Read an Input report from a HID device.
+
+	Input reports are returned
+    to the host through the INTERRUPT IN endpoint. The first byte will
+	contain the Report number if the device uses numbered reports.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param data A buffer to put the read data into.
+	@param length The number of bytes to read. For devices with
+		multiple reports, make sure to read an extra byte for
+		the report number.
+
+	@returns
+		This function returns the actual number of bytes read and
+		-1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);
+
+/** @brief Set the device handle to be non-blocking.
+
+	In non-blocking mode calls to hid_read() will return
+	immediately with a value of 0 if there is no data to be
+	read. In blocking mode, hid_read() will wait (block) until
+	there is data to read before returning.
+
+	Nonblocking can be turned on and off at any time.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param nonblock enable or not the nonblocking reads
+	 - 1 to enable nonblocking
+	 - 0 to disable nonblocking.
+
+	@returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock);
+
+/** @brief Send a Feature report to the device.
+
+	Feature reports are sent over the Control endpoint as a
+	Set_Report transfer.  The first byte of @p data[] must
+	contain the Report ID. For devices which only support a
+	single report, this must be set to 0x0. The remaining bytes
+	contain the report data. Since the Report ID is mandatory,
+	calls to hid_send_feature_report() will always contain one
+	more byte than the report contains. For example, if a hid
+	report is 16 bytes long, 17 bytes must be passed to
+	hid_send_feature_report(): the Report ID (or 0x0, for
+	devices which do not use numbered reports), followed by the
+	report data (16 bytes). In this example, the length passed
+	in would be 17.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param data The data to send, including the report number as
+		the first byte.
+	@param length The length in bytes of the data to send, including
+		the report number.
+
+	@returns
+		This function returns the actual number of bytes written and
+		-1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length);
+
+/** @brief Get a feature report from a HID device.
+
+	Make sure to set the first byte of @p data[] to the Report
+	ID of the report to be read.  Make sure to allow space for
+	this extra byte in @p data[].
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param data A buffer to put the read data into, including
+		the Report ID. Set the first byte of @p data[] to the
+		Report ID of the report to be read.
+	@param length The number of bytes to read, including an
+		extra byte for the report ID. The buffer can be longer
+		than the actual report.
+
+	@returns
+		This function returns the number of bytes read and
+		-1 on error.
+*/
+int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);
+
+/** @brief Close a HID device.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+*/
+void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device);
+
+/** @brief Get The Manufacturer String from a HID device.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param string A wide string buffer to put the data into.
+	@param maxlen The length of the buffer in multiples of wchar_t.
+
+	@returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen);
+
+/** @brief Get The Product String from a HID device.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param string A wide string buffer to put the data into.
+	@param maxlen The length of the buffer in multiples of wchar_t.
+
+	@returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen);
+
+/** @brief Get The Serial Number String from a HID device.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param string A wide string buffer to put the data into.
+	@param maxlen The length of the buffer in multiples of wchar_t.
+
+	@returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen);
+
+/** @brief Get a string from a HID device, based on its string index.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+	@param string_index The index of the string to get.
+	@param string A wide string buffer to put the data into.
+	@param maxlen The length of the buffer in multiples of wchar_t.
+
+	@returns
+		This function returns 0 on success and -1 on error.
+*/
+int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen);
+
+/** @brief Get a string describing the last error which occurred.
+
+	@ingroup API
+	@param device A device handle returned from hid_open().
+
+	@returns
+		This function returns a string containing the last error
+		which occurred or NULL if none has occurred.
+*/
+HID_API_EXPORT const wchar_t *HID_API_CALL hid_error(hid_device *device);
+
+#ifdef __cplusplus
+}
+#endif
diff -U 3 -dHrN a/libs/indibase/CMakeLists.txt b/libs/indibase/CMakeLists.txt
--- a/libs/indibase/CMakeLists.txt	2025-08-21 16:22:49.000000000 +0200
+++ b/libs/indibase/CMakeLists.txt	2025-08-28 09:40:21.274325141 +0200
@@ -15,7 +15,7 @@
     eventloop
     dsp
     fpack
-    hid
+    ${HIDAPILIB}
     ${USB1_LIBRARIES}
     ${NOVA_LIBRARIES}
     ${CMAKE_THREAD_LIBS_INIT}
diff -U 3 -dHrN a/obsolete/focusmaster.h b/obsolete/focusmaster.h
--- a/obsolete/focusmaster.h	2025-08-21 16:22:49.000000000 +0200
+++ b/obsolete/focusmaster.h	2025-08-28 09:18:26.334660677 +0200
@@ -21,7 +21,13 @@
 #pragma once
 
 #include "indifocuser.h"
-#include "hidapi.h"
+
+#ifdef _USE_SYSTEM_HIDAPILIB
+#include <hidapi/hidapi.h>
+#else
+#include <indi_hidapi.h>
+#endif
+
 
 class FocusMaster : public INDI::Focuser
 {
