diff -ur zabbix-1.8.10-orig/configure.in zabbix-1.8.10/configure.in
--- zabbix-1.8.10-orig/configure.in	2011-12-28 02:27:45.000000000 -0700
+++ zabbix-1.8.10/configure.in	2012-01-24 11:31:07.305941284 -0700
@@ -1348,6 +1348,14 @@
         kernel=`uname -r`
 
         case "${kernel}" in
+             3.2.*)
+        	    AC_MSG_RESULT([3.2 family (${kernel})])
+        	    AC_DEFINE([KERNEL_3_2], 1, [Define to 1 if you are using Linux 3.2.x])
+        	    ;;
+             3.1.*)
+        	    AC_MSG_RESULT([3.1 family (${kernel})])
+        	    AC_DEFINE([KERNEL_3_1], 1, [Define to 1 if you are using Linux 3.1.x])
+        	    ;;
              2.6.*) 
         	    AC_MSG_RESULT([2.6 family (${kernel})])
         	    AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you are using Linux 2.6.x])
diff -ur zabbix-1.8.10-orig/include/config.h.in zabbix-1.8.10/include/config.h.in
--- zabbix-1.8.10-orig/include/config.h.in	2011-12-28 02:39:16.000000000 -0700
+++ zabbix-1.8.10/include/config.h.in	2012-01-24 11:31:16.396331212 -0700
@@ -501,6 +501,12 @@
 /* Define to 1 if you are using Linux 2.6.x */
 #undef KERNEL_2_6
 
+/* Define to 1 if you are using Linux 3.1.x */
+#undef KERNEL_3_1
+
+/* Define to 1 if you are using Linux 3.2.x */
+#undef KERNEL_3_2
+
 /* Define to 1 if LDAP depricated functions is used. */
 #undef LDAP_DEPRECATED
 
diff -ur zabbix-1.8.10-orig/src/libs/zbxsysinfo/linux/sensors.c zabbix-1.8.10/src/libs/zbxsysinfo/linux/sensors.c
--- zabbix-1.8.10-orig/src/libs/zbxsysinfo/linux/sensors.c	2011-12-28 02:27:42.000000000 -0700
+++ zabbix-1.8.10/src/libs/zbxsysinfo/linux/sensors.c	2012-01-24 11:31:46.257601893 -0700
@@ -20,14 +20,21 @@
 #include "common.h"
 #include "sysinfo.h"
 
-#ifdef KERNEL_2_4
+#if defined(KERNEL_2_4) || defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
 
 #define DO_ONE	0
 #define DO_AVG	1
 #define DO_MAX	2
 #define DO_MIN	3
 
+#if defined(KERNEL_2_4)
 #define DEVICE_DIR	"/proc/sys/dev/sensors"
+#endif
+
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+#define DEVICE_DIR	"/sys/class/hwmon"
+#define	EXTRA		"device"
+#endif
 
 static void	count_sensor(int do_task, const char *filename, double *aggr, int *cnt)
 {
@@ -46,9 +53,17 @@
 
 	zbx_fclose(f);
 
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+	if (1 == sscanf(line, "%lf", &value))
+#else
 	if (1 == sscanf(line, "%*lf\t%*lf\t%lf\n", &value))
+#endif
 	{
 		(*cnt)++;
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+		if(NULL == strstr(filename, "fan"))
+			value = value / 1000;
+#endif
 
 		switch (do_task)
 		{
@@ -70,11 +85,35 @@
 
 static void	get_device_sensors(int do_task, const char *device, const char *name, double *aggr, int *cnt)
 {
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+	struct stat buffer;
+	int	use_extra = 0;
+#endif
 	char	sensorname[MAX_STRING_LEN];
+	char	sensortest[MAX_STRING_LEN];
+
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+	zbx_snprintf(sensortest, sizeof(sensortest), "%s/%s/name", DEVICE_DIR, device);
+	if(stat(sensortest, &buffer) != 0)
+	{
+		zbx_snprintf(sensortest, sizeof(sensortest), "%s/%s/device/name", DEVICE_DIR, device);
+		if(stat(sensortest, &buffer) == 0)
+		{
+			use_extra = 1;
+		}
+	}
+#endif
 
 	if (DO_ONE == do_task)
 	{
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+		if(use_extra)
+			zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s/%s/%s_input", DEVICE_DIR, device, EXTRA, name);
+		else
+			zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s/%s_input", DEVICE_DIR, device, name);
+#else
 		zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s/%s", DEVICE_DIR, device, name);
+#endif
 		count_sensor(do_task, sensorname, aggr, cnt);
 	}
 	else
@@ -94,7 +133,14 @@
 			if (NULL == zbx_regexp_match(deviceent->d_name, device, NULL))
 				continue;
 
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+			if(use_extra)
+				zbx_snprintf(devicename, sizeof(devicename), "%s/%s/%s", DEVICE_DIR, deviceent->d_name, EXTRA);
+			else
+				zbx_snprintf(devicename, sizeof(devicename), "%s/%s", DEVICE_DIR, deviceent->d_name);
+#else
 			zbx_snprintf(devicename, sizeof(devicename), "%s/%s", DEVICE_DIR, deviceent->d_name);
+#endif
 
 			if (NULL == (sensordir = opendir(devicename)))
 				continue;
@@ -107,7 +153,19 @@
 				if (NULL == zbx_regexp_match(sensorent->d_name, name, NULL))
 					continue;
 
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+				if (0 != strcmp(sensorent->d_name + strlen(sensorent->d_name) - 6, "_input"))
+					continue;
+#endif
+
+#if defined(KERNEL_2_6) || defined(KERNEL_3_1) || defined(KERNEL_3_2)
+				if(use_extra)
+					zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s/%s", devicename, sensorent->d_name, EXTRA);
+				else
+					zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s", devicename, sensorent->d_name);
+#else
 				zbx_snprintf(sensorname, sizeof(sensorname), "%s/%s", devicename, sensorent->d_name);
+#endif
 				count_sensor(do_task, sensorname, aggr, cnt);
 			}
 			closedir(sensordir);
