--- erlang-13.b.1-dfsg.orig/lib/kernel/src/inet_db.erl
+++ erlang-13.b.1-dfsg/lib/kernel/src/inet_db.erl
@@ -846,7 +846,6 @@
 	{lookup_rr, Domain, Class, Type} ->
 	    {reply, do_lookup_rr(Domain, Class, Type), State};
 
-	%% XXX Fix IPv6 nameservers
 	{ins_ns, {A,B,C,D},Port} when ?ip(A,B,C,D), is_integer(Port) ->
 	    [{_,Ns}] = ets:lookup(Db, res_ns),
 	    ets:insert(Db, {res_ns, [{{A,B,C,D},Port} | Ns]}),
@@ -862,11 +861,25 @@
 	    ets:insert(Db, {res_ns, keydelete({A,B,C,D}, 1, Ns)}),
 	    {reply, ok, State};
 
+	{ins_ns, {A,B,C,D,E,F,G,H},Port} when ?ip6(A,B,C,D,E,F,G,H), is_integer(Port) ->
+	    [{_,Ns}] = ets:lookup(Db, res_ns),
+	    ets:insert(Db, {res_ns, [{{A,B,C,D,E,F,G,H},Port} | Ns]}),
+	    {reply, ok, State};
+
+	{add_ns, {A,B,C,D,E,F,G,H}, Port} when ?ip6(A,B,C,D,E,F,G,H), is_integer(Port) ->
+	    [{_,Ns}] = ets:lookup(Db, res_ns),
+	    ets:insert(Db, {res_ns, Ns ++ [{{A,B,C,D,E,F,G,H},Port}]}),
+	    {reply, ok, State};
+
+	{del_ns, {A,B,C,D,E,F,G,H}} when ?ip6(A,B,C,D,E,F,G,H) ->
+	    [{_,Ns}] = ets:lookup(Db, res_ns),
+	    ets:insert(Db, {res_ns, keydelete({A,B,C,D,E,F,G,H}, 1, Ns)}),
+	    {reply, ok, State};
+
 	del_ns ->
 	    ets:insert(Db, {res_ns, []}),
 	    {reply, ok, State};
 
-	%% Fix IPv6 nameservers
 	{ins_alt_ns, {A,B,C,D}, Port} when ?ip(A,B,C,D), is_integer(Port) ->
 	    [{_,Ns}] = ets:lookup(Db, res_alt_ns),
 	    ets:insert(Db, {res_alt_ns, [{{A,B,C,D},Port} | Ns]}),
@@ -882,6 +895,21 @@
 	    ets:insert(Db, {res_alt_ns, keydelete({A,B,C,D}, 1, Ns)}),
 	    {reply, ok, State};
 
+	{ins_alt_ns, {A,B,C,D,E,F,G,H}, Port} when ?ip6(A,B,C,D,E,F,G,H), is_integer(Port) ->
+	    [{_,Ns}] = ets:lookup(Db, res_alt_ns),
+	    ets:insert(Db, {res_alt_ns, [{{A,B,C,D,E,F,G,H},Port} | Ns]}),
+	    {reply, ok, State};
+
+	{add_alt_ns, {A,B,C,D,E,F,G,H}, Port} when ?ip6(A,B,C,D,E,F,G,H), is_integer(Port) ->
+	    [{_,Ns}] = ets:lookup(Db, res_alt_ns),
+	    ets:insert(Db, {res_alt_ns, Ns ++ [{{A,B,C,D,E,F,G,H},Port}]}),
+	    {reply, ok, State};
+
+	{del_alt_ns, {A,B,C,D,E,F,G,H}} when ?ip6(A,B,C,D,E,F,G,H) ->
+	    [{_,Ns}] = ets:lookup(Db, res_alt_ns),
+	    ets:insert(Db, {res_alt_ns, keydelete({A,B,C,D,E,F,G,H}, 1, Ns)}),
+	    {reply, ok, State};
+
 	del_alt_ns ->
 	    ets:insert(Db, {res_alt_ns, []}),
 	    {reply, ok, State};
--- erlang-13.b.1-dfsg.orig/lib/kernel/src/inet_res.erl
+++ erlang-13.b.1-dfsg/lib/kernel/src/inet_res.erl
@@ -429,65 +429,72 @@
     end.
     
 res_send_udp2(Id, Buffer, Retry, Tm, Timer, Ns) ->
-    case inet_udp:open(0, [{active,false}]) of
-	{ok,S} ->
-	    Res = res_send_udp(S, Id, Buffer, 0, Retry, Tm, Timer, Ns),
-	    inet_udp:close(S),
-	    Res;
-	Error -> Error
-    end.
+    res_send_udp(Id, Buffer, 0, Retry, Tm, Timer, Ns).
 
-res_send_udp(_S, _Id, _Buffer, N, N, _Tm, _Timer, _Ns) -> 
+res_send_udp(_Id, _Buffer, N, N, _Tm, _Timer, _Ns) -> 
     {error, timeout};
-res_send_udp(S, Id, Buffer, I, N, Tm, Timer, Ns) ->
+res_send_udp(Id, Buffer, I, N, Tm, Timer, Ns) ->
     Num = length(Ns),
     if Num =:= 0 ->
 	    {error, timeout};
        true ->
-	    case res_send_query_udp(S,Id,Buffer,I,Num,Tm,Timer,Ns,[]) of
+	    case res_send_query_udp(Id,Buffer,I,Num,Tm,Timer,Ns,[]) of
 		{noanswer, ErrNs} -> %% remove unreachable nameservers
-		    res_send_udp(S, Id, Buffer, I+1, N, Tm,Timer,Ns--ErrNs);
+		    res_send_udp(Id, Buffer, I+1, N, Tm,Timer,Ns--ErrNs);
 		Result ->
 		    Result
 	    end
     end.
 
-res_send_query_udp(S, Id, Buffer, I, N, Tm, Timer, [{IP, Port}|Ns],ErrNs) ->
+res_send_query_udp(Id, Buffer, I, N, Tm, Timer, [{IP, Port}|Ns],ErrNs) ->
     Timeout = inet:timeout( (Tm * (1 bsl I)) div N, Timer),
     ?dbg("Try UDP server : ~p:~p (timeout=~w)\n", [IP, Port,Timeout]),
-    inet_udp:connect(S, IP, Port),
-    inet_udp:send(S, IP, Port, Buffer),
-    case res_recv_reply_udp(S, IP, Port, Id, Timeout) of
-	{ok, Rec} -> 
-	    {ok, Rec};
-	{error, nxdomain} ->
-	    {error, nxdomain};
-	{error, qfmterror} ->
-	    {error, einval};
-	{error, enetunreach} ->
-	    res_send_query_udp(S, Id, Buffer, I, N, Tm,Timer, 
-			       Ns, [{IP,Port}|ErrNs]);
-	{error, econnrefused} -> 
-	    res_send_query_udp(S, Id, Buffer, I, N, Tm, Timer, 
-			       Ns, [{IP,Port}|ErrNs]);
-	{error, timeout} when Timeout =:= 0 ->
-	    {error, timeout};
-	_Error -> res_send_query_udp(S, Id, Buffer, I, N, Tm, Timer,
-				    Ns, ErrNs)
+    Module = case IP of
+		 {A,B,C,D} when ?ip(A,B,C,D) ->
+		     inet_udp;
+		 {A,B,C,D,E,F,G,H} when ?ip6(A,B,C,D,E,F,G,H) ->
+		     inet6_udp
+	     end,
+    case Module:open(0, [{active,false}]) of
+	{ok, S} ->
+	    Module:connect(S, IP, Port),
+	    Module:send(S, IP, Port, Buffer),
+	    Result = res_recv_reply_udp(Module, S, IP, Port, Id, Timeout),
+	    Module:close(S),
+	    case Result of
+		{ok, Rec} -> 
+		    {ok, Rec};
+		{error, nxdomain} ->
+		    {error, nxdomain};
+		{error, qfmterror} ->
+		    {error, einval};
+		{error, enetunreach} ->
+		    res_send_query_udp(Id, Buffer, I, N, Tm,Timer, 
+				       Ns, [{IP,Port}|ErrNs]);
+		{error, econnrefused} -> 
+		    res_send_query_udp(Id, Buffer, I, N, Tm, Timer, 
+				       Ns, [{IP,Port}|ErrNs]);
+		{error, timeout} when Timeout =:= 0 ->
+		    {error, timeout};
+		_Error -> res_send_query_udp(Id, Buffer, I, N, Tm, Timer,
+					     Ns, ErrNs)
+	    end;
+	Error ->
+	    Error
     end;
-res_send_query_udp(_S, _Id, _Buffer, _I, _N, _Tm, _Timer, [], ErrNs) ->
+res_send_query_udp(_Id, _Buffer, _I, _N, _Tm, _Timer, [], ErrNs) ->
     {noanswer, ErrNs}.
 
 
-res_recv_reply_udp(S, IP, Port, Id, Timeout) ->
-    case inet_udp:recv(S, 0, Timeout) of
+res_recv_reply_udp(Module, S, IP, Port, Id, Timeout) ->
+    case Module:recv(S, 0, Timeout) of
 	{ok, {IP, Port, Answer}} ->
 	    case decode_answer(Answer, Id) of
 		{error, badid} ->
-		    res_recv_reply_udp(S, IP, Port, Id, Timeout);
+		    res_recv_reply_udp(Module, S, IP, Port, Id, Timeout);
 		Reply -> Reply
 	    end;
-	{ok, _} -> res_recv_reply_udp(S, IP, Port, Id, Timeout);
+	{ok, _} -> res_recv_reply_udp(Module, S, IP, Port, Id, Timeout);
 	Error -> 
 	    ?dbg("Udp server error: ~p\n", [Error]),
 	    Error
@@ -497,14 +504,20 @@
 res_send_tcp2(Id, Buffer, Retry, Tm, Timer, [{IP,Port}|Ns]) ->
     Timeout = inet:timeout(Tm*5, Timer),
     ?dbg("Try TCP server : ~p:~p (timeout=~w)\n", [IP, Port, Timeout]),
-    case catch inet_tcp:connect(IP, Port, 
-				[{active,false},{packet,2}], 
-				Timeout) of
+    Module = case IP of
+		 {A,B,C,D} when ?ip(A,B,C,D) ->
+		     inet_tcp;
+		 {A,B,C,D,E,F,G,H} when ?ip6(A,B,C,D,E,F,G,H) ->
+		     inet6_tcp
+	     end,
+    case catch Module:connect(IP, Port, 
+			      [{active,false},{packet,2}], 
+			      Timeout) of
 	     {ok, S} ->
-		 inet_tcp:send(S, Buffer),
-		 case inet_tcp:recv(S, 0, Timeout) of
+		 Module:send(S, Buffer),
+		 case Module:recv(S, 0, Timeout) of
 		     {ok, Answer} ->
-			 inet_tcp:close(S),
+			 Module:close(S),
 			 case decode_answer(Answer, Id) of
 			     {ok,Rec} -> {ok, Rec};
 			     {error, nxdomain} -> {error, nxdomain};
@@ -514,7 +527,7 @@
 				 res_send_tcp2(Id, Buffer, Retry, Tm, Timer, Ns)
 			 end;
 		     _Error ->
-			 inet_tcp:close(S),
+			 Module:close(S),
 			 res_send_tcp2(Id, Buffer, Retry, Tm, Timer, Ns)
 		 end;
 	       _Error -> 
