diff -u -r collectd-4.6.2/src/csv.c collectd-4.6.2.xani/src/csv.c
--- collectd-4.6.2/src/csv.c	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/csv.c	2009-04-01 10:17:42.000000000 +0200
@@ -59,7 +59,9 @@
 	for (i = 0; i < ds->ds_num; i++)
 	{
 		if ((ds->ds[i].type != DS_TYPE_COUNTER)
-				&& (ds->ds[i].type != DS_TYPE_GAUGE))
+				&& (ds->ds[i].type != DS_TYPE_GAUGE)
+				&& (ds->ds[i].type != DS_TYPE_DERIVE)
+				&& (ds->ds[i].type != DS_TYPE_ABSOLUTE))
 			return (-1);
 
 		if (ds->ds[i].type == DS_TYPE_COUNTER)
@@ -86,10 +88,58 @@
 						",%lf", rates[i]);
 			}
 		}
-		else /* if (ds->ds[i].type == DS_TYPE_GAUGE) */
+		else  if (ds->ds[i].type == DS_TYPE_GAUGE) 
 		{
 			status = ssnprintf (buffer + offset, buffer_len - offset,
 					",%lf", vl->values[i].gauge);
+		} 
+		else if (ds->ds[i].type == DS_TYPE_DERIVE)
+		{
+			if (store_rates == 0)
+			{
+				status = ssnprintf (buffer + offset,
+						buffer_len - offset,
+						",%llu",
+						vl->values[i].counter);
+			}
+			else /* if (store_rates == 1) */
+			{
+				if (rates == NULL)
+					rates = uc_get_rate (ds, vl);
+				if (rates == NULL)
+				{
+					WARNING ("csv plugin: "
+							"uc_get_rate failed.");
+					return (-1);
+				}
+				status = ssnprintf (buffer + offset,
+						buffer_len - offset,
+						",%lf", rates[i]);
+			}
+		}
+		else if (ds->ds[i].type == DS_TYPE_ABSOLUTE)
+		{
+			if (store_rates == 0)
+			{
+				status = ssnprintf (buffer + offset,
+						buffer_len - offset,
+						",%llu",
+						vl->values[i].counter);
+			}
+			else /* if (store_rates == 1) */
+			{
+				if (rates == NULL)
+					rates = uc_get_rate (ds, vl);
+				if (rates == NULL)
+				{
+					WARNING ("csv plugin: "
+							"uc_get_rate failed.");
+					return (-1);
+				}
+				status = ssnprintf (buffer + offset,
+						buffer_len - offset,
+						",%lf", rates[i]);
+			}
 		}
 
 		if ((status < 1) || (status >= (buffer_len - offset)))
diff -u -r collectd-4.6.2/src/plugin.h collectd-4.6.2.xani/src/plugin.h
--- collectd-4.6.2/src/plugin.h	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/plugin.h	2009-04-01 01:34:02.000000000 +0200
@@ -29,6 +29,8 @@
 
 #define DS_TYPE_COUNTER 0
 #define DS_TYPE_GAUGE   1
+#define DS_TYPE_DERIVE   2
+#define DS_TYPE_ABSOLUTE   3
 
 #ifndef LOG_ERR
 # define LOG_ERR 3
@@ -57,11 +59,15 @@
  */
 typedef unsigned long long counter_t;
 typedef double gauge_t;
+typedef unsigned long long derive_t;
+typedef unsigned long long absolute_t;
 
 union value_u
 {
 	counter_t counter;
 	gauge_t   gauge;
+	derive_t   derive;
+	absolute_t   absolute;
 };
 typedef union value_u value_t;
 
diff -u -r collectd-4.6.2/src/rrdcached.c collectd-4.6.2.xani/src/rrdcached.c
--- collectd-4.6.2/src/rrdcached.c	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/rrdcached.c	2009-04-01 01:32:25.000000000 +0200
@@ -75,7 +75,9 @@
   for (i = 0; i < ds->ds_num; i++)
   {
     if ((ds->ds[i].type != DS_TYPE_COUNTER)
-        && (ds->ds[i].type != DS_TYPE_GAUGE))
+        && (ds->ds[i].type != DS_TYPE_GAUGE)
+	&& (ds->ds[i].type != DS_TYPE_DERIVE)
+	&& (ds->ds[i].type != DS_TYPE_ABSOLUTE)
       return (-1);
 
     if (ds->ds[i].type == DS_TYPE_COUNTER)
@@ -83,11 +85,20 @@
       status = ssnprintf (buffer + offset, buffer_len - offset,
           ":%llu", vl->values[i].counter);
     }
-    else /* if (ds->ds[i].type == DS_TYPE_GAUGE) */
+    else if (ds->ds[i].type == DS_TYPE_GAUGE) 
     {
       status = ssnprintf (buffer + offset, buffer_len - offset,
           ":%lf", vl->values[i].gauge);
     }
+    else if (ds->ds[i].type == DS_TYPE_DERIVE) {
+      status = ssnprintf (buffer + offset, buffer_len - offset,
+	  ":%llu", vl->values[i].derive);
+    }
+    else /* if (ds->ds[i].type == DS_TYPE_ABSOLUTE) */ {
+      status = ssnprintf (buffer + offset, buffer_len - offset,
+	  ":%llu", vl->values[i].absolute);
+ 
+    }
 
     if ((status < 1) || (status >= (buffer_len - offset)))
       return (-1);
diff -u -r collectd-4.6.2/src/rrdtool.c collectd-4.6.2.xani/src/rrdtool.c
--- collectd-4.6.2/src/rrdtool.c	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/rrdtool.c	2009-04-01 10:33:36.000000000 +0200
@@ -203,15 +203,23 @@
 	for (i = 0; i < ds->ds_num; i++)
 	{
 		if ((ds->ds[i].type != DS_TYPE_COUNTER)
-				&& (ds->ds[i].type != DS_TYPE_GAUGE))
+				&& (ds->ds[i].type != DS_TYPE_GAUGE)
+				&& (ds->ds[i].type != DS_TYPE_DERIVE)
+				&& (ds->ds[i].type != DS_TYPE_ABSOLUTE))
 			return (-1);
 
 		if (ds->ds[i].type == DS_TYPE_COUNTER)
 			status = ssnprintf (buffer + offset, buffer_len - offset,
 					":%llu", vl->values[i].counter);
-		else
+		else if (ds->ds[i].type == DS_TYPE_GAUGE)
 			status = ssnprintf (buffer + offset, buffer_len - offset,
 					":%lf", vl->values[i].gauge);
+		else if (ds->ds[i].type == DS_TYPE_DERIVE)
+			status = ssnprintf (buffer + offset, buffer_len - offset,
+					":%llu", vl->values[i].counter);
+		else /*if (ds->ds[i].type == DS_TYPE_ABSOLUTE) */
+			status = ssnprintf (buffer + offset, buffer_len - offset,
+					":%llu", vl->values[i].counter);
 
 		if ((status < 1) || (status >= (buffer_len - offset)))
 			return (-1);
diff -u -r collectd-4.6.2/src/types.db collectd-4.6.2.xani/src/types.db
--- collectd-4.6.2/src/types.db	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/types.db	2009-04-01 11:05:18.000000000 +0200
@@ -1,3 +1,4 @@
+absolute		count:ABSOLUTE:0:U
 apache_bytes		count:COUNTER:0:134217728
 apache_connections	count:GAUGE:0:65535
 apache_requests		count:COUNTER:0:134217728
@@ -14,6 +15,7 @@
 cpu			value:COUNTER:0:4294967295
 current			value:GAUGE:U:U
 delay			seconds:GAUGE:-1000000:1000000
+derive			value:DERIVE:0:U
 df			used:GAUGE:0:1125899906842623, free:GAUGE:0:1125899906842623
 disk_merged		read:COUNTER:0:4294967295, write:COUNTER:0:4294967295
 disk_octets		read:COUNTER:0:17179869183, write:COUNTER:0:17179869183
diff -u -r collectd-4.6.2/src/types_list.c collectd-4.6.2.xani/src/types_list.c
--- collectd-4.6.2/src/types_list.c	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/types_list.c	2009-04-01 01:54:45.000000000 +0200
@@ -68,9 +68,13 @@
     dsrc->type = DS_TYPE_GAUGE;
   else if (strcasecmp (fields[1], "COUNTER") == 0)
     dsrc->type = DS_TYPE_COUNTER;
+  else if (strcasecmp (fields[1], "DERIVE") == 0)
+    dsrc->type = DS_TYPE_DERIVE;
+  else if (strcasecmp (fields[1], "ABSOLUTE") == 0)
+    dsrc->type = DS_TYPE_ABSOLUTE;
   else
   {
-    ERROR ("(fields[1] = %s) != (GAUGE || COUNTER)", fields[1]);
+    ERROR ("(fields[1] = %s) != (GAUGE || COUNTER || DERIVE || ABSOLUTE)", fields[1]);
     return (-1);
   }
 
diff -u -r collectd-4.6.2/src/utils_cmd_putval.c collectd-4.6.2.xani/src/utils_cmd_putval.c
--- collectd-4.6.2/src/utils_cmd_putval.c	2009-03-18 11:55:39.000000000 +0100
+++ collectd-4.6.2.xani/src/utils_cmd_putval.c	2009-04-01 02:09:00.000000000 +0200
@@ -71,6 +71,10 @@
 			vl->values[i].counter = atoll (ptr);
 		else if (ds->ds[i].type == DS_TYPE_GAUGE)
 			vl->values[i].gauge = atof (ptr);
+		else if (ds->ds[i].type == DS_TYPE_DERIVE)
+			vl->values[i].derive = atoll (ptr);
+		else if (ds->ds[i].type == DS_TYPE_GAUGE)
+			vl->values[i].absolute = atoll (ptr);
 
 		i++;
 	} /* while (strtok_r) */
diff -u -r collectd-4.6.2/src/utils_match.h collectd-4.6.2.xani/src/utils_match.h
--- collectd-4.6.2/src/utils_match.h	2008-11-25 14:04:47.000000000 +0100
+++ collectd-4.6.2.xani/src/utils_match.h	2009-04-01 01:18:27.000000000 +0200
@@ -30,6 +30,8 @@
  */
 #define UTILS_MATCH_DS_TYPE_GAUGE   0x10
 #define UTILS_MATCH_DS_TYPE_COUNTER 0x20
+#define UTILS_MATCH_DS_TYPE_DERIVE 0x30
+#define UTILS_MATCH_DS_TYPE_ABSOLUTE 0x40
 
 #define UTILS_MATCH_CF_GAUGE_AVERAGE 0x01
 #define UTILS_MATCH_CF_GAUGE_MIN     0x02
diff -u -r collectd-4.6.2/src/utils_rrdcreate.c collectd-4.6.2.xani/src/utils_rrdcreate.c
--- collectd-4.6.2/src/utils_rrdcreate.c	2009-03-17 14:47:16.000000000 +0100
+++ collectd-4.6.2.xani/src/utils_rrdcreate.c	2009-04-01 01:15:06.000000000 +0200
@@ -213,6 +213,10 @@
       type = "COUNTER";
     else if (d->type == DS_TYPE_GAUGE)
       type = "GAUGE";
+    else if (d->type == DS_TYPE_DERIVE)
+      type = "DERIVE";
+    else if (d->type == DS_TYPE_ABSOLUTE)
+      type = "ABSOLUTE";
     else
     {
       ERROR ("rrdtool plugin: Unknown DS type: %i",
