diff --git a/src/plugins/imageformats/mng/qmnghandler.cpp b/src/plugins/imageformats/mng/qmnghandler.cpp
index 395a783a5da5bf9a0d960a0ea77e32b20f744c8d..1ee3bbd78b24a49ea4133f3d6c4d0883cdbd8d6b 100644
--- a/src/plugins/imageformats/mng/qmnghandler.cpp
+++ b/src/plugins/imageformats/mng/qmnghandler.cpp
@@ -263,6 +263,7 @@ mng_bool QMngHandlerPrivate::processHeader(mng_uint32 iWidth, mng_uint32 iHeight
 bool QMngHandlerPrivate::getNextImage(QImage *result)
 {
     mng_retcode ret;
+    const bool savedHaveReadAll = haveReadAll;
     if (haveReadNone) {
         haveReadNone = false;
         ret = mng_readdisplay(hMNG);
@@ -271,6 +272,13 @@ bool QMngHandlerPrivate::getNextImage(QImage *result)
     }
     if ((MNG_NOERROR == ret) || (MNG_NEEDTIMERWAIT == ret)) {
         *result = image;
+
+        // QTBUG-28894 -- libmng produces an extra frame at the end
+        //                of the animation on the first loop only.
+        if (nextDelay == 1 && (!savedHaveReadAll && haveReadAll)) {
+            ret = mng_display_resume(hMNG);
+        }
+
         frameIndex = nextIndex++;
         if (haveReadAll && (frameCount == 0))
             frameCount = nextIndex;