Merge branch 'master' of github.com:pivotal/robolectric
diff --git a/src/main/java/com/xtremelabs/robolectric/Robolectric.java b/src/main/java/com/xtremelabs/robolectric/Robolectric.java
index b8bc079..e7c12a0 100644
--- a/src/main/java/com/xtremelabs/robolectric/Robolectric.java
+++ b/src/main/java/com/xtremelabs/robolectric/Robolectric.java
@@ -695,6 +695,10 @@
         return (ShadowMenuInflater) shadowOf_(instance);
     }
 
+    public static ShadowMessage shadowOf(Message instance) {
+        return (ShadowMessage) shadowOf_(instance);
+    }
+
     public static ShadowMimeTypeMap shadowOf(MimeTypeMap instance) {
         return (ShadowMimeTypeMap) shadowOf_(instance);
     }
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java
index 74af258..20f8c8a 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowHandler.java
@@ -3,6 +3,8 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+
+import com.xtremelabs.robolectric.Robolectric;
 import com.xtremelabs.robolectric.internal.Implementation;
 import com.xtremelabs.robolectric.internal.Implements;
 import com.xtremelabs.robolectric.internal.RealObject;
@@ -95,6 +97,7 @@
 
     @Implementation
     public final boolean sendMessageDelayed(final Message msg, long delayMillis) {
+        Robolectric.shadowOf(msg).setWhen(Robolectric.shadowOf(looper).getScheduler().getCurrentTime()+delayMillis);
         messages.add(msg);
         postDelayed(new Runnable() {
             @Override
@@ -108,20 +111,6 @@
         return true;
     }
 
-    private final boolean sendMessageToFrontDelayed(final Message msg, long delayMillis) {
-        messages.add(0, msg);
-        postAtFrontOfQueue(new Runnable() {
-            @Override
-            public void run() {
-                if (messages.contains(msg)) {
-                    routeMessage(msg);
-                    messages.remove(msg);
-                }
-            }
-        });
-        return true;
-    }
-
     private void routeMessage(Message msg) {
         if(callback != null) {
             callback.handleMessage(msg);
@@ -143,8 +132,19 @@
     }
 
     @Implementation
-    public final boolean sendMessageAtFrontOfQueue(Message msg) {
-        return sendMessageToFrontDelayed(msg, 0L);
+    public final boolean sendMessageAtFrontOfQueue(final Message msg) {
+        Robolectric.shadowOf(msg).setWhen(Robolectric.shadowOf(looper).getScheduler().getCurrentTime());
+        messages.add(0, msg);
+        postAtFrontOfQueue(new Runnable() {
+            @Override
+            public void run() {
+                if (messages.contains(msg)) {
+                    routeMessage(msg);
+                    messages.remove(msg);
+                }
+            }
+        });
+        return true;
     }
 
     @Implementation
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java
index 4c0b82d..d1588c0 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMessage.java
@@ -1,6 +1,7 @@
 package com.xtremelabs.robolectric.shadows;
 
 
+import com.xtremelabs.robolectric.Robolectric;
 import com.xtremelabs.robolectric.internal.Implementation;
 import com.xtremelabs.robolectric.internal.Implements;
 import com.xtremelabs.robolectric.internal.RealObject;
@@ -13,6 +14,7 @@
 public class ShadowMessage {
     private Bundle data;
     private Handler target;
+    private long when;
 
     @RealObject
     private Message message;
@@ -107,4 +109,13 @@
     public void sendToTarget() {
         target.sendMessage(message);
     }
+
+    @Implementation
+    public long getWhen() {
+        return when;
+    }
+
+    public void setWhen(long when) {
+        this.when = when;
+    }
 }
diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java
index 0109af8..8212be7 100644
--- a/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/shadows/HandlerTest.java
@@ -19,6 +19,9 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertFalse;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @RunWith(WithTestDefaultsRunner.class)
 public class HandlerTest {
     private Transcript transcript;
@@ -340,6 +343,33 @@
         assertThat(m4.obj, equalTo((Object)"foo"));
     }
 
+    @Test
+    public void shouldSetWhenOnMessage() throws Exception {
+        final List<Message>  msgs = new ArrayList<Message>();
+        Handler h = new Handler(new Handler.Callback() {
+            @Override
+            public boolean handleMessage(Message msg) {
+                msgs.add(msg);
+                return false;
+            }
+        });
+
+        h.sendEmptyMessage(0);
+        h.sendEmptyMessageDelayed(0, 4000l);
+        Robolectric.getUiThreadScheduler().advanceToLastPostedRunnable();
+        h.sendEmptyMessageDelayed(0, 12000l);
+        Robolectric.getUiThreadScheduler().advanceToLastPostedRunnable();
+        assertThat(msgs.size(), equalTo(3));
+
+        Message m0 = msgs.get(0);
+        Message m1 = msgs.get(1);
+        Message m2 = msgs.get(2);
+
+        assertThat(m0.getWhen(), equalTo(0l));
+        assertThat(m1.getWhen(), equalTo(4000l));
+        assertThat(m2.getWhen(), equalTo(16000l));
+    }
+
     private class Say implements Runnable {
         private String event;