diff --git a/.travis.yml b/.travis.yml
index 7c05419..b562071 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,6 +5,10 @@ go:
   - 1.14.x
   - tip
 
+arch:
+  - amd64
+  - ppc64le
+
 script:
   - go test -v -cover -race ./...
 
diff --git a/debian/changelog b/debian/changelog
index 0addad7..3711efb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+golang-github-opentracing-contrib-go-stdlib (1.0.0+git20201217.1.08d136d-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 09 Apr 2021 13:19:13 -0000
+
 golang-github-opentracing-contrib-go-stdlib (1.0.0-1) unstable; urgency=medium
 
   * Team upload.
diff --git a/nethttp/client.go b/nethttp/client.go
index bfb305f..16d2078 100644
--- a/nethttp/client.go
+++ b/nethttp/client.go
@@ -34,7 +34,7 @@ type Transport struct {
 type clientOptions struct {
 	operationName            string
 	componentName            string
-	urlTagFunc         func(u *url.URL) string
+	urlTagFunc               func(u *url.URL) string
 	disableClientTrace       bool
 	disableInjectSpanContext bool
 	spanObserver             func(span opentracing.Span, r *http.Request)
@@ -149,6 +149,18 @@ func (c closeTracker) Close() error {
 	return err
 }
 
+type writerCloseTracker struct {
+	io.ReadWriteCloser
+	sp opentracing.Span
+}
+
+func (c writerCloseTracker) Close() error {
+	err := c.ReadWriteCloser.Close()
+	c.sp.LogFields(log.String("event", "ClosedBody"))
+	c.sp.Finish()
+	return err
+}
+
 // TracerFromRequest retrieves the Tracer from the request. If the request does
 // not have a Tracer it will return nil.
 func TracerFromRequest(req *http.Request) *Tracer {
@@ -174,6 +186,7 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
 
 	ext.HTTPMethod.Set(tracer.sp, req.Method)
 	ext.HTTPUrl.Set(tracer.sp, tracer.opts.urlTagFunc(req.URL))
+	ext.PeerAddress.Set(tracer.sp, req.URL.Host)
 	tracer.opts.spanObserver(tracer.sp, req)
 
 	if !tracer.opts.disableInjectSpanContext {
@@ -194,7 +207,12 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
 	if req.Method == "HEAD" {
 		tracer.sp.Finish()
 	} else {
-		resp.Body = closeTracker{resp.Body, tracer.sp}
+		readWriteCloser, ok := resp.Body.(io.ReadWriteCloser)
+		if ok {
+			resp.Body = writerCloseTracker{readWriteCloser, tracer.sp}
+		} else {
+			resp.Body = closeTracker{resp.Body, tracer.sp}
+		}
 	}
 	return resp, nil
 }
@@ -223,8 +241,7 @@ func (h *Tracer) start(req *http.Request) opentracing.Span {
 	}
 
 	ctx := h.root.Context()
-	h.sp = h.tr.StartSpan("HTTP "+req.Method, opentracing.ChildOf(ctx))
-	ext.SpanKindRPCClient.Set(h.sp)
+	h.sp = h.tr.StartSpan("HTTP "+req.Method, opentracing.ChildOf(ctx), ext.SpanKindRPCClient)
 
 	componentName := h.opts.componentName
 	if componentName == "" {
@@ -266,8 +283,7 @@ func (h *Tracer) clientTrace() *httptrace.ClientTrace {
 }
 
 func (h *Tracer) getConn(hostPort string) {
-	ext.HTTPUrl.Set(h.sp, hostPort)
-	h.sp.LogFields(log.String("event", "GetConn"))
+	h.sp.LogFields(log.String("event", "GetConn"), log.String("hostPort", hostPort))
 }
 
 func (h *Tracer) gotConn(info httptrace.GotConnInfo) {
diff --git a/nethttp/client_test.go b/nethttp/client_test.go
index 7128f1e..9f922bf 100644
--- a/nethttp/client_test.go
+++ b/nethttp/client_test.go
@@ -1,6 +1,9 @@
 package nethttp
 
 import (
+	"bytes"
+	"fmt"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"net/url"
@@ -135,6 +138,64 @@ func TestTracerFromRequest(t *testing.T) {
 	}
 }
 
+func TestWriteCloserFromRequest(t *testing.T) {
+	wait := make(chan bool, 0)
+	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		defer func() {
+			wait <- true
+		}()
+
+		w.Header().Set("Upgrade", "websocket")
+		w.Header().Set("Connection", "Upgrade")
+		w.WriteHeader(http.StatusSwitchingProtocols)
+
+		hijacker := w.(http.Hijacker)
+		_, rw, err := hijacker.Hijack()
+
+		if err != nil {
+			t.Fatal("Failed to hijack connection")
+		}
+
+		line, _, err := rw.ReadLine()
+		if string(line) != "ping" {
+			t.Fatalf("Expected 'ping' received %q", string(line))
+		}
+
+		if err != nil {
+			t.Fatal(err)
+		}
+	}))
+
+	var buf bytes.Buffer
+	req, err := http.NewRequest("POST", srv.URL, &buf)
+	req.Header.Set("Connection", "upgrade")
+	req.Header.Set("Upgrade", "websocket")
+	req.Proto = "HTTP/1.1"
+	req.ProtoMajor = 1
+	req.ProtoMinor = 1
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	tr := &mocktracer.MockTracer{}
+	req, _ = TraceRequest(tr, req)
+
+	client := &http.Client{Transport: &Transport{}}
+	resp, err := client.Do(req)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	rw, ok := resp.Body.(io.ReadWriteCloser)
+	if !ok {
+		t.Fatal("resp.Body is not a io.ReadWriteCloser")
+	}
+
+	fmt.Fprint(rw, "ping\n")
+	<-wait
+	rw.Close()
+}
+
 func TestInjectSpanContext(t *testing.T) {
 	tests := []struct {
 		name                     string
@@ -227,8 +288,8 @@ func TestClientCustomURL(t *testing.T) {
 		tag  string
 	}{
 		// These first cases fail early
-		{[]ClientOption{}, "/ok?token=a", srv.Listener.Addr().String()},
-		{[]ClientOption{URLTagFunc(fn)}, "/ok?token=c", srv.Listener.Addr().String()},
+		{[]ClientOption{}, "/ok?token=a", srv.URL + "/ok?token=a"},
+		{[]ClientOption{URLTagFunc(fn)}, "/ok?token=c", srv.URL + "/ok?token=*"},
 		// Disable ClientTrace to fire RoundTrip
 		{[]ClientOption{ClientTrace(false)}, "/ok?token=b", srv.URL + "/ok?token=b"},
 		{[]ClientOption{ClientTrace(false), URLTagFunc(fn)}, "/ok?token=c", srv.URL + "/ok?token=*"},
@@ -251,5 +312,12 @@ func TestClientCustomURL(t *testing.T) {
 		if got, want := tag, tt.tag; got != want {
 			t.Fatalf("got %s tag name, expected %s", got, want)
 		}
+		peerAddress, ok := clientSpan.Tags()["peer.address"]
+		if !ok {
+			t.Fatal("cannot find peer.address tag")
+		}
+		if peerAddress != srv.Listener.Addr().String() {
+			t.Fatalf("got %s want %s in peer.address tag", peerAddress, srv.Listener.Addr().String())
+		}
 	}
-}
\ No newline at end of file
+}