 // MARK: Set knowledge free
 
 final fileprivate class SetKnowledgeFreeDataSource: WelcomeContainerViewControllerDataSource {
-    lazy var foregroundAnimationView: WelcomeAnimationView = {
-        return WelcomeAnimationView(staticImage: UIImage(named: "editing-welcome-articles")!)
-    }()
-
-    lazy var backgroundAnimationView: WelcomeAnimationView? = {
-        return nil
+    private let plusesAnimatedImageView = WelcomeAnimatedImageView(imageName: "editing-welcome/set-knowledge-free/pluses")
+
+    private lazy var articleAnimatedImageViews: [WelcomeAnimatedImageView] = {
+        let namePrefix = "editing-welcome/set-knowledge-free/article-"
+        let origin = CGPoint(x: 153, y: 85)
+        return [
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 200, y: 118)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 104, y: 25)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 111, y: 144)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 122, y: 93)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)14", origin: origin, destination: CGPoint(x: 156, y: 62)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 139, y: 55)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 176, y: 26)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 225, y: 24)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)15", origin: origin, destination: CGPoint(x: 213, y: 30)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)11", origin: origin, destination: CGPoint(x: 167, y: 119)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)16", origin: origin, destination: CGPoint(x: 136, y: 167)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)14", origin: origin, destination: CGPoint(x: 163, y: 136)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)14", origin: origin, destination: CGPoint(x: 55, y: 92)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)15", origin: origin, destination: CGPoint(x: 113, y: 113)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)13", origin: origin, destination: CGPoint(x: 51, y: 26)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)2", origin: origin, destination: CGPoint(x: 225, y: 47)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)12", origin: origin, destination: CGPoint(x: 45, y: 67)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)11", origin: origin, destination: CGPoint(x: 93, y: 29)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)13", origin: origin, destination: CGPoint(x: 162, y: 33)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)9", origin: origin, destination: CGPoint(x: 226, y: 31)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)8", origin: origin, destination: CGPoint(x: 81, y: 79)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)11", origin: origin, destination: CGPoint(x: 223, y: 106)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)6", origin: origin, destination: CGPoint(x: 236, y: 85)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)5", origin: origin, destination: CGPoint(x: 108, y: 68)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)4", origin: origin, destination: CGPoint(x: 184, y: 95)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)3", origin: origin, destination: CGPoint(x: 188, y: 51)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)2", origin: origin, destination: CGPoint(x: 154, y: 160)),
+            WelcomeAnimatedImageView(imageName: "\(namePrefix)14", origin: origin, destination: CGPoint(x: 76, y: 126))
+        ]
+    }()
+
+    lazy var animationView: WelcomeAnimationView = {
+        let animatedImageViews = articleAnimatedImageViews + [plusesAnimatedImageView]
+        return WelcomeAnimationView(staticImageNamed: "editing-welcome/set-knowledge-free/main-article", animatedImageViews: animatedImageViews, propertyAnimator: propertyAnimator)
+    }()
+
+    private lazy var propertyAnimator: UIViewPropertyAnimator = {
+        let articlePropertyAnimator = UIViewPropertyAnimator(duration: 0.8, curve: .easeInOut)
+
+        articlePropertyAnimator.addAnimations {
+            self.articleAnimatedImageViews.forEach { imageView in
+                imageView.alpha = 1
+                imageView.frame.origin = imageView.normalizedDestination!
+            }
+        }
+
+        let plusesPropertyAnimator = UIViewPropertyAnimator(duration: 0.5, curve: .linear)
+
+        plusesPropertyAnimator.addAnimations {
+            self.plusesAnimatedImageView.alpha = 1
+        }
+
+        articlePropertyAnimator.addCompletion { _ in
+            plusesPropertyAnimator.startAnimation()
+        }
+
+        return articlePropertyAnimator
     }()
 
     lazy var panelViewController: WelcomePanelViewController = {

// MARK: Write in an impartial tone

final fileprivate class ImpartialToneDataSource: WelcomeContainerViewControllerDataSource {
    lazy var foregroundAnimationView: WelcomeAnimationView = {
        return WelcomeAnimationView(staticImage: UIImage(named: "editing-welcome-scale")!)
    }()

    lazy var backgroundAnimationView: WelcomeAnimationView? = {
        return nil
    }()

    lazy var panelViewController: WelcomePanelViewController = {

// MARK: Cite reliable sources

final fileprivate class CiteReliableSourcesDataSource: WelcomeContainerViewControllerDataSource {
    private let highlightAnimatedImageView = WelcomeAnimatedImageView(imageName: "editing-welcome/cite/highlight", origin: CGPoint(x: 187, y: 96), insertBelow: false)
    private let plusesAnimatedImageView = WelcomeAnimatedImageView(imageName: "editing-welcome/cite/pluses")

    lazy var animationView: WelcomeAnimationView = {
        return WelcomeAnimationView(staticImageNamed: "editing-welcome/cite/article", animatedImageViews: [highlightAnimatedImageView, plusesAnimatedImageView], propertyAnimator: propertyAnimator)
    }()

    private lazy var propertyAnimator: UIViewPropertyAnimator = {
        let highlightPropertyAnimator = UIViewPropertyAnimator(duration: 1.0, curve: .easeInOut)

        highlightPropertyAnimator.addAnimations({
            self.highlightAnimatedImageView.alpha = 1
        }, delayFactor: 0.6)

        let plusesPropertyAnimator = UIViewPropertyAnimator(duration: 0.3, curve: .linear)

        plusesPropertyAnimator.addAnimations {
            self.plusesAnimatedImageView.alpha = 1
        }

        highlightPropertyAnimator.addCompletion { _ in
            plusesPropertyAnimator.startAnimation()
        }

        return highlightPropertyAnimator
    }()

    lazy var panelViewController: WelcomePanelViewController = {
