diff --git a/iproute2-2.6.29-1-warnings.diff b/iproute2-2.6.29-1-warnings.diff
index df4c417..b7a95fa 100644
--- a/iproute2-2.6.29-1-warnings.diff
+++ b/iproute2-2.6.29-1-warnings.diff
@@ -16,7 +16,7 @@ Index: ip/ip6tunnel.c
 ===================================================================
 --- ip/ip6tunnel.c.orig
 +++ ip/ip6tunnel.c
-@@ -261,8 +261,9 @@ static int do_tunnels_list(struct ip6_tn
+@@ -262,8 +262,9 @@ static int do_tunnels_list(struct ip6_tn
  	}
  
  	/* skip two lines at the begenning of the file */
@@ -70,7 +70,7 @@ Index: ip/iptunnel.c
 ===================================================================
 --- ip/iptunnel.c.orig
 +++ ip/iptunnel.c
-@@ -412,8 +412,9 @@ static int do_tunnels_list(struct ip_tun
+@@ -407,8 +407,9 @@ static int do_tunnels_list(struct ip_tun
  		return -1;
  	}
  
@@ -81,7 +81,7 @@ Index: ip/iptunnel.c
 +	res = fgets(buf, sizeof(buf), fp);
  
  	while (fgets(buf, sizeof(buf), fp) != NULL) {
- 		char *ptr;
+ 		int index, type;
 Index: ip/rtmon.c
 ===================================================================
 --- ip/rtmon.c.orig
@@ -117,7 +117,7 @@ Index: misc/ifstat.c
 ===================================================================
 --- misc/ifstat.c.orig
 +++ misc/ifstat.c
-@@ -717,8 +717,9 @@ int main(int argc, char *argv[])
+@@ -716,8 +716,9 @@ int main(int argc, char *argv[])
  				fclose(tfp);
  			}
  			if (uptime >= 0 && time(NULL) >= stb.st_mtime+uptime) {
@@ -128,7 +128,7 @@ Index: misc/ifstat.c
  			}
  		}
  
-@@ -760,7 +761,8 @@ int main(int argc, char *argv[])
+@@ -759,7 +760,8 @@ int main(int argc, char *argv[])
  			dump_incr_db(stdout);
  	}
  	if (!no_update) {
diff --git a/iproute2-2.6.35+9.tar.bz2 b/iproute2-2.6.35+9.tar.bz2
deleted file mode 100644
index ae7b9c1..0000000
--- a/iproute2-2.6.35+9.tar.bz2
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:06d028c301203b39e82b7c1923fffc0169231951080238a91e13a0c2739512cf
-size 387857
diff --git a/iproute2-2.6.37-rtt-metrics-units.diff b/iproute2-2.6.37-rtt-metrics-units.diff
new file mode 100644
index 0000000..2285c4f
--- /dev/null
+++ b/iproute2-2.6.37-rtt-metrics-units.diff
@@ -0,0 +1,197 @@
+From ff2e5a2ada6196ce4ed89a76b5e86f047c9a63f4 Mon Sep 17 00:00:00 2001
+From: Marius Tomaschewski <mt@suse.de>
+Date: Wed, 12 Jan 2011 16:41:45 +0100
+Subject: [PATCH] ip route rtt metrics time unit is milliseconds
+
+Adopted ip route rtt,rttvar,rto_min metrics time unit to milliseconds
+instead of jiffies as required by recent kernels (>=2.6.27).
+
+Added an get_rtt_metrics_units function providing the unit and the
+get_time_in_units as successor of get_jiffies function, allowing to
+specify the unit. The get_rtt_metrics_units can be extended to detect
+and handle also older kernels.
+
+This fixes also the inconsistent use of get_user_hz in print_route
+and get_hz in get_jiffies function that return different units.
+---
+ include/utils.h |    1 +
+ ip/iproute.c    |   38 ++++++++++++++++++++++++++------------
+ lib/utils.c     |   24 +++++++++++++-----------
+ 3 files changed, 40 insertions(+), 23 deletions(-)
+
+diff --git a/include/utils.h b/include/utils.h
+index 3da6998..3d98c01 100644
+--- a/include/utils.h
++++ b/include/utils.h
+@@ -80,6 +80,7 @@ extern int mask2bits(__u32 netmask);
+ extern int get_integer(int *val, const char *arg, int base);
+ extern int get_unsigned(unsigned *val, const char *arg, int base);
+ extern int get_jiffies(unsigned *val, const char *arg, int base, int *raw);
++extern int get_time_in_units(unsigned *val, const char *arg, int base, int *raw, unsigned unit);
+ #define get_byte get_u8
+ #define get_ushort get_u16
+ #define get_short get_s16
+diff --git a/ip/iproute.c b/ip/iproute.c
+index 0d69290..830b0a3 100644
+--- a/ip/iproute.c
++++ b/ip/iproute.c
+@@ -33,6 +33,21 @@
+ #define RTAX_RTTVAR RTAX_HOPS
+ #endif
+ 
++#define TIME_UNIT_MS 1000
++
++static unsigned get_rtt_metrics_units(void)
++{
++	/*
++	 * recent kernels (>=2.6.27) are using milliseconds base.
++	 * Note: To support older kernels, return the proper HZ...
++	 *
++	 * final unit for rto_min: unit
++	 *                rttvar:  unit * 4
++	 *                rtt:     unit * 8
++	 */
++	return TIME_UNIT_MS;
++}
++
+ enum list_action {
+ 	IPROUTE_LIST,
+ 	IPROUTE_FLUSH,
+@@ -522,12 +537,11 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 			mxlock = *(unsigned*)RTA_DATA(mxrta[RTAX_LOCK]);
+ 
+ 		for (i=2; i<= RTAX_MAX; i++) {
+-			unsigned val;
++			unsigned long long val; /* val *= 1000 below */
++			unsigned unit = get_rtt_metrics_units();
+ 
+ 			if (mxrta[i] == NULL)
+ 				continue;
+-			if (!hz)
+-				hz = get_user_hz();
+ 
+ 			if (i < sizeof(mx_names)/sizeof(char*) && mx_names[i])
+ 				fprintf(fp, " %s", mx_names[i]);
+@@ -543,24 +557,24 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+ 					val = 0;
+ 				/* fall through */
+ 			default:
+-				fprintf(fp, " %u", val);
++				fprintf(fp, " %llu", val);
+ 				break;
+ 
+ 			case RTAX_RTT:
+ 			case RTAX_RTTVAR:
+ 			case RTAX_RTO_MIN:
+-				val *= 1000;
++				val *= TIME_UNIT_MS;
+ 				if (i == RTAX_RTT)
+ 					val /= 8;
+ 				else if (i == RTAX_RTTVAR)
+ 					val /= 4;
+ 
+-				if (val >= hz)
++				if (val >= unit)
+ 					fprintf(fp, " %llums",
+-						(unsigned long long) val / hz);
++						val / unit);
+ 				else
+-					fprintf(fp, " %.2fms", 
+-						(double)val / hz);
++					fprintf(fp, " %.8fms", 
++						(double)val / unit);
+ 			}
+ 		}
+ 	}
+@@ -840,7 +854,7 @@ int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
+ 				mxlock |= (1<<RTAX_RTT);
+ 				NEXT_ARG();
+ 			}
+-			if (get_jiffies(&rtt, *argv, 0, &raw))
++			if (get_time_in_units(&rtt, *argv, 0, &raw, get_rtt_metrics_units()))
+ 				invarg("\"rtt\" value is invalid\n", *argv);
+ 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_RTT, 
+ 				(raw) ? rtt : rtt * 8);
+@@ -848,7 +862,7 @@ int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
+ 			unsigned rto_min;
+ 			NEXT_ARG();
+ 			mxlock |= (1<<RTAX_RTO_MIN);
+-			if (get_jiffies(&rto_min, *argv, 0, &raw))
++			if (get_time_in_units(&rto_min, *argv, 0, &raw, get_rtt_metrics_units()))
+ 				invarg("\"rto_min\" value is invalid\n",
+ 				       *argv);
+ 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_RTO_MIN,
+@@ -900,7 +914,7 @@ int iproute_modify(int cmd, unsigned flags, int argc, char **argv)
+ 				mxlock |= (1<<RTAX_RTTVAR);
+ 				NEXT_ARG();
+ 			}
+-			if (get_jiffies(&win, *argv, 0, &raw))
++			if (get_time_in_units(&win, *argv, 0, &raw, get_rtt_metrics_units()))
+ 				invarg("\"rttvar\" value is invalid\n", *argv);
+ 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_RTTVAR,
+ 				(raw) ? win : win * 4);
+diff --git a/lib/utils.c b/lib/utils.c
+index a60d884..a21a2ae 100644
+--- a/lib/utils.c
++++ b/lib/utils.c
+@@ -102,6 +102,11 @@ int get_unsigned(unsigned *val, const char *arg, int base)
+ 
+ int get_jiffies(unsigned *jiffies, const char *arg, int base, int *raw)
+ {
++	return get_time_in_units(jiffies, arg, base, raw, get_hz());
++}
++
++int get_time_in_units(unsigned *val, const char *arg, int base, int *raw, unsigned unit)
++{
+ 	double t;
+ 	unsigned long res;
+ 	char *p;
+@@ -120,37 +125,34 @@ int get_jiffies(unsigned *jiffies, const char *arg, int base, int *raw)
+ 	if (p == arg)
+ 		return -1;
+ 
+-	if (__iproute2_hz_internal == 0)
+-                __iproute2_hz_internal = __get_hz();
+-	
+ 	*raw = 1;
+ 
+ 	if (*p) {
+ 		*raw = 0;
+                 if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 ||
+                     strcasecmp(p, "secs")==0)
+-                        t *= __iproute2_hz_internal;
++                        t *= unit;
+                 else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 ||
+                          strcasecmp(p, "msecs") == 0)
+-                        t *= __iproute2_hz_internal/1000.0;
++                        t *= unit/1000.0;
+                 else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 ||
+                          strcasecmp(p, "usecs") == 0)
+-                        t *= __iproute2_hz_internal/1000000.0;
++                        t *= unit/1000000.0;
+                 else if (strcasecmp(p, "ns") == 0 || strcasecmp(p, "nsec")==0 ||
+                          strcasecmp(p, "nsecs") == 0)
+-                        t *= __iproute2_hz_internal/1000000000.0;
++                        t *= unit/1000000000.0;
+ 		else if (strcasecmp(p, "j") == 0 || strcasecmp(p, "hz") == 0 ||
+ 			 strcasecmp(p,"jiffies") == 0)
+-			t *= 1.0; /* allow suffix, do nothing */
++			t *= unit/(double)get_hz();
+                 else
+                         return -1;
+         }
+ 
+ 	/* emulate ceil() without having to bring-in -lm and always be >= 1 */
+ 
+-	*jiffies = t;
+-	if (*jiffies < t)
+-		*jiffies += 1;
++	*val = t;
++	if (*val < t)
++		*val += 1;
+ 	
+         return 0;
+ 
+-- 
+1.7.1
+
diff --git a/iproute2-2.6.37.tar.bz2 b/iproute2-2.6.37.tar.bz2
new file mode 100644
index 0000000..cbb24c4
--- /dev/null
+++ b/iproute2-2.6.37.tar.bz2
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:71754f8ad68facdb97d0cb9d7a298dc7f1ba069370bce902b661e06959f264e3
+size 388866
diff --git a/iproute2.changes b/iproute2.changes
index e017f09..4adf647 100644
--- a/iproute2.changes
+++ b/iproute2.changes
@@ -1,3 +1,23 @@
+-------------------------------------------------------------------
+Wed Jan 12 16:02:26 UTC 2011 - mt@suse.de
+
+- Adopted ip route rtt,rttvar,rto_min metrics time unit to
+  milliseconds as required by recent kernels (bnc#659746).
+
+-------------------------------------------------------------------
+Tue Jan 11 00:45:02 UTC 2011 - jengelh@medozas.de
+
+- Update to iproute2-2.6.37
+* Support for iptables >= 1.4.9
+* Support for GRE in XFRM
+* tc f_flow now knows rxhash
+* Support for macvtap "mode" parameter
+* tc ACT_CSUM support
+* added `ip route save` and `ip route restore` commands
+- Spec file updates
+* Remove pointless AutoReqProv:on (that's the default)
+* Enable tc's m_xt
+
 -------------------------------------------------------------------
 Fri Dec  3 10:29:55 CET 2010 - ms@suse.de
 
diff --git a/iproute2.spec b/iproute2.spec
index 81b5a0b..bf5a18e 100644
--- a/iproute2.spec
+++ b/iproute2.spec
@@ -1,5 +1,5 @@
 #
-# spec file for package iproute2 (Version 2.6.35+9)
+# spec file for package iproute2 (Version 2.6.37)
 #
 # Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
 #
@@ -20,13 +20,13 @@
 
 Name:           iproute2
 BuildRequires:  bison db-devel flex ghostscript-fonts-std ghostscript-x11 libpng-devel libtiff-devel sgmltool texlive-latex xorg-x11-devel
+BuildRequires:	iptables-devel
 License:        GPLv2+
 Group:          Productivity/Networking/Routing
-Provides:       iproute 
-AutoReqProv:    on
-Version:        2.6.35+9
-Release:        3
-%define rversion        2.6.35+9
+Provides:       iproute
+Version:        2.6.37
+Release:        1
+%define rversion        2.6.37
 Summary:        Advanced Routing
 Url:            http://developer.osdl.org/dev/iproute2/
 Source0:        %name-%rversion.tar.bz2
@@ -39,6 +39,7 @@ Patch8:         %name-2.6.29-1-skbedit-memset.diff
 Patch9:         %name-2.6.29-1-iptunnel-fclose.diff
 Patch10:        %name-2.6.29-1-ss-pclose.diff
 Patch13:        %name-2.6.29-1-memleak.diff
+Patch14:        %name-2.6.37-rtt-metrics-units.diff
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 
 %description
@@ -84,19 +85,22 @@ as well as examples and other outdated files.
 %patch9
 %patch10
 %patch13
+%patch14 -p1
 find . -name *.orig -print0 | xargs -r0 rm -v
 
 %build
 # build with -fPIC. For details see
 # https://bugzilla.novell.com/show_bug.cgi?id=388021
-make %{?_smp_mflags} LIBDIR=/usr/share CCOPTS="-D_GNU_SOURCE $RPM_OPT_FLAGS -Wstrict-prototypes -fPIC"
+make %{?_smp_mflags} LIBDIR=%_libdir CCOPTS="-D_GNU_SOURCE $RPM_OPT_FLAGS -Wstrict-prototypes -fPIC"
 cd doc
 make pdf
 
 %install
 install -d $RPM_BUILD_ROOT/{etc/,sbin/,usr/{sbin,share/man/man{3,8}}}
 install -d $RPM_BUILD_ROOT/{/usr/include,%_libdir,/usr/share}
-make install DESTDIR=$RPM_BUILD_ROOT LIBDIR=/usr/share
+make install DESTDIR=$RPM_BUILD_ROOT LIBDIR=%_libdir \
+	MODDESTDIR="$RPM_BUILD_ROOT/%_libdir"
+rm -f "$RPM_BUILD_ROOT/%_libdir/m_ipt.so"
 install lib/libnetlink.a $RPM_BUILD_ROOT/%_libdir
 install include/libnetlink.h $RPM_BUILD_ROOT/usr/include
 mv $RPM_BUILD_ROOT/usr/sbin/ip $RPM_BUILD_ROOT/sbin
@@ -121,6 +125,7 @@ rm -rf $RPM_BUILD_ROOT
 %config(noreplace) /etc/iproute2/rt_realms
 %config(noreplace) /etc/iproute2/rt_tables
 %config(noreplace) /etc/iproute2/ematch_map
+%_libdir/m_xt.so
 %dir /usr/share/tc
 %attr(644,root,root)/usr/share/tc/*