Index: Rhino.Etl.Core/Enumerables/EventRaisingEnumerator.cs
===================================================================
--- Rhino.Etl.Core/Enumerables/EventRaisingEnumerator.cs	(revision 1867)
+++ Rhino.Etl.Core/Enumerables/EventRaisingEnumerator.cs	(working copy)
@@ -1,54 +1,22 @@
 namespace Rhino.Etl.Core.Enumerables
 {
-    using System.Collections;
     using System.Collections.Generic;
-    using Commons;
     using Operations;
 
     /// <summary>
     /// An enumerator that will raise the events on the operation for each iterated item
     /// </summary>
-    public class EventRaisingEnumerator : IEnumerable<Row>, IEnumerator<Row>
+    public class EventRaisingEnumerator : SingleRowEventRaisingEnumerator
     {
-        private readonly IOperation operation;
-        private readonly IEnumerable<Row> inner;
-        private IEnumerator<Row> innerEnumerator;
-        private Row previous;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="EventRaisingEnumerator"/> class.
         /// </summary>
         /// <param name="operation">The operation.</param>
         /// <param name="inner">The innerEnumerator.</param>
-        public EventRaisingEnumerator(IOperation operation, IEnumerable<Row> inner)
-        {
-            this.operation = operation;
-            this.inner = inner;
-        }
+        public EventRaisingEnumerator(IOperation operation, IEnumerable<Row> inner) : base(operation, inner)
+        {}
 
         ///<summary>
-        ///Gets the element in the collection at the current position of the enumerator.
-        ///</summary>
-        ///
-        ///<returns>
-        ///The element in the collection at the current position of the enumerator.
-        ///</returns>
-        ///
-        public Row Current
-        {
-            get { return innerEnumerator.Current; }
-        }
-
-        ///<summary>
-        ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
-        ///</summary>
-        ///<filterpriority>2</filterpriority>
-        public void Dispose()
-        {
-            innerEnumerator.Dispose();
-        }
-
-        ///<summary>
         ///Advances the enumerator to the next element of the collection.
         ///</summary>
         ///
@@ -57,69 +25,14 @@
         ///</returns>
         ///
         ///<exception cref="T:System.InvalidOperationException">The collection was modified after the enumerator was created. </exception><filterpriority>2</filterpriority>
-        public bool MoveNext()
+        public override bool MoveNext()
         {
-            bool result = innerEnumerator.MoveNext();
-            if (result)
-            {
-                previous = innerEnumerator.Current;
-                operation.RaiseRowProcessed(Current);
-            }
-            else 
+            bool result = base.MoveNext();
+
+            if(!result) 
                 operation.RaiseFinishedProcessing();
+
             return result;
         }
-
-        ///<summary>
-        ///Sets the enumerator to its initial position, which is before the first element in the collection.
-        ///</summary>
-        ///
-        ///<exception cref="T:System.InvalidOperationException">The collection was modified after the enumerator was created. </exception><filterpriority>2</filterpriority>
-        public void Reset()
-        {
-            innerEnumerator.Reset();
-        }
-
-        ///<summary>
-        ///Gets the current element in the collection.
-        ///</summary>
-        ///
-        ///<returns>
-        ///The current element in the collection.
-        ///</returns>
-        ///
-        ///<exception cref="T:System.InvalidOperationException">The enumerator is positioned before the first element of the collection or after the last element.-or- The collection was modified after the enumerator was created.</exception><filterpriority>2</filterpriority>
-        object IEnumerator.Current
-        {
-            get { return innerEnumerator.Current; }
-        }
-
-        ///<summary>
-        ///Returns an enumerator that iterates through the collection.
-        ///</summary>
-        ///
-        ///<returns>
-        ///A <see cref="T:System.Collections.Generic.IEnumerator`1"></see> that can be used to iterate through the collection.
-        ///</returns>
-        ///<filterpriority>1</filterpriority>
-        IEnumerator<Row> IEnumerable<Row>.GetEnumerator()
-        {
-            Guard.Against(inner == null, "Null enuerator detected, are you trying to read from the first operation in the process?");
-            innerEnumerator = inner.GetEnumerator();
-            return this;
-        }
-
-        ///<summary>
-        ///Returns an enumerator that iterates through a collection.
-        ///</summary>
-        ///
-        ///<returns>
-        ///An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
-        ///</returns>
-        ///<filterpriority>2</filterpriority>
-        public IEnumerator GetEnumerator()
-        {
-            return ((IEnumerable<Row>) this).GetEnumerator();
-        }
     }
 }
\ No newline at end of file
Index: Rhino.Etl.Core/Operations/OutputCommandOperation.cs
===================================================================
--- Rhino.Etl.Core/Operations/OutputCommandOperation.cs	(revision 1867)
+++ Rhino.Etl.Core/Operations/OutputCommandOperation.cs	(working copy)
@@ -1,3 +1,5 @@
+using Rhino.Etl.Core.Enumerables;
+
 namespace Rhino.Etl.Core.Operations
 {
     using System.Collections.Generic;
@@ -27,7 +29,7 @@
             using (IDbConnection connection = Use.Connection(ConnectionStringName))
             using (IDbTransaction transaction = connection.BeginTransaction())
             {
-                foreach (Row row in rows)
+                foreach (Row row in new SingleRowEventRaisingEnumerator(this, rows))
                 {
                     using (IDbCommand cmd = connection.CreateCommand())
                     {
@@ -53,7 +55,6 @@
             yield break;
         }
 
-
         /// <summary>
         /// Prepares the command for execution, set command text, parameters, etc
         /// </summary>
Index: Rhino.Etl.Core/Rhino.Etl.Core.csproj
===================================================================
--- Rhino.Etl.Core/Rhino.Etl.Core.csproj	(revision 1867)
+++ Rhino.Etl.Core/Rhino.Etl.Core.csproj	(working copy)
@@ -2,7 +2,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{DC42946E-5972-411C-A061-F2932E49C31F}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -62,7 +62,6 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\SharedLibs\NHibernate\log4net.dll</HintPath>
     </Reference>
-    <Reference Include="MySql.Data, Version=5.2.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
     <Reference Include="Rhino.Commons, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0b3305902db7183f, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\build\net-3.5\debug\Rhino.Commons.dll</HintPath>
@@ -79,6 +78,7 @@
   <ItemGroup>
     <Compile Include="ConventionOperations\ConventionSqlBatchOpeartion.cs" />
     <Compile Include="ConventionOperations\ConventionSqlBulkInsertOperation.cs" />
+    <Compile Include="Enumerables\SingleRowEventRaisingEnumerator.cs" />
     <Compile Include="Enumerables\ThreadSafeEnumerator.cs" />
     <Compile Include="Operations\BranchingOperation.cs" />
     <Compile Include="Operations\JoinType.cs" />
Index: Rhino.Etl.Tests/Errors/ErrorsFixture.cs
===================================================================
--- Rhino.Etl.Tests/Errors/ErrorsFixture.cs	(revision 1867)
+++ Rhino.Etl.Tests/Errors/ErrorsFixture.cs	(working copy)
@@ -18,7 +18,7 @@
                 process.RegisterLast(new AddToResults(results));
 
                 process.Execute();
-                Assert.AreEqual(2, results.Count);
+                Assert.AreEqual(process.ThrowOperation.RowsAfterWhichToThrow, results.Count);
                 List<Exception> errors = new List<Exception>(process.GetAllErrors());
                 Assert.AreEqual(1, errors.Count);
                 Assert.AreEqual("Failed to execute operation Rhino.Etl.Tests.Errors.ThrowingOperation: problem",
Index: Rhino.Etl.Tests/Errors/ErrorsProcess.cs
===================================================================
--- Rhino.Etl.Tests/Errors/ErrorsProcess.cs	(revision 1867)
+++ Rhino.Etl.Tests/Errors/ErrorsProcess.cs	(working copy)
@@ -4,9 +4,11 @@
 
     public class ErrorsProcess : EtlProcess
     {
+        public readonly ThrowingOperation ThrowOperation = new ThrowingOperation();
+
         protected override void Initialize()
         {
-            Register(new ThrowingOperation());
+            Register(ThrowOperation);
         }
     }
 }
\ No newline at end of file
Index: Rhino.Etl.Tests/Errors/ThrowingOperation.cs
===================================================================
--- Rhino.Etl.Tests/Errors/ThrowingOperation.cs	(revision 1867)
+++ Rhino.Etl.Tests/Errors/ThrowingOperation.cs	(working copy)
@@ -1,15 +1,23 @@
 namespace Rhino.Etl.Tests.Errors
 {
+    using System;
     using System.Collections.Generic;
     using System.IO;
     using Core;
-    using Rhino.Etl.Core.Operations;
+    using Core.Operations;
 
     public class ThrowingOperation : AbstractOperation
     {
+        private readonly int rowsAfterWhichToThrow = new Random().Next(1, 6);
+
+        public int RowsAfterWhichToThrow
+        {
+            get { return rowsAfterWhichToThrow; }
+        }
+
         public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
         {
-            for (int i = 0; i < 2; i++)
+            for (int i = 0; i < RowsAfterWhichToThrow; i++)
             {
                 Row row = new Row();
                 row["id"] = i;
Index: Rhino.Etl.Tests/Fibonacci/Output/OutputFibonacciToDatabase.cs
===================================================================
--- Rhino.Etl.Tests/Fibonacci/Output/OutputFibonacciToDatabase.cs	(revision 1867)
+++ Rhino.Etl.Tests/Fibonacci/Output/OutputFibonacciToDatabase.cs	(working copy)
@@ -7,6 +7,8 @@
     {
         private readonly int max;
         private readonly Should should;
+        public readonly ThrowingOperation ThrowingOperation = new ThrowingOperation();
+        public readonly FibonacciOutput OutputOperation = new FibonacciOutput();
 
         public OutputFibonacciToDatabase(int max, Should should)
         {
@@ -21,8 +23,8 @@
         {
             Register(new FibonacciOperation(max));
             if (should == Should.Throw)
-                Register(new ThrowingOperation());
-            Register(new FibonacciOutput());
+                Register(ThrowingOperation);
+            Register(OutputOperation);
         }
     }
 }
\ No newline at end of file
Index: Rhino.Etl.Tests/OutputCommandFixture.cs
===================================================================
--- Rhino.Etl.Tests/OutputCommandFixture.cs	(revision 1867)
+++ Rhino.Etl.Tests/OutputCommandFixture.cs	(working copy)
@@ -3,7 +3,7 @@
     using System;
     using System.Collections.Generic;
     using MbUnit.Framework;
-    using Rhino.Etl.Tests.Fibonacci.Output;
+    using Fibonacci.Output;
 
     [TestFixture]
     public class OutputCommandFixture : BaseFibonacciTest
@@ -11,13 +11,55 @@
         [Test]
         public void CanInsertToDatabaseFromInMemoryCollection()
         {
-            OutputFibonacciToDatabase fibonaci = new OutputFibonacciToDatabase(25,Should.WorkFine);
+            OutputFibonacciToDatabase fibonaci = new OutputFibonacciToDatabase(25, Should.WorkFine);
             fibonaci.Execute();
 
             Assert25ThFibonacci();
         }
 
         [Test]
+        public void WillRaiseRowProcessedEvent()
+        {
+            int rowsProcessed = 0;
+
+            using (OutputFibonacciToDatabase fibonaci = new OutputFibonacciToDatabase(1, Should.WorkFine))
+            {
+                fibonaci.OutputOperation.OnRowProcessed += delegate { rowsProcessed++; };
+                fibonaci.Execute();
+            }
+
+            Assert.AreEqual(1, rowsProcessed);
+        }
+
+        [Test]
+        public void WillRaiseRowProcessedEventUntilItThrows()
+        {
+            int rowsProcessed = 0;
+
+            using (OutputFibonacciToDatabase fibonaci = new OutputFibonacciToDatabase(25, Should.Throw))
+            {
+                fibonaci.OutputOperation.OnRowProcessed += delegate { rowsProcessed++; };
+                fibonaci.Execute();
+
+                Assert.AreEqual(fibonaci.ThrowingOperation.RowsAfterWhichToThrow, rowsProcessed);
+            }
+        }
+
+        [Test]
+        public void WillRaiseFinishedProcessingEventOnce()
+        {
+            int finished = 0;
+
+            using (OutputFibonacciToDatabase fibonaci = new OutputFibonacciToDatabase(1, Should.WorkFine))
+            {
+                fibonaci.OutputOperation.OnFinishedProcessing += delegate { finished++; };
+                fibonaci.Execute();
+            }
+
+            Assert.AreEqual(1, finished);
+        }
+
+        [Test]
         public void WhenErrorIsThrownWillRollbackTransaction()
         {
             OutputFibonacciToDatabase fibonaci = new OutputFibonacciToDatabase(25, Should.Throw);
Index: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
===================================================================
--- Rhino.Etl.Tests/Rhino.Etl.Tests.csproj	(revision 1867)
+++ Rhino.Etl.Tests/Rhino.Etl.Tests.csproj	(working copy)
@@ -2,7 +2,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{A1519C4F-3C25-4484-B3D2-2266C133754E}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -62,9 +62,9 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\..\SharedLibs\NHibernate\log4net.dll</HintPath>
     </Reference>
-    <Reference Include="MbUnit.framework, Version=1.0.2700.29885, Culture=neutral, PublicKeyToken=5e72ecd30bc408d5">
+    <Reference Include="MbUnit.Framework, Version=1.0.2700.29885, Culture=neutral, PublicKeyToken=5e72ecd30bc408d5">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\SharedLibs\Tools\MbUnit\MbUnit.framework.dll</HintPath>
+      <HintPath>..\..\SharedLibs\Tools\MbUnit\MbUnit.Framework.dll</HintPath>
     </Reference>
     <Reference Include="Rhino.Commons, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0b3305902db7183f, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -151,7 +151,6 @@
     <Compile Include="LoadTest\UpperCaseColumn.cs" />
     <Compile Include="LoadTest\UpperCaseUserNames.cs" />
     <Compile Include="OutputCommandFixture.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Branches\MultiplyByThreeOperation.cs" />
     <Compile Include="Branches\BranchesFixture.cs" />
     <Compile Include="SqlBatchOperationFixture.cs" />
@@ -210,6 +209,9 @@
       <Install>false</Install>
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
