diff --git a/lib/pop3.c b/lib/pop3.c
index 7d22e825132c861f79ad0b4a93027f05e9b9587f..9ed240fed474663555dc05cf8ee07161e177ddcb 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -213,7 +213,7 @@ static const struct Curl_handler Curl_handler_pop3s_proxy = {
 
 /* Function that checks for an ending pop3 status code at the start of the
    given string, but also detects the allowed authentication mechanisms
-   according to the AUTH response. */
+   according to the CAPA response. */
 static int pop3_endofresp(struct pingpong *pp, int *resp)
 {
   char *line = pp->linestart_resp;
@@ -229,20 +229,31 @@ static int pop3_endofresp(struct pingpong *pp, int *resp)
     return FALSE;
   }
 
-  /* Are we processing reponses to our AUTH command */
-  if(pop3c->state == POP3_AUTH) {
+  /* Are we processing reponses to our CAPA command? */
+  if(pop3c->state == POP3_CAPA) {
 
-    /* Advance past our positive response if necessary */
-    if(len >= 3 && !memcmp(line, "+OK", 3)) {
-      line += 3;
-      len -= 3;
+    /* Do we have the terminating character? */
+    if(len >= 1 && !memcmp(line, ".", 1)) {
+      *resp = '+';
+
+      return TRUE;
+    }
+
+    /* We are only interested in the SASL line */
+    if(len < 4 || memcmp(line, "SASL", 3)) {
+      return FALSE;
     }
 
+    /* Advance past the SASL keyword */
+    line += 4;
+    len -= 4;
+
     /* Loop through the data line */
     for(;;) {
       while(len &&
             (*line == ' ' || *line == '\t' ||
              *line == '\r' || *line == '\n')) {
+
         if(*line == '\n')
           return FALSE;
 
@@ -253,13 +264,6 @@ static int pop3_endofresp(struct pingpong *pp, int *resp)
       if(!len)
         break;
 
-      /* Until we receive the terminating character */
-      if(*line == '.') {
-        *resp = '+';
-
-        return TRUE;
-      }
-
       /* Extract the word */
       for(wordlen = 0; wordlen < len && line[wordlen] != ' ' &&
             line[wordlen] != '\t' && line[wordlen] != '\r' &&
@@ -306,7 +310,7 @@ static void state(struct connectdata *conn, pop3state newstate)
     "STOP",
     "SERVERGREET",
     "STARTTLS",
-    "AUTH",
+    "CAPA",
     "AUTH_PLAIN",
     "AUTH_LOGIN",
     "AUTH_LOGIN_PASSWD",
@@ -330,7 +334,7 @@ static void state(struct connectdata *conn, pop3state newstate)
   pop3c->state = newstate;
 }
 
-static CURLcode pop3_state_auth(struct connectdata *conn)
+static CURLcode pop3_state_capa(struct connectdata *conn)
 {
   CURLcode result = CURLE_OK;
   struct pop3_conn *pop3c = &conn->proto.pop3c;
@@ -346,13 +350,13 @@ static CURLcode pop3_state_auth(struct connectdata *conn)
     return result;
   }
 
-  /* send AUTH */
-  result = Curl_pp_sendf(&pop3c->pp, "AUTH");
+  /* send CAPA */
+  result = Curl_pp_sendf(&pop3c->pp, "CAPA");
 
   if(result)
     return result;
 
-  state(conn, POP3_AUTH);
+  state(conn, POP3_CAPA);
 
   return CURLE_OK;
 }
@@ -462,7 +466,7 @@ static CURLcode pop3_state_servergreet_resp(struct connectdata *conn,
     state(conn, POP3_STARTTLS);
   }
   else
-    result = pop3_state_auth(conn);
+    result = pop3_state_capa(conn);
 
   return result;
 }
@@ -484,14 +488,14 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn,
       state(conn, POP3_STOP);
     }
     else
-      result = pop3_state_auth(conn);
+      result = pop3_state_capa(conn);
   }
   else {
     /* Curl_ssl_connect is BLOCKING */
     result = Curl_ssl_connect(conn, FIRSTSOCKET);
     if(CURLE_OK == result) {
       pop3_to_pop3s(conn);
-      result = pop3_state_auth(conn);
+      result = pop3_state_capa(conn);
     }
     else {
       state(conn, POP3_STOP);
@@ -501,8 +505,8 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn,
   return result;
 }
 
-/* For AUTH responses */
-static CURLcode pop3_state_auth_resp(struct connectdata *conn,
+/* For CAPA responses */
+static CURLcode pop3_state_capa_resp(struct connectdata *conn,
                                      int pop3code,
                                      pop3state instate)
 {
@@ -937,8 +941,8 @@ static CURLcode pop3_statemach_act(struct connectdata *conn)
       result = pop3_state_starttls_resp(conn, pop3code, pop3c->state);
       break;
 
-    case POP3_AUTH:
-      result = pop3_state_auth_resp(conn, pop3code, pop3c->state);
+    case POP3_CAPA:
+      result = pop3_state_capa_resp(conn, pop3code, pop3c->state);
       break;
 
     case POP3_AUTH_PLAIN:
diff --git a/lib/pop3.h b/lib/pop3.h
index 77459aca9258dd027ff011f5d7ce104936a36e88..98954cb0b0d31ad6ea324c08075f2eba303223bd 100644
--- a/lib/pop3.h
+++ b/lib/pop3.h
@@ -30,7 +30,7 @@ typedef enum {
   POP3_SERVERGREET,  /* waiting for the initial greeting immediately after
                         a connect */
   POP3_STARTTLS,
-  POP3_AUTH,
+  POP3_CAPA,
   POP3_AUTH_PLAIN,
   POP3_AUTH_LOGIN,
   POP3_AUTH_LOGIN_PASSWD,