Index: lib/sqlalchemy/orm/properties.py
===================================================================
--- lib/sqlalchemy/orm/properties.py	(revision 3674)
+++ lib/sqlalchemy/orm/properties.py	(working copy)
@@ -61,7 +61,7 @@
     def get_history(self, obj, passive=False):
         return sessionlib.attribute_manager.get_history(obj, self.key, passive=passive)
 
-    def merge(self, session, source, dest, _recursive):
+    def merge(self, session, source, dest, dont_load, _recursive):
         setattr(dest, self.key, getattr(source, self.key, None))
 
     def get_col_value(self, column, value):
@@ -280,7 +280,7 @@
     def __str__(self):
         return str(self.parent.class_.__name__) + "." + self.key + " (" + str(self.mapper.class_.__name__)  + ")"
 
-    def merge(self, session, source, dest, _recursive):
+    def merge(self, session, source, dest, dont_load, _recursive):
         if not "merge" in self.cascade or self.mapper in _recursive:
             return
         childlist = sessionlib.attribute_manager.get_history(source, self.key, passive=True)
@@ -290,14 +290,14 @@
             # sets a blank collection according to the correct list class
             dest_list = sessionlib.attribute_manager.init_collection(dest, self.key)
             for current in list(childlist):
-                obj = session.merge(current, entity_name=self.mapper.entity_name, _recursive=_recursive)
+                obj = session.merge(current, entity_name=self.mapper.entity_name, dont_load=dont_load, _recursive=_recursive)
                 if obj is not None:
                     #dest_list.append_without_event(obj)
                     dest_list.append_with_event(obj)
         else:
             current = list(childlist)[0]
             if current is not None:
-                obj = session.merge(current, entity_name=self.mapper.entity_name, _recursive=_recursive)
+                obj = session.merge(current, entity_name=self.mapper.entity_name, dont_load=dont_load, _recursive=_recursive)
                 if obj is not None:
                     setattr(dest, self.key, obj)
 
Index: lib/sqlalchemy/orm/session.py
===================================================================
--- lib/sqlalchemy/orm/session.py	(revision 3681)
+++ lib/sqlalchemy/orm/session.py	(working copy)
@@ -841,7 +841,7 @@
         for c in [object] + list(_object_mapper(object).cascade_iterator('delete', object)):
             self.uow.register_deleted(c)
 
-    def merge(self, object, entity_name=None, _recursive=None):
+    def merge(self, object, entity_name=None, dont_load=False, _recursive=None):
         """Copy the state of the given `object` onto the persistent
         object with the same identifier.
 
@@ -872,12 +872,16 @@
             else:
                 if key in self.identity_map:
                     merged = self.identity_map[key]
+                elif dont_load:
+                    merged = attribute_manager.new_instance(mapper.class_)
+                    merged._instance_key = key
+                    self.update(merged, entity_name=mapper.entity_name)
                 else:
                     merged = self.get(mapper.class_, key[1])
                     if merged is None:
                         raise exceptions.AssertionError("Instance %s has an instance key but is not persisted" % mapperutil.instance_str(object))
             for prop in mapper.iterate_properties:
-                prop.merge(self, object, merged, _recursive)
+                prop.merge(self, object, merged, dont_load, _recursive)
             if key is None:
                 self.save(merged, entity_name=mapper.entity_name)
             return merged
