Index: lib/sqlalchemy/orm/session.py
===================================================================
--- lib/sqlalchemy/orm/session.py	(revision 1775)
+++ lib/sqlalchemy/orm/session.py	(working copy)
@@ -295,7 +295,7 @@
         instance.
         """
         self._save_impl(object, entity_name=entity_name)
-        object_mapper(object).cascade_callable('save-update', object, lambda c, e:self._save_or_update_impl(c, e))
+#        object_mapper(object).cascade_callable('save-update', object, lambda c, e:self._save_or_update_impl(c, e))
 
     def update(self, object, entity_name=None):
         """Brings the given detached (saved) instance into this Session.
@@ -304,11 +304,11 @@
         This operation cascades the "save_or_update" method to associated instances if the relation is mapped 
         with cascade="save-update"."""
         self._update_impl(object, entity_name=entity_name)
-        object_mapper(object).cascade_callable('save-update', object, lambda c, e:self._save_or_update_impl(c, e))
+#        object_mapper(object).cascade_callable('save-update', object, lambda c, e:self._save_or_update_impl(c, e))
 
     def save_or_update(self, object, entity_name=None):
         self._save_or_update_impl(object, entity_name=entity_name)
-        object_mapper(object).cascade_callable('save-update', object, lambda c, e:self._save_or_update_impl(c, e))
+#        object_mapper(object).cascade_callable('save-update', object, lambda c, e:self._save_or_update_impl(c, e))
     
     def _save_or_update_impl(self, object, entity_name=None):
         key = getattr(object, '_instance_key', None)
Index: lib/sqlalchemy/orm/unitofwork.py
===================================================================
--- lib/sqlalchemy/orm/unitofwork.py	(revision 1805)
+++ lib/sqlalchemy/orm/unitofwork.py	(working copy)
@@ -38,11 +38,11 @@
         sess = object_session(obj)
         if sess is not None:
             sess._register_changed(obj)
-            if self.cascade is not None and self.cascade.save_update and item not in sess:
-                mapper = object_mapper(obj)
-                prop = mapper.props[self.key]
-                ename = prop.mapper.entity_name
-                sess.save_or_update(item, entity_name=ename)
+            #if self.cascade is not None and self.cascade.save_update and item not in sess:
+             #   mapper = object_mapper(obj)
+             #   prop = mapper.props[self.key]
+             #   ename = prop.mapper.entity_name
+             #   sess.save_or_update(item, entity_name=ename)
 
     def delete(self, event, obj, item):
         sess = object_session(obj)
@@ -53,11 +53,11 @@
         sess = object_session(obj)
         if sess is not None:
             sess._register_changed(obj)
-            if newvalue is not None and self.cascade is not None and self.cascade.save_update and newvalue not in sess:
-                mapper = object_mapper(obj)
-                prop = mapper.props[self.key]
-                ename = prop.mapper.entity_name
-                sess.save_or_update(newvalue, entity_name=ename)
+            #if newvalue is not None and self.cascade is not None and self.cascade.save_update and newvalue not in sess:
+            #    mapper = object_mapper(obj)
+            #    prop = mapper.props[self.key]
+            #    ename = prop.mapper.entity_name
+            #    sess.save_or_update(newvalue, entity_name=ename)
 
 class UOWProperty(attributes.InstrumentedAttribute):
     """overrides InstrumentedAttribute to provide an extra AttributeExtension to all managed attributes
@@ -180,6 +180,9 @@
             objset = None
 
         for obj in [n for n in self.new] + [d for d in self.dirty]:
+            object_mapper(obj).cascade_callable('save-update', obj, lambda c, e:session._save_or_update_impl(c, e))
+
+        for obj in [n for n in self.new] + [d for d in self.dirty]:
             if objset is not None and not obj in objset:
                 continue
             if obj in self.deleted:
