diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index cd96ddb..9139186 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -1662,6 +1662,7 @@ connectDBStart(PGconn *conn)
 	conn->addr_cur = conn->connhost[0].addrlist;
 	conn->pversion = PG_PROTOCOL(3, 0);
 	conn->send_appname = true;
+	resetPQExpBuffer(&conn->savedMessage);
 	conn->status = CONNECTION_NEEDED;
 
 	/*
@@ -1730,6 +1731,7 @@ connectDBComplete(PGconn *conn)
 				 * Reset stored error messages since we now have a working
 				 * connection
 				 */
+				resetPQExpBuffer(&conn->savedMessage);
 				resetPQExpBuffer(&conn->errorMessage);
 				return 1;		/* success! */
 
@@ -2792,6 +2794,18 @@ keep_going:						/* We will come back to here until there is
 				if (conn->target_session_attrs != NULL &&
 					strcmp(conn->target_session_attrs, "read-write") == 0)
 				{
+					/*
+					 * We are yet to make a connection. Save all existing error
+					 * messages until we make a successful connection state.
+					 * This is important because PQsendQuery is going to reset
+					 * conn->errorMessage and we will loose error messages
+					 * related to previous hosts we have tried to connect and
+					 * failed.
+					 */
+					appendPQExpBufferStr(&conn->savedMessage,
+										 conn->errorMessage.data);
+					resetPQExpBuffer(&conn->errorMessage);
+
 					conn->status = CONNECTION_OK;
 					if (!PQsendQuery(conn,
 									 "show transaction_read_only"))
@@ -2841,6 +2855,10 @@ keep_going:						/* We will come back to here until there is
 			if (conn->target_session_attrs != NULL &&
 				strcmp(conn->target_session_attrs, "read-write") == 0)
 			{
+				appendPQExpBufferStr(&conn->savedMessage,
+									 conn->errorMessage.data);
+				resetPQExpBuffer(&conn->errorMessage);
+
 				conn->status = CONNECTION_OK;
 				if (!PQsendQuery(conn,
 								 "show transaction_read_only"))
@@ -2950,6 +2968,12 @@ keep_going:						/* We will come back to here until there is
 
 error_return:
 
+	/* Failed to connect, restore the errorMessage. */
+	appendPQExpBufferStr(&conn->savedMessage, conn->errorMessage.data);
+	resetPQExpBuffer(&conn->errorMessage);
+	appendPQExpBufferStr(&conn->errorMessage, conn->savedMessage.data);
+	resetPQExpBuffer(&conn->savedMessage);
+
 	dot_pg_pass_warning(conn);
 
 	/*
@@ -3106,12 +3130,14 @@ makeEmptyPGconn(void)
 	conn->rowBufLen = 32;
 	conn->rowBuf = (PGdataValue *) malloc(conn->rowBufLen * sizeof(PGdataValue));
 	initPQExpBuffer(&conn->errorMessage);
+	initPQExpBuffer(&conn->savedMessage);
 	initPQExpBuffer(&conn->workBuffer);
 
 	if (conn->inBuffer == NULL ||
 		conn->outBuffer == NULL ||
 		conn->rowBuf == NULL ||
 		PQExpBufferBroken(&conn->errorMessage) ||
+		PQExpBufferBroken(&conn->savedMessage) ||
 		PQExpBufferBroken(&conn->workBuffer))
 	{
 		/* out of memory already :-( */
@@ -3232,6 +3258,7 @@ freePGconn(PGconn *conn)
 	if (conn->target_session_attrs)
 		free(conn->target_session_attrs);
 	termPQExpBuffer(&conn->errorMessage);
+	termPQExpBuffer(&conn->savedMessage);
 	termPQExpBuffer(&conn->workBuffer);
 
 	free(conn);
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index a2f8589..bab7a92 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -496,6 +496,9 @@ struct pg_conn
 	/* Buffer for current error message */
 	PQExpBufferData errorMessage;		/* expansible string */
 
+	/* Saves previous error messages in case of multipple hosts. */
+	PQExpBufferData savedMessage;		/* expansible string */
+
 	/* Buffer for receiving various parts of messages */
 	PQExpBufferData workBuffer; /* expansible string */
 };
