         @__rejectApi 'image'
         return
 
+      df = $.Deferred()
+
       @multipartStart().done (data) =>
         @uploadParts(data.parts).done =>
           @multipartComplete(data.uuid).done (data) =>
             @fileId = data.uuid
             @__handleFileData(data)
-            @__completeUpload()
-          .fail @__uploadDf.reject
-        .fail @__uploadDf.reject
-      .fail @__uploadDf.reject
+            df.resolve()
+          .fail(df.reject)
+        .progress(df.notify)
+        .fail(df.reject)
+      .fail(df.reject)
+
+      df
 
     multipartStart: ->
       data =

        total = 0
        for loaded in progress
          total += loaded
        @__uploadDf.notify(total / @fileSize)

      df = $.Deferred()



        attempts = 0
        do retry = =>
          if @apiDeferred.state() != 'pending'
            return

          attempts += 1
