diff --git a/.keepalived.metadata b/.keepalived.metadata
index 1460181..4dc0ac8 100644
--- a/.keepalived.metadata
+++ b/.keepalived.metadata
@@ -1 +1 @@
-1cad8639cc97f2fa7dcc9e832193ad51a30a2f63 SOURCES/keepalived-1.2.8.tar.gz
+a74a98994b60a9eacba6c057f22ec40fd66d39fb SOURCES/keepalived-1.2.10.tar.gz
diff --git a/SOURCES/0001-ipvs-make-nlerr2syserr-libnl-dependent.patch b/SOURCES/0001-ipvs-make-nlerr2syserr-libnl-dependent.patch
new file mode 100644
index 0000000..03b3014
--- /dev/null
+++ b/SOURCES/0001-ipvs-make-nlerr2syserr-libnl-dependent.patch
@@ -0,0 +1,34 @@
+From 71e762fb29a8ba218c90a48e0e160b2bb8b74326 Mon Sep 17 00:00:00 2001
+From: Alexandre Cassen <acassen@gmail.com>
+Date: Mon, 6 Jan 2014 15:04:28 +0100
+Subject: [PATCH 1/7] ipvs: make nlerr2syserr libnl dependent
+
+nlerr2syserr() is only used when libnl is present... simply reflect
+this in libipvs.
+---
+ keepalived/libipvs-2.6/libipvs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/keepalived/libipvs-2.6/libipvs.c b/keepalived/libipvs-2.6/libipvs.c
+index 223e76b..8ccf94d 100644
+--- a/keepalived/libipvs-2.6/libipvs.c
++++ b/keepalived/libipvs-2.6/libipvs.c
+@@ -54,6 +54,7 @@ static int family, try_nl = 1;
+ 	CHECK_IPV4(s, ret);					\
+ 	CHECK_PE(s, ret);
+ 
++#ifdef LIBIPVS_USE_NL
+ #ifndef FALLBACK_LIBNL1
+ static int nlerr2syserr(int err)
+ {
+@@ -79,7 +80,6 @@ static int nlerr2syserr(int err)
+ }
+ #endif
+ 
+-#ifdef LIBIPVS_USE_NL
+ struct nl_msg *ipvs_nl_message(int cmd, int flags)
+ {
+ 	struct nl_msg *msg;
+-- 
+1.8.1.4
+
diff --git a/SOURCES/0002-fix-libnl-libnl-3-logic-in-configure-script.patch b/SOURCES/0002-fix-libnl-libnl-3-logic-in-configure-script.patch
new file mode 100644
index 0000000..7cca210
--- /dev/null
+++ b/SOURCES/0002-fix-libnl-libnl-3-logic-in-configure-script.patch
@@ -0,0 +1,213 @@
+From b14b99adf4132eab1ecf8d1d4e83fadf5ada1076 Mon Sep 17 00:00:00 2001
+From: Ryan O'Hara <rohara@redhat.com>
+Date: Mon, 6 Jan 2014 11:21:03 -0600
+Subject: [PATCH 2/7] Fix libnl/libnl-3 logic in configure script
+
+This patch causes the configure script to prefer libnl-3 over
+libnl(1). The configure script will first check for libnl-3 and
+libnl-genl-3. If both are found, use them. If not, check for
+libnl(1). This is useful when building on systems that have both
+libnl-3 and libnl(1) installed. It also fixes some redundant libraries
+in LIBS.
+---
+ configure    | 103 ++++++++++++++++++++++++++++++-----------------------------
+ configure.in |  43 +++++++++++++------------
+ 2 files changed, 74 insertions(+), 72 deletions(-)
+
+diff --git a/configure b/configure
+index b35331f..be6574e 100755
+--- a/configure
++++ b/configure
+@@ -3896,50 +3896,8 @@ else
+   as_fn_error $? "OpenSSL libraries are required" "$LINENO" 5
+ fi
+ 
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_socket_modify_cb in -lnl" >&5
+-$as_echo_n "checking for nl_socket_modify_cb in -lnl... " >&6; }
+-if ${ac_cv_lib_nl_nl_socket_modify_cb+:} false; then :
+-  $as_echo_n "(cached) " >&6
+-else
+-  ac_check_lib_save_LIBS=$LIBS
+-LIBS="-lnl  $LIBS"
+-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+-/* end confdefs.h.  */
+ 
+-/* Override any GCC internal prototype to avoid an error.
+-   Use char because int might match the return type of a GCC
+-   builtin and then its argument prototype would still apply.  */
+-#ifdef __cplusplus
+-extern "C"
+-#endif
+-char nl_socket_modify_cb ();
+-int
+-main ()
+-{
+-return nl_socket_modify_cb ();
+-  ;
+-  return 0;
+-}
+-_ACEOF
+-if ac_fn_c_try_link "$LINENO"; then :
+-  ac_cv_lib_nl_nl_socket_modify_cb=yes
+-else
+-  ac_cv_lib_nl_nl_socket_modify_cb=no
+-fi
+-rm -f core conftest.err conftest.$ac_objext \
+-    conftest$ac_exeext conftest.$ac_ext
+-LIBS=$ac_check_lib_save_LIBS
+-fi
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nl_nl_socket_modify_cb" >&5
+-$as_echo "$ac_cv_lib_nl_nl_socket_modify_cb" >&6; }
+-if test "x$ac_cv_lib_nl_nl_socket_modify_cb" = xyes; then :
+-
+-    USE_NL="LIBIPVS_USE_NL"
+-    CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
+-    LIBS="$LIBS -lnl"
+-
+-else
+-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_socket_alloc in -lnl-3" >&5
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_socket_alloc in -lnl-3" >&5
+ $as_echo_n "checking for nl_socket_alloc in -lnl-3... " >&6; }
+ if ${ac_cv_lib_nl_3_nl_socket_alloc+:} false; then :
+   $as_echo_n "(cached) " >&6
+@@ -3977,10 +3935,7 @@ fi
+ $as_echo "$ac_cv_lib_nl_3_nl_socket_alloc" >&6; }
+ if test "x$ac_cv_lib_nl_3_nl_socket_alloc" = xyes; then :
+ 
+-      USE_NL="LIBIPVS_USE_NL"
+-      CFLAGS="$CFLAGS $(pkg-config --libs --cflags libnl-3.0)"
+-      LIBS="$LIBS -lnl-3"
+-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for genl_connect in -lnl-genl-3" >&5
++    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for genl_connect in -lnl-genl-3" >&5
+ $as_echo_n "checking for genl_connect in -lnl-genl-3... " >&6; }
+ if ${ac_cv_lib_nl_genl_3_genl_connect+:} false; then :
+   $as_echo_n "(cached) " >&6
+@@ -4018,19 +3973,65 @@ fi
+ $as_echo "$ac_cv_lib_nl_genl_3_genl_connect" >&6; }
+ if test "x$ac_cv_lib_nl_genl_3_genl_connect" = xyes; then :
+ 
+-         LIBS="$LIBS -lnl-3 -lnl-genl-3"
++        USE_NL="LIBIPVS_USE_NL"
++        CFLAGS="$CFLAGS $(pkg-config libnl-genl-3.0)"
++	LIBS="$LIBS $(pkg-config --libs libnl-genl-3.0)"
++
++else
++
++        as_fn_error $? "libnl-3 is installed but not libnl-gen-3. Please, install libnl-gen-3." "$LINENO" 5
++
++fi
++
+ 
+ else
+ 
+-         as_fn_error $? "libnl-3 is installed but not libnl-gen-3. Please, install libnl-gen-3." "$LINENO" 5
++    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_socket_modify_cb in -lnl" >&5
++$as_echo_n "checking for nl_socket_modify_cb in -lnl... " >&6; }
++if ${ac_cv_lib_nl_nl_socket_modify_cb+:} false; then :
++  $as_echo_n "(cached) " >&6
++else
++  ac_check_lib_save_LIBS=$LIBS
++LIBS="-lnl  $LIBS"
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h.  */
+ 
++/* Override any GCC internal prototype to avoid an error.
++   Use char because int might match the return type of a GCC
++   builtin and then its argument prototype would still apply.  */
++#ifdef __cplusplus
++extern "C"
++#endif
++char nl_socket_modify_cb ();
++int
++main ()
++{
++return nl_socket_modify_cb ();
++  ;
++  return 0;
++}
++_ACEOF
++if ac_fn_c_try_link "$LINENO"; then :
++  ac_cv_lib_nl_nl_socket_modify_cb=yes
++else
++  ac_cv_lib_nl_nl_socket_modify_cb=no
+ fi
++rm -f core conftest.err conftest.$ac_objext \
++    conftest$ac_exeext conftest.$ac_ext
++LIBS=$ac_check_lib_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nl_nl_socket_modify_cb" >&5
++$as_echo "$ac_cv_lib_nl_nl_socket_modify_cb" >&6; }
++if test "x$ac_cv_lib_nl_nl_socket_modify_cb" = xyes; then :
+ 
++        USE_NL="LIBIPVS_USE_NL"
++        CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
++        LIBS="$LIBS $(pkg-config --libs libnl-1)"
+ 
+ else
+ 
+-      USE_NL="LIBIPVS_DONTUSE_NL"
+-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: keepalived will be built without libnl support." >&5
++        USE_NL="LIBIPVS_DONTUSE_NL"
++        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: keepalived will be built without libnl support." >&5
+ $as_echo "$as_me: WARNING: keepalived will be built without libnl support." >&2;}
+ 
+ fi
+diff --git a/configure.in b/configure.in
+index 3daf3ee..3d4a191 100644
+--- a/configure.in
++++ b/configure.in
+@@ -55,29 +55,30 @@ dnl ----[ Checks for libraries ]----
+ AC_CHECK_LIB(crypt, crypt,,AC_MSG_ERROR([crypt() function is required]))
+ AC_CHECK_LIB(crypto, MD5_Init,,AC_MSG_ERROR([OpenSSL libraries are required]))
+ AC_CHECK_LIB(ssl, SSL_CTX_new,,AC_MSG_ERROR([OpenSSL libraries are required]))
+-AC_CHECK_LIB(nl, nl_socket_modify_cb,
++
++AC_CHECK_LIB(nl-3, nl_socket_alloc,
+   [
+-    USE_NL="LIBIPVS_USE_NL"
+-    CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
+-    LIBS="$LIBS -lnl"
++    AC_CHECK_LIB(nl-genl-3, genl_connect,
++      [
++        USE_NL="LIBIPVS_USE_NL"
++        CFLAGS="$CFLAGS $(pkg-config libnl-genl-3.0)"
++	LIBS="$LIBS $(pkg-config --libs libnl-genl-3.0)"
++      ],
++      [
++        AC_MSG_ERROR([libnl-3 is installed but not libnl-gen-3. Please, install libnl-gen-3.])
++      ])
+   ],
+-  [AC_CHECK_LIB(nl-3, nl_socket_alloc,
+-    [
+-      USE_NL="LIBIPVS_USE_NL"
+-      CFLAGS="$CFLAGS $(pkg-config --libs --cflags libnl-3.0)"
+-      LIBS="$LIBS -lnl-3"
+-      AC_CHECK_LIB(nl-genl-3, genl_connect,
+-       [
+-         LIBS="$LIBS -lnl-3 -lnl-genl-3"
+-       ],
+-       [
+-         AC_MSG_ERROR([libnl-3 is installed but not libnl-gen-3. Please, install libnl-gen-3.])
+-       ])
+-    ],
+-    [
+-      USE_NL="LIBIPVS_DONTUSE_NL"
+-      AC_MSG_WARN([keepalived will be built without libnl support.])
+-    ])
++  [
++    AC_CHECK_LIB(nl, nl_socket_modify_cb,
++      [
++        USE_NL="LIBIPVS_USE_NL"
++        CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
++        LIBS="$LIBS $(pkg-config --libs libnl-1)"
++      ],
++      [                                                                                           
++        USE_NL="LIBIPVS_DONTUSE_NL"
++        AC_MSG_WARN([keepalived will be built without libnl support.])
++      ])
+   ])
+ 
+ dnl ----[ Kernel version check ]----
+-- 
+1.8.1.4
+
diff --git a/SOURCES/0003-libipvs-libnl-3-include-fix.patch b/SOURCES/0003-libipvs-libnl-3-include-fix.patch
new file mode 100644
index 0000000..5a186ea
--- /dev/null
+++ b/SOURCES/0003-libipvs-libnl-3-include-fix.patch
@@ -0,0 +1,93 @@
+From e2562e4bc40e6092d07e0e2ad8d43fdf9d79e463 Mon Sep 17 00:00:00 2001
+From: Alexandre Cassen <acassen@gmail.com>
+Date: Tue, 7 Jan 2014 08:37:22 +0100
+Subject: [PATCH 3/7] libipvs: libnl-3 include fix
+
+when libnl-3 is present use proper include path. On most system libnl-3
+include path is /usr/include/libnl3.
+---
+ configure                          | 4 ++++
+ configure.in                       | 3 +++
+ keepalived/libipvs-2.6/Makefile.in | 2 +-
+ 3 files changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/configure b/configure
+index be6574e..90cca7d 100755
+--- a/configure
++++ b/configure
+@@ -622,6 +622,7 @@ ac_includes_default="\
+ ac_subst_vars='LTLIBOBJS
+ LIBOBJS
+ VRRP_SUPPORT
++INCLUDE_NL
+ USE_NL
+ IPVS_SUPPORT
+ VERSION_DATE
+@@ -3976,6 +3977,7 @@ if test "x$ac_cv_lib_nl_genl_3_genl_connect" = xyes; then :
+         USE_NL="LIBIPVS_USE_NL"
+         CFLAGS="$CFLAGS $(pkg-config libnl-genl-3.0)"
+ 	LIBS="$LIBS $(pkg-config --libs libnl-genl-3.0)"
++	INCLUDE_NL="-I/usr/include/libnl3"
+ 
+ else
+ 
+@@ -4027,6 +4029,7 @@ if test "x$ac_cv_lib_nl_nl_socket_modify_cb" = xyes; then :
+         USE_NL="LIBIPVS_USE_NL"
+         CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
+         LIBS="$LIBS $(pkg-config --libs libnl-1)"
++	INCLUDE_NL=""
+ 
+ else
+ 
+@@ -4462,6 +4465,7 @@ fi
+ 
+ 
+ 
++
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+ $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+ if ${ac_cv_c_const+:} false; then :
+diff --git a/configure.in b/configure.in
+index 3d4a191..364890d 100644
+--- a/configure.in
++++ b/configure.in
+@@ -63,6 +63,7 @@ AC_CHECK_LIB(nl-3, nl_socket_alloc,
+         USE_NL="LIBIPVS_USE_NL"
+         CFLAGS="$CFLAGS $(pkg-config libnl-genl-3.0)"
+ 	LIBS="$LIBS $(pkg-config --libs libnl-genl-3.0)"
++	INCLUDE_NL="-I/usr/include/libnl3"
+       ],
+       [
+         AC_MSG_ERROR([libnl-3 is installed but not libnl-gen-3. Please, install libnl-gen-3.])
+@@ -74,6 +75,7 @@ AC_CHECK_LIB(nl-3, nl_socket_alloc,
+         USE_NL="LIBIPVS_USE_NL"
+         CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
+         LIBS="$LIBS $(pkg-config --libs libnl-1)"
++	INCLUDE_NL=""
+       ],
+       [                                                                                           
+         USE_NL="LIBIPVS_DONTUSE_NL"
+@@ -277,6 +279,7 @@ AC_SUBST(VERSION)
+ AC_SUBST(VERSION_DATE)
+ AC_SUBST(IPVS_SUPPORT)
+ AC_SUBST(USE_NL)
++AC_SUBST(INCLUDE_NL)
+ AC_SUBST(VRRP_SUPPORT)
+ 
+ dnl ----[ Checks for typedefs, structures, and compiler characteristics ]----
+diff --git a/keepalived/libipvs-2.6/Makefile.in b/keepalived/libipvs-2.6/Makefile.in
+index 14cfa95..dfefc7d 100644
+--- a/keepalived/libipvs-2.6/Makefile.in
++++ b/keepalived/libipvs-2.6/Makefile.in
+@@ -1,7 +1,7 @@
+ # Makefile for libipvs
+ 
+ CC		= @CC@
+-CFLAGS		= @CFLAGS@ @CPPFLAGS@ -D@USE_NL@ -Wall -Wunused
++CFLAGS		= @CFLAGS@ @CPPFLAGS@ @INCLUDE_NL@ -D@USE_NL@ -Wall -Wunused
+ 
+ export OBJS += libipvs.a
+ 
+-- 
+1.8.1.4
+
diff --git a/SOURCES/0004-lib-extend-command-lib-string-parser.patch b/SOURCES/0004-lib-extend-command-lib-string-parser.patch
new file mode 100644
index 0000000..7dab0bb
--- /dev/null
+++ b/SOURCES/0004-lib-extend-command-lib-string-parser.patch
@@ -0,0 +1,91 @@
+From dcdc2aeafb04d09b9d7ba412d8b417c9fd072c2a Mon Sep 17 00:00:00 2001
+From: Alexandre Cassen <acassen@gmail.com>
+Date: Tue, 7 Jan 2014 15:38:57 +0100
+Subject: [PATCH 4/7] lib: extend command lib string parser
+
+Extend cmd_make_strvec to support quoted string as a single slot and
+commented string at the end of parsed string.
+---
+ lib/Makefile.in |  2 +-
+ lib/command.c   | 34 +++++++++++++++++++++++-----------
+ 2 files changed, 24 insertions(+), 12 deletions(-)
+
+diff --git a/lib/Makefile.in b/lib/Makefile.in
+index 9eb929e..ee4691f 100644
+--- a/lib/Makefile.in
++++ b/lib/Makefile.in
+@@ -42,6 +42,6 @@ logger.o: logger.c logger.h
+ list_head.o: list_head.c list_head.h
+ buffer.o: buffer.c buffer.h memory.h
+ command.o: command.c command.h vector.h memory.h vty.h timer.h \
+-	config.h
++	config.h logger.h
+ vty.o: vty.c vty.h scheduler.h timer.h utils.h command.h logger.h \
+ 	memory.h
+diff --git a/lib/command.c b/lib/command.c
+index eff59de..4814594 100644
+--- a/lib/command.c
++++ b/lib/command.c
+@@ -35,7 +35,7 @@
+ #include "timer.h"
+ 
+ /* Command vector which includes some level of command lists. Normally
+- * each daemon maintains each own cmdvec. */
++ * each daemon maintains its own cmdvec. */
+ vector_t *cmdvec = NULL;
+ 
+ desc_t desc_cr;
+@@ -156,7 +156,9 @@ sort_node(void)
+ 
+ /* Breaking up string into each command piece. I assume given
+  * character is separated by a space character. Return value is a
+- * vector which includes char ** data element. */
++ * vector which includes char ** data element. It supports
++ * quoted string as a single slot and commented string at
++ * the end of parsed string */
+ vector_t *
+ cmd_make_strvec(const char *string)
+ {
+@@ -187,20 +189,30 @@ cmd_make_strvec(const char *string)
+ 	/* Copy each command piece and set into vector. */
+ 	while (1) {
+ 		start = cp;
+-		while (!(isspace((int) *cp) || *cp == '\r' || *cp == '\n') &&
+-		       *cp != '\0')
++		if (*cp == '"') {
+ 			cp++;
+-		strlen = cp - start;
+-		token = (char *) MALLOC(strlen + 1);
+-		memcpy(token, start, strlen);
+-		*(token + strlen) = '\0';
+-		vector_set(strvec, token);
++			token = MALLOC(2);
++			*(token) = '"';
++			*(token + 1) = '\0';
++		} else {
++			while (!(isspace((int) *cp) || *cp == '\r' || *cp == '\n') &&
++			       *cp != '\0' && *cp != '"')
++				cp++;
++			strlen = cp - start;
++			token = (char *) MALLOC(strlen + 1);
++			memcpy(token, start, strlen);
++			*(token + strlen) = '\0';
++		}
++
++		/* Alloc & set the slot */
++		vector_alloc_slot(strvec);
++		vector_set_slot(strvec, token);
+ 
+-		while ((isspace ((int) *cp) || *cp == '\n' || *cp == '\r') &&
++		while ((isspace((int) *cp) || *cp == '\n' || *cp == '\r') &&
+ 		       *cp != '\0')
+ 			cp++;
+ 
+-		if (*cp == '\0')
++		if (*cp == '\0' || *cp == '!' || *cp == '#')
+ 			return strvec;
+ 	}
+ }
+-- 
+1.8.1.4
+
diff --git a/SOURCES/0005-lib-cosmetics-at-command.c.patch b/SOURCES/0005-lib-cosmetics-at-command.c.patch
new file mode 100644
index 0000000..246b372
--- /dev/null
+++ b/SOURCES/0005-lib-cosmetics-at-command.c.patch
@@ -0,0 +1,309 @@
+From 8db312d415bab144c9e5b6fd41ced3c020fcaa82 Mon Sep 17 00:00:00 2001
+From: Alexandre Cassen <acassen@gmail.com>
+Date: Tue, 7 Jan 2014 15:58:12 +0100
+Subject: [PATCH 5/7] lib: cosmetics at command.c
+
+Extend command framework to support logger and remove some dead code.
+some cosmetics too.
+---
+ lib/command.c | 86 +++++++++++++++++++++--------------------------------------
+ lib/command.h | 24 +++++------------
+ 2 files changed, 37 insertions(+), 73 deletions(-)
+
+diff --git a/lib/command.c b/lib/command.c
+index 4814594..04079b5 100644
+--- a/lib/command.c
++++ b/lib/command.c
+@@ -33,6 +33,7 @@
+ #include "vty.h"
+ #include "command.h"
+ #include "timer.h"
++#include "logger.h"
+ 
+ /* Command vector which includes some level of command lists. Normally
+  * each daemon maintains its own cmdvec. */
+@@ -310,8 +311,8 @@ cmd_make_descvec(const char *string, const char *descstr)
+ 
+ 		if (*cp == '|') {
+ 			if (!multiple) {
+-				fprintf (stderr, "Command parse error!: %s\n", string);
+-				exit (1);
++				log_message(LOG_ERR, "Command parse error!: %s\n", string);
++				exit(1);
+ 			}
+ 			cp++;
+ 		}
+@@ -407,9 +408,9 @@ install_element(node_type_t ntype, cmd_element_t *cmd)
+ 	cnode = vector_slot(cmdvec, ntype);
+ 
+ 	if (cnode == NULL) {
+-		fprintf (stderr, "Command node %d doesn't exist, please check it\n",
+-			 ntype);
+-		exit (1);
++		log_message(LOG_ERR, "Command node %d doesn't exist, please check it\n"
++				   , ntype);
++		exit(1);
+ 	}
+ 
+ 	vector_set(cnode->cmd_vector, cmd);
+@@ -417,7 +418,7 @@ install_element(node_type_t ntype, cmd_element_t *cmd)
+ 	if (cmd->strvec == NULL)
+ 		cmd->strvec = cmd_make_descvec(cmd->string, cmd->doc);
+ 
+-	cmd->cmdsize = cmd_cmdsize (cmd->strvec);
++	cmd->cmdsize = cmd_cmdsize(cmd->strvec);
+ }
+ 
+ static const unsigned char itoa64[] =
+@@ -489,9 +490,9 @@ config_write_host(vty_t *vty)
+ static vector_t *
+ cmd_node_vector(vector_t *v, node_type_t ntype)
+ {
+-  cmd_node_t *cnode = vector_slot(v, ntype);
++	cmd_node_t *cnode = vector_slot(v, ntype);
+ 
+-  return cnode->cmd_vector;
++	return cnode->cmd_vector;
+ }
+ 
+ /* Completion match types. */
+@@ -825,8 +826,8 @@ cmd_filter_by_completion(char *command, vector_t *v, unsigned int index)
+ 
+ 	/* If command and cmd_element string does not match set NULL to vector */
+ 	for (i = 0; i < vector_active (v); i++) {
+-		if ((cmd_element = vector_slot (v, i)) != NULL) {
+-			if (index >= vector_active (cmd_element->strvec)) {
++		if ((cmd_element = vector_slot(v, i)) != NULL) {
++			if (index >= vector_active(cmd_element->strvec)) {
+ 				vector_slot(v, i) = NULL;
+ 			} else {
+ 				unsigned int j;
+@@ -911,12 +912,12 @@ cmd_filter_by_string(char *command, vector_t *v, unsigned int index)
+ 	match_type = no_match;
+ 
+ 	/* If command and cmd_element string does not match set NULL to vector */
+-	for (i = 0; i < vector_active (v); i++) {
++	for (i = 0; i < vector_active(v); i++) {
+ 		if ((cmd_element = vector_slot (v, i)) != NULL) {
+ 			/* If given index is bigger than max string vector of command,
+ 			 * set NULL */
+-			if (index >= vector_active (cmd_element->strvec)) {
+-				vector_slot (v, i) = NULL;
++			if (index >= vector_active(cmd_element->strvec)) {
++				vector_slot(v, i) = NULL;
+ 			} else {
+ 				unsigned int j;
+ 				int matched = 0;
+@@ -1161,9 +1162,9 @@ cmd_unique_string(vector_t *v, const char *str)
+ 	unsigned int i;
+ 	char *match;
+ 
+-	for (i = 0; i < vector_active (v); i++) {
+-		if ((match = vector_slot (v, i)) != NULL) {
+-			if (strcmp (match, str) == 0) {
++	for (i = 0; i < vector_active(v); i++) {
++		if ((match = vector_slot(v, i)) != NULL) {
++			if (strcmp(match, str) == 0) {
+ 				return 0;
+ 			}
+ 		}
+@@ -1180,9 +1181,9 @@ desc_unique_string(vector_t *v, const char *str)
+ 	unsigned int i;
+ 	desc_t *desc;
+ 
+-	for (i = 0; i < vector_active (v); i++) {
+-		if ((desc = vector_slot (v, i)) != NULL) {
+-			if (strcmp (desc->cmd, str) == 0) {
++	for (i = 0; i < vector_active(v); i++) {
++		if ((desc = vector_slot(v, i)) != NULL) {
++			if (strcmp(desc->cmd, str) == 0) {
+ 				return 1;
+ 			}
+ 		}
+@@ -1418,7 +1419,7 @@ cmd_complete_command_real(vector_t *vline, vty_t *vty, int *status)
+ 			int ret;
+ 
+ 			/* First try completion match, if there is exactly match return 1 */
+-			match = cmd_filter_by_completion (command, cmd_vector, i);
++			match = cmd_filter_by_completion(command, cmd_vector, i);
+ 
+ 			/* If there is exact match then filter ambiguous match else check
+ 			 * ambiguousness. */
+@@ -1434,8 +1435,8 @@ cmd_complete_command_real(vector_t *vline, vty_t *vty, int *status)
+ 	matchvec = vector_init(INIT_MATCHVEC_SIZE);
+ 
+ 	/* Now we got into completion */
+-	for (i = 0; i < vector_active (cmd_vector); i++) {
+-		if ((cmd_element = vector_slot (cmd_vector, i))) {
++	for (i = 0; i < vector_active(cmd_vector); i++) {
++		if ((cmd_element = vector_slot(cmd_vector, i))) {
+ 			const char *string;
+ 			vector_t *strvec = cmd_element->strvec;
+ 
+@@ -1560,28 +1561,6 @@ cmd_complete_command(vector_t *vline, vty_t *vty, int *status)
+ node_type_t
+ node_parent(node_type_t node)
+ {
+-#if 0
+-	node_type_t ret;
+-
+-	assert(node > CONFIG_NODE);
+-
+-	switch (node) {
+-	case BGP_VPNV4_NODE:
+-	case BGP_IPV4_NODE:
+-	case BGP_IPV4M_NODE:
+-	case BGP_IPV6_NODE:
+-	case BGP_IPV6M_NODE:
+-		ret = BGP_NODE;
+-		break;
+-	case KEYCHAIN_KEY_NODE:
+-		ret = KEYCHAIN_NODE;
+-		break;
+-	default:
+-		ret = CONFIG_NODE;
+-	}
+-
+-	return ret;
+-#endif
+ 	return CONFIG_NODE;
+ }
+ 
+@@ -1628,8 +1607,8 @@ cmd_execute_command_real(vector_t *vline, vty_t *vty, cmd_element_t **cmd)
+ 	matched_count = 0;
+ 	incomplete_count = 0;
+ 
+-	for (i = 0; i < vector_active (cmd_vector); i++) {
+-		if ((cmd_element = vector_slot (cmd_vector, i))) {
++	for (i = 0; i < vector_active(cmd_vector); i++) {
++		if ((cmd_element = vector_slot(cmd_vector, i))) {
+ 			if (match == vararg_match || index >= cmd_element->cmdsize) {
+ 				matched_element = cmd_element;
+ 				matched_count++;
+@@ -1718,7 +1697,7 @@ cmd_execute_command(vector_t *vline, vty_t *vty, cmd_element_t **cmd, int vtysh)
+ 	}
+ 
+ 
+-	saved_ret = ret = cmd_execute_command_real (vline, vty, cmd);
++	saved_ret = ret = cmd_execute_command_real(vline, vty, cmd);
+ 
+ 	if (vtysh)
+ 		return saved_ret;
+@@ -1957,10 +1936,10 @@ DEFUN(config_exit,
+ }
+ 
+ /* quit is alias of exit. */
+-ALIAS (config_exit,
+-       config_quit_cmd,
+-       "quit",
+-       "Exit current mode and down to previous mode\n")
++ALIAS(config_exit,
++      config_quit_cmd,
++      "quit",
++      "Exit current mode and down to previous mode\n")
+        
+ /* End of configuration. */
+ DEFUN(config_end,
+@@ -2038,7 +2017,7 @@ DEFUN(config_list,
+ 
+ 	for (i = 0; i < vector_active (cnode->cmd_vector); i++)
+ 		if ((cmd = vector_slot (cnode->cmd_vector, i)) != NULL &&
+-		    !(cmd->attr == CMD_ATTR_DEPRECATED || cmd->attr == CMD_ATTR_HIDDEN))
++		    cmd->attr != CMD_ATTR_HIDDEN)
+ 			vty_out(vty, "  %s%s", cmd->string, VTY_NEWLINE);
+ 
+ 	return CMD_SUCCESS;
+@@ -2612,7 +2591,6 @@ cmd_init(void)
+ 	install_element(VIEW_NODE, &config_terminal_no_length_cmd);
+ 	install_element(VIEW_NODE, &echo_cmd);
+ 
+-//	install_element(ENABLE_NODE, &config_exit_cmd);
+ 	install_default(ENABLE_NODE);
+ 	install_element(ENABLE_NODE, &config_disable_cmd);
+ 	install_element(ENABLE_NODE, &config_terminal_cmd);
+@@ -2626,8 +2604,6 @@ cmd_init(void)
+ 	install_element(ENABLE_NODE, &echo_cmd);
+ 
+ 	install_default(CONFIG_NODE);
+-//	install_element(CONFIG_NODE, &config_exit_cmd);
+-
+   
+ 	install_element(CONFIG_NODE, &hostname_cmd);
+ 	install_element(CONFIG_NODE, &no_hostname_cmd);
+diff --git a/lib/command.h b/lib/command.h
+index 34091a9..71191a1 100644
+--- a/lib/command.h
++++ b/lib/command.h
+@@ -64,6 +64,7 @@ typedef enum _node_type {
+ 
+ 	VTY_NODE,					/* Vty node. */
+ 
++	GLOBAL_NODE,					/* Global daemon commands. */
+ 	CHECK_NODE,					/* Checker framework commands. */
+ 	VRRP_NODE,					/* VRRP framework commands. */
+ } node_type_t;
+@@ -118,8 +119,7 @@ typedef struct _desc {
+  */
+ 
+ enum {
+-	CMD_ATTR_DEPRECATED = 1,
+-	CMD_ATTR_HIDDEN,
++	CMD_ATTR_HIDDEN = 1,
+ };
+ 
+ #define CMD_SUCCESS		0
+@@ -187,9 +187,6 @@ enum {
+ #define DEFUN_HIDDEN(funcname, cmdname, cmdstr, helpstr)			\
+ 	DEFUN_ATTR (funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
+ 
+-#define DEFUN_DEPRECATED(funcname, cmdname, cmdstr, helpstr)			\
+-	DEFUN_ATTR (funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED)
+-
+ /* DEFUN_NOSH for commands that vtysh should ignore */
+ #define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr)				\
+ 	DEFUN(funcname, cmdname, cmdstr, helpstr)
+@@ -213,9 +210,6 @@ enum {
+ #define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr)		\
+ 	DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
+ 
+-#define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr)		\
+-	DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED)
+-
+ /* ALIAS macro which define existing command's alias. */
+ #define ALIAS(funcname, cmdname, cmdstr, helpstr)				\
+ 	DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
+@@ -226,27 +220,21 @@ enum {
+ #define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr)			\
+ 	DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, 0)
+ 
+-#define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr)			\
+-	DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, 0)
+-
+ #define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr)			\
+ 	DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
+ 
+ #define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr)		\
+ 	DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, daemon)
+ 
+-#define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr)		\
+-	DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, daemon)
+-
+ #define CMD_OPTION(S)	((S[0]) == '[')
+ #define CMD_VARIABLE(S)	(((S[0]) >= 'A' && (S[0]) <= 'Z') || ((S[0]) == '<'))
+ #define CMD_VARARG(S)	((S[0]) == '.')
+ #define CMD_RANGE(S)	((S[0] == '<'))
+ 
+-#define CMD_IPV4(S)		((strcmp ((S), "A.B.C.D") == 0))
+-#define CMD_IPV4_PREFIX(S)	((strcmp ((S), "A.B.C.D/M") == 0))
+-#define CMD_IPV6(S)		((strcmp ((S), "X:X::X:X") == 0))
+-#define CMD_IPV6_PREFIX(S)	((strcmp ((S), "X:X::X:X/M") == 0))
++#define CMD_IPV4(S)		((strcmp((S), "A.B.C.D") == 0))
++#define CMD_IPV4_PREFIX(S)	((strcmp((S), "A.B.C.D/M") == 0))
++#define CMD_IPV6(S)		((strcmp((S), "X:X::X:X") == 0))
++#define CMD_IPV6_PREFIX(S)	((strcmp((S), "X:X::X:X/M") == 0))
+ 
+ /* Common descriptions. */
+ #define SHOW_STR "Show running system information\n"
+-- 
+1.8.1.4
+
diff --git a/SOURCES/0006-lib-extend-vty-to-support-logger.patch b/SOURCES/0006-lib-extend-vty-to-support-logger.patch
new file mode 100644
index 0000000..91835d5
--- /dev/null
+++ b/SOURCES/0006-lib-extend-vty-to-support-logger.patch
@@ -0,0 +1,157 @@
+From 8b6e812dcee8a54b4b6ad4116cb0782730079952 Mon Sep 17 00:00:00 2001
+From: Alexandre Cassen <acassen@gmail.com>
+Date: Tue, 7 Jan 2014 16:10:46 +0100
+Subject: [PATCH 6/7] lib: extend vty to support logger
+
+add support to logger and some cosmetics.
+---
+ lib/vty.c | 52 +++++++++++++++++++++++++---------------------------
+ lib/vty.h |  2 +-
+ 2 files changed, 26 insertions(+), 28 deletions(-)
+
+diff --git a/lib/vty.c b/lib/vty.c
+index e8c6dc6..b84b232 100644
+--- a/lib/vty.c
++++ b/lib/vty.c
+@@ -1600,7 +1600,7 @@ vty_timeout(thread_t *thread)
+ }
+ 
+ /* Read up configuration file from file_name. */
+-static void
++static int
+ vty_read_file(FILE *confp)
+ {
+ 	int ret;
+@@ -1617,19 +1617,20 @@ vty_read_file(FILE *confp)
+ 	if (!((ret == CMD_SUCCESS) || (ret == CMD_ERR_NOTHING_TODO))) {
+ 		switch (ret) {
+ 		case CMD_ERR_AMBIGUOUS:
+-			fprintf(stderr, "Ambiguous command.\n");
++			log_message(LOG_ERR, "Ambiguous command.\n");
+ 			break;
+ 		case CMD_ERR_NO_MATCH:
+-			fprintf(stderr, "There is no such command.\n");
++			log_message(LOG_ERR, "There is no such command.\n");
+ 			break;
+ 		}
+-		fprintf(stderr, "Error occured during reading below line.\n%s\n"
+-			      , vty->buf);
++		log_message(LOG_ERR, "Error occured during reading below line.\n%s\n"
++				   , vty->buf);
+ 		vty_close(vty);
+-		exit(1);
++		return -1;
+ 	}
+ 
+ 	vty_close(vty);
++	return 0;
+ }
+ 
+ static FILE *
+@@ -1703,7 +1704,7 @@ vty_use_backup_config(char *fullpath)
+ }
+ 
+ /* Read up configuration file from file_name. */
+-void
++int
+ vty_read_config(char *config_file, char *config_default_dir)
+ {
+ 	char cwd[MAXPATHLEN];
+@@ -1717,9 +1718,9 @@ vty_read_config(char *config_file, char *config_default_dir)
+ 		if (!IS_DIRECTORY_SEP(config_file[0])) {
+ 			retpath = getcwd(cwd, MAXPATHLEN);
+ 			if (!retpath) {
+-				fprintf(stderr, "%s: failed to get current working directory: %s\n"
+-					      , __func__, strerror(errno));
+-				exit(1);
++				log_message(LOG_ERR, "%s: failed to get current working directory: %s\n"
++						   , __func__, strerror(errno));
++				return -1;
+ 			}
+ 			tmp = MALLOC(strlen(cwd) + strlen(config_file) + 2);
+ 			sprintf(tmp, "%s/%s", cwd, config_file);
+@@ -1731,32 +1732,32 @@ vty_read_config(char *config_file, char *config_default_dir)
+ 		confp = fopen(fullpath, "r");
+ 
+ 		if (confp == NULL) {
+-			fprintf(stderr, "%s: failed to open configuration file %s: %s\n"
+-				      , __func__, fullpath, strerror (errno));
++			log_message(LOG_ERR, "%s: failed to open configuration file %s: %s\n"
++					   , __func__, fullpath, strerror (errno));
+           
+ 			confp = vty_use_backup_config(fullpath);
+ 			if (confp) {
+-				fprintf(stderr, "WARNING: using backup configuration file!\n");
++				log_message(LOG_ERR, "WARNING: using backup configuration file!\n");
+ 			} else {
+-				fprintf(stderr, "can't open configuration file [%s]\n"
+-					      , config_file);
+-				exit(1);
++				log_message(LOG_ERR, "can't open configuration file [%s]\n"
++						   , config_file);
++				return -1;
+ 			}
+ 		}
+ 	} else {
+ 		confp = fopen(config_default_dir, "r");
+ 		if (confp == NULL) {
+-			fprintf(stderr, "%s: failed to open configuration file %s: %s\n"
+-				      , __func__, config_default_dir, strerror(errno));
++			log_message(LOG_ERR, "%s: failed to open configuration file %s: %s\n"
++					   , __func__, config_default_dir, strerror(errno));
+           
+ 			confp = vty_use_backup_config(config_default_dir);
+ 			if (confp) {
+-				fprintf(stderr, "WARNING: using backup configuration file!\n");
++				log_message(LOG_ERR, "WARNING: using backup configuration file!\n");
+ 				fullpath = config_default_dir;
+ 			} else {
+-				fprintf(stderr, "can't open configuration file [%s]\n"
+-					      , config_default_dir);
+-				exit (1);
++				log_message(LOG_ERR, "can't open configuration file [%s]\n"
++						   , config_default_dir);
++				return -1;
+ 			}
+ 		} else {
+ 			fullpath = config_default_dir;
+@@ -1764,12 +1765,10 @@ vty_read_config(char *config_file, char *config_default_dir)
+ 	}
+ 
+ 	vty_read_file(confp);
+-
+ 	fclose(confp);
+-
+ 	host_config_set(fullpath);
+-  
+ 	FREE_PTR(tmp);
++	return 0;
+ }
+ 
+ int
+@@ -2038,8 +2037,7 @@ vty_config_write(vty_t *vty)
+ 	return CMD_SUCCESS;
+ }
+ 
+-cmd_node_t vty_node =
+-{
++cmd_node_t vty_node = {
+ 	VTY_NODE,
+ 	"%s(config-line)# ",
+ 	1,
+diff --git a/lib/vty.h b/lib/vty.h
+index 6134ad3..2c4b44f 100644
+--- a/lib/vty.h
++++ b/lib/vty.h
+@@ -181,7 +181,7 @@ extern int vty_listen(struct sockaddr_storage *);
+ extern void vty_reset(void);
+ extern vty_t *vty_new(void);
+ extern int vty_out(vty_t *, const char *, ...) PRINTF_ATTRIBUTE(2, 3);
+-extern void vty_read_config(char *, char *);
++extern int vty_read_config(char *, char *);
+ extern void vty_time_print(vty_t *, int);
+ extern void vty_serv_sock(const char *, unsigned short, const char *);
+ extern void vty_close(vty_t *);
+-- 
+1.8.1.4
+
diff --git a/SOURCES/0007-autoconf-better-libnl3-detection.patch b/SOURCES/0007-autoconf-better-libnl3-detection.patch
new file mode 100644
index 0000000..14d9ce6
--- /dev/null
+++ b/SOURCES/0007-autoconf-better-libnl3-detection.patch
@@ -0,0 +1,99 @@
+From cba49f220eff2025771da9aab766188ceb66c5bf Mon Sep 17 00:00:00 2001
+From: Alexandre Cassen <acassen@gmail.com>
+Date: Tue, 7 Jan 2014 16:21:58 +0100
+Subject: [PATCH 7/7] autoconf: better libnl3 detection
+
+use pkg-config facilities to append CFLAGS related instead of hardcoding
+libnl3 path in configure script.
+---
+ configure                          | 6 +-----
+ configure.in                       | 5 +----
+ keepalived/libipvs-2.6/Makefile.in | 2 +-
+ 3 files changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/configure b/configure
+index 90cca7d..66ce48c 100755
+--- a/configure
++++ b/configure
+@@ -622,7 +622,6 @@ ac_includes_default="\
+ ac_subst_vars='LTLIBOBJS
+ LIBOBJS
+ VRRP_SUPPORT
+-INCLUDE_NL
+ USE_NL
+ IPVS_SUPPORT
+ VERSION_DATE
+@@ -3975,9 +3974,8 @@ $as_echo "$ac_cv_lib_nl_genl_3_genl_connect" >&6; }
+ if test "x$ac_cv_lib_nl_genl_3_genl_connect" = xyes; then :
+ 
+         USE_NL="LIBIPVS_USE_NL"
+-        CFLAGS="$CFLAGS $(pkg-config libnl-genl-3.0)"
++        CFLAGS="$CFLAGS $(pkg-config --cflags libnl-genl-3.0)"
+ 	LIBS="$LIBS $(pkg-config --libs libnl-genl-3.0)"
+-	INCLUDE_NL="-I/usr/include/libnl3"
+ 
+ else
+ 
+@@ -4029,7 +4027,6 @@ if test "x$ac_cv_lib_nl_nl_socket_modify_cb" = xyes; then :
+         USE_NL="LIBIPVS_USE_NL"
+         CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
+         LIBS="$LIBS $(pkg-config --libs libnl-1)"
+-	INCLUDE_NL=""
+ 
+ else
+ 
+@@ -4465,7 +4462,6 @@ fi
+ 
+ 
+ 
+-
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+ $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+ if ${ac_cv_c_const+:} false; then :
+diff --git a/configure.in b/configure.in
+index 364890d..7d97616 100644
+--- a/configure.in
++++ b/configure.in
+@@ -61,9 +61,8 @@ AC_CHECK_LIB(nl-3, nl_socket_alloc,
+     AC_CHECK_LIB(nl-genl-3, genl_connect,
+       [
+         USE_NL="LIBIPVS_USE_NL"
+-        CFLAGS="$CFLAGS $(pkg-config libnl-genl-3.0)"
++        CFLAGS="$CFLAGS $(pkg-config --cflags libnl-genl-3.0)"
+ 	LIBS="$LIBS $(pkg-config --libs libnl-genl-3.0)"
+-	INCLUDE_NL="-I/usr/include/libnl3"
+       ],
+       [
+         AC_MSG_ERROR([libnl-3 is installed but not libnl-gen-3. Please, install libnl-gen-3.])
+@@ -75,7 +74,6 @@ AC_CHECK_LIB(nl-3, nl_socket_alloc,
+         USE_NL="LIBIPVS_USE_NL"
+         CFLAGS="$CFLAGS -DFALLBACK_LIBNL1"
+         LIBS="$LIBS $(pkg-config --libs libnl-1)"
+-	INCLUDE_NL=""
+       ],
+       [                                                                                           
+         USE_NL="LIBIPVS_DONTUSE_NL"
+@@ -279,7 +277,6 @@ AC_SUBST(VERSION)
+ AC_SUBST(VERSION_DATE)
+ AC_SUBST(IPVS_SUPPORT)
+ AC_SUBST(USE_NL)
+-AC_SUBST(INCLUDE_NL)
+ AC_SUBST(VRRP_SUPPORT)
+ 
+ dnl ----[ Checks for typedefs, structures, and compiler characteristics ]----
+diff --git a/keepalived/libipvs-2.6/Makefile.in b/keepalived/libipvs-2.6/Makefile.in
+index dfefc7d..14cfa95 100644
+--- a/keepalived/libipvs-2.6/Makefile.in
++++ b/keepalived/libipvs-2.6/Makefile.in
+@@ -1,7 +1,7 @@
+ # Makefile for libipvs
+ 
+ CC		= @CC@
+-CFLAGS		= @CFLAGS@ @CPPFLAGS@ @INCLUDE_NL@ -D@USE_NL@ -Wall -Wunused
++CFLAGS		= @CFLAGS@ @CPPFLAGS@ -D@USE_NL@ -Wall -Wunused
+ 
+ export OBJS += libipvs.a
+ 
+-- 
+1.8.1.4
+
diff --git a/SPECS/keepalived.spec b/SPECS/keepalived.spec
index d6db158..545de43 100644
--- a/SPECS/keepalived.spec
+++ b/SPECS/keepalived.spec
@@ -1,6 +1,6 @@
 %bcond_without snmp
-%bcond_without sha1
 %bcond_without vrrp
+%bcond_without sha1
 %bcond_with profile
 %bcond_with debug
 
@@ -8,8 +8,8 @@
 
 Name: keepalived
 Summary: High Availability monitor built upon LVS, VRRP and service pollers
-Version: 1.2.8
-Release: 1%{?dist}
+Version: 1.2.10
+Release: 2%{?dist}
 License: GPLv2+
 URL: http://www.keepalived.org/
 Group: System Environment/Daemons
@@ -17,6 +17,14 @@ Group: System Environment/Daemons
 Source0: http://www.keepalived.org/software/keepalived-%{version}.tar.gz
 Source1: keepalived.service
 
+Patch1: 0001-ipvs-make-nlerr2syserr-libnl-dependent.patch
+Patch2: 0002-fix-libnl-libnl-3-logic-in-configure-script.patch
+Patch3: 0003-libipvs-libnl-3-include-fix.patch
+Patch4: 0004-lib-extend-command-lib-string-parser.patch
+Patch5: 0005-lib-cosmetics-at-command.c.patch
+Patch6: 0006-lib-extend-vty-to-support-logger.patch
+Patch7: 0007-autoconf-better-libnl3-detection.patch
+
 Requires(post): systemd
 Requires(preun): systemd
 Requires(postun): systemd
@@ -27,7 +35,7 @@ BuildRequires: net-snmp-devel
 %endif
 BuildRequires: systemd-units
 BuildRequires: openssl-devel
-BuildRequires: libnl-devel
+BuildRequires: libnl3-devel
 BuildRequires: kernel-devel
 BuildRequires: popt-devel
 
@@ -47,6 +55,13 @@ infrastructures.
 
 %prep
 %setup -q
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
 
 %build
 %configure \
@@ -102,6 +117,15 @@ rm -rf %{buildroot}
 %{_mandir}/man8/keepalived.8*
 
 %changelog
+* Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 1.2.10-2
+- Mass rebuild 2014-01-24
+
+* Tue Jan 14 2014 Ryan O'Hara <rohara@redhat.com> - 1.2.10-1
+- Rebase to upstream version 1.2.10 (#1052359)
+
+* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> - 1.2.8-2
+- Mass rebuild 2013-12-27
+
 * Thu Sep 05 2013 Ryan O'Hara <rohara@redhat.com> - 1.2.8-1
 - Update to 1.2.8.