From 284ea8f49a7fda3d8568181e490e1bfa2b79be24 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
Date: Fri, 6 May 2016 12:27:44 +0200
Subject: [PATCH] No, putting these methods into admin (request-scoped)
 controller is not good as no caching takes place. Better put them into
 session-scoped controllers to have caching possible. Please cherry-pick and
 keep recruiter-stuff out of other projects.
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

Signed-off-by: Roland Häder <roland@mxchange.org>
---
 .../JobsAdminContactWebRequestBean.java       |  16 +-
 .../JobsAdminContactWebRequestController.java |  15 -
 .../contact/JobsContactWebSessionBean.java    | 108 ++++--
 .../JobsContactWebSessionController.java      |  20 +-
 .../helper/JobsAdminWebRequestHelper.java     |  22 +-
 .../JobsUserProfileWebRequestBean.java        |   9 +-
 .../JobsUserRegisterWebSessionBean.java       |   5 +-
 .../user/JobsAdminUserWebRequestBean.java     | 308 +---------------
 .../JobsAdminUserWebRequestController.java    |  87 -----
 .../beans/user/JobsUserWebSessionBean.java    | 335 +++++++++++++++++-
 .../user/JobsUserWebSessionController.java    |  93 ++++-
 web/admin/contact/admin_contact_list.xhtml    |   2 +-
 web/admin/user/admin_user_list.xhtml          |   2 +-
 13 files changed, 512 insertions(+), 510 deletions(-)

diff --git a/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestBean.java b/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestBean.java
index 41797abd..936b6fba 100644
--- a/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestBean.java
+++ b/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestBean.java
@@ -19,7 +19,6 @@ package org.mxchange.jjobs.beans.contact;
 import java.text.MessageFormat;
 import java.util.Date;
 import java.util.Iterator;
-import java.util.List;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.event.Event;
@@ -229,9 +228,6 @@ public class JobsAdminContactWebRequestBean implements JobsAdminContactWebReques
 	 * Default constructor
 	 */
 	public JobsAdminContactWebRequestBean () {
-		// Set gender to UNKNOWN
-		this.gender = Gender.UNKNOWN;
-
 		// Try it
 		try {
 			// Get initial context
@@ -293,11 +289,6 @@ public class JobsAdminContactWebRequestBean implements JobsAdminContactWebReques
 		return "admin_list_contact"; //NOI18N
 	}
 
-	@Override
-	public List<Contact> allContacts () {
-		return this.contactController.allContacts();
-	}
-
 	@Override
 	public void copyContactToController (final Contact contact) {
 		// The contact instance must be valid
@@ -647,11 +638,6 @@ public class JobsAdminContactWebRequestBean implements JobsAdminContactWebReques
 		this.zipCode = zipCode;
 	}
 
-	@Override
-	public boolean hasContacts () {
-		return (!this.allContacts().isEmpty());
-	}
-
 	/**
 	 * Post-initialization of this class
 	 */
@@ -702,7 +688,7 @@ public class JobsAdminContactWebRequestBean implements JobsAdminContactWebReques
 		boolean IsFound = false;
 
 		// Get iterator
-		Iterator<Contact> iterator = this.allContacts().iterator();
+		Iterator<Contact> iterator = this.contactController.allContacts().iterator();
 
 		// Loop through all
 		while (iterator.hasNext()) {
diff --git a/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestController.java b/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestController.java
index 8c973157..eb7e0858 100644
--- a/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestController.java
+++ b/src/java/org/mxchange/jjobs/beans/contact/JobsAdminContactWebRequestController.java
@@ -18,7 +18,6 @@ package org.mxchange.jjobs.beans.contact;
 
 import java.io.Serializable;
 import java.util.Date;
-import java.util.List;
 import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jcontacts.contact.gender.Gender;
 import org.mxchange.jcountry.data.Country;
@@ -39,20 +38,6 @@ public interface JobsAdminContactWebRequestController extends Serializable {
 	 */
 	String addContact ();
 
-	/**
-	 * Returns a list of all found contacts
-	 * <p>
-	 * @return A list of all contacts.
-	 */
-	List<Contact> allContacts ();
-
-	/**
-	 * Checks whether there are contacts.
-	 * <p>
-	 * @return Whether contacts are there
-	 */
-	boolean hasContacts ();
-
 	/**
 	 * Creates an instance from contact data
 	 * <p>
diff --git a/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionBean.java b/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionBean.java
index d6227306..f49c764a 100644
--- a/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionBean.java
+++ b/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionBean.java
@@ -48,6 +48,7 @@ import org.mxchange.jphone.phonenumbers.landline.LandLineNumber;
 import org.mxchange.jphone.phonenumbers.mobileprovider.MobileProvider;
 import org.mxchange.jusercore.events.login.UserLoggedInEvent;
 import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
+import org.mxchange.jusercore.events.user.add.AdminAddedUserEvent;
 import org.mxchange.jusercore.exceptions.UserPasswordMismatchException;
 
 /**
@@ -204,9 +205,6 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 	 * Default constructor
 	 */
 	public JobsContactWebSessionBean () {
-		// Set gender to UNKNOWN
-		this.gender = Gender.UNKNOWN;
-
 		// Try it
 		try {
 			// Get initial context
@@ -226,6 +224,33 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 		this.emailAddressList.add(contactEmailAddress);
 	}
 
+	@Override
+	public void afterAdminAddedUserEvent (@Observes final AdminAddedUserEvent event) {
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterAdminAddedUserEvent: event={0} - CALLED!", event)); //NOI18N
+
+		// event should not be null
+		if (null == event) {
+			// Throw NPE
+			throw new NullPointerException("event is null"); //NOI18N
+		} else if (event.getAddedUser() == null) {
+			// Throw NPE again
+			throw new NullPointerException("event.addedUser is null"); //NOI18N
+		} else if (event.getAddedUser().getUserId() == null) {
+			// userId is null
+			throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
+		} else if (event.getAddedUser().getUserId() < 1) {
+			// Not avalid id
+			throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
+		}
+
+		// Clear all data
+		this.clear();
+
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println("UserWebBean:afterAdminAddedUserEvent: EXIT!"); //NOI18N
+	}
+
 	@Override
 	public void afterAdminUpdatedContactDataEvent (@Observes final AdminUpdatedContactEvent event) {
 		// Trace message
@@ -343,38 +368,16 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 		return this.contactList;
 	}
 
-	/**
-	 * Clears this bean
-	 */
-	@Override
-	public void clear () {
-		// Clear all data
-		// - personal data
-		this.setGender(Gender.UNKNOWN);
-		this.setFirstName(null);
-		this.setFamilyName(null);
-		this.setStreet(null);
-		this.setHouseNumber(null);
-		this.setZipCode(null);
-		this.setCity(null);
-		this.setCountry(null);
-
-		// - contact data
-		this.setEmailAddress(null);
-		this.setEmailAddressRepeat(null);
-		this.setPhoneAreaCode(null);
-		this.setCellphoneCarrier(null);
-		this.setFaxAreaCode(null);
-
-		// - other data
-		this.setBirthday(null);
-		this.setComment(null);
-	}
-
 	@Override
 	public Contact createContactInstance () {
 		// User message
-		//this.getLogger().logTrace("createContactInstance: CALLED!");
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createContactInstance: CALLED!", this.getClass().getSimpleName()));
+
+		// Is all required data set?
+		if (!this.isRequiredPersonalDataSet()) {
+			// No, then abort here
+			throw new FaceletException(new IllegalArgumentException("Not all personal data is set, but createContactInstance() is called.")); //NOI18N
+		}
 
 		// Required personal data must be set
 		assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
@@ -395,7 +398,11 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 		contact.setContactCity(this.getCity());
 		contact.setContactCountry(this.getCountry());
 		contact.setContactEmailAddress(this.getEmailAddress());
+		contact.setContactBirthday(this.getBirthday());
+		contact.setContactComment(this.getComment());
 
+		// Debug message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createContactInstance: this.emailAddress={1}", this.getClass().getSimpleName(), this.getEmailAddress()));
 		// Don't set null or wrong references
 		if ((phone instanceof DialableLandLineNumber) && (phone.getPhoneCountry() instanceof Country) && (this.getPhoneAreaCode() != null) && (this.getPhoneNumber() != null) && (this.getPhoneAreaCode() > 0) && (this.getPhoneNumber() > 0)) {
 			// Now the number must be given
@@ -453,9 +460,8 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 			contact.setContactCellphoneNumber(cellphone);
 		}
 
-		contact.setContactBirthday(this.getBirthday());
-		contact.setContactComment(this.getComment());
-
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createContactInstance: contact={1} - EXIT!", this.getClass().getSimpleName(), contact));
 		// Created timestamp and ownContact
 		contact.setContactOwnContact(Boolean.TRUE);
 
@@ -715,6 +721,11 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 		this.zipCode = zipCode;
 	}
 
+	@Override
+	public boolean hasContacts () {
+		return (!this.allContacts().isEmpty());
+	}
+
 	/**
 	 * Post-initialization of this class
 	 */
@@ -829,6 +840,33 @@ public class JobsContactWebSessionBean implements JobsContactWebSessionControlle
 		this.emailAddressList.add(contact.getContactEmailAddress());
 	}
 
+	/**
+	 * Clears this bean
+	 */
+	private void clear () {
+		// Clear all data
+		// - personal data
+		this.setGender(Gender.UNKNOWN);
+		this.setFirstName(null);
+		this.setFamilyName(null);
+		this.setStreet(null);
+		this.setHouseNumber(null);
+		this.setZipCode(null);
+		this.setCity(null);
+		this.setCountry(null);
+
+		// - contact data
+		this.setEmailAddress(null);
+		this.setEmailAddressRepeat(null);
+		this.setPhoneAreaCode(null);
+		this.setCellphoneCarrier(null);
+		this.setFaxAreaCode(null);
+
+		// - other data
+		this.setBirthday(null);
+		this.setComment(null);
+	}
+
 	/**
 	 * Copies given contact into the controller
 	 * <p>
diff --git a/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionController.java b/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionController.java
index 7b595fac..811e4db8 100644
--- a/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionController.java
+++ b/src/java/org/mxchange/jjobs/beans/contact/JobsContactWebSessionController.java
@@ -27,6 +27,7 @@ import org.mxchange.jcountry.data.Country;
 import org.mxchange.jphone.phonenumbers.mobileprovider.MobileProvider;
 import org.mxchange.jusercore.events.login.UserLoggedInEvent;
 import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
+import org.mxchange.jusercore.events.user.add.AdminAddedUserEvent;
 
 /**
  * An interface for user beans
@@ -47,6 +48,20 @@ public interface JobsContactWebSessionController extends Serializable {
 	 */
 	List<Contact> allContacts();
 
+	/**
+	 * Checks whether there are contacts.
+	 * <p>
+	 * @return Whether contacts are there
+	 */
+	boolean hasContacts ();
+
+	/**
+	 * Event observer for newly added users by adminstrator
+	 * <p>
+	 * @param event Event being fired
+	 */
+	void afterAdminAddedUserEvent (final AdminAddedUserEvent event);
+
 	/**
 	 * Updates all data from bean in given contact instance
 	 * <p>
@@ -73,11 +88,6 @@ public interface JobsContactWebSessionController extends Serializable {
 	 */
 	Contact lookupContactById (final Long contactId) throws ContactNotFoundException;
 
-	/**
-	 * Clears this controller
-	 */
-	void clear ();
-
 	/**
 	 * Event observer for new user registrations
 	 * <p>
diff --git a/src/java/org/mxchange/jjobs/beans/helper/JobsAdminWebRequestHelper.java b/src/java/org/mxchange/jjobs/beans/helper/JobsAdminWebRequestHelper.java
index 697e366e..e3ae2c7a 100644
--- a/src/java/org/mxchange/jjobs/beans/helper/JobsAdminWebRequestHelper.java
+++ b/src/java/org/mxchange/jjobs/beans/helper/JobsAdminWebRequestHelper.java
@@ -22,7 +22,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jjobs.beans.contact.JobsAdminContactWebRequestController;
-import org.mxchange.jjobs.beans.user.JobsAdminUserWebRequestController;
+import org.mxchange.jjobs.beans.user.JobsUserWebSessionController;
 import org.mxchange.jusercore.model.user.User;
 
 /**
@@ -40,17 +40,11 @@ public class JobsAdminWebRequestHelper implements JobsAdminWebRequestController
 	private static final long serialVersionUID = 17_258_793_567_145_701L;
 
 	/**
-	 * Administrative contact controller
+	 * Regular contact controller
 	 */
 	@Inject
 	private JobsAdminContactWebRequestController adminContactController;
 
-	/**
-	 * Administrative user controller
-	 */
-	@Inject
-	private JobsAdminUserWebRequestController adminUserController;
-
 	/**
 	 * Contact instance
 	 */
@@ -61,6 +55,12 @@ public class JobsAdminWebRequestHelper implements JobsAdminWebRequestController
 	 */
 	private User user;
 
+	/**
+	 * Regular user controller
+	 */
+	@Inject
+	private JobsUserWebSessionController userController;
+
 	/**
 	 * Default constructor
 	 */
@@ -109,7 +109,7 @@ public class JobsAdminWebRequestHelper implements JobsAdminWebRequestController
 		}
 
 		// Set all fields: user
-		this.adminUserController.setUserName(this.getUser().getUserName());
+		this.userController.setUserName(this.getUser().getUserName());
 
 		// Log message
 		//* NOISY-DEBUG: */ System.out.println("AdminHelper::copyUserToController - EXIT!"); //NOI18N
@@ -142,8 +142,8 @@ public class JobsAdminWebRequestHelper implements JobsAdminWebRequestController
 		// Default key is "unused"
 		String messageKey = "CONTACT_IS_UNUSED"; //NOI18N
 
-		// Check user/customer
-		boolean isUserContact = this.adminUserController.isContactFound(contact);
+		// Check user
+		boolean isUserContact = this.userController.isContactFound(contact);
 
 		// Check user first
 		if (isUserContact) {
diff --git a/src/java/org/mxchange/jjobs/beans/profile/JobsUserProfileWebRequestBean.java b/src/java/org/mxchange/jjobs/beans/profile/JobsUserProfileWebRequestBean.java
index 73527305..84c9cf6b 100644
--- a/src/java/org/mxchange/jjobs/beans/profile/JobsUserProfileWebRequestBean.java
+++ b/src/java/org/mxchange/jjobs/beans/profile/JobsUserProfileWebRequestBean.java
@@ -22,7 +22,6 @@ import javax.faces.view.facelets.FaceletException;
 import javax.inject.Inject;
 import javax.inject.Named;
 import org.mxchange.jjobs.beans.login.JobsUserLoginWebSessionController;
-import org.mxchange.jjobs.beans.user.JobsAdminUserWebRequestController;
 import org.mxchange.jjobs.beans.user.JobsUserWebSessionController;
 import org.mxchange.jusercore.exceptions.UserNotFoundException;
 import org.mxchange.jusercore.model.user.User;
@@ -42,12 +41,6 @@ public class JobsUserProfileWebRequestBean implements JobsUserProfileWebRequestC
 	 */
 	private static final long serialVersionUID = 187_687_145_286_710L;
 
-	/**
-	 * Administrative user controller
-	 */
-	@Inject
-	private JobsAdminUserWebRequestController adminUserController;
-
 	/**
 	 * User controller
 	 */
@@ -67,7 +60,7 @@ public class JobsUserProfileWebRequestBean implements JobsUserProfileWebRequestC
 
 		try {
 			// Try to get it
-			u = this.adminUserController.lookupUserById(userId);
+			u = this.userController.lookupUserById(userId);
 		} catch (final UserNotFoundException ex) {
 			// Throw again
 			throw new FaceletException(ex);
diff --git a/src/java/org/mxchange/jjobs/beans/register/JobsUserRegisterWebSessionBean.java b/src/java/org/mxchange/jjobs/beans/register/JobsUserRegisterWebSessionBean.java
index 8a8d9dbe..054ea6b2 100644
--- a/src/java/org/mxchange/jjobs/beans/register/JobsUserRegisterWebSessionBean.java
+++ b/src/java/org/mxchange/jjobs/beans/register/JobsUserRegisterWebSessionBean.java
@@ -111,7 +111,7 @@ public class JobsUserRegisterWebSessionBean implements JobsUserRegisterWebSessio
 		} else if (!this.userController.isRequiredPersonalDataSet()) {
 			// Not all required fields are set
 			throw new FaceletException("Not all required fields are set."); //NOI18N
-		} else if (this.adminUserController.isUserNameRegistered(user)) {
+		} else if (this.userController.isUserNameRegistered(user)) {
 			// User name is already used
 			throw new FaceletException(new UserNameAlreadyRegisteredException(user));
 		} else if (this.contactController.isEmailAddressRegistered(user.getUserContact())) {
@@ -138,6 +138,9 @@ public class JobsUserRegisterWebSessionBean implements JobsUserRegisterWebSessio
 			// Call bean
 			User registeredUser = this.registerBean.registerUser(user);
 
+			// The id number should be set
+			assert (registeredUser.getUserId() instanceof Long) : "registerUser.userId is null after registerUser() was called."; //NOI18N
+
 			// Fire event
 			this.registeredEvent.fire(new RegisteredUserEvent(registeredUser));
 
diff --git a/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestBean.java b/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestBean.java
index 0517694c..fbbb3374 100644
--- a/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestBean.java
+++ b/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestBean.java
@@ -17,9 +17,6 @@
 package org.mxchange.jjobs.beans.user;
 
 import java.text.MessageFormat;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Objects;
 import javax.annotation.PostConstruct;
 import javax.enterprise.context.RequestScoped;
@@ -37,16 +34,13 @@ import org.mxchange.jjobs.beans.contact.JobsContactWebSessionController;
 import org.mxchange.jjobs.beans.helper.JobsAdminWebRequestController;
 import org.mxchange.jjobs.beans.login.JobsUserLoginWebSessionController;
 import org.mxchange.jusercore.container.login.UserLoginContainer;
-import org.mxchange.jusercore.events.login.UserLoggedInEvent;
 import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
 import org.mxchange.jusercore.events.user.add.AdminAddedUserEvent;
 import org.mxchange.jusercore.events.user.add.AdminUserAddedEvent;
 import org.mxchange.jusercore.events.user.update.AdminUpdatedUserDataEvent;
 import org.mxchange.jusercore.events.user.update.AdminUserDataUpdatedEvent;
-import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
 import org.mxchange.jusercore.exceptions.EmailAddressAlreadyRegisteredException;
 import org.mxchange.jusercore.exceptions.UserNameAlreadyRegisteredException;
-import org.mxchange.jusercore.exceptions.UserNotFoundException;
 import org.mxchange.jusercore.exceptions.UserPasswordRepeatMismatchException;
 import org.mxchange.jusercore.model.user.LoginUser;
 import org.mxchange.jusercore.model.user.User;
@@ -88,11 +82,6 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 	@Inject
 	private JobsContactWebSessionController contactController;
 
-	/**
-	 * A list of all selectable contacts
-	 */
-	private List<Contact> selectableContacts;
-
 	/**
 	 * An event fired when the administrator has updated a new user
 	 */
@@ -111,11 +100,6 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 	@Inject
 	private JobsUserWebSessionController userController;
 
-	/**
-	 * A list of all user profiles
-	 */
-	private List<User> userList;
-
 	/**
 	 * Login bean (controller)
 	 */
@@ -127,11 +111,6 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 	 */
 	private String userName;
 
-	/**
-	 * User name list
-	 */
-	private List<String> userNameList;
-
 	/**
 	 * User password (unencrypted from web form)
 	 */
@@ -142,11 +121,6 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 	 */
 	private String userPasswordRepeat;
 
-	/**
-	 * A list of all public user profiles
-	 */
-	private List<User> visibleUserList;
-
 	/**
 	 * Default constructor
 	 */
@@ -227,7 +201,7 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 
 		// Is the user name or email address used already?
 		// @TODO Add password length check
-		if (this.isUserNameRegistered(user)) {
+		if (this.userController.isUserNameRegistered(user)) {
 			// User name is already used
 			throw new FaceletException(new UserNameAlreadyRegisteredException(user));
 		} else if ((this.adminHelper.getContact() == null) && (this.contactController.isEmailAddressRegistered(user.getUserContact()))) {
@@ -271,12 +245,6 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 		// Fire event
 		this.addedUserEvent.fire(new AdminUserAddedEvent(updatedUser));
 
-		// Add user to local list
-		this.userList.add(updatedUser);
-
-		// Clear contact instance
-		this.contactController.clear();
-
 		// Return to user list (for now)
 		return "admin_list_user"; //NOI18N
 	}
@@ -306,85 +274,14 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 
 		// Debug message
 		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterRegistration: registeredUser={0}", registeredUser)); //NOI18N
-		// Add user name
-		this.addUserName(registeredUser);
 
 		// Clear all data
 		this.clear();
 
-		// Add user to local list
-		this.userList.add(registeredUser);
-
-		// Is the account public?
-		if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
-			// Also add it to this list
-			this.visibleUserList.add(registeredUser);
-		}
-
 		// Trace message
 		//* NOISY-DEBUG: */ System.out.println("UserWebBean:afterRegistration: EXIT!"); //NOI18N
 	}
 
-	@Override
-	public void afterUserLogin (final @Observes UserLoggedInEvent event) {
-		// Trace message
-		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterUserLogin: event={0} - CALLED!", event)); //NOI18N
-
-		// event should not be null
-		if (null == event) {
-			// Throw NPE
-			throw new NullPointerException("event is null"); //NOI18N
-		} else if (event.getLoggedInUser() == null) {
-			// Throw NPE again
-			throw new NullPointerException("event.user is null"); //NOI18N
-		} else if (event.getLoggedInUser().getUserId() == null) {
-			// userId is null
-			throw new NullPointerException("event.user.userId is null"); //NOI18N
-		} else if (event.getLoggedInUser().getUserId() < 1) {
-			// Not avalid id
-			throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
-		}
-
-		// Re-initialize list
-		this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
-
-		// Trace message
-		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterUserLogin: this.visibleUserList.size()={0} - EXIT!", this.visibleUserList.size())); //NOI18N
-	}
-
-	@Override
-	public void afterUserUpdatedPersonalData (@Observes final UpdatedUserPersonalDataEvent event) {
-		// Check parameter
-		if (null == event) {
-			// Throw NPE
-			throw new NullPointerException("event is null"); //NOI18N
-		} else if (event.getUpdatedUser() == null) {
-			// Throw NPE again
-			throw new NullPointerException("event.updatedUser is null"); //NOI18N
-		} else if (event.getUpdatedUser().getUserId() == null) {
-			// ... and again
-			throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
-		} else if (event.getUpdatedUser().getUserId() < 1) {
-			// Invalid value
-			throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
-		}
-
-		// All fine, so update list
-		this.updateList(event.getUpdatedUser());
-	}
-
-	@Override
-	public List<User> allUsers () {
-		// Return it
-		return Collections.unmodifiableList(this.userList);
-	}
-
-	@Override
-	public List<User> allVisibleUsers () {
-		// Return it
-		return Collections.unmodifiableList(this.visibleUserList);
-	}
-
 	@Override
 	public String editUserData () {
 		// Get user instance
@@ -442,9 +339,6 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 		// Call EJB for updating user data
 		User updatedUser = this.userBean.updateUserData(user);
 
-		// Update list
-		this.updateList(updatedUser);
-
 		// Fire event
 		this.updatedUserDataEvent.fire(new AdminUserDataUpdatedEvent(updatedUser));
 
@@ -482,173 +376,11 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 		this.userPasswordRepeat = userPasswordRepeat;
 	}
 
-	@Override
-	public boolean hasUsers () {
-		return (!this.allUsers().isEmpty());
-	}
-
 	/**
 	 * Post-initialization of this class
 	 */
 	@PostConstruct
 	public void init () {
-		// Initialize user list
-		this.userList = this.userBean.allUsers();
-
-		// Get full user name list for reducing EJB calls
-		this.userNameList = this.userBean.getUserNameList();
-
-		// Is the user logged-in?
-		if (this.userLoginController.isUserLoggedIn()) {
-			// Is logged-in, so load also users visible to memebers
-			this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
-		} else {
-			// Initialize user list
-			this.visibleUserList = this.userBean.allPublicUsers();
-		}
-
-		// Get all users
-		List<User> allUsers = this.allUsers();
-
-		// Get all contacts
-		List<Contact> allContacts = this.contactController.allContacts();
-
-		// Get iterator
-		Iterator<Contact> iterator = allContacts.iterator();
-
-		// Loop through it
-		while (iterator.hasNext()) {
-			// Get next element
-			Contact next = iterator.next();
-
-			// Get iterator
-			Iterator<User> userIterator = allUsers.iterator();
-
-			// Loop through all users
-			while (userIterator.hasNext()) {
-				// Get user instance
-				User nextUser = userIterator.next();
-
-				// Is contact same?
-				if (Objects.equals(next, nextUser.getUserContact())) {
-					// Found same
-					iterator.remove();
-					break;
-				}
-			}
-		}
-
-		// Set contact list
-		this.selectableContacts = allContacts;
-	}
-
-	@Override
-	public boolean isContactFound (final Contact contact) {
-		// The contact must be valid
-		if (null == contact) {
-			// Throw NPE
-			throw new NullPointerException("contact is null"); //NOI18N
-		} else if (contact.getContactId() == null) {
-			// Throw again ...
-			throw new NullPointerException("contact.contactId is null"); //NOI18N
-		} else if (contact.getContactId() < 1) {
-			// Not valid
-			throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
-		}
-
-		// Default is not found
-		boolean isFound = false;
-
-		// Get iterator
-		Iterator<User> iterator = this.allUsers().iterator();
-
-		// Loop through all entries
-		while (iterator.hasNext()) {
-			// Get user
-			User next = iterator.next();
-
-			// Compare both objects
-			if (Objects.equals(contact, next.getUserContact())) {
-				// Found it
-				isFound = true;
-				break;
-			}
-		}
-
-		// Return status
-		return isFound;
-	}
-
-	@Override
-	public boolean isUserNameRegistered (final User user) {
-		return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
-	}
-
-	@Override
-	public boolean isVisibleUserFound () {
-		return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
-	}
-
-	@Override
-	public User lookupUserById (final Long userId) throws UserNotFoundException {
-		// Parameter must be valid
-		if (null == userId) {
-			// Throw NPE
-			throw new NullPointerException("userId is null"); //NOI18N
-		} else if (userId < 1) {
-			// Not valid
-			throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
-		}
-
-		// Init variable
-		User user = null;
-
-		// Try to lookup it in visible user list
-		for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
-			// Get next user
-			User next = iterator.next();
-
-			// Is the user id found?
-			if (Objects.equals(next.getUserId(), userId)) {
-				// Copy to other variable
-				user = next;
-				break;
-			}
-		}
-
-		// Is it still null?
-		if (null == user) {
-			// Not visible for the current user
-			throw new UserNotFoundException(userId);
-		}
-
-		// Return it
-		return user;
-	}
-
-	@Override
-	public List<Contact> selectableContacts () {
-		return Collections.unmodifiableList(this.selectableContacts);
-	}
-
-	/**
-	 * Adds user's name to bean's internal list. It also updates the public user
-	 * list if the user has decided to have a public account,
-	 * <p>
-	 * @param user User instance
-	 */
-	private void addUserName (final User user) {
-		// Make sure the entry is not added yet
-		if (this.userNameList.contains(user.getUserName())) {
-			// Abort here
-			throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
-		} else if (this.contactController.isEmailAddressRegistered(user.getUserContact())) {
-			// Already added
-			throw new IllegalArgumentException(MessageFormat.format("Email address {0} already added.", user.getUserContact().getContactEmailAddress())); //NOI18N
-		}
-
-		// Add user name
-		this.userNameList.add(user.getUserName());
 	}
 
 	/**
@@ -671,42 +403,4 @@ public class JobsAdminUserWebRequestBean implements JobsAdminUserWebRequestContr
 		return ((!this.getUserPassword().isEmpty()) && (Objects.equals(this.getUserPassword(), this.getUserPasswordRepeat())));
 	}
 
-	/**
-	 * Updates list with given user instance
-	 * <p>
-	 * @param user User instance
-	 */
-	private void updateList (final User user) {
-		// The user should be valid
-		if (null == user) {
-			// Throw NPE
-			throw new NullPointerException("user is null"); //NOI18N
-		} else if (user.getUserId() == null) {
-			// ... again NPE
-			throw new NullPointerException("user.userId is null"); //NOI18N
-		} else if (user.getUserId() < 1) {
-			// Invalid id
-			throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
-		}
-
-		// Get iterator
-		Iterator<User> iterator = this.userList.iterator();
-
-		// Look whole list
-		while (iterator.hasNext()) {
-			// Get next element
-			User next = iterator.next();
-
-			// Is the same user id?
-			if (Objects.equals(user.getUserId(), next.getUserId())) {
-				// Found it, so remove it
-				this.userList.remove(next);
-				break;
-			}
-		}
-
-		// Re-add item
-		this.userList.add(user);
-	}
-
 }
diff --git a/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestController.java b/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestController.java
index 92823501..a968ae85 100644
--- a/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestController.java
+++ b/src/java/org/mxchange/jjobs/beans/user/JobsAdminUserWebRequestController.java
@@ -17,13 +17,7 @@
 package org.mxchange.jjobs.beans.user;
 
 import java.io.Serializable;
-import java.util.List;
-import org.mxchange.jcontacts.contact.Contact;
-import org.mxchange.jusercore.events.login.UserLoggedInEvent;
 import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
-import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
-import org.mxchange.jusercore.exceptions.UserNotFoundException;
-import org.mxchange.jusercore.model.user.User;
 
 /**
  * An interface for user beans
@@ -39,79 +33,6 @@ public interface JobsAdminUserWebRequestController extends Serializable {
 	 */
 	void afterRegistrationEvent (final UserRegisteredEvent event);
 
-	/**
-	 * Event observer for logged-in user
-	 * <p>
-	 * @param event Event instance
-	 */
-	void afterUserLogin (final UserLoggedInEvent event);
-
-	/**
-	 * Listens to fired event when user updated personal data
-	 * <p>
-	 * @param event Event being fired
-	 */
-	void afterUserUpdatedPersonalData (final UpdatedUserPersonalDataEvent event);
-
-	/**
-	 * Checks whether the given contact is a user
-	 * <p>
-	 * @param contact Contact to check
-	 * <p>
-	 * @return Whether the contact is a user
-	 */
-	boolean isContactFound (final Contact contact);
-
-	/**
-	 * Checks whether a public user account is registered. This means that at
-	 * least one user profile has its flag "public user profile" enabled.
-	 * <p>
-	 * @return Whether at least one user has a public profile
-	 */
-	boolean isVisibleUserFound ();
-
-	/**
-	 * Checks whether given user instance's name is used
-	 * <p>
-	 * @param user User instance's name to check
-	 * <p>
-	 * @return Whether it is already used
-	 */
-	boolean isUserNameRegistered (final User user);
-
-	/**
-	 * Tries to lookup user by given id number. If the user is not found or the
-	 * account status is not CONFIRMED proper exceptions are thrown.
-	 * <p>
-	 * @param userId User id
-	 * <p>
-	 * @return User instance
-	 * <p>
-	 * @throws UserNotFoundException If the user is not found
-	 */
-	User lookupUserById (final Long userId) throws UserNotFoundException;
-
-	/**
-	 * All users
-	 * <p>
-	 * @return A list of all public user profiles
-	 */
-	List<User> allUsers ();
-
-	/**
-	 * All public user profiles
-	 * <p>
-	 * @return A list of all public user profiles
-	 */
-	List<User> allVisibleUsers ();
-
-	/**
-	 * Checks whether users are registered
-	 * <p>
-	 * @return Whether users are registered
-	 */
-	boolean hasUsers ();
-
 	/**
 	 * Adds user instance to database by preparing a complete user instance and
 	 * sending it to the EJB. The data set in the controller is being verified,
@@ -170,12 +91,4 @@ public interface JobsAdminUserWebRequestController extends Serializable {
 	 */
 	void setUserPasswordRepeat (final String userPasswordRepeat);
 
-	/**
-	 * Returns a list of all selectable contacts for user creation. Contacts
-	 * from already existing users are excluded in this list.
-	 * <p>
-	 * @return A list of all selectable contacts
-	 */
-	List<Contact> selectableContacts ();
-
 }
diff --git a/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionBean.java b/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionBean.java
index eafd48d3..4318d410 100644
--- a/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionBean.java
+++ b/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionBean.java
@@ -17,6 +17,7 @@
 package org.mxchange.jjobs.beans.user;
 
 import java.text.MessageFormat;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
@@ -39,6 +40,8 @@ import org.mxchange.jphone.phonenumbers.fax.DialableFaxNumber;
 import org.mxchange.jphone.phonenumbers.landline.DialableLandLineNumber;
 import org.mxchange.jusercore.events.login.UserLoggedInEvent;
 import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
+import org.mxchange.jusercore.events.user.add.AdminAddedUserEvent;
+import org.mxchange.jusercore.events.user.update.AdminUpdatedUserDataEvent;
 import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
 import org.mxchange.jusercore.events.user.update.UserUpdatedPersonalDataEvent;
 import org.mxchange.jusercore.exceptions.UserNotFoundException;
@@ -68,6 +71,11 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 	@Inject
 	private JobsContactWebSessionController contactController;
 
+	/**
+	 * A list of all selectable contacts
+	 */
+	private List<Contact> selectableContacts;
+
 	/**
 	 * Event being fired when user updated personal data
 	 */
@@ -85,6 +93,11 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 	 */
 	private Long userId;
 
+	/**
+	 * A list of all user profiles
+	 */
+	private List<User> userList;
+
 	/**
 	 * Login bean (controller)
 	 */
@@ -96,6 +109,11 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 	 */
 	private String userName;
 
+	/**
+	 * User name list
+	 */
+	private List<String> userNameList;
+
 	/**
 	 * User password (unencrypted from web form)
 	 */
@@ -133,6 +151,69 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		}
 	}
 
+	@Override
+	public void afterAdminAddedUserEvent (@Observes final AdminAddedUserEvent event) {
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterAdminAddedUserEvent: event={0} - CALLED!", event)); //NOI18N
+
+		// event should not be null
+		if (null == event) {
+			// Throw NPE
+			throw new NullPointerException("event is null"); //NOI18N
+		} else if (event.getAddedUser() == null) {
+			// Throw NPE again
+			throw new NullPointerException("event.addedUser is null"); //NOI18N
+		} else if (event.getAddedUser().getUserId() == null) {
+			// userId is null
+			throw new NullPointerException("event.addedUser.userId is null"); //NOI18N
+		} else if (event.getAddedUser().getUserId() < 1) {
+			// Not avalid id
+			throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getAddedUser(), event.getAddedUser().getUserId())); //NOI18N
+		}
+
+		// Add user to local list
+		this.userList.add(event.getAddedUser());
+
+		// Clear all data
+		this.clear();
+
+		// Set user id again
+		this.setUserId(event.getAddedUser().getUserId());
+
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println("UserWebBean:afterAdminAddedUserEvent: EXIT!"); //NOI18N
+	}
+
+	@Override
+	public void afterAdminUpdatedUserDataEvent (@Observes final AdminUpdatedUserDataEvent event) {
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterAdminUpdatedUserEvent: event={0} - CALLED!", event)); //NOI18N
+
+		// event should not be null
+		if (null == event) {
+			// Throw NPE
+			throw new NullPointerException("event is null"); //NOI18N
+		} else if (event.getUpdatedUser() == null) {
+			// Throw NPE again
+			throw new NullPointerException("event.updatedUser is null"); //NOI18N
+		} else if (event.getUpdatedUser().getUserId() == null) {
+			// userId is null
+			throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
+		} else if (event.getUpdatedUser().getUserId() < 1) {
+			// Not avalid id
+			throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getUpdatedUser(), event.getUpdatedUser().getUserId())); //NOI18N
+		}
+
+		// Update list
+		this.updateList(event.getUpdatedUser());
+
+		// Clear all data
+		this.clear();
+
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println("UserWebBean:afterAdminUpdatedUserEvent: EXIT!"); //NOI18N
+	}
+
 	@Override
 	public void afterRegistrationEvent (@Observes final UserRegisteredEvent event) {
 		// Trace message
@@ -144,10 +225,10 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 			throw new NullPointerException("event is null"); //NOI18N
 		} else if (event.getRegisteredUser() == null) {
 			// Throw NPE again
-			throw new NullPointerException("event.user is null"); //NOI18N
+			throw new NullPointerException("event.registeredUser is null"); //NOI18N
 		} else if (event.getRegisteredUser().getUserId() == null) {
 			// userId is null
-			throw new NullPointerException("event.user.userId is null"); //NOI18N
+			throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
 		} else if (event.getRegisteredUser().getUserId() < 1) {
 			// Not avalid id
 			throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getRegisteredUser(), event.getRegisteredUser().getUserId())); //NOI18N
@@ -165,6 +246,18 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		// Clear all data
 		this.clear();
 
+		// Add user to local list
+		this.userList.add(registeredUser);
+
+		// Add user name
+		this.addUserName(registeredUser);
+
+		// Is the account public?
+		if (Objects.equals(registeredUser.getUserProfileMode(), ProfileMode.PUBLIC)) {
+			// Also add it to this list
+			this.visibleUserList.add(registeredUser);
+		}
+
 		// Set user id again
 		this.setUserId(registeredUser.getUserId());
 
@@ -183,10 +276,10 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 			throw new NullPointerException("event is null"); //NOI18N
 		} else if (event.getLoggedInUser() == null) {
 			// Throw NPE again
-			throw new NullPointerException("event.user is null"); //NOI18N
+			throw new NullPointerException("event.registeredUser is null"); //NOI18N
 		} else if (event.getLoggedInUser().getUserId() == null) {
 			// userId is null
-			throw new NullPointerException("event.user.userId is null"); //NOI18N
+			throw new NullPointerException("event.registeredUser.userId is null"); //NOI18N
 		} else if (event.getLoggedInUser().getUserId() < 1) {
 			// Not avalid id
 			throw new IllegalArgumentException(MessageFormat.format("userId of user={0} is not valid: {1}", event.getLoggedInUser(), event.getLoggedInUser().getUserId())); //NOI18N
@@ -195,14 +288,50 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		// Copy all data to this bean
 		this.copyUser(event.getLoggedInUser());
 
+		// Re-initialize list
+		this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
+
 		// Trace message
 		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterUserLogin: this.visibleUserList.size()={0} - EXIT!", this.visibleUserList.size())); //NOI18N
 	}
 
+	@Override
+	public void afterUserUpdatedPersonalData (@Observes final UpdatedUserPersonalDataEvent event) {
+		// Check parameter
+		if (null == event) {
+			// Throw NPE
+			throw new NullPointerException("event is null"); //NOI18N
+		} else if (event.getUpdatedUser() == null) {
+			// Throw NPE again
+			throw new NullPointerException("event.updatedUser is null"); //NOI18N
+		} else if (event.getUpdatedUser().getUserId() == null) {
+			// ... and again
+			throw new NullPointerException("event.updatedUser.userId is null"); //NOI18N
+		} else if (event.getUpdatedUser().getUserId() < 1) {
+			// Invalid value
+			throw new IllegalArgumentException(MessageFormat.format("event.updatedUser.userId={0} is in valid", event.getUpdatedUser().getUserId())); //NOI18N
+		}
+
+		// All fine, so update list
+		this.updateList(event.getUpdatedUser());
+	}
+
+	@Override
+	public List<User> allUsers () {
+		// Return it
+		return Collections.unmodifiableList(this.userList);
+	}
+
+	@Override
+	public List<User> allVisibleUsers () {
+		// Return it
+		return Collections.unmodifiableList(this.visibleUserList);
+	}
+
 	@Override
 	public User createUserInstance () {
-		// User message
-		//this.getLogger().logTrace("createUserInstance: CALLED!");
+		// Trace message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: CALLED!", this.getClass().getSimpleName()));
 
 		// Required personal data must be set
 		assert (this.isRequiredPersonalDataSet()) : "not all personal data is set"; //NOI18N
@@ -217,11 +346,15 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		// Create contact instance
 		Contact contact = this.contactController.createContactInstance();
 
+		// Debug message
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: contact={1}", this.getClass().getSimpleName(), contact));
+
 		// Set contact in user
 		localUser.setUserContact(contact);
 
 		// Trace message
-		//this.getLogger().logTrace(MessageFormat.format("createUserInstance: user={0} - EXIT!", user));
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("{0}.createUserInstance: user={1} - EXIT!", this.getClass().getSimpleName(), user));
+
 		// Return it
 		return localUser;
 	}
@@ -317,11 +450,101 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		this.userProfileMode = userProfileMode;
 	}
 
+	@Override
+	public boolean hasUsers () {
+		return (!this.allUsers().isEmpty());
+	}
+
 	/**
 	 * Post-initialization of this class
 	 */
 	@PostConstruct
 	public void init () {
+		// Initialize user list
+		this.userList = this.userBean.allUsers();
+
+		// Get full user name list for reducing EJB calls
+		this.userNameList = this.userBean.getUserNameList();
+
+		// Is the user logged-in?
+		if (this.userLoginController.isUserLoggedIn()) {
+			// Is logged-in, so load also users visible to memebers
+			this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
+		} else {
+			// Initialize user list
+			this.visibleUserList = this.userBean.allPublicUsers();
+		}
+
+		// Get all users
+		List<User> allUsers = this.allUsers();
+
+		// Get all contacts
+		List<Contact> allContacts = this.contactController.allContacts();
+
+		// Get iterator
+		Iterator<Contact> iterator = allContacts.iterator();
+
+		// Loop through it
+		while (iterator.hasNext()) {
+			// Get next element
+			Contact next = iterator.next();
+
+			// Get iterator
+			Iterator<User> userIterator = allUsers.iterator();
+
+			// Loop through all users
+			while (userIterator.hasNext()) {
+				// Get user instance
+				User nextUser = userIterator.next();
+
+				// Is contact same?
+				if (Objects.equals(next, nextUser.getUserContact())) {
+					// Found same
+					iterator.remove();
+					break;
+				}
+			}
+		}
+
+		// Set contact list
+		this.selectableContacts = allContacts;
+	}
+
+	@Override
+	public boolean isContactFound (final Contact contact) {
+		// The contact must be valid
+		if (null == contact) {
+			// Throw NPE
+			throw new NullPointerException("contact is null"); //NOI18N
+		} else if (contact.getContactId() == null) {
+			// Throw again ...
+			throw new NullPointerException("contact.contactId is null"); //NOI18N
+		} else if (contact.getContactId() < 1) {
+			// Not valid
+			throw new IllegalArgumentException(MessageFormat.format("contact.contactId={0} is not valid", contact.getContactId())); //NOI18N
+		}
+
+		// Default is not found
+		boolean isFound = false;
+
+		// Get iterator
+		Iterator<User> iterator = this.allUsers().iterator();
+
+		// Loop through all entries
+		while (iterator.hasNext()) {
+			// Get user
+			User next = iterator.next();
+
+			// Compare both objects
+			if (Objects.equals(contact, next.getUserContact())) {
+				// Found it
+				isFound = true;
+				break;
+			}
+		}
+
+		// Return status
+		return isFound;
 	}
 
 	@Override
@@ -350,38 +573,76 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		return ((this.getUserId() == null) || (this.getUserId() == 0));
 	}
 
+	@Override
+	public boolean isUserNameRegistered (final User user) {
+		return ((this.userNameList instanceof List) && (this.userNameList.contains(user.getUserName())));
+	}
+
+	@Override
+	public boolean isVisibleUserFound () {
+		return ((this.visibleUserList instanceof List) && (this.visibleUserList.size() > 0));
+	}
+
 	@Override
 	public User lookupUserById (final Long userId) throws UserNotFoundException {
-		// Init variable
-		User localUser = null;
+		// Parameter must be valid
+		if (null == userId) {
+			// Throw NPE
+			throw new NullPointerException("userId is null"); //NOI18N
+		} else if (userId < 1) {
+			// Not valid
+			throw new IllegalArgumentException(MessageFormat.format("userId={0} is not valid.", userId)); //NOI18N
+		}
 
-		// Clear this bean
-		this.clear();
+		// Init variable
+		User user = null;
 
 		// Try to lookup it in visible user list
-		for (final Iterator<User> iterator = this.visibleUserList.iterator(); iterator.hasNext();) {
+		for (final Iterator<User> iterator = this.userList.iterator(); iterator.hasNext();) {
 			// Get next user
 			User next = iterator.next();
 
 			// Is the user id found?
 			if (Objects.equals(next.getUserId(), userId)) {
 				// Copy to other variable
-				localUser = next;
+				user = next;
 				break;
 			}
 		}
 
 		// Is it still null?
-		if (null == localUser) {
+		if (null == user) {
 			// Not visible for the current user
 			throw new UserNotFoundException(userId);
 		}
 
-		// Copy all data to this bean
-		this.copyUser(localUser);
-
 		// Return it
-		return localUser;
+		return user;
+	}
+
+	@Override
+	public List<Contact> selectableContacts () {
+		return Collections.unmodifiableList(this.selectableContacts);
+	}
+
+	/**
+	 * Adds user's name to bean's internal list. It also updates the public user
+	 * list if the user has decided to have a public account,
+	 * <p>
+	 * @param user User instance
+	 */
+	private void addUserName (final User user) {
+		// Make sure the entry is not added yet
+		if (this.userNameList.contains(user.getUserName())) {
+			// Abort here
+			throw new IllegalArgumentException(MessageFormat.format("User name {0} already added.", user.getUserName())); //NOI18N
+		} else if (this.contactController.isEmailAddressRegistered(user.getUserContact())) {
+			// Already added
+			throw new IllegalArgumentException(MessageFormat.format("Email address {0} already added.", user.getUserContact().getContactEmailAddress())); //NOI18N
+		}
+
+		// Add user name
+		this.userNameList.add(user.getUserName());
 	}
 
 	/**
@@ -416,4 +677,42 @@ public class JobsUserWebSessionBean implements JobsUserWebSessionController {
 		DialableLandLineNumber phone = user.getUserContact().getContactLandLineNumber();
 	}
 
+	/**
+	 * Updates list with given user instance
+	 * <p>
+	 * @param user User instance
+	 */
+	private void updateList (final User user) {
+		// The user should be valid
+		if (null == user) {
+			// Throw NPE
+			throw new NullPointerException("user is null"); //NOI18N
+		} else if (user.getUserId() == null) {
+			// ... again NPE
+			throw new NullPointerException("user.userId is null"); //NOI18N
+		} else if (user.getUserId() < 1) {
+			// Invalid id
+			throw new IllegalArgumentException(MessageFormat.format("user.userId={0} is invalid", user.getUserId())); //NOI18N
+		}
+
+		// Get iterator
+		Iterator<User> iterator = this.userList.iterator();
+
+		// Look whole list
+		while (iterator.hasNext()) {
+			// Get next element
+			User next = iterator.next();
+
+			// Is the same user id?
+			if (Objects.equals(user.getUserId(), next.getUserId())) {
+				// Found it, so remove it
+				this.userList.remove(next);
+				break;
+			}
+		}
+
+		// Re-add item
+		this.userList.add(user);
+	}
+
 }
diff --git a/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionController.java b/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionController.java
index d905ce5e..cbce3c01 100644
--- a/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionController.java
+++ b/src/java/org/mxchange/jjobs/beans/user/JobsUserWebSessionController.java
@@ -17,8 +17,13 @@
 package org.mxchange.jjobs.beans.user;
 
 import java.io.Serializable;
+import java.util.List;
+import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jusercore.events.login.UserLoggedInEvent;
 import org.mxchange.jusercore.events.registration.UserRegisteredEvent;
+import org.mxchange.jusercore.events.user.add.AdminAddedUserEvent;
+import org.mxchange.jusercore.events.user.update.AdminUpdatedUserDataEvent;
+import org.mxchange.jusercore.events.user.update.UpdatedUserPersonalDataEvent;
 import org.mxchange.jusercore.exceptions.UserNotFoundException;
 import org.mxchange.jusercore.model.user.User;
 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
@@ -36,16 +41,25 @@ public interface JobsUserWebSessionController extends Serializable {
 	public static final Integer MINIMUM_PASSWORD_LENGTH = 5;
 
 	/**
-	 * Tries to lookup user by given id number. If the user is not found or the
-	 * account status is not CONFIRMED proper exceptions are thrown.
+	 * Event observer for newly added users by adminstrator
 	 * <p>
-	 * @param userId User id
+	 * @param event Event being fired
+	 */
+	void afterAdminAddedUserEvent (final AdminAddedUserEvent event);
+
+	/**
+	 * Event observer for updated user data by administrator
 	 * <p>
-	 * @return User instance
+	 * @param event Event being updated
+	 */
+	void afterAdminUpdatedUserDataEvent (final AdminUpdatedUserDataEvent event);
+
+	/**
+	 * Listens to fired event when user updated personal data
 	 * <p>
-	 * @throws UserNotFoundException If the user is not found
+	 * @param event Event being fired
 	 */
-	User lookupUserById (final Long userId) throws UserNotFoundException;
+	void afterUserUpdatedPersonalData (final UpdatedUserPersonalDataEvent event);
 
 	/**
 	 * Event observer for new user registrations
@@ -61,6 +75,73 @@ public interface JobsUserWebSessionController extends Serializable {
 	 */
 	void afterUserLogin (final UserLoggedInEvent event);
 
+	/**
+	 * All users
+	 * <p>
+	 * @return A list of all public user profiles
+	 */
+	List<User> allUsers ();
+
+	/**
+	 * All public user profiles
+	 * <p>
+	 * @return A list of all public user profiles
+	 */
+	List<User> allVisibleUsers ();
+
+	/**
+	 * Checks whether users are registered
+	 * <p>
+	 * @return Whether users are registered
+	 */
+	boolean hasUsers ();
+
+	/**
+	 * Checks whether the given contact is a user
+	 * <p>
+	 * @param contact Contact to check
+	 * <p>
+	 * @return Whether the contact is a user
+	 */
+	boolean isContactFound (final Contact contact);
+
+	/**
+	 * Checks whether a public user account is registered. This means that at
+	 * least one user profile has its flag "public user profile" enabled.
+	 * <p>
+	 * @return Whether at least one user has a public profile
+	 */
+	boolean isVisibleUserFound ();
+
+	/**
+	 * Checks whether given user instance's name is used
+	 * <p>
+	 * @param user User instance's name to check
+	 * <p>
+	 * @return Whether it is already used
+	 */
+	boolean isUserNameRegistered (final User user);
+
+	/**
+	 * Tries to lookup user by given id number. If the user is not found or the
+	 * account status is not CONFIRMED proper exceptions are thrown.
+	 * <p>
+	 * @param userId User id
+	 * <p>
+	 * @return User instance
+	 * <p>
+	 * @throws UserNotFoundException If the user is not found
+	 */
+	User lookupUserById (final Long userId) throws UserNotFoundException;
+
+	/**
+	 * Returns a list of all selectable contacts for user creation. Contacts
+	 * from already existing users are excluded in this list.
+	 * <p>
+	 * @return A list of all selectable contacts
+	 */
+	List<Contact> selectableContacts ();
+
 	/**
 	 * Creates an instance from all properties
 	 * <p>
diff --git a/web/admin/contact/admin_contact_list.xhtml b/web/admin/contact/admin_contact_list.xhtml
index 6961c715..98821772 100644
--- a/web/admin/contact/admin_contact_list.xhtml
+++ b/web/admin/contact/admin_contact_list.xhtml
@@ -16,7 +16,7 @@
 		</ui:define>
 
 		<ui:define name="content">
-			<h:dataTable id="table_list_contacts" var="contact" value="#{adminContactController.allContacts()}" styleClass="table_big" headerClass="table_header_column" summary="#{msg.TABLE_SUMMARY_ADMIN_LIST_CONTACT}" rendered="#{adminContactController.hasContacts()}">
+			<h:dataTable id="table_list_contacts" var="contact" value="#{contactController.allContacts()}" styleClass="table_big" headerClass="table_header_column" summary="#{msg.TABLE_SUMMARY_ADMIN_LIST_CONTACT}" rendered="#{contactController.hasContacts()}">
 				<h:column>
 					<f:facet name="header">#{msg.ADMIN_CONTACT_ID}</f:facet>
 
diff --git a/web/admin/user/admin_user_list.xhtml b/web/admin/user/admin_user_list.xhtml
index b6f7de2a..39d2609b 100644
--- a/web/admin/user/admin_user_list.xhtml
+++ b/web/admin/user/admin_user_list.xhtml
@@ -16,7 +16,7 @@
 		</ui:define>
 
 		<ui:define name="content">
-			<h:dataTable id="table_list_users" var="user" value="#{adminUserController.allUsers()}" styleClass="table_big" headerClass="table_header_column" summary="#{msg.TABLE_SUMMARY_ADMIN_LIST_USERS}" rendered="#{adminUserController.hasUsers()}">
+			<h:dataTable id="table_list_users" var="user" value="#{userController.allUsers()}" styleClass="table_big" headerClass="table_header_column" summary="#{msg.TABLE_SUMMARY_ADMIN_LIST_USERS}" rendered="#{userController.hasUsers()}">
 				<h:column>
 					<f:facet name="header">#{msg.ADMIN_USER_ID}</f:facet>
 
-- 
2.39.5