Attach the payload from ping frame to ping ack
diff --git a/transport/control.go b/transport/control.go
index 6b5201e..f6b38a5 100644
--- a/transport/control.go
+++ b/transport/control.go
@@ -86,7 +86,8 @@
 }
 
 type ping struct {
-	ack bool
+	ack  bool
+	data [8]byte
 }
 
 func (ping) isItem() bool {
diff --git a/transport/http2_client.go b/transport/http2_client.go
index b13fb78..9bbbb4d 100644
--- a/transport/http2_client.go
+++ b/transport/http2_client.go
@@ -646,7 +646,9 @@
 }
 
 func (t *http2Client) handlePing(f *http2.PingFrame) {
-	t.controlBuf.put(&ping{true})
+	pingAck := &ping{ack: true}
+	copy(pingAck.data[:], f.Data[:])
+	t.controlBuf.put(pingAck)
 }
 
 func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) {
@@ -827,9 +829,7 @@
 				case *flushIO:
 					t.framer.flushWrite()
 				case *ping:
-					// TODO(zhaoq): Ack with all-0 data now. will change to some
-					// meaningful content when this is actually in use.
-					t.framer.writePing(true, i.ack, [8]byte{})
+					t.framer.writePing(true, i.ack, i.data)
 				default:
 					grpclog.Printf("transport: http2Client.controller got unexpected item type %v\n", i)
 				}
diff --git a/transport/http2_server.go b/transport/http2_server.go
index ceb3055..289e4fe 100644
--- a/transport/http2_server.go
+++ b/transport/http2_server.go
@@ -377,7 +377,9 @@
 }
 
 func (t *http2Server) handlePing(f *http2.PingFrame) {
-	t.controlBuf.put(&ping{true})
+	pingAck := &ping{ack: true}
+	copy(pingAck.data[:], f.Data[:])
+	t.controlBuf.put(pingAck)
 }
 
 func (t *http2Server) handleWindowUpdate(f *http2.WindowUpdateFrame) {
@@ -628,9 +630,7 @@
 				case *flushIO:
 					t.framer.flushWrite()
 				case *ping:
-					// TODO(zhaoq): Ack with all-0 data now. will change to some
-					// meaningful content when this is actually in use.
-					t.framer.writePing(true, i.ack, [8]byte{})
+					t.framer.writePing(true, i.ack, i.data)
 				default:
 					grpclog.Printf("transport: http2Server.controller got unexpected item type %v\n", i)
 				}
diff --git a/transport/transport_test.go b/transport/transport_test.go
index 06847ce..84c8d0f 100644
--- a/transport/transport_test.go
+++ b/transport/transport_test.go
@@ -483,12 +483,12 @@
 	}
 	cc.Close()
 	select {
-		case <-ss.Context().Done():
-			if ss.Context().Err() != context.Canceled {
-				t.Fatalf("ss.Context().Err() got %v, want %v", ss.Context().Err(), context.Canceled)
-			}
-		case <-time.After(5 * time.Second):
-			t.Fatalf("Failed to cancel the context of the sever side stream.")
+	case <-ss.Context().Done():
+		if ss.Context().Err() != context.Canceled {
+			t.Fatalf("ss.Context().Err() got %v, want %v", ss.Context().Err(), context.Canceled)
+		}
+	case <-time.After(5 * time.Second):
+		t.Fatalf("Failed to cancel the context of the sever side stream.")
 	}
 }