diff --git a/src/main/java/org/olat/_spring/mainContext.xml b/src/main/java/org/olat/_spring/mainContext.xml
index 62cccc495477d24455848f3fea66bb86e2685c5f..e71e39ebe58b973b95791ffb135aa3f1416940fb 100644
--- a/src/main/java/org/olat/_spring/mainContext.xml
+++ b/src/main/java/org/olat/_spring/mainContext.xml
@@ -1,9 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context"
 	xsi:schemaLocation="
-  http://www.springframework.org/schema/beans 
-  http://www.springframework.org/schema/beans/spring-beans.xsd">
+        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/context 
+        http://www.springframework.org/schema/context/spring-context.xsd">
+  
+	<context:component-scan base-package="org.olat.note" />
 
 	<import resource="classpath:/org/olat/core/util/threadlog/_spring/threadlogCorecontext.xml"/>
 	<import resource="classpath:/org/olat/core/_spring/mainCorecontext.xml"/>
@@ -33,7 +38,6 @@
 	<import resource="classpath:/org/olat/instantMessaging/_spring/instantMessagingContext.xml"/>
 	<import resource="classpath:/org/olat/ldap/_spring/ldapContext.xml"/>
 	<import resource="classpath:/org/olat/login/_spring/loginContext.xml"/>
-	<import resource="classpath:/org/olat/note/_spring/noteContext.xml"/>
 	<import resource="classpath:/org/olat/portfolio/_spring/portfolioContext.xml"/>
 	<import resource="classpath:/org/olat/properties/_spring/propertiesContext.xml"/>
 	<import resource="classpath:/org/olat/registration/_spring/registrationContext.xml"/>
diff --git a/src/main/java/org/olat/note/NoteController.java b/src/main/java/org/olat/note/NoteController.java
index fca8416f5d44424e91f11ecbc7eba6a8216ee628..8c21bdbbb927770c59f2ffa2895209dea9a09b9b 100644
--- a/src/main/java/org/olat/note/NoteController.java
+++ b/src/main/java/org/olat/note/NoteController.java
@@ -45,6 +45,7 @@ import org.olat.core.util.event.EventBus;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.resource.OresHelper;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date: Dec 9, 2004
@@ -58,12 +59,14 @@ import org.olat.core.util.resource.OresHelper;
  */
 public class NoteController extends FormBasicController implements GenericEventListener {
 
-	private NoteManager nm;
 	private Note n;
 	private EventBus sec;
 	private RichTextElement noteField;
 	private FormLink editButton;
 	private FormSubmit submitButton;
+	
+	@Autowired
+	private NoteManager nm;
 
 	/**
 	 * @param ureq
@@ -98,8 +101,7 @@ public class NoteController extends FormBasicController implements GenericEventL
 
 	private void init(UserRequest ureq, String resourceTypeName, Long resourceTypeId, String noteTitle) {
 		Identity owner = ureq.getIdentity();
-		this.nm = NoteManager.getInstance();
-		this.n = nm.loadNoteOrCreateInRAM(owner, resourceTypeName, resourceTypeId);
+		n = nm.loadNoteOrCreateInRAM(owner, resourceTypeName, resourceTypeId);
 		n.setNoteTitle(noteTitle);
 
 		// register for local event (for the same user), is used to dispose
diff --git a/src/main/java/org/olat/note/NoteImpl.java b/src/main/java/org/olat/note/NoteImpl.java
index 76ee238203806d23b323e2ea2ea3a00935d04323..bde2dfbde8eb776385ecb3c9121f61d816f8e0c1 100644
--- a/src/main/java/org/olat/note/NoteImpl.java
+++ b/src/main/java/org/olat/note/NoteImpl.java
@@ -26,6 +26,7 @@
 package org.olat.note;
 
 import java.util.Date;
+
 import org.olat.core.commons.persistence.PersistentObject;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.AssertException;
@@ -37,6 +38,9 @@ import org.olat.core.logging.AssertException;
  * @author Alexander Schneider
  */
 public class NoteImpl extends PersistentObject implements Note {
+
+	private static final long serialVersionUID = -403450817851666464L;
+	
 	private Identity owner;
 	private String resourceTypeName;
 	private Long resourceTypeId;
@@ -157,4 +161,21 @@ public class NoteImpl extends PersistentObject implements Note {
 	public void setLastModified(Date date) {
 		this.lastModified = date;
 	}
+
+	@Override
+	public int hashCode() {
+		return getKey() == null ? 2609815 : getKey().hashCode();
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if(this == obj) {
+			return true;
+		}
+		if(obj instanceof NoteImpl) {
+			NoteImpl note = (NoteImpl)obj;
+			return getKey() != null && getKey().equals(note.getKey());
+		}
+		return false;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/note/NoteListController.java b/src/main/java/org/olat/note/NoteListController.java
index b5589f9ff88f485785a646ce78d1825d7cbbe16c..3ca0a86a42020aac3faef912e41fb49bc65e0793 100644
--- a/src/main/java/org/olat/note/NoteListController.java
+++ b/src/main/java/org/olat/note/NoteListController.java
@@ -49,6 +49,7 @@ import org.olat.core.util.event.EventBus;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent;
 import org.olat.core.util.resource.OresHelper;
+import org.springframework.beans.factory.annotation.Autowired;
 
 
 /**
@@ -61,7 +62,6 @@ public class NoteListController extends BasicController implements GenericEventL
 
 	private NoteListTableDataModel nLModel;
 	private Note chosenN = null;
-	private NoteManager nm = NoteManager.getInstance();
 
 	private TableController tableC;
 	private DialogBoxController deleteDialogCtr;
@@ -70,6 +70,9 @@ public class NoteListController extends BasicController implements GenericEventL
 	private Identity cOwner;
 	private Locale locale;
 	private CloseableModalController cmc;
+	
+	@Autowired
+	private NoteManager nm;
 
 	/**
 	 * @param ureq
diff --git a/src/main/java/org/olat/note/NoteManager.java b/src/main/java/org/olat/note/NoteManager.java
index f0fcf6f866bfd842452260a9132479a042f7f144..d99169878375494026367a97b09baa85e263a3aa 100644
--- a/src/main/java/org/olat/note/NoteManager.java
+++ b/src/main/java/org/olat/note/NoteManager.java
@@ -29,39 +29,26 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
-import org.hibernate.type.StandardBasicTypes;
-import org.hibernate.type.Type;
-import org.olat.core.commons.persistence.DBFactory;
-import org.olat.core.commons.persistence.DBQuery;
+import org.olat.basesecurity.IdentityRef;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
-import org.olat.core.manager.BasicManager;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.user.UserDataDeletable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 /**
  * Description:
  * 
  * @author Alexander Schneider
  */
-public class NoteManager extends BasicManager implements UserDataDeletable {
-	private static NoteManager instance;
+@Service
+public class NoteManager implements UserDataDeletable {
 
-	/**
-	 * [spring]
-	 * @param userDeletionManager
-	 */
-	private NoteManager() {
-		instance = this;
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static NoteManager getInstance() {
-		return instance;
-	}
+	@Autowired
+	private DB dbInstance;
 
 	/**
 	 * @param owner
@@ -98,29 +85,30 @@ public class NoteManager extends BasicManager implements UserDataDeletable {
 	 * @param resourceTypeId
 	 * @return the note
 	 */
-	private Note findNote(Identity owner, String resourceTypeName, Long resourceTypeId) {
-
-		String query = "from org.olat.note.NoteImpl as n where n.owner = ? and n.resourceTypeName = ? and n.resourceTypeId = ?";
-		List notes = DBFactory.getInstance().find(query, new Object[] { owner.getKey(), resourceTypeName, resourceTypeId },
-				new Type[] { StandardBasicTypes.LONG, StandardBasicTypes.STRING, StandardBasicTypes.LONG });
-
+	private Note findNote(IdentityRef owner, String resourceTypeName, Long resourceTypeId) {
+
+		String query = "select n from org.olat.note.NoteImpl as n where n.owner.key=:ownerKey and n.resourceTypeName=:resName and n.resourceTypeId=:resId";
+		List<Note> notes = dbInstance.getCurrentEntityManager().createQuery(query, Note.class)
+				.setParameter("ownerKey", owner.getKey())
+				.setParameter("resName", resourceTypeName)
+				.setParameter("resId", resourceTypeId)
+				.getResultList();
 		if (notes == null || notes.size() != 1) {
 			return null;
-		} else {
-			return (Note) notes.get(0);
 		}
+		return notes.get(0);
 	}
 
 	/**
 	 * @param owner
 	 * @return a list of notes belonging to the owner
 	 */
-	public List<Note> listUserNotes(Identity owner) {
-		String query = "from org.olat.note.NoteImpl as n inner join fetch n.owner as noteowner where noteowner = :noteowner";
-		DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString());
-		dbQuery.setEntity("noteowner", owner);
-		List<Note> notes = dbQuery.list();
-		return notes;
+	public List<Note> listUserNotes(IdentityRef owner) {
+		String query = "select n from org.olat.note.NoteImpl as n inner join fetch n.owner as noteowner where noteowner.key=:noteowner";
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(query.toString(), Note.class).
+				setParameter("noteowner", owner.getKey())
+				.getResultList();
 	}
 
 	/**
@@ -129,8 +117,8 @@ public class NoteManager extends BasicManager implements UserDataDeletable {
 	 * @param n the note
 	 */
 	public void deleteNote(Note n) {
-		n = (Note)DBFactory.getInstance().loadObject(n);
-		DBFactory.getInstance().deleteObject(n);
+		Note reloadedNote = dbInstance.getCurrentEntityManager().find(NoteImpl.class, n.getKey());
+		dbInstance.getCurrentEntityManager().remove(reloadedNote);
 		fireBookmarkEvent(n.getOwner());
 	}
 
@@ -141,7 +129,7 @@ public class NoteManager extends BasicManager implements UserDataDeletable {
 	 */
 	public void saveNote(Note n) {
 		n.setLastModified(new Date());
-		DBFactory.getInstance().saveObject(n);
+		dbInstance.getCurrentEntityManager().persist(n);
 		fireBookmarkEvent(n.getOwner());
 	}
 
@@ -150,10 +138,11 @@ public class NoteManager extends BasicManager implements UserDataDeletable {
 	 * 
 	 * @param n
 	 */
-	public void updateNote(Note n) {
+	public Note updateNote(Note n) {
 		n.setLastModified(new Date());
-		DBFactory.getInstance().updateObject(n);
+		Note mergedNote = dbInstance.getCurrentEntityManager().merge(n);
 		fireBookmarkEvent(n.getOwner());
+		return mergedNote;
 	}
 
 	/**
@@ -162,12 +151,9 @@ public class NoteManager extends BasicManager implements UserDataDeletable {
 	 */
 	@Override
 	public void deleteUserData(Identity identity,	String newDeletedUserName) {
-		List<Note> userNotes = this.listUserNotes(identity);
+		List<Note> userNotes = listUserNotes(identity);
 		for (Iterator<Note> iter = userNotes.iterator(); iter.hasNext();) {
-			this.deleteNote( iter.next() );			
-		}
-		if (isLogDebugEnabled()) {
-			logDebug("All notes deleted for identity=" + identity, null );
+			deleteNote( iter.next() );			
 		}
 	}
 	
diff --git a/src/main/java/org/olat/note/NotesPortletRunController.java b/src/main/java/org/olat/note/NotesPortletRunController.java
index 122c8dc7718e85ebf2c31401e7959f9cede24985..07efc0564de2649a16413bf441585fb2e960c4af 100644
--- a/src/main/java/org/olat/note/NotesPortletRunController.java
+++ b/src/main/java/org/olat/note/NotesPortletRunController.java
@@ -65,6 +65,7 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OresHelper;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description:<br>
@@ -84,6 +85,9 @@ public class NotesPortletRunController extends AbstractPortletRunController<Note
 	private Link showAllLink;
 	private final OLATResourceable eventBusThisIdentityOres;
 	
+	@Autowired
+	private NoteManager nm;
+	
 	/**
 	 * Constructor
 	 * @param ureq
@@ -136,7 +140,6 @@ public class NotesPortletRunController extends AbstractPortletRunController<Note
 	 * @return
 	 */
 	private List<PortletEntry<Note>> getAllPortletEntries() {
-		NoteManager nm = NoteManager.getInstance();
 		List<Note> noteList = nm.listUserNotes(cOwner);
 		return convertNoteToPortletEntryList(noteList);		
 	}
@@ -159,13 +162,10 @@ public class NotesPortletRunController extends AbstractPortletRunController<Note
 	 * 
 	 * @see org.olat.core.gui.control.generic.portal.AbstractPortletRunController#reloadModel(org.olat.core.gui.UserRequest, org.olat.core.gui.control.generic.portal.SortingCriteria)
 	 */
-	protected void reloadModel(SortingCriteria sortingCriteria) {
-		if (sortingCriteria.getSortingType() == SortingCriteria.AUTO_SORTING) {
-			NoteManager nm = NoteManager.getInstance();
+	protected void reloadModel(SortingCriteria sortCriteria) {
+		if (sortCriteria.getSortingType() == SortingCriteria.AUTO_SORTING) {
 			List<Note> noteList = nm.listUserNotes(cOwner);
-			
-			noteList = getSortedList(noteList, sortingCriteria );
-			
+			noteList = getSortedList(noteList, sortCriteria );
 			List<PortletEntry<Note>> entries = convertNoteToPortletEntryList(noteList);
 			notesListModel = new NoteSortingTableDataModel(entries, getLocale());
 			tableCtr.setTableDataModel(notesListModel);
@@ -287,16 +287,16 @@ public class NotesPortletRunController extends AbstractPortletRunController<Note
 	 * 
 	 * @see org.olat.core.gui.control.generic.portal.AbstractPortletRunController#getComparator(org.olat.core.gui.control.generic.portal.SortingCriteria)
 	 */
-	protected Comparator<Note> getComparator(final SortingCriteria sortingCriteria) {
+	protected Comparator<Note> getComparator(final SortingCriteria criteria) {
 		return new Comparator<Note>(){			
 			public int compare(final Note note1, final Note note2) {	
 				int comparisonResult = 0;
-			  if(sortingCriteria.getSortingTerm()==SortingCriteria.ALPHABETICAL_SORTING) {			  	
+			  if(criteria.getSortingTerm()==SortingCriteria.ALPHABETICAL_SORTING) {			  	
 			  	comparisonResult = collator.compare(StringEscapeUtils.escapeHtml(note1.getNoteTitle()).toString(), StringEscapeUtils.escapeHtml(note2.getNoteTitle()).toString());			  		  	
-			  } else if(sortingCriteria.getSortingTerm()==SortingCriteria.DATE_SORTING) {
+			  } else if(criteria.getSortingTerm()==SortingCriteria.DATE_SORTING) {
 			  	comparisonResult = note1.getLastModified().compareTo(note2.getLastModified());
 			  } 
-			  if(!sortingCriteria.isAscending()) {
+			  if(!criteria.isAscending()) {
 			  	//if not isAscending return (-comparisonResult)			  	
 			  	return -comparisonResult;
 			  }
diff --git a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
index 05e638fcd0d837b6c340982ca28d0651f2f76ac0..e53470acc27fcc32d857f685bd7569322752aee6 100644
--- a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
+++ b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
@@ -19,17 +19,20 @@
  */
 package org.olat.basesecurity.manager;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
 import junit.framework.Assert;
 
 import org.junit.Test;
+import org.olat.basesecurity.Grant;
 import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupMembership;
 import org.olat.basesecurity.model.GroupImpl;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
+import org.olat.resource.OLATResource;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -242,5 +245,166 @@ public class GroupDAOTest extends OlatTestCase {
 		List<GroupMembership> deletedMemberships = groupDao.getMemberships(group, "pilot");
 		Assert.assertTrue(deletedMemberships.isEmpty());
 	}
-
-}
+	
+	@Test
+	public void addGrant() {
+		Group group = groupDao.createGroup();
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, "grant-role", "read-only", resource);
+		dbInstance.commitAndCloseSession();
+	}
+	
+	@Test
+	public void getGrants_withResource() {
+		Group group = groupDao.createGroup();
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, "getGrants-res", "getGrants-res-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		List<Group> groups = Collections.singletonList(group);
+		List<Grant> grants = groupDao.getGrants(groups, resource);
+		Assert.assertNotNull(grants);
+		Assert.assertEquals(1, grants.size());
+		Grant grant = grants.get(0);
+		Assert.assertNotNull(grant);
+		Assert.assertEquals(group, grant.getGroup());
+		Assert.assertEquals(resource, grant.getResource());
+		Assert.assertEquals("getGrants-res", grant.getRole());
+		Assert.assertEquals("getGrants-res-perm", grant.getPermission());
+	}
+	
+	@Test
+	public void getGrants_withResource_withRole() {
+		Group group = groupDao.createGroup();
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, "getGrants-role-1", "getGrants-role-1-perm", resource);
+		groupDao.addGrant(group, "getGrants-role-2", "getGrants-role-2-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		List<Grant> grants = groupDao.getGrants(group, "getGrants-role-2", resource);
+		Assert.assertNotNull(grants);
+		Assert.assertEquals(1, grants.size());
+		Grant grant = grants.get(0);
+		Assert.assertNotNull(grant);
+		Assert.assertEquals(group, grant.getGroup());
+		Assert.assertEquals(resource, grant.getResource());
+		Assert.assertEquals("getGrants-role-2", grant.getRole());
+		Assert.assertEquals("getGrants-role-2-perm", grant.getPermission());
+	}
+	
+	@Test
+	public void hasGrant() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("grant-1-");
+		Group group = groupDao.createGroup();
+		String role = "hasGrant-role";
+		groupDao.addMembership(group, id, role);
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, role, "hasGrant-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		boolean hasGrant = groupDao.hasGrant(id, "hasGrant-perm", resource);
+		Assert.assertTrue(hasGrant);
+	}
+	
+	@Test
+	public void getPermissions() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("grant-1-");
+		Group group = groupDao.createGroup();
+		String role = "getPermissions-role";
+		groupDao.addMembership(group, id, role);
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, role, "getPermissions-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		List<String> permissions = groupDao.getPermissions(id, resource);
+		Assert.assertNotNull(permissions);
+		Assert.assertEquals(1, permissions.size());
+		Assert.assertEquals("getPermissions-perm", permissions.get(0));
+	}
+	
+	@Test
+	public void getPermissions_complex() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("grant-1-");
+		Group group = groupDao.createGroup();
+		String role1 = "getPermissions-role-1";
+		groupDao.addMembership(group, id, role1);
+		String role2 = "getPermissions-role-2";
+		groupDao.addMembership(group, id, role2);
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, role1, "getPermissions-perm-1", resource);
+		groupDao.addGrant(group, role2, "getPermissions-perm-2", resource);
+		dbInstance.commitAndCloseSession();
+		
+		List<String> permissions = groupDao.getPermissions(id, resource);
+		Assert.assertNotNull(permissions);
+		Assert.assertEquals(2, permissions.size());
+		Assert.assertTrue(permissions.contains("getPermissions-perm-1"));
+		Assert.assertTrue(permissions.contains("getPermissions-perm-2"));
+	}
+	
+	@Test
+	public void addRemoveGrant() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("addremove-1-");
+		Group group = groupDao.createGroup();
+		groupDao.addMembership(group, id, "addremove-1");
+		groupDao.addMembership(group, id, "addremove-2");
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, "addremove-1", "addremove-1-perm", resource);
+		groupDao.addGrant(group, "addremove-2", "addremove-2-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		//setup check
+		boolean hasPerm1 = groupDao.hasGrant(id, "addremove-1-perm", resource);
+		Assert.assertTrue(hasPerm1);
+		boolean hasPerm2 = groupDao.hasGrant(id, "addremove-2-perm", resource);
+		Assert.assertTrue(hasPerm2);
+		
+		//remove perm 1
+		groupDao.removeGrant(group, "addremove-1", "addremove-1-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		boolean hasStillPerm1 = groupDao.hasGrant(id, "addremove-1-perm", resource);
+		Assert.assertFalse(hasStillPerm1);
+		boolean hasStillPerm2 = groupDao.hasGrant(id, "addremove-2-perm", resource);
+		Assert.assertTrue(hasStillPerm2);
+	}
+	
+	@Test
+	public void addRemoveGrants() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("addremove-1-");
+		Group group = groupDao.createGroup();
+		groupDao.addMembership(group, id, "addremove-1");
+		groupDao.addMembership(group, id, "addremove-2");
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		groupDao.addGrant(group, "addremove-1", "addremove-1-perm", resource);
+		groupDao.addGrant(group, "addremove-1", "addremove-11-perm", resource);
+		groupDao.addGrant(group, "addremove-2", "addremove-2-perm", resource);
+		groupDao.addGrant(group, "addremove-2", "addremove-22-perm", resource);
+		dbInstance.commitAndCloseSession();
+		
+		//setup check
+		boolean hasPerm1 = groupDao.hasGrant(id, "addremove-1-perm", resource);
+		Assert.assertTrue(hasPerm1);
+		boolean hasPerm11 = groupDao.hasGrant(id, "addremove-11-perm", resource);
+		Assert.assertTrue(hasPerm11);
+		boolean hasPerm2 = groupDao.hasGrant(id, "addremove-2-perm", resource);
+		Assert.assertTrue(hasPerm2);
+		boolean hasPerm22 = groupDao.hasGrant(id, "addremove-22-perm", resource);
+		Assert.assertTrue(hasPerm22);
+		
+		//remove perm 1
+		groupDao.removeGrants(group, "addremove-1", resource);
+		dbInstance.commitAndCloseSession();
+		
+		//check
+		boolean hasStillPerm1 = groupDao.hasGrant(id, "addremove-1-perm", resource);
+		Assert.assertFalse(hasStillPerm1);
+		boolean hasStillPerm11 = groupDao.hasGrant(id, "addremove-11-perm", resource);
+		Assert.assertFalse(hasStillPerm11);
+		boolean hasStillPerm2 = groupDao.hasGrant(id, "addremove-2-perm", resource);
+		Assert.assertTrue(hasStillPerm2);
+		boolean hasStillPerm22 = groupDao.hasGrant(id, "addremove-22-perm", resource);
+		Assert.assertTrue(hasStillPerm22);
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/org/olat/note/NoteTest.java b/src/test/java/org/olat/note/NoteTest.java
index 3bea20ac3744241bd5f7886d175fe460e3c0c713..d670fb2a30cc121a14c4fdf087f549e8c5108e0c 100644
--- a/src/test/java/org/olat/note/NoteTest.java
+++ b/src/test/java/org/olat/note/NoteTest.java
@@ -26,22 +26,16 @@
 
 package org.olat.note;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
 import java.util.List;
-import java.util.UUID;
 
-import org.junit.Before;
+import org.junit.Assert;
 import org.junit.Test;
-import org.olat.core.commons.persistence.DBFactory;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
-import org.olat.core.id.OLATResourceable;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
-import org.olat.resource.OLATResourceManager;
+import org.olat.resource.OLATResource;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date:  Dec 9, 2004
@@ -51,73 +45,56 @@ import org.olat.test.OlatTestCase;
  * Comment:  
  * 
  */
-public class NoteTest extends OlatTestCase implements OLATResourceable {
-
-	private long RESOURCE_ID = 42;
-	private String RESOURCE_TYPE = "org.olat.note.NoteTest";
-	private static OLog log = Tracing.createLoggerFor(NoteTest.class);
-	private static boolean isInitialized = false;
-	private static Identity identity = null;
-	private static org.olat.resource.OLATResource res = null;
-	private static NoteManager nm;
-
+public class NoteTest extends OlatTestCase {
 
-	/**
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Before
-	public void setup() {
-		if (NoteTest.isInitialized == false) {
-			try {
-				nm = NoteManager.getInstance();
-				// identity with null User should be ok for test case
-				String name = UUID.randomUUID().toString().replace("-", "");
-				identity = JunitTestHelper.createAndPersistIdentityAsUser(name);
-				res = OLATResourceManager.getInstance().createOLATResourceInstance(this);
-				OLATResourceManager.getInstance().saveOLATResource(res);
-				
-				NoteTest.isInitialized = true;
-			} catch (Exception e) {
-				log.error(
-					"Error while generating database tables or opening hibernate session: " +
-					e);
-			}
-		}
-	}
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private NoteManager noteManager;
 
 	@Test
 	public void testGenericLoadDeleteNote() {
-	    Long resourceTypeId = res.getResourceableId(); 
-	    String resourceTypeName = res.getResourceableTypeName();
-	    Note n = nm.loadNoteOrCreateInRAM(identity, resourceTypeName, resourceTypeId);
+		Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("note-1-");
+	    OLATResource resource = JunitTestHelper.createRandomResource();
+	    
+	    Note n = noteManager.loadNoteOrCreateInRAM(identity, resource.getResourceableTypeName(), resource.getResourceableId());
 	    n.setNoteTitle("Notiz Titel");
 	    n.setNoteText("Notiz Text");
-	    nm.saveNote(n);
+	    noteManager.saveNote(n);
 	    
-	    DBFactory.getInstance().closeSession();
+	    dbInstance.commitAndCloseSession();
 	    
-	    Note note = nm.loadNoteOrCreateInRAM(identity, resourceTypeName, resourceTypeId);
-	    assertNotNull(note);
+	    Note note = noteManager.loadNoteOrCreateInRAM(identity, resource.getResourceableTypeName(), resource.getResourceableId());
+	    Assert.assertNotNull(note);
 	    
-	    nm.deleteNote(note);
+	    noteManager.deleteNote(note);
 	    
-	    List<Note> notes = nm.listUserNotes(identity);
-	    assertTrue(notes.size()==0);
-	   
+	    List<Note> notes = noteManager.listUserNotes(identity);
+	    Assert.assertTrue(notes.isEmpty());
 	}
-
 	
-	/**
-	 * @see org.olat.core.id.OLATResourceablegetResourceableTypeName()
-	 */
-	public String getResourceableTypeName() {
-		return RESOURCE_TYPE;
-	}
-
-	/**
-	 * @see org.olat.core.id.OLATResourceablegetResourceableId()
-	 */
-	public Long getResourceableId() {
-		return new Long(RESOURCE_ID);
+	@Test
+	public void saveUpdateNote() {
+		Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("note-2-");
+	    OLATResource resource = JunitTestHelper.createRandomResource();
+		Note note = noteManager.loadNoteOrCreateInRAM(identity, resource.getResourceableTypeName(), resource.getResourceableId());
+		note.setNoteTitle("Very important");
+	    note.setNoteText("Critical update with new features");
+	    noteManager.saveNote(note);
+	    dbInstance.commitAndCloseSession();
+	    
+	    Note updateNote = noteManager.loadNoteOrCreateInRAM(identity, resource.getResourceableTypeName(), resource.getResourceableId());
+	    updateNote.setNoteTitle("Important");
+	    updateNote.setNoteText("Cool update with new features");
+	    noteManager.saveNote(updateNote);
+	    dbInstance.commitAndCloseSession();
+	    
+	    List<Note> notes = noteManager.listUserNotes(identity);
+	    Assert.assertNotNull(notes);
+	    Assert.assertEquals(1, notes.size());
+	    Assert.assertEquals(updateNote, notes.get(0));
+	    Note reloadedNote = notes.get(0);
+	    Assert.assertEquals("Important", reloadedNote.getNoteTitle());
+	    Assert.assertEquals("Cool update with new features", reloadedNote.getNoteText());
 	}
 }