Roles roles = ureq.getUserSession().getRoles();
    if (olatResourceable == null) {
      // special case after login: guest will get guesthome, other user the
      // normal home
      if (ureq.getUserSession().getRoles().isGuestOnly()) return new GuestHomeMainController(ureq, wControl);
      return new HomeMainController(ureq, wControl);
    } else if (OresHelper.isOfType(olatResourceable, BGMainController.class)) {
      if (roles.isGuestOnly()) throw new OLATSecurityException("Tried to launch a BuddyGroupMainController, but is in guest group " + roles);
      return BGControllerFactory.getInstance().createBuddyGroupMainController(ureq, wControl, initialViewIdentifier);
    } else if (OresHelper.isOfType(olatResourceable, BusinessGroup.class)) {
      if (roles.isGuestOnly()) throw new OLATSecurityException("Tried to launch a BusinessGroup, but is in guest group " + roles);
      BusinessGroupManager bgm = BusinessGroupManagerImpl.getInstance();
      BusinessGroup bg = bgm.loadBusinessGroup(olatResourceable.getResourceableId(), exceptIfNoneFound);
      boolean isOlatAdmin = ureq.getUserSession().getRoles().isOLATAdmin();
      // check if allowed to start (must be member or admin)
      if (isOlatAdmin || bgm.isIdentityInBusinessGroup(ureq.getIdentity(), bg)) {  
        // only olatadmins or admins of this group can administer this group
        return BGControllerFactory.getInstance().createRunControllerFor(ureq, wControl, bg, isOlatAdmin,
            initialViewIdentifier);
      }
      // else skip
    } else if (OresHelper.isOfType(olatResourceable, RepositoryEntry.class)) {
      // it this is a respository type, the resourceableID is the repository
      // entry key
      RepositoryManager rm = RepositoryManager.getInstance();
      RepositoryEntry re = rm.lookupRepositoryEntry(olatResourceable.getResourceableId());
      MainLayoutController ctrl = RepositoyUIFactory.createLaunchController(re, initialViewIdentifier, ureq, wControl);
      if (ctrl != null) return ctrl;
    } else if (OresHelper.isOfType(olatResourceable, CourseModule.class)) {
      // gets called by subscription launcher
      //FIXME:fj:make it clearer here: subscriptioncontext is always given by
      // the surrounding resource, but for launching we always need the
      // repoentry
      // if it is a course, we also take the repository entry, since a course
      // can only be called by a repoentry
      RepositoryManager rm = RepositoryManager.getInstance();
      RepositoryEntry re = rm.lookupRepositoryEntry(olatResourceable, false);
      MainLayoutController ctrl = RepositoyUIFactory.createLaunchController(re, initialViewIdentifier, ureq, wControl);
      if (ctrl != null) return ctrl;
    } else if (OresHelper.isOfType(olatResourceable, AssessmentManager.class)) {
      // gets called by subscription launcher
      //FIXME:fj:make it clearer here: subscriptioncontext is always given by
      // the surrounding resource, but for launching we always need the
      // repoentry
      // if it is a course, we also take the repository entry, since a course
      // can only be called by a repoentry
      RepositoryManager rm = RepositoryManager.getInstance();
      // launch course with view identifyer assessment tool. however notifications 
      // publisher data provides not existing assessmentManager resource
      OLATResourceable fakedCourseResource = OresHelper.createOLATResourceableInstance(CourseModule.class, olatResourceable.getResourceableId());
      RepositoryEntry re = rm.lookupRepositoryEntry(fakedCourseResource, false);
      MainLayoutController ctrl = RepositoyUIFactory.createLaunchController(re, "assessmentTool", ureq, wControl);
      
      if (ctrl != null) return ctrl;
    } else if (OresHelper.isOfType(olatResourceable, DropboxController.class)) {
      // JumpIn-handling for task-dropbox notification 
      RepositoryManager rm = RepositoryManager.getInstance();
      OLATResourceable fakedCourseResource = OresHelper.createOLATResourceableInstance(CourseModule.class, olatResourceable.getResourceableId());
      RepositoryEntry re = rm.lookupRepositoryEntry(fakedCourseResource,false);
      if (re == null) {
        return null;// found no repositoryEntry => return null
      }
      MainLayoutController ctrl = RepositoyUIFactory.createLaunchController(re, "assessmentTool:nodeChoose", ureq, wControl);  
      if (ctrl != null) return ctrl;
    } else if (OresHelper.isOfType(olatResourceable, ReturnboxController.class)) {
      // JumpIn-handling for task-returnbox notification 
      RepositoryManager rm = RepositoryManager.getInstance();
      OLATResourceable fakedCourseResource = OresHelper.createOLATResourceableInstance(CourseModule.class, olatResourceable.getResourceableId());
      RepositoryEntry re = rm.lookupRepositoryEntry(fakedCourseResource, false);
      MainLayoutController ctrl = RepositoyUIFactory.createLaunchController(re, initialViewIdentifier, ureq, wControl);  
      if (ctrl != null) return ctrl;
    }
    // --- repository ---
    else if (OresHelper.isOfType(olatResourceable, RepositoryMainController.class)) {
      return new RepositoryMainController(ureq, wControl);
    }
    // --- home ---
    else if (OresHelper.isOfType(olatResourceable, HomeMainController.class)) {
      if (roles.isGuestOnly()) throw new OLATSecurityException("Tried to launch a HomeMainController, but is in guest group " + roles);
      return new HomeMainController(ureq, wControl);
    } else if (OresHelper.isOfType(olatResourceable, SystemAdminMainController.class)) {
      if (!roles.isOLATAdmin()) throw new OLATSecurityException("Tried to launch a SystemAdminMainController, but is not in admin group " + roles);
      return new SystemAdminMainController(ureq, wControl);
    } else if (OresHelper.isOfType(olatResourceable, UserAdminMainController.class)) {
      if (!roles.isUserManager()) throw new OLATSecurityException("Tried to launch a UserAdminMainController, but is not in admin group " + roles);