diff --git a/libgtnl/include/libgtpnl/gtp.h b/libgtnl/include/libgtpnl/gtp.h
index 10b34d5..fa09d2a 100644
--- a/libgtnl/include/libgtpnl/gtp.h
+++ b/libgtnl/include/libgtpnl/gtp.h
@@ -8,6 +8,7 @@ struct gtp_tunnel;
 struct gtp_tunnel *gtp_tunnel_alloc(void);
 void gtp_tunnel_free(struct gtp_tunnel *t);
 
+void gtp_tunnel_set_ifns(struct gtp_tunnel *t, int ifns);
 void gtp_tunnel_set_ifidx(struct gtp_tunnel *t, uint32_t ifidx);
 void gtp_tunnel_set_ms_ip4(struct gtp_tunnel *t, struct in_addr *ms_addr);
 void gtp_tunnel_set_sgsn_ip4(struct gtp_tunnel *t, struct in_addr *sgsn_addr);
@@ -15,6 +16,7 @@ void gtp_tunnel_set_version(struct gtp_tunnel *t, uint32_t version);
 void gtp_tunnel_set_tid(struct gtp_tunnel *t, uint64_t tid);
 void gtp_tunnel_set_flowid(struct gtp_tunnel *t, uint16_t flowid);
 
+const int gtp_tunnel_get_ifns(struct gtp_tunnel *t);
 const uint32_t gtp_tunnel_get_ifidx(struct gtp_tunnel *t);
 const struct in_addr *gtp_tunnel_get_ms_ip4(struct gtp_tunnel *t);
 const struct in_addr *gtp_tunnel_get_sgsn_ip4(struct gtp_tunnel *t);
diff --git a/libgtnl/include/libgtpnl/gtpnl.h b/libgtnl/include/libgtpnl/gtpnl.h
index c4faf6c..3d3fd73 100644
--- a/libgtnl/include/libgtpnl/gtpnl.h
+++ b/libgtnl/include/libgtpnl/gtpnl.h
@@ -16,7 +16,7 @@ int genl_lookup_family(struct mnl_socket *nl, const char *family);
 
 struct in_addr;
 
-int gtp_dev_create(const char *gtp_ifname, const char *real_ifname,
+int gtp_dev_create(int dest_ns, const char *gtp_ifname, const char *real_ifname,
 		   int fd0, int fd1);
 int gtp_dev_config(const char *iface, struct in_addr *net, uint32_t prefix);
 int gtp_dev_destroy(const char *gtp_ifname);
diff --git a/libgtnl/include/linux/gtp_nl.h b/libgtnl/include/linux/gtp_nl.h
index 0a28046..a8fdf3a 100644
--- a/libgtnl/include/linux/gtp_nl.h
+++ b/libgtnl/include/linux/gtp_nl.h
@@ -40,6 +40,7 @@ enum gtp_attrs {
 	GTPA_SGSN_ADDRESS,
 	GTPA_MS_ADDRESS,
 	GTPA_FLOWID,	/* only for GTPv0 */
+	GTPA_NET_NS_FD,
 	__GTPA_MAX,
 };
 #define GTPA_MAX (__GTPA_MAX + 1)
diff --git a/libgtnl/src/gtp-genl.c b/libgtnl/src/gtp-genl.c
index c1f60ab..9e68a30 100644
--- a/libgtnl/src/gtp-genl.c
+++ b/libgtnl/src/gtp-genl.c
@@ -44,6 +44,8 @@
 static void gtp_build_payload(struct nlmsghdr *nlh, struct gtp_tunnel *t)
 {
 	mnl_attr_put_u32(nlh, GTPA_VERSION, t->gtp_version);
+	if (t->ifns > 0)
+		mnl_attr_put_u32(nlh, GTPA_NET_NS_FD, t->ifns);
 	mnl_attr_put_u32(nlh, GTPA_LINK, t->ifidx);
 	mnl_attr_put_u32(nlh, GTPA_SGSN_ADDRESS, t->sgsn_addr.s_addr);
 	mnl_attr_put_u32(nlh, GTPA_MS_ADDRESS, t->ms_addr.s_addr);
diff --git a/libgtnl/src/gtp-rtnl.c b/libgtnl/src/gtp-rtnl.c
index 22b9430..db54653 100644
--- a/libgtnl/src/gtp-rtnl.c
+++ b/libgtnl/src/gtp-rtnl.c
@@ -38,6 +38,10 @@
 
 #include "internal.h"
 
+#if !defined(IFLA_LINK_NETNSID)
+#define IFLA_LINK_NETNSID (IFLA_PHYS_SWITCH_ID + 1)
+#endif
+
 static struct nlmsghdr *
 gtp_put_nlmsg(char *buf, uint16_t type, uint16_t nl_flags, uint32_t seq)
 {
@@ -104,7 +108,7 @@ static int gtp_dev_talk(struct nlmsghdr *nlh, uint32_t seq)
 	return ret;
 }
 
-int gtp_dev_create(const char *gtp_ifname, const char *real_ifname,
+int gtp_dev_create(int dest_ns, const char *gtp_ifname, const char *real_ifname,
 		   int fd0, int fd1)
 {
 	char buf[MNL_SOCKET_BUFFER_SIZE];
@@ -120,6 +124,8 @@ int gtp_dev_create(const char *gtp_ifname, const char *real_ifname,
 	ifm->ifi_change |= IFF_UP;
 	ifm->ifi_flags |= IFF_UP;
 
+	if (dest_ns > 0)
+		mnl_attr_put_u32(nlh, IFLA_NET_NS_FD, dest_ns);
 	mnl_attr_put_u32(nlh, IFLA_LINK, if_nametoindex(real_ifname));
 	mnl_attr_put_str(nlh, IFLA_IFNAME, gtp_ifname);
 	nest = mnl_attr_nest_start(nlh, IFLA_LINKINFO);
diff --git a/libgtnl/src/gtp.c b/libgtnl/src/gtp.c
index 4534091..6e3d473 100644
--- a/libgtnl/src/gtp.c
+++ b/libgtnl/src/gtp.c
@@ -39,6 +39,12 @@ void gtp_tunnel_free(struct gtp_tunnel *t)
 }
 EXPORT_SYMBOL(gtp_tunnel_free);
 
+void gtp_tunnel_set_ifns(struct gtp_tunnel *t, int ifns)
+{
+	t->ifns = ifns;
+}
+EXPORT_SYMBOL(gtp_tunnel_set_ifns);
+
 void gtp_tunnel_set_ifidx(struct gtp_tunnel *t, uint32_t ifidx)
 {
 	t->ifidx = ifidx;
@@ -75,6 +81,12 @@ void gtp_tunnel_set_flowid(struct gtp_tunnel *t, uint16_t flowid)
 }
 EXPORT_SYMBOL(gtp_tunnel_set_flowid);
 
+const int gtp_tunnel_get_ifns(struct gtp_tunnel *t)
+{
+	return t->ifns;
+}
+EXPORT_SYMBOL(gtp_tunnel_get_ifns);
+
 const uint32_t gtp_tunnel_get_ifidx(struct gtp_tunnel *t)
 {
 	return t->ifidx;
diff --git a/libgtnl/src/internal.h b/libgtnl/src/internal.h
index 75b3954..68f0135 100644
--- a/libgtnl/src/internal.h
+++ b/libgtnl/src/internal.h
@@ -13,6 +13,7 @@
 #include <netinet/in.h>
 
 struct gtp_tunnel {
+	int             ifns;
 	uint32_t	ifidx;
 	struct in_addr	ms_addr;
 	struct in_addr	sgsn_addr;
diff --git a/libgtnl/src/libgtpnl.map b/libgtnl/src/libgtpnl.map
index 6e69ef8..2368467 100644
--- a/libgtnl/src/libgtpnl.map
+++ b/libgtnl/src/libgtpnl.map
@@ -15,12 +15,14 @@ global:
 
   gtp_tunnel_alloc;
   gtp_tunnel_free;
+  gtp_tunnel_set_ifns;
   gtp_tunnel_set_ifidx;
   gtp_tunnel_set_ms_ip4;
   gtp_tunnel_set_sgsn_ip4;
   gtp_tunnel_set_version;
   gtp_tunnel_set_tid;
   gtp_tunnel_set_flowid;
+  gtp_tunnel_get_ifns;
   gtp_tunnel_get_ifidx;
   gtp_tunnel_get_ms_ip4;
   gtp_tunnel_get_sgsn_ip4;
