Index: Rhino.Etl.Core/Row.cs
===================================================================
--- Rhino.Etl.Core/Row.cs	(revision 1875)
+++ Rhino.Etl.Core/Row.cs	(working copy)
@@ -89,7 +89,12 @@
 
             foreach (var key in items.Keys)
             {
-                if(items[key].Equals(other.items[key]) == false)
+                if(items[key] == null)
+                {
+                    if (other.items[key] != null)
+                        return false;
+                }
+                else if(items[key].Equals(other.items[key]) == false)
                     return false;
             }
 
Index: Rhino.Etl.Tests/RowTest.cs
===================================================================
--- Rhino.Etl.Tests/RowTest.cs	(revision 1875)
+++ Rhino.Etl.Tests/RowTest.cs	(working copy)
@@ -10,6 +10,8 @@
         [Row(new[] {"a", "b"}, new object[] {1, 2}, new[] {"a", "b"}, new object[] {2, 3})]
         [Row(new[] {"a", "b"}, new object[] {1, 2}, new[] {"x", "y"}, new object[] {1, 2})]
         [Row(new[] {"a"}, new object[] {1}, new[] {"a", "b"}, new object[] {1, 2})]
+        [Row(new[] {"a"}, new object[] {null}, new[] {"a"}, new object[] {1})]
+        [Row(new[] {"a"}, new object[] {1}, new[] {"a"}, new object[] {null})]
         public void Should_be_different_if_different_columns(string[] firstColumns, object[] firstValues,
                                                              string[] secondColumns, object[] secondValues)
         {
@@ -20,6 +22,18 @@
         }
 
         [Test]
+        public void Nulls_are_equal()
+        {
+            Row first = new Row();
+            first["a"] = null;
+
+            Row second = new Row();
+            second["a"] = null;
+
+            Assert.IsTrue(first.Equals(second));
+        }
+
+        [Test]
         public void Should_not_take_casing_into_account()
         {
             Row first = new Row();
