Index: data/hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java
===================================================================
--- data/hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java	(revision 2569)
+++ data/hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java	(working copy)
@@ -70,7 +70,7 @@
 
         Role role = rdao.getRoleByName(Constants.ADMIN_ROLE);
         user.addRole(role);
-        dao.saveUser(user);
+        user = dao.saveUser(user);
         flush();
 
         user = dao.get(1L);
@@ -110,7 +110,7 @@
         assertNotNull(role.getId());
         user.addRole(role);
 
-        dao.saveUser(user);
+        user = dao.saveUser(user);
         flush();
 
         assertNotNull(user.getId());
Index: data/hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java
===================================================================
--- data/hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java	(revision 2569)
+++ data/hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java	(working copy)
@@ -38,7 +38,7 @@
         user.setEmail("foo@bar.com");
 
         // create
-        universalDao.save(user);
+        user = (User)universalDao.save(user);
         flush();
         assertNotNull(user.getId());
 
Index: data/hibernate/src/main/java/org/appfuse/dao/GenericDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(revision 2569)
+++ data/hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(working copy)
@@ -43,7 +43,7 @@
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
      */
-    public void save(T object);
+    public T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java	(revision 2569)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/GenericDaoHibernate.java	(working copy)
@@ -57,8 +57,8 @@
 	}
     }
 
-    public void save(T object) {
-        super.getHibernateTemplate().saveOrUpdate(object);
+    public T save(T object) {
+        return (T)super.getHibernateTemplate().merge(object);
     }
 
     public void remove(PK id) {
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java	(revision 2569)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/UserDaoHibernate.java	(working copy)
@@ -34,11 +34,12 @@
     /**
      * @see org.appfuse.dao.UserDao#saveUser(org.appfuse.model.User)
      */
-    public void saveUser(final User user) {
-        log.debug("user's id: " + user.getId());        
+    public User saveUser(User user) {
+        log.debug("user's id: " + user.getId());
         getHibernateTemplate().saveOrUpdate(user);
         // necessary to throw a DataIntegrityViolation and catch it in UserManager
         getHibernateTemplate().flush();
+        return user;
     }
     
     /**
@@ -47,8 +48,8 @@
      * does not.
      */
     @Override
-    public void save(User user) {
-        this.saveUser(user);
+    public User save(User user) {
+        return this.saveUser(user);
     }
 
     /** 
Index: data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java	(revision 2569)
+++ data/hibernate/src/main/java/org/appfuse/dao/hibernate/UniversalDaoHibernate.java	(working copy)
@@ -22,8 +22,8 @@
     /**
      * @see org.appfuse.dao.UniversalDao#save(java.lang.Object)
      */
-    public void save(Object o) {
-        getHibernateTemplate().saveOrUpdate(o);
+    public Object save(Object o) {
+        return getHibernateTemplate().merge(o);
     }
 
     /**
Index: data/hibernate/src/main/java/org/appfuse/dao/UserDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/UserDao.java	(revision 2569)
+++ data/hibernate/src/main/java/org/appfuse/dao/UserDao.java	(working copy)
@@ -33,6 +33,6 @@
      * Saves a user's information.
      * @param user the object to be saved
      */
-    public void saveUser(User user);
+    public User saveUser(User user);
     
 }
Index: data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java
===================================================================
--- data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(revision 2569)
+++ data/hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(working copy)
@@ -50,7 +50,7 @@
      * Generic method to save an object - handles both update and insert.
      * @param o the object to save
      */
-    public void save(Object o);
+    public Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
Index: data/jpa-hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java
===================================================================
--- data/jpa-hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java	(revision 2569)
+++ data/jpa-hibernate/src/test/java/org/appfuse/dao/UserDaoTest.java	(working copy)
@@ -107,7 +107,7 @@
         assertNotNull(role.getId());
         user.addRole(role);
 
-        dao.save(user);
+        user = dao.save(user);
 
         assertNotNull(user.getId());
         assertEquals("testpass", user.getPassword());
Index: data/jpa-hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java
===================================================================
--- data/jpa-hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java	(revision 2569)
+++ data/jpa-hibernate/src/test/java/org/appfuse/dao/UniversalDaoTest.java	(working copy)
@@ -38,7 +38,7 @@
         user.setEmail("foo@bar.com");
 
         // create
-        universalDao.save(user);
+        user = (User)universalDao.save(user);
         assertNotNull(user.getId());
 
         // retrieve
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(revision 2569)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/GenericDao.java	(working copy)
@@ -43,7 +43,7 @@
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
      */
-    public void save(T object);
+    public T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java	(revision 2569)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/UserDao.java	(working copy)
@@ -33,6 +33,6 @@
      * Saves a user's information.
      * @param user the object to be saved
      */
-    public void saveUser(User user);
+    public User saveUser(User user);
     
 }
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java	(revision 2569)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UniversalDaoJpa.java	(working copy)
@@ -31,14 +31,8 @@
     /**
      * @see org.appfuse.dao.UniversalDao#save(java.lang.Object)
      */
-    public void save(Object o) {
-        Object objId = DaoUtils.getPersistentId(o);
-        
-        if (objId == null) {
-            this.entityManager.persist(o);
-        } else {
-            this.entityManager.merge(o);
-        }
+    public Object save(Object o) {
+	return this.entityManager.merge(o);
     }
 
     /**
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java	(revision 2569)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/GenericDaoJpa.java	(working copy)
@@ -69,14 +69,8 @@
 	}
     }
 
-    public void save(T object) {
-        Object objId = DaoUtils.getPersistentId(object);
-        
-        if (objId == null) {
-            this.entityManager.persist(object);
-        } else {
-            this.entityManager.merge(object);
-        }
+    public T save(T object) {
+	return this.entityManager.merge(object);
     }
 
     public void remove(PK id) {
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java	(revision 2569)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/jpa/UserDaoJpa.java	(working copy)
@@ -50,7 +50,8 @@
         }
     }
     
-    public void saveUser(User user) {
-        super.save(user);
+    public User saveUser(User user) {
+        User u = super.save(user);
+        return u;
     }
 }
Index: data/jpa-hibernate/src/main/java/org/appfuse/dao/UniversalDao.java
===================================================================
--- data/jpa-hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(revision 2569)
+++ data/jpa-hibernate/src/main/java/org/appfuse/dao/UniversalDao.java	(working copy)
@@ -50,7 +50,7 @@
      * Generic method to save an object - handles both update and insert.
      * @param o the object to save
      */
-    public void save(Object o);
+    public Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
Index: data/ibatis/src/test/java/org/appfuse/dao/UserDaoTest.java
===================================================================
--- data/ibatis/src/test/java/org/appfuse/dao/UserDaoTest.java	(revision 2569)
+++ data/ibatis/src/test/java/org/appfuse/dao/UserDaoTest.java	(working copy)
@@ -42,7 +42,7 @@
         Address address = user.getAddress();
         address.setAddress("new address");
 
-        dao.saveUser(user);
+        user = dao.saveUser(user);
 
         assertEquals(user.getAddress(), address);
         assertEquals("new address", user.getAddress().getAddress());
@@ -53,7 +53,7 @@
         endTransaction();
 
         try {
-            dao.saveUser(user);
+            user = dao.saveUser(user);
             fail("saveUser didn't throw DataIntegrityViolationException");
         } catch (DataIntegrityViolationException e) {
             assertNotNull(e);
@@ -67,18 +67,18 @@
 
         Role role = rdao.getRoleByName(Constants.ADMIN_ROLE);
         user.addRole(role);
-        dao.saveUser(user);
+        user = dao.saveUser(user);
 
         assertEquals(2, user.getRoles().size());
 
         //add the same role twice - should result in no additional role
         user.addRole(role);
-        dao.saveUser(user);
+        user = dao.saveUser(user);
 
         assertEquals("more than 2 roles", 2, user.getRoles().size());
 
         user.getRoles().remove(role);
-        dao.saveUser(user);
+        user = dao.saveUser(user);
 
         assertEquals(1, user.getRoles().size());
     }
@@ -101,7 +101,7 @@
         assertNotNull(role.getId());
         user.addRole(role);
 
-        dao.saveUser(user);
+        user = dao.saveUser(user);
 
         assertNotNull(user.getId());
         assertEquals("testpass", user.getPassword());
Index: data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java
===================================================================
--- data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java	(revision 2569)
+++ data/ibatis/src/test/java/org/appfuse/dao/RoleDaoTest.java	(working copy)
@@ -25,14 +25,14 @@
         log.debug(role);
         role.setDescription("test descr");
 
-        dao.save(role);
+        role = dao.save(role);
         assertEquals(role.getDescription(), "test descr");
     }
 
     public void testAddAndRemoveRole() throws Exception {
         Role role = new Role("testrole");
         role.setDescription("new role descr");
-        dao.save(role);
+        role = dao.save(role);
         setComplete(); // change behavior from rollback to commit
         endTransaction();
 
Index: data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/GenericDao.java	(working copy)
@@ -43,7 +43,7 @@
      * Generic method to save an object - handles both update and insert.
      * @param object the object to save
      */
-    public void save(T object);
+    public T save(T object);
 
     /**
      * Generic method to delete an object based on class and id
Index: data/ibatis/src/main/java/org/appfuse/dao/UserDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/UserDao.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/UserDao.java	(working copy)
@@ -33,6 +33,6 @@
      * Saves a user's information.
      * @param user the object to be saved
      */
-    public void saveUser(User user);
+    public User saveUser(User user);
     
 }
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/RoleDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/RoleDaoiBatis.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/RoleDaoiBatis.java	(working copy)
@@ -27,12 +27,13 @@
     }
 
     @Override
-    public void save(final Role role) {
+    public Role save(final Role role) {
         if (role.getId() == null) {
             getSqlMapClientTemplate().update("addRole", role);
         } else {
             getSqlMapClientTemplate().update("updateRole", role);
         }
+        return role;
     }
 
     public void removeRole(String rolename) {
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/UniversalDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/UniversalDaoiBatis.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/UniversalDaoiBatis.java	(working copy)
@@ -35,7 +35,7 @@
         return object;
     }
 
-    public void save(final Object object) {
+    public Object save(final Object object) {
         String className = ClassUtils.getShortName(object.getClass());
         Object primaryKey = iBatisDaoUtils.getPrimaryKeyValue(object);
         String keyId = null;
@@ -63,6 +63,8 @@
         // check for null id
         if (iBatisDaoUtils.getPrimaryKeyValue(object) == null) {
             throw new ObjectRetrievalFailureException(className, object);
+        } else {
+            return object;
         }
     }
 
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/GenericDaoiBatis.java	(working copy)
@@ -56,7 +56,7 @@
         }
     }
 
-    public void save(final T object) {
+    public T save(final T object) {
         String className = ClassUtils.getShortName(object.getClass());
         Object primaryKey = iBatisDaoUtils.getPrimaryKeyValue(object);
         String keyId = null;
@@ -84,6 +84,8 @@
         // check for null id
         if (iBatisDaoUtils.getPrimaryKeyValue(object) == null) {
             throw new ObjectRetrievalFailureException(className, object);
+        } else {
+            return object;
         }
     }
 
Index: data/ibatis/src/main/java/org/appfuse/dao/ibatis/UserDaoiBatis.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/ibatis/UserDaoiBatis.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/ibatis/UserDaoiBatis.java	(working copy)
@@ -90,7 +90,7 @@
     /**
      * @see org.appfuse.dao.UserDao#saveUser(org.appfuse.model.User)
      */
-    public void saveUser(final User user) {
+    public User saveUser(final User user) {
         iBatisDaoUtils.prepareObjectForSaveOrUpdate(user);
         
         if (user.getId() == null) {
@@ -102,6 +102,7 @@
             deleteUserRoles(user.getId());
             addUserRoles(user);
         }
+        return user;
     }
 
 
Index: data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java
===================================================================
--- data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java	(revision 2569)
+++ data/ibatis/src/main/java/org/appfuse/dao/UniversalDao.java	(working copy)
@@ -50,7 +50,7 @@
      * Generic method to save an object - handles both update and insert.
      * @param o the object to save
      */
-    public void save(Object o);
+    public Object save(Object o);
 
     /**
      * Generic method to delete an object based on class and id
