diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index bb3a137815f20041a9fd4a240751efc86de06ac5..080830a134dbdb864afd7c3e123d23a876217d79 100755
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -507,6 +507,37 @@ bool LLEventStream::post(const LLSD& event)
     return (*signal)(event);
 }
 
+/*****************************************************************************
+ *   LLEventMailDrop
+ *****************************************************************************/
+bool LLEventMailDrop::post(const LLSD& event)
+{
+    bool posted = LLEventPump::post(event);
+    
+    if (!posted)
+    {
+        mEventHistory.push_back(event);
+    }
+    
+    return posted;
+}
+
+LLBoundListener LLEventMailDrop::listen_impl(const std::string& name,
+                                    const LLEventListener& listener,
+                                    const NameList& after,
+                                    const NameList& before)
+{
+    LLBoundListener bndlistener = LLEventPump::listen_impl(name, listener, after, before);
+    
+    return bndlistener;
+}
+
+//    typedef std::list<LLSD> EventList;
+//    EventList mEventHistory;
+
+
+
+
 /*****************************************************************************
 *   LLEventQueue
 *****************************************************************************/
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 8d4fa6835039963c039b2f8941412b33e5138228..b07db889c0c0bd987f2d5099f9c676d5617b04a5 100755
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -554,12 +554,13 @@ private:
     virtual void reset();
 
 private:
-    virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
-                                        const NameList& after,
-                                        const NameList& before);
     std::string mName;
 
 protected:
+    virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
+                                        const NameList& after,
+                                        const NameList& before);
+    
     /// implement the dispatching
     boost::shared_ptr<LLStandardSignal> mSignal;
 
@@ -597,11 +598,39 @@ public:
     virtual bool post(const LLSD& event);
 };
 
+/*****************************************************************************
+ *   LLEventMailDrop
+ *****************************************************************************/
+/**
+ * LLEventMailDrop is a specialization of LLEventStream. Events are posted normally, 
+ * however if no listeners return that they have handled the event it is placed in 
+ * a list.  Subsequent attaching listeners will recieve stored events until a 
+ * listener indicates that the event has been handled.
+ */
+class LL_COMMON_API LLEventMailDrop: public LLEventPump
+{
+public:
+    LLEventMailDrop(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
+    virtual ~LLEventMailDrop() {}
+    
+    /// Post an event to all listeners
+    virtual bool post(const LLSD& event);
+    
+protected:
+    virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
+                                        const NameList& after,
+                                        const NameList& before);
+
+private:
+    typedef std::list<LLSD> EventList;
+    EventList mEventHistory;
+};
+
 /*****************************************************************************
 *   LLEventQueue
 *****************************************************************************/
 /**
- * LLEventQueue isa LLEventPump whose post() method defers calling registered
+ * LLEventQueue is a LLEventPump whose post() method defers calling registered
  * listeners until flush() is called.
  */
 class LL_COMMON_API LLEventQueue: public LLEventPump