Index: src/main/java/org/perf4j/helpers/GroupingStatisticsIterator.java
===================================================================
--- src/main/java/org/perf4j/helpers/GroupingStatisticsIterator.java	(revision 70)
+++ src/main/java/org/perf4j/helpers/GroupingStatisticsIterator.java	(working copy)
@@ -171,9 +171,9 @@
                 }                
                 nextTimeSliceEndTime = ((startTime / timeSlice) * timeSlice) + timeSlice;
                 return retVal;
-            } else {
-                currentGroupedTimingStatistics.addStopWatch(stopWatch);
-            }
+            } else if (stopWatch != null) {
+		currentGroupedTimingStatistics.addStopWatch(stopWatch);
+	    }
         }
 
         //if here then there are no more stopwatches left, so clean up the last batch
Index: src/test/java/org/perf4j/helpers/GroupingStatisticsIteratorTest.java
===================================================================
--- src/test/java/org/perf4j/helpers/GroupingStatisticsIteratorTest.java	(revision 70)
+++ src/test/java/org/perf4j/helpers/GroupingStatisticsIteratorTest.java	(working copy)
@@ -21,6 +21,7 @@
 import org.perf4j.TimingStatistics;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -110,4 +111,44 @@
             //expected
         }
     }
+    
+    /**
+     * Test StopWatch in the middle of the timeslice. See bug
+     * http://jira.codehaus.org/browse/PERFFORJ-29
+     */
+    public void testStopWatchIteratorContainsNullBeginningTimeslice() {
+	GroupingStatisticsIterator groupingStatisticsIterator = new GroupingStatisticsIterator(
+		Collections.singletonList((StopWatch) null).iterator());
+	assertFalse(groupingStatisticsIterator.hasNext());
+    }
+
+    /**
+     * Test null StopWatch that terminates the timeslice
+     */
+    public void testStopWatchIteratorContainsNullNotBeginningTimeslice() {
+	long timeslice = 300L;
+
+	// create a non-null stopWatch to start the timeSlice and terminate with
+	// a null stopWatch
+	StopWatch stopWatch = new StopWatch(System.currentTimeMillis()
+		- timeslice - 1, timeslice, "stopWatch1",
+		"should start the timeslice");
+	GroupingStatisticsIterator groupingStatisticsIterator = new GroupingStatisticsIterator(
+		Arrays.asList(stopWatch, null).iterator());
+
+	// should be one timeslice and null will trigger it to end the timeslice
+	assertTrue(groupingStatisticsIterator.hasNext());
+	GroupedTimingStatistics groupStats = groupingStatisticsIterator.next();
+	assertEquals(1, groupStats.getStatisticsByTag().size());
+
+	TimingStatistics timingStats1 = groupStats.getStatisticsByTag().get(
+		stopWatch.getTag());
+	assertEquals(1, timingStats1.getCount());
+	assertEquals(stopWatch.getElapsedTime(), timingStats1.getMax());
+	assertEquals(stopWatch.getElapsedTime(), timingStats1.getMin());
+	assertEquals(stopWatch.getElapsedTime() + 0.0, timingStats1.getMean());
+
+	// no more timeslices
+	assertFalse(groupingStatisticsIterator.hasNext());
+    }
 }

