diff --git a/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/array/reverse_each_tags.txt b/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/array/reverse_each_tags.txt
deleted file mode 100644
index 810fb34..0000000
--- a/Merlin/External.LCA_RESTRICTED/Languages/IronRuby/mspec/ironruby-tags/core/array/reverse_each_tags.txt
+++ /dev/null
@@ -1 +0,0 @@
-fails:Array#reverse_each does not fail when removing elements from block
diff --git a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/ArrayOps.cs b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/ArrayOps.cs
index 6b379d3..b51b62d 100644
--- a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/ArrayOps.cs
+++ b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/ArrayOps.cs
@@ -546,27 +546,31 @@ namespace IronRuby.Builtins {
         [RubyMethod("reverse!")]
         public static RubyArray/*!*/ InPlaceReverse(RubyContext/*!*/ context, RubyArray/*!*/ self) {
             RubyUtils.RequiresNotFrozen(context, self);
             self.Reverse();
             return self;
         }
 
         [RubyMethod("reverse_each")]
         public static object ReverseEach(RubyContext/*!*/ context, BlockParam block, RubyArray/*!*/ self) {
             Assert.NotNull(context, self);
 
             if (self.Count > 0 && block == null) {
                 throw RubyExceptions.NoBlockGiven();
             }
 
-            for (int i = self.Count - 1; i >= 0; --i) {
+            for (int originalSize = self.Count, i = originalSize - 1; i >= 0; i--) {
                 object result;
                 if (block.Yield(self[i], out result)) {
                     return result;
                 }
+                if (self.Count < originalSize) {
+                    i = originalSize - i - 1 + self.Count;
+                    originalSize = self.Count;
+                }
             }
             return self;
         }
 
         #endregion
     }
 }
diff --git a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs
index b509fca..bd3b63e 100644
--- a/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs
+++ b/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs
@@ -1028,30 +1028,31 @@ namespace IronRuby.Builtins {
                 if (Protocols.IsEqual(equals, self[i], item)) {
                     return i;
                 }
             }
             return null;
         }
 
         [RubyMethod("rindex")]
         public static object ReverseIndex(BinaryOpStorage/*!*/ equals, IList/*!*/ self, object item) {
             for (int originalSize = self.Count, i = originalSize - 1; i >= 0; i--) {
                 if (Protocols.IsEqual(equals, self[i], item)) {
                     return i;
                 }
                 if (self.Count < originalSize) {
                     i = originalSize - i - 1 + self.Count;
+                    originalSize = self.Count;
                 }
             }
             return null;
         }
 
         #endregion
 
         #region indexes, indices, values_at
 
         [RubyMethod("indexes")]
         [RubyMethod("indices")]
         public static object Indexes(ConversionStorage<int>/*!*/ fixnumCast, 
             CallSiteStorage<Func<CallSite, RubyClass, object>>/*!*/ allocateStorage,
             IList/*!*/ self, [NotNull]params object[]/*!*/ values) {
             fixnumCast.Context.ReportWarning("Array#indexes and Array#indices are deprecated; use Array#values_at");
