 -            } 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;
-     }
- }

+                    ((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
                 }
             }
         }
+
+//        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) {

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));
                 }
             }
