diff --git a/nhibernate/src/NHibernate.Test/Join/JoinInteropMappings.hbm.xml b/nhibernate/src/NHibernate.Test/Join/JoinInteropMappings.hbm.xml
new file mode 100644
index 0000000..59d8c50
--- /dev/null
+++ b/nhibernate/src/NHibernate.Test/Join/JoinInteropMappings.hbm.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+                   namespace="NHibernate.Test.Join"
+                   assembly="NHibernate.Test"
+                   default-lazy="false">
+  
+  <class name="Info">
+    <id name="Id">
+      <generator class="assigned"/>
+    </id>
+    <property name="Data"/>
+    <join table="ExtendedInfo" optional="true">
+      <key column="InfoId"/>
+      <property name="MoreData"/>
+    </join>
+  </class>
+  
+</hibernate-mapping>
diff --git a/nhibernate/src/NHibernate.Test/Join/JoinInteropModel.cs b/nhibernate/src/NHibernate.Test/Join/JoinInteropModel.cs
new file mode 100644
index 0000000..9e9b89d
--- /dev/null
+++ b/nhibernate/src/NHibernate.Test/Join/JoinInteropModel.cs
@@ -0,0 +1,12 @@
+namespace NHibernate.Test.Join
+{
+    public class Info
+    {
+        public virtual int Id { get; set; }
+        public virtual int? Version { get; set; }
+        public virtual string Data { get; set; }
+		
+		// This property is in the joined table
+		public virtual string MoreData { get; set; }
+    }
+}
diff --git a/nhibernate/src/NHibernate.Test/Join/JoinInteropTest.cs b/nhibernate/src/NHibernate.Test/Join/JoinInteropTest.cs
new file mode 100644
index 0000000..528c37c
--- /dev/null
+++ b/nhibernate/src/NHibernate.Test/Join/JoinInteropTest.cs
@@ -0,0 +1,200 @@
+using System;
+using log4net;
+using NHibernate.Linq;
+using NUnit.Framework;
+using System.Collections;
+using System.Data;
+
+namespace NHibernate.Test.Join
+{
+	using NHibernate.Test.Subclass;
+
+	/// <summary>
+	/// Test case to ensure that NHibernate is interoperable with joined tables created
+	/// by third parties whose rows can have all NULL values.
+	/// </summary>
+	/// <remarks>
+	/// Not all ORM frameworks handle a "join table" the same way that NHibernate does.
+	/// In particular, some frameworks will leave a row in a "join table" with all NULL
+	/// properties. NHibernate cannot deal with this situation, since it assumes that if
+	/// all the joined table's properties are null, it should never have existed.
+	/// </remarks>
+	[TestFixture]
+	public class JoinInteropTest : TestCase
+	{
+		private static ILog log = LogManager.GetLogger(typeof(JoinInteropTest));
+
+		#region TestCase Overrides
+
+		private void ExecuteSql(ISession session, string sql)
+		{
+			IDbCommand command = session.Connection.CreateCommand();
+			session.Transaction.Enlist(command);
+			command.CommandText = sql;
+			command.ExecuteNonQuery();
+		}
+
+		protected override bool AppliesTo(Dialect.Dialect dialect)
+		{
+			// This covers all recent versions of SQL server.
+			// Restricting this test case since we explicitly do SQL inserts 
+			// in the test setup.
+			if (dialect is Dialect.MsSql2000Dialect)
+			{
+				return true;
+			}
+
+			return false;
+		}
+
+		protected override void OnSetUp()
+		{
+			base.OnSetUp();
+			using (ISession session = this.OpenSession())
+			using (ITransaction tx = session.BeginTransaction())
+			{
+				// ... and need to bypass NHibernate to insert the following rows, in order
+				// to simulate rows in a legacy database that were "already there".
+				ExecuteSql(session, "insert into Info values (1, 'Data with NULL MoreData')");
+				ExecuteSql(session, "insert into ExtendedInfo values (1, NULL)");
+
+				ExecuteSql(session, "insert into Info values (2, 'Data with non-null MoreData')");
+				ExecuteSql(session, "insert into ExtendedInfo values (2, 'Some non-null MoreData')");
+				
+				ExecuteSql(session, "insert into Info values (3, NULL)");
+				ExecuteSql(session, "insert into ExtendedInfo values (3, 'non-null MoreData with null Data')");
+
+				// Everything NULL - not sure this will ever work?
+				ExecuteSql(session, "insert into Info values (4, NULL)");
+				ExecuteSql(session, "insert into ExtendedInfo values (4, NULL)");
+
+				tx.Commit();
+			}
+
+		}
+
+		protected override void OnTearDown()
+		{
+			base.OnTearDown();
+			using (ISession session = this.OpenSession())
+			using (ITransaction tx = session.BeginTransaction())
+			{
+				// Not using HQL to delete since this may have other problems
+				ExecuteSql(session, "delete from ExtendedInfo");
+				ExecuteSql(session, "delete from Info");
+				tx.Commit();
+			}
+		}
+
+		#endregion TestCase Overrides
+
+
+		protected override string MappingsAssembly
+		{
+			get { return "NHibernate.Test"; }
+		}
+
+		protected override IList Mappings
+		{
+			get
+			{
+				return new string[] { 
+					"Join.JoinInteropMappings.hbm.xml",
+				};
+			}
+		}
+
+		[Test]
+		public void TestGetTestDataHql()
+		{
+			using (var session = this.OpenSession())
+			using (var tx = session.BeginTransaction())
+			{
+				var query = session.CreateQuery("from " + typeof(Info).Name);
+				var list = query.List<Info>();
+				foreach (var element in list)
+				{
+					Assert.That(element != null);
+
+					Console.WriteLine("{0} ('{1}', '{2}')", element.Id, element.Data, element.MoreData);
+				}
+
+				var isDirty = session.IsDirty();
+				Assert.That(isDirty == false);
+
+				tx.Commit();
+			}
+		}
+
+		[Test]
+		public void TestUpdateData()
+		{
+			using (var session = this.OpenSession())
+			using (var tx = session.BeginTransaction())
+			{
+				var query = session.CreateQuery("from " + typeof(Info).Name);
+				var list = query.List<Info>();
+				foreach (var element in list)
+				{
+					Assert.That(element != null);
+
+					Console.WriteLine("{0} ('{1}', '{2}') -->", element.Id, element.Data, element.MoreData);
+					element.Data = string.Format("Updated {0}", element.Data);
+					Console.WriteLine("    {0} ('{1}', '{2}')", element.Id, element.Data, element.MoreData);
+					session.Update(element);
+
+					var isDirty = session.IsDirty();
+					Assert.That(isDirty == true);
+				}
+
+				tx.Commit();
+			}
+		}
+
+		[Test]
+		public void TestUpdateMoreData()
+		{
+			using (var session = this.OpenSession())
+			using (var tx = session.BeginTransaction())
+			{
+				var query = session.CreateQuery("from " + typeof(Info).Name);
+				var list = query.List<Info>();
+				foreach (var element in list)
+				{
+					Assert.That(element != null);
+
+					Console.WriteLine("{0} ('{1}', '{2}') -->", element.Id, element.Data, element.MoreData);
+					element.MoreData = string.Format("Updated {0}", element.MoreData);
+					Console.WriteLine("    {0} ('{1}', '{2}')", element.Id, element.Data, element.MoreData);
+					session.Update(element);
+
+					var isDirty = session.IsDirty();
+					Assert.That(isDirty == true);
+				}
+
+				tx.Commit();
+			}
+		}
+
+
+		[Test]
+		public void TestGetTestDataLinq()
+		{
+			using (var session = this.OpenSession())
+			using (var tx = session.BeginTransaction())
+			{
+				var query = session.Query<Info>();
+
+				foreach (var element in query)
+				{
+					Console.WriteLine("{0} ('{1}', '{2}')", element.Id, element.Data, element.MoreData);
+				}
+
+				var isDirty = session.IsDirty();
+				Assert.That(isDirty == false);
+
+				tx.Commit();
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj b/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
index 83902a9..3df82cd 100644
--- a/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
+++ b/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
@@ -469,6 +469,8 @@
     <Compile Include="Insertordering\InsertOrderingFixture.cs" />
     <Compile Include="Insertordering\Membership.cs" />
     <Compile Include="Insertordering\User.cs" />
+    <Compile Include="Join\JoinInteropTest.cs" />
+    <Compile Include="Join\JoinInteropModel.cs" />
     <Compile Include="LazyOneToOne\Employee.cs" />
     <Compile Include="LazyOneToOne\Employment.cs" />
     <Compile Include="LazyOneToOne\LazyOneToOneTest.cs" />
@@ -2652,6 +2654,7 @@
     <EmbeddedResource Include="NHSpecificTest\NH1291AnonExample\Mappings.hbm.xml" />
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="Join\JoinInteropMappings.hbm.xml" />
     <EmbeddedResource Include="NHSpecificTest\NH2667\Mappings.hbm.xml" />
     <EmbeddedResource Include="NHSpecificTest\NH1642\Mappings.hbm.xml" />
     <EmbeddedResource Include="Stateless\Contact.hbm.xml" />
diff --git a/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs b/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs
index 9cd5cf9..7a3d7ac 100644
--- a/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs
+++ b/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs
@@ -2703,12 +2703,18 @@ namespace NHibernate.Persister.Entity
 			if (!IsInverseTable(j))
 			{
 				bool isRowToUpdate;
-				if (IsNullableTable(j) && oldFields != null && IsAllNull(oldFields, j))
+				bool isNullableTable = IsNullableTable(j);
+
+				// This optimization causes problems if a non-NHibernate application leaves a row around with all NULL values
+				/*
+				if (isNullableTable && oldFields != null && IsAllNull(oldFields, j))
 				{
 					//don't bother trying to update, we know there is no row there yet
 					isRowToUpdate = false;
 				}
-				else if (IsNullableTable(j) && IsAllNull(fields, j))
+				else 
+				*/
+				if (isNullableTable && IsAllNull(fields, j))
 				{
 					//if all fields are null, we might need to delete existing row
 					isRowToUpdate = true;
