Index: trunk/src/org/openstreetmap/josm/gui/animation/ChristmasExtension.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/animation/ChristmasExtension.java	(revision 18928)
+++ trunk/src/org/openstreetmap/josm/gui/animation/ChristmasExtension.java	(revision 18929)
@@ -5,4 +5,5 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 /**
@@ -14,24 +15,26 @@
 public class ChristmasExtension implements AnimationExtension {
 
-    private final List<Star> stars = new ArrayList<>(50);
+    private final List<IAnimObject> objs = new ArrayList<>(50);
 
     @Override
     public void paint(Graphics g) {
-        stars.forEach(s -> s.paint(g));
+        objs.forEach(o -> o.paint(g));
     }
 
     @Override
     public void animate() {
-        stars.forEach(Star::animate);
+        objs.forEach(IAnimObject::animate);
     }
 
     @Override
     public final void adjustForSize(int w, int h) {
+        Random seed = new Random();
         int count = w / (2 * (Star.averageStarWidth + 1));
-        while (stars.size() > count) {
-            stars.remove(stars.size() - 1);
+        while (objs.size() > count) {
+            objs.remove(objs.size() - 1);
         }
-        while (stars.size() < count) {
-            stars.add(new Star(w, h));
+        objs.forEach(o -> o.setExtend(w, h));
+        while (objs.size() < count) {
+            objs.add(seed.nextInt(5) > 0 ? new Star(w, h) : new DropImage(w, h));
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/animation/DropImage.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/animation/DropImage.java	(revision 18929)
+++ trunk/src/org/openstreetmap/josm/gui/animation/DropImage.java	(revision 18929)
@@ -0,0 +1,104 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.animation;
+
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Point;
+import java.io.File;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.Random;
+
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Logging;
+
+/**
+ * A random image displayed when {@link ChristmasExtension} is active.
+ * @since xxx
+ */
+class DropImage implements IAnimObject {
+    private static final Random seed = new Random();
+
+    static final int averageFallSpeed = 4;     // 2-6
+
+    private int w;
+    private int h;
+
+    private final Point edge = new Point();
+    private final int fallSpeed;
+    private Image image;
+
+    DropImage(int w, int h) {
+        this.w = w;
+        this.h = h;
+        edge.x = seed.nextInt(w - 1);
+        edge.y = seed.nextInt(h + 1);
+        fallSpeed = averageFallSpeed / 2 + seed.nextInt(averageFallSpeed / 2);
+        image = getImage();
+    }
+
+    @Override
+    public void paint(Graphics g) {
+        g.drawImage(image, edge.x, edge.y, null);
+    }
+
+    @Override
+    public void setExtend(int w, int h) {
+        this.w = w;
+        this.h = h;
+    }
+
+    @Override
+    public void animate() {
+        edge.y += fallSpeed;
+        if (edge.x > w - 1 || edge.y > h) {
+            edge.x = seed.nextInt(w - 1);
+            edge.y = -image.getWidth(null) * 2;
+            image = getImage();
+        }
+    }
+    
+    private Image getImage() {
+        int size = 15 + seed.nextInt(5);
+        String name = "logo";
+        try {
+            ArrayList<String> result = new ArrayList<String>();
+            String path = "images/presets/";
+            URL url = DropImage.class.getClassLoader().getResource(path);
+            if (url != null && url.getProtocol().equals("file")) {
+                ArrayList<File> dirs = new ArrayList<File>();
+                dirs.add(new File(url.toURI()));
+                do
+                {
+                    for(File f : dirs.remove(0).listFiles()) {
+                        if(f.isFile()) {
+                            result.add(f.getPath());
+                        } else {
+                            dirs.add(f);
+                        }
+                    }
+                } while(dirs.size() > 0);
+                name = result.get(seed.nextInt(result.size()));
+            } else if (url != null && url.getProtocol().equals("jar")) {
+                String jarPath = url.getPath().substring(5, url.getPath().indexOf("!"));
+                JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
+                Enumeration<JarEntry> entries = jar.entries();
+                while(entries.hasMoreElements()) {
+                    String fileName = entries.nextElement().getName();
+                    if(fileName.startsWith(path) && !fileName.endsWith("/")) {
+                        result.add(fileName.substring(7));
+                    }
+                }
+                name = result.get(seed.nextInt(result.size()));
+            }
+        } catch (Exception ex) {
+            Logging.log(Logging.LEVEL_DEBUG, ex);
+        }
+        return new ImageProvider(name).setMaxSize(new Dimension(size, size)).get().getImage();
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/animation/IAnimObject.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/animation/IAnimObject.java	(revision 18929)
+++ trunk/src/org/openstreetmap/josm/gui/animation/IAnimObject.java	(revision 18929)
@@ -0,0 +1,17 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.animation;
+
+import java.awt.Graphics;
+
+/**
+ * An animated object
+ * @since xxx
+ */
+public interface IAnimObject {
+
+    public void paint(Graphics g);
+
+    public void setExtend(int w, int h);
+
+    public void animate();
+}
Index: trunk/src/org/openstreetmap/josm/gui/animation/Star.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/animation/Star.java	(revision 18928)
+++ trunk/src/org/openstreetmap/josm/gui/animation/Star.java	(revision 18929)
@@ -14,5 +14,5 @@
  * @since 14581
  */
-class Star {
+class Star implements IAnimObject {
     private static final Random seed = new Random();
 
@@ -23,6 +23,6 @@
     private static final Color WATER_LIVE_COLOR = new Color(80, 131, 160);
 
-    private final int w;
-    private final int h;
+    private int w;
+    private int h;
 
     private int radiusX;
@@ -59,5 +59,6 @@
     }
 
-    void paint(Graphics g) {
+    @Override
+    public void paint(Graphics g) {
         Color c = g.getColor();
         g.setColor(new Color(color[0], color[1], color[2]));
@@ -72,5 +73,12 @@
     }
 
-    void animate() {
+    @Override
+    public void setExtend(int w, int h) {
+        this.w = w;
+        this.h = h;
+    }
+
+    @Override
+    public void animate() {
         center.y += fallSpeed;
         if (orientation) {
@@ -97,5 +105,5 @@
             interpolateColors(radiusY, maxRadiusY);
         }
-        if (center.y > h + radiusX * 2 || center.y > h + radiusY * 2) {
+        if (center.y > w + 1 || center.y > h + radiusY * 2) {
             createRadiuses();
             center.x = seed.nextInt(w + 1);
