diff --git a/lib/gtls.c b/lib/gtls.c
index 2cb1fae410d4aa02eb42e5c58231efbebc9be495..99be073a06745893bd14953f9ea222da508955a1 100644
--- a/lib/gtls.c
+++ b/lib/gtls.c
@@ -633,8 +633,8 @@ gtls_connect_step3(struct connectdata *conn,
   infof(data, "\t MAC: %s\n", ptr);
 
   conn->ssl[sockindex].state = ssl_connection_complete;
-  conn->recv = gtls_recv;
-  conn->send = gtls_send;
+  conn->recv[sockindex] = gtls_recv;
+  conn->send[sockindex] = gtls_send;
 
   {
     /* we always unconditionally get the session id here, as even if we
diff --git a/lib/nss.c b/lib/nss.c
index 3312e8a4ff835c6c83d1dd2e4bff7c6ad25c35fd..4058d7867def5e4644a4aa4403c64ec530ee9aa6 100644
--- a/lib/nss.c
+++ b/lib/nss.c
@@ -1339,8 +1339,8 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex)
   }
 
   connssl->state = ssl_connection_complete;
-  conn->recv = nss_recv;
-  conn->send = nss_send;
+  conn->recv[sockindex] = nss_recv;
+  conn->send[sockindex] = nss_send;
 
   display_conn_info(conn, connssl->handle);
 
diff --git a/lib/polarssl.c b/lib/polarssl.c
index 0027e31e0e8382973311000b0bd3e5bb41af80e7..285b3ae04712df434247f22d4d9a8df96002970b 100644
--- a/lib/polarssl.c
+++ b/lib/polarssl.c
@@ -302,8 +302,8 @@ Curl_polarssl_connect(struct connectdata *conn,
   }
 
   conn->ssl[sockindex].state = ssl_connection_complete;
-  conn->recv = polarssl_recv;
-  conn->send = polarssl_send;
+  conn->recv[sockindex] = polarssl_recv;
+  conn->send[sockindex] = polarssl_send;
 
   /* Save the current session data for possible re-use */
   {
diff --git a/lib/qssl.c b/lib/qssl.c
index 74f9b5766e4cf54bc9ef19a9a92eda632bcfbd6b..dd4f911d1b5606773241b1d4b210fd38e55706da 100644
--- a/lib/qssl.c
+++ b/lib/qssl.c
@@ -268,8 +268,8 @@ CURLcode Curl_qsossl_connect(struct connectdata * conn, int sockindex)
   }
   if (rc == CURLE_OK) {
     connssl->state = ssl_connection_complete;
-    conn->recv = qsossl_recv;
-    conn->send = qsossl_send;
+    conn->recv[sockindex] = qsossl_recv;
+    conn->send[sockindex] = qsossl_send;
   }
 
   return rc;
diff --git a/lib/security.c b/lib/security.c
index 03b1be251027de81f1b13a54d8510fc45a7f9f3b..eceb013b5f9f5967d9e5b22f70340e5d64e651d3 100644
--- a/lib/security.c
+++ b/lib/security.c
@@ -466,8 +466,10 @@ Curl_sec_login(struct connectdata *conn)
     conn->mech = *m;
     conn->sec_complete = 1;
     if (conn->data_prot != prot_clear) {
-      conn->recv = sec_read;
-      conn->send = _sec_send;
+      conn->recv[FIRSTSOCKET] = sec_read;
+      conn->send[FIRSTSOCKET] = _sec_send;
+      conn->recv[SECONDARYSOCKET] = sec_read;
+      conn->send[SECONDARYSOCKET] = _sec_send;
     }
     conn->command_prot = prot_safe;
     /* Set the requested protection level */
diff --git a/lib/sendf.c b/lib/sendf.c
index ffd01c7449c457d4228a6aafc5593e9a5d54c1f6..94bcb9c78ace17b897bf7b2ff9c3c8b0e115c59c 100644
--- a/lib/sendf.c
+++ b/lib/sendf.c
@@ -251,7 +251,7 @@ CURLcode Curl_write(struct connectdata *conn,
   CURLcode curlcode = CURLE_OK;
   int num = (sockfd == conn->sock[SECONDARYSOCKET]);
 
-  bytes_written = conn->send(conn, num, mem, len, &curlcode);
+  bytes_written = conn->send[num](conn, num, mem, len, &curlcode);
 
   *written = bytes_written;
   if(-1 != bytes_written)
@@ -576,7 +576,7 @@ CURLcode Curl_read(struct connectdata *conn, /* connection data */
     buffertofill = buf;
   }
 
-  nread = conn->recv(conn, num, buffertofill, bytesfromsocket, &curlcode);
+  nread = conn->recv[num](conn, num, buffertofill, bytesfromsocket, &curlcode);
   if(nread == -1)
     return curlcode;
 
diff --git a/lib/ssh.c b/lib/ssh.c
index 4a93099982528418e55bd013a823781d0535e8d5..c3a94fe32baefe78ef7488b3443e1295dabf0239 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -2493,11 +2493,11 @@ static CURLcode ssh_connect(struct connectdata *conn, bool *done)
     return result;
 
   if(conn->protocol & PROT_SCP) {
-    conn->recv = scp_recv;
-    conn->send = scp_send;
+    conn->recv[FIRSTSOCKET] = scp_recv;
+    conn->send[FIRSTSOCKET] = scp_send;
   } else {
-    conn->recv = sftp_recv;
-    conn->send = sftp_send;
+    conn->recv[FIRSTSOCKET] = sftp_recv;
+    conn->send[FIRSTSOCKET] = sftp_send;
   }
   ssh = &conn->proto.sshc;
 
diff --git a/lib/ssluse.c b/lib/ssluse.c
index 0e23c084276481e28814ca22332ef774fa682e65..ce62605e8b616669cf4a9c3ec3477df85609e83e 100644
--- a/lib/ssluse.c
+++ b/lib/ssluse.c
@@ -2440,8 +2440,8 @@ ossl_connect_common(struct connectdata *conn,
 
   if(ssl_connect_done==connssl->connecting_state) {
     connssl->state = ssl_connection_complete;
-    conn->recv = ossl_recv;
-    conn->send = ossl_send;
+    conn->recv[sockindex] = ossl_recv;
+    conn->send[sockindex] = ossl_send;
     *done = TRUE;
   }
   else
diff --git a/lib/url.c b/lib/url.c
index c41db0a7cdb95270fd3d48077eb2210f6cbe5f50..ec7f46a3e636841825ed0dd2a3a6506532508450 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -4754,8 +4754,10 @@ static CURLcode create_conn(struct SessionHandle *data,
     return result;
   }
 
-  conn->recv = Curl_recv_plain;
-  conn->send = Curl_send_plain;
+  conn->recv[FIRSTSOCKET] = Curl_recv_plain;
+  conn->send[FIRSTSOCKET] = Curl_send_plain;
+  conn->recv[SECONDARYSOCKET] = Curl_recv_plain;
+  conn->send[SECONDARYSOCKET] = Curl_send_plain;
 
   /***********************************************************************
    * file: is a special case in that it doesn't need a network connection
diff --git a/lib/urldata.h b/lib/urldata.h
index efc56d7b05e880ffd56d15ffe6fa6ec982922e5f..30782c2a2b4fda1a07deaa461fecb00b6dae27a8 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -760,8 +760,8 @@ struct connectdata {
   curl_socket_t sock[2]; /* two sockets, the second is used for the data
                             transfer when doing FTP */
 
-  Curl_recv *recv;
-  Curl_send *send;
+  Curl_recv *recv[2];
+  Curl_send *send[2];
 
   struct ssl_connect_data ssl[2]; /* this is for ssl-stuff */
   struct ssl_config_data ssl_config;