diff --git a/lib/tftp.c b/lib/tftp.c
index a286077..6084ebc 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -398,12 +398,16 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
       long tsize = 0;
 
       tsize = strtol( value, NULL, 10 );
-      if(!tsize) {
-        failf(data, "invalid tsize -:%s:- value in OACK packet", value);
-        return CURLE_TFTP_ILLEGAL;
-      }
-      Curl_pgrsSetDownloadSize(data, tsize);
       infof(data, "%s (%ld)\n", "tsize parsed from OACK", tsize);
+
+      /* tsize should be ignored on upload:  Who cares the size of the remote file? */
+      if (!data->set.upload) {
+        if(!tsize) {
+          failf(data, "invalid tsize -:%s:- value in OACK packet", value);
+          return CURLE_TFTP_ILLEGAL;
+        }
+        Curl_pgrsSetDownloadSize(data, tsize);
+      }
     }
   }
 
@@ -1462,9 +1466,12 @@ static CURLcode tftp_do(struct connectdata *conn, bool *done)
 
   code = tftp_perform(conn, done);
 
-  /* If we have encountered an error */
-  code = tftp_translate_code(state->error);
-
+  /* If we returned an error, just use that...otherwise, look at internal codes. */
+  if (code == CURLE_OK) {
+    /* If we have encountered an internal tftp error, translate it. */
+    code = tftp_translate_code(state->error);
+  }
+  
   return code;
 }
 

