 +                    ((CapturesArguments) m).captureFrom(invocation.getRawArguments()[position - indexOfVararg]);
                  }
              }
-+
          } else {
-             for (int position = 0; position < matchers.size(); position++) {
-                 Matcher m = matchers.get(position);
-@@ -140,26 +141,47 @@ public class InvocationMatcher implements DescribedInvocation, CapturesArgumensF
-                 }
-             }
+@@ -142,18 +140,6 @@ public class InvocationMatcher implements DescribedInvocation, CapturesArgumensF
          }
-+
-+//        for (int position = 0; position < matchers.size(); position++) {
-+//            Matcher m = matchers.get(position);
-+//            if (m instanceof CapturesArguments && invocation.getRawArguments().length > position) {
-+//                //TODO SF - this whole lot can be moved captureFrom implementation
-+//                if(isVariableArgument(invocation, position) && isVarargMatcher(m)) {
-+//                    Object array = invocation.getRawArguments()[position];
-+//                    for (int i = 0; i < Array.getLength(array); i++) {
-+//                        ((CapturesArguments) m).captureFrom(Array.get(array, i));
-+//                    }
-+//                    //since we've captured all varargs already, it does not make sense to process other matchers.
-+//                    return;
-+//                } else {
-+//                    ((CapturesArguments) m).captureFrom(invocation.getRawArguments()[position]);
-+//                }
-+//            }
-+//        }
      }
  
 -    private Set<Matcher> uniqueMatcherSet(int indexOfVararg) {

-            } else {
-                set.add(matcher);
-            }
+    private boolean isVarargMatcher(Matcher matcher) {
+        Matcher actualMatcher = matcher;
+        if (actualMatcher instanceof MatcherDecorator) {
+            actualMatcher = ((MatcherDecorator) actualMatcher).getActualMatcher();
         }
-        return set;
+        return actualMatcher instanceof VarargMatcher;
+    }
+
+    private boolean isVariableArgument(Invocation invocation, int position) {
+        return invocation.getRawArguments().length - 1 == position
+                && invocation.getRawArguments()[position] != null
+                && invocation.getRawArguments()[position].getClass().isArray()
+                && invocation.getMethod().isVarArgs();
     }
 
     public static List<InvocationMatcher> createFrom(List<Invocation> invocations) {
         LinkedList<InvocationMatcher> out = new LinkedList<InvocationMatcher>();
+
         for (Invocation i : invocations) {
             out.add(new InvocationMatcher(i));
         }
+
         return out;
     }
 }

diff --git a/src/org/mockito/internal/invocation/InvocationMatcher.java b/src/org/mockito/internal/invocation/InvocationMatcher.java
index 3b3795b..a3a7c08 100644
--- a/src/org/mockito/internal/invocation/InvocationMatcher.java
+++ b/src/org/mockito/internal/invocation/InvocationMatcher.java
@@ -124,12 +124,10 @@ public class InvocationMatcher implements DescribedInvocation, CapturesArgumensF
                     ((CapturesArguments) m).captureFrom(invocation.getArgumentAt(position, Object.class));
                 }
             }
