diff --git a/src/plugins/assetimporters/uip/uipimporter.cpp b/src/plugins/assetimporters/uip/uipimporter.cpp
index e22c63664149803df2031a58a26a184e79a6126c..1db82d7384f0a08186adf68ac9184e8af339b4be 100644
--- a/src/plugins/assetimporters/uip/uipimporter.cpp
+++ b/src/plugins/assetimporters/uip/uipimporter.cpp
@@ -396,7 +396,7 @@ QSet<GraphObject*> getSubtreeItems(GraphObject *node)
     return items;
 }
 
-void generateTimelineAnimation(Slide *slide, float startFrame, float endFrame, bool isRunning, QTextStream &output, int tabLevel)
+void generateTimelineAnimation(Slide *slide, float startFrame, float endFrame, bool isRunning, QTextStream &output, int tabLevel, const QString &componentName)
 {
     QString looping = QStringLiteral("1");
     QString pingPong = QStringLiteral("false");
@@ -408,12 +408,36 @@ void generateTimelineAnimation(Slide *slide, float startFrame, float endFrame, b
     }
 
     output << QSSGQmlUtilities::insertTabs(tabLevel) << QStringLiteral("TimelineAnimation {") << endl;
+    output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("id: ") << QSSGQmlUtilities::sanitizeQmlId(slide->m_name + QStringLiteral("TimelineAnimation")) << endl;
     output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("duration: ") << (endFrame - startFrame) * 1000.0f << endl;
     output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("from: ") << startFrame << endl;
     output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("to: ") << endFrame << endl;
     output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("running: " ) << (isRunning ? QStringLiteral("true") : QStringLiteral("false")) << endl;
     output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("loops: ") << looping << endl;
     output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("pingPong: ") << pingPong << endl;
+    if (slide->m_playMode == Slide::PlayThroughTo) {
+        // when the animation is done playing, change to the state defined by PlayThrough
+        // onFinished: item1.state = "firsthalf"
+        QString slideName;
+        if (slide->m_playThrough == Slide::Next) {
+            if (slide->nextSibling())
+                slideName = slide->nextSibling()->m_name;
+        } else if (slide->m_playThrough == Slide::Previous) {
+            if (slide->nextSibling())
+                slideName = slide->previousSibling()->m_name;
+        } else {
+            // value
+            if (slide->m_playThroughValue.type() == QVariant::String) {
+                slideName = slide->m_playThroughValue.toString();
+            } else {
+                int slideIndex = slide->m_playThroughValue.toInt();
+                Slide *newSlide = static_cast<Slide*>(slide->parent()->childAtIndex(slideIndex));
+                slideName = newSlide->m_name;
+            }
+        }
+        if (!slideName.isEmpty())
+            output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("onFinished: ") << componentName << QStringLiteral(".state = \"") << slideName << QStringLiteral("\"") << endl;
+    }
     output << QSSGQmlUtilities::insertTabs(tabLevel) << QStringLiteral("}");
 }
 
@@ -439,7 +463,7 @@ QVector<AnimationTrack> combineAnimationTracks(const QVector<AnimationTrack> &ma
 
 }
 
-void UipImporter::generateAnimationTimeLine(Slide *masterSlide, QTextStream &output, int tabLevel)
+void UipImporter::generateAnimationTimeLine(Slide *masterSlide, QTextStream &output, int tabLevel, const QString &componentName)
 {
     // Generate a 1 Timeline and 1 TimelineAnimation for each slide
     // Each combines the master slide and current slide
@@ -448,13 +472,13 @@ void UipImporter::generateAnimationTimeLine(Slide *masterSlide, QTextStream &out
     auto slide = static_cast<Slide*>(masterSlide->firstChild());
     while (slide) {
         output << QSSGQmlUtilities::insertTabs(tabLevel) << QStringLiteral("Timeline {") << endl;
-        output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("id: ") << QSSGQmlUtilities::sanitizeQmlId(slide->m_name + QStringLiteral("Timeline")) << endl;;
+        output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("id: ") << QSSGQmlUtilities::sanitizeQmlId(slide->m_name + QStringLiteral("Timeline")) << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("startFrame: ") << masterSlide->startTime() << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("endFrame: ") << masterSlide->endTime() << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("currentFrame: ") << masterSlide->startTime() << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("enabled: false") << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("animations: [") << endl;
-        generateTimelineAnimation(masterSlide, slide->startTime(), slide->endTime(), true, output, tabLevel + 2);
+        generateTimelineAnimation(slide, slide->startTime(), slide->endTime(), true, output, tabLevel + 2, componentName);
         output << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel + 1) << QStringLiteral("]") << endl;
 
@@ -498,6 +522,12 @@ void UipImporter::generateStatesFromSlides(Slide *masterSlide, QTextStream &outp
         output << QSSGQmlUtilities::insertTabs(tabLevel+2) << QStringLiteral("PropertyChanges {") << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel+3) << QStringLiteral("target: ") << QSSGQmlUtilities::sanitizeQmlId(slide->m_name + QStringLiteral("Timeline")) << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel+3) << QStringLiteral("enabled: true") << endl;
+        output << QSSGQmlUtilities::insertTabs(tabLevel+3) << QStringLiteral("currentFrame: 0") << endl;
+        output << QSSGQmlUtilities::insertTabs(tabLevel+2) << QStringLiteral("}") << endl;
+
+        output << QSSGQmlUtilities::insertTabs(tabLevel+2) << QStringLiteral("PropertyChanges {") << endl;
+        output << QSSGQmlUtilities::insertTabs(tabLevel+3) << QStringLiteral("target: ") << QSSGQmlUtilities::sanitizeQmlId(slide->m_name + QStringLiteral("TimelineAnimation")) << endl;
+        output << QSSGQmlUtilities::insertTabs(tabLevel+3) << QStringLiteral("running: true") << endl;
         output << QSSGQmlUtilities::insertTabs(tabLevel+2) << QStringLiteral("}") << endl;
 
         // Now all other properties changed by the slide
@@ -557,7 +587,7 @@ void UipImporter::generateComponent(GraphObject *component)
 
     // Generate Animation Timeline
     auto componentNode = static_cast<ComponentNode*>(component);
-    generateAnimationTimeLine(componentNode->m_masterSlide, output, 1);
+    generateAnimationTimeLine(componentNode->m_masterSlide, output, 1, component->qmlId());
 
     // Generate States from Slides
     generateStatesFromSlides(componentNode->m_masterSlide, output, 1);
@@ -753,6 +783,7 @@ QString UipImporter::processUipPresentation(UipPresentation *presentation, const
                 output << QStringLiteral("Rectangle {") << endl;
             else
                 output << QStringLiteral("Item {") << endl;
+            output << QSSGQmlUtilities::insertTabs(1) << QStringLiteral("id: ") << QSSGQmlUtilities::sanitizeQmlId(m_presentation->name()) << endl;
             output << QSSGQmlUtilities::insertTabs(1) << QStringLiteral("width: ") << m_presentation->presentationWidth()<< endl;
             output << QSSGQmlUtilities::insertTabs(1) << QStringLiteral("height: ") << m_presentation->presentationHeight() << endl;
             //output << QSSGQmlUtilities::insertTabs(1) << QStringLiteral("title: \"") << m_presentation->name() << QStringLiteral("\"") << endl;
@@ -772,7 +803,7 @@ QString UipImporter::processUipPresentation(UipPresentation *presentation, const
             }
             // Do States and AnimationTimelines here (same for all layers of the presentation)
             // Generate Animation Timeline
-            generateAnimationTimeLine(m_presentation->masterSlide(), output, 1);
+            generateAnimationTimeLine(m_presentation->masterSlide(), output, 1, QSSGQmlUtilities::sanitizeQmlId(m_presentation->name()));
             // Generate States from Slides
             generateStatesFromSlides(m_presentation->masterSlide(), output, 1);
 
diff --git a/src/plugins/assetimporters/uip/uipimporter.h b/src/plugins/assetimporters/uip/uipimporter.h
index 2c3739a198821e21e710da68409b21bba405fceb..dc9f4817614c1319a97b8d57b44fda39c366af20 100644
--- a/src/plugins/assetimporters/uip/uipimporter.h
+++ b/src/plugins/assetimporters/uip/uipimporter.h
@@ -61,7 +61,7 @@ private:
     void checkForResourceFiles(GraphObject *object);
     void generateMaterialComponent(GraphObject *object);
     void generateAliasComponent(GraphObject *reference);
-    void generateAnimationTimeLine(Slide *masterSlide, QTextStream &output, int tabLevel);
+    void generateAnimationTimeLine(Slide *masterSlide, QTextStream &output, int tabLevel, const QString &componentName);
     void generateStatesFromSlides(Slide *masterSlide, QTextStream &output, int tabLevel);
     void generateComponent(GraphObject *component);
     void writeHeader(QTextStream &output);