From: Roland Häder <roland@mxchange.org>
Date: Fri, 6 May 2016 10:27:44 +0000 (+0200)
Subject: No, putting these methods into admin (request-scoped) controller is not good as no... 
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=689450faac9a73646d7ded0b3995e696467ee457;p=addressbook-war.git

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.

Signed-off-by: Roland Häder <roland@mxchange.org>
---

diff --git a/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestBean.java b/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestBean.java
index 6b77e0c1..bb46862f 100644
--- a/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestBean.java
+++ b/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestBean.java
@@ -19,7 +19,6 @@ package org.mxchange.addressbook.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 AddressbookAdminContactWebRequestBean implements AddressbookAdminCo
 	 * Default constructor
 	 */
 	public AddressbookAdminContactWebRequestBean () {
-		// Set gender to UNKNOWN
-		this.gender = Gender.UNKNOWN;
-
 		// Try it
 		try {
 			// Get initial context
@@ -293,11 +289,6 @@ public class AddressbookAdminContactWebRequestBean implements AddressbookAdminCo
 		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 AddressbookAdminContactWebRequestBean implements AddressbookAdminCo
 		this.zipCode = zipCode;
 	}
 
-	@Override
-	public boolean hasContacts () {
-		return (!this.allContacts().isEmpty());
-	}
-
 	/**
 	 * Post-initialization of this class
 	 */
@@ -702,7 +688,7 @@ public class AddressbookAdminContactWebRequestBean implements AddressbookAdminCo
 		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/addressbook/beans/contact/AddressbookAdminContactWebRequestController.java b/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestController.java
index 4719ac8b..17da4a01 100644
--- a/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestController.java
+++ b/src/java/org/mxchange/addressbook/beans/contact/AddressbookAdminContactWebRequestController.java
@@ -18,7 +18,6 @@ package org.mxchange.addressbook.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 AddressbookAdminContactWebRequestController extends Serializabl
 	 */
 	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/addressbook/beans/contact/AddressbookContactWebSessionBean.java b/src/java/org/mxchange/addressbook/beans/contact/AddressbookContactWebSessionBean.java
index 4923262b..e5e360ef 100644
--- a/src/java/org/mxchange/addressbook/beans/contact/AddressbookContactWebSessionBean.java
+++ b/src/java/org/mxchange/addressbook/beans/contact/AddressbookContactWebSessionBean.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 AddressbookContactWebSessionBean implements AddressbookContactWebSe
 	 * Default constructor
 	 */
 	public AddressbookContactWebSessionBean () {
-		// Set gender to UNKNOWN
-		this.gender = Gender.UNKNOWN;
-
 		// Try it
 		try {
 			// Get initial context
@@ -226,6 +224,33 @@ public class AddressbookContactWebSessionBean implements AddressbookContactWebSe
 		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
@@ -344,38 +369,16 @@ public class AddressbookContactWebSessionBean implements AddressbookContactWebSe
 		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
@@ -396,7 +399,11 @@ public class AddressbookContactWebSessionBean implements AddressbookContactWebSe
 		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
@@ -454,9 +461,8 @@ public class AddressbookContactWebSessionBean implements AddressbookContactWebSe
 			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);
 
@@ -716,6 +722,11 @@ public class AddressbookContactWebSessionBean implements AddressbookContactWebSe
 		this.zipCode = zipCode;
 	}
 
+	@Override
+	public boolean hasContacts () {
+		return (!this.allContacts().isEmpty());
+	}
+
 	/**
 	 * Post-initialization of this class
 	 */
@@ -830,6 +841,33 @@ public class AddressbookContactWebSessionBean implements AddressbookContactWebSe
 		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/addressbook/beans/contact/AddressbookContactWebSessionController.java b/src/java/org/mxchange/addressbook/beans/contact/AddressbookContactWebSessionController.java
index 378137d1..1f402a86 100644
--- a/src/java/org/mxchange/addressbook/beans/contact/AddressbookContactWebSessionController.java
+++ b/src/java/org/mxchange/addressbook/beans/contact/AddressbookContactWebSessionController.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 AddressbookContactWebSessionController 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 AddressbookContactWebSessionController 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/addressbook/beans/helper/AddressbookAdminWebRequestHelper.java b/src/java/org/mxchange/addressbook/beans/helper/AddressbookAdminWebRequestHelper.java
index b345b136..1994116b 100644
--- a/src/java/org/mxchange/addressbook/beans/helper/AddressbookAdminWebRequestHelper.java
+++ b/src/java/org/mxchange/addressbook/beans/helper/AddressbookAdminWebRequestHelper.java
@@ -21,7 +21,7 @@ import javax.enterprise.context.RequestScoped;
 import javax.inject.Inject;
 import javax.inject.Named;
 import org.mxchange.addressbook.beans.contact.AddressbookAdminContactWebRequestController;
-import org.mxchange.addressbook.beans.user.AddressbookAdminUserWebRequestController;
+import org.mxchange.addressbook.beans.user.AddressbookUserWebSessionController;
 import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jusercore.model.user.User;
 
@@ -40,17 +40,11 @@ public class AddressbookAdminWebRequestHelper implements AddressbookAdminWebRequ
 	private static final long serialVersionUID = 17_258_793_567_145_701L;
 
 	/**
-	 * Administrative contact controller
+	 * Regular contact controller
 	 */
 	@Inject
 	private AddressbookAdminContactWebRequestController adminContactController;
 
-	/**
-	 * Administrative user controller
-	 */
-	@Inject
-	private AddressbookAdminUserWebRequestController adminUserController;
-
 	/**
 	 * Contact instance
 	 */
@@ -61,6 +55,12 @@ public class AddressbookAdminWebRequestHelper implements AddressbookAdminWebRequ
 	 */
 	private User user;
 
+	/**
+	 * Regular user controller
+	 */
+	@Inject
+	private AddressbookUserWebSessionController userController;
+
 	/**
 	 * Default constructor
 	 */
@@ -109,7 +109,7 @@ public class AddressbookAdminWebRequestHelper implements AddressbookAdminWebRequ
 		}
 
 		// 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 AddressbookAdminWebRequestHelper implements AddressbookAdminWebRequ
 		// 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/addressbook/beans/profile/AddressbookUserProfileWebRequestBean.java b/src/java/org/mxchange/addressbook/beans/profile/AddressbookUserProfileWebRequestBean.java
index 32dc4faf..abedbba9 100644
--- a/src/java/org/mxchange/addressbook/beans/profile/AddressbookUserProfileWebRequestBean.java
+++ b/src/java/org/mxchange/addressbook/beans/profile/AddressbookUserProfileWebRequestBean.java
@@ -22,7 +22,7 @@ import javax.faces.view.facelets.FaceletException;
 import javax.inject.Inject;
 import javax.inject.Named;
 import org.mxchange.addressbook.beans.login.AddressbookUserLoginWebSessionController;
-import org.mxchange.addressbook.beans.user.AddressbookAdminUserWebRequestController;
+import org.mxchange.addressbook.beans.user.AddressbookUserWebSessionController;
 import org.mxchange.jusercore.exceptions.UserNotFoundException;
 import org.mxchange.jusercore.model.user.User;
 import org.mxchange.jusercore.model.user.profilemodes.ProfileMode;
@@ -42,16 +42,16 @@ public class AddressbookUserProfileWebRequestBean implements AddressbookUserProf
 	private static final long serialVersionUID = 187_687_145_286_710L;
 
 	/**
-	 * User controller
+	 * Login controller
 	 */
 	@Inject
-	private AddressbookAdminUserWebRequestController adminUserController;
+	private AddressbookUserLoginWebSessionController loginController;
 
 	/**
-	 * Login controller
+	 * User controller
 	 */
 	@Inject
-	private AddressbookUserLoginWebSessionController loginController;
+	private AddressbookUserWebSessionController userController;
 
 	@Override
 	public boolean isProfileLinkVisibleById (final Long userId) {
@@ -60,7 +60,7 @@ public class AddressbookUserProfileWebRequestBean implements AddressbookUserProf
 
 		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/addressbook/beans/register/AddressbookUserRegisterWebSessionBean.java b/src/java/org/mxchange/addressbook/beans/register/AddressbookUserRegisterWebSessionBean.java
index 4a763495..062bec04 100644
--- a/src/java/org/mxchange/addressbook/beans/register/AddressbookUserRegisterWebSessionBean.java
+++ b/src/java/org/mxchange/addressbook/beans/register/AddressbookUserRegisterWebSessionBean.java
@@ -111,7 +111,7 @@ public class AddressbookUserRegisterWebSessionBean implements AddressbookUserReg
 		} 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 AddressbookUserRegisterWebSessionBean implements AddressbookUserReg
 			// 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/addressbook/beans/user/AddressbookAdminUserWebRequestBean.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestBean.java
index 6bb6877e..e6e54d4b 100644
--- a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestBean.java
+++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestBean.java
@@ -17,9 +17,6 @@
 package org.mxchange.addressbook.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;
@@ -38,16 +35,13 @@ import org.mxchange.addressbook.beans.login.AddressbookUserLoginWebSessionContro
 import org.mxchange.jcontacts.contact.Contact;
 import org.mxchange.jcontacts.contact.ContactSessionBeanRemote;
 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;
@@ -94,11 +88,6 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 	@Inject
 	private AddressbookContactWebSessionController contactController;
 
-	/**
-	 * A list of all selectable contacts
-	 */
-	private List<Contact> selectableContacts;
-
 	/**
 	 * An event fired when the administrator has updated a new user
 	 */
@@ -117,11 +106,6 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 	@Inject
 	private AddressbookUserWebSessionController userController;
 
-	/**
-	 * A list of all user profiles
-	 */
-	private List<User> userList;
-
 	/**
 	 * Login bean (controller)
 	 */
@@ -133,11 +117,6 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 	 */
 	private String userName;
 
-	/**
-	 * User name list
-	 */
-	private List<String> userNameList;
-
 	/**
 	 * User password (unencrypted from web form)
 	 */
@@ -148,11 +127,6 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 	 */
 	private String userPasswordRepeat;
 
-	/**
-	 * A list of all public user profiles
-	 */
-	private List<User> visibleUserList;
-
 	/**
 	 * Default constructor
 	 */
@@ -245,7 +219,7 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 
 		// 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()))) {
@@ -323,18 +297,7 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 		User registeredUser = event.getRegisteredUser();
 
 		// Debug message
-		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("AdminUserWebBean:afterRegistration: registeredUser={0}", registeredUser)); //NOI18N
-		// 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);
-		}
-
-		// Add user name and email address
-		this.addUserNameEmailAddress(registeredUser);
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterRegistration: registeredUser={0}", registeredUser)); //NOI18N
 
 		// Clear all data
 		this.clear();
@@ -343,66 +306,6 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 		//* NOISY-DEBUG: */ System.out.println("AdminUserWebBean:afterRegistration: EXIT!"); //NOI18N
 	}
 
-	@Override
-	public void afterUserLogin (final @Observes UserLoggedInEvent event) {
-		// Trace message
-		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("AdminUserWebBean: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("AdminUserWebBean: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
@@ -460,9 +363,6 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 		// 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));
 
@@ -500,224 +400,11 @@ public class AddressbookAdminUserWebRequestBean implements AddressbookAdminUserW
 		this.userPasswordRepeat = userPasswordRepeat;
 	}
 
-	@Override
-	public boolean hasUsers () {
-		return (!this.allUsers().isEmpty());
-	}
-
 	/**
 	 * Post-initialization of this class
 	 */
 	@PostConstruct
 	public void init () {
-		// 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();
-		}
-
-		// 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 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 = this.userList.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);
-	}
-
-	/**
-	 * Updates list with given user instance
-	 * <p>
-	 * @param user User instance
-	 */
-	@Override
-	public 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);
-	}
-
-	/**
-	 * Adds user's name and email address to bean's internal list. It also
-	 * updates the public user list if the user has decided to ha	}
-	 * <p>
-	 * @param user User instance
-	 */
-	private void addUserNameEmailAddress (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());
-
-		// Add email addres
-		this.contactController.addEmailAddress(user.getUserContact().getContactEmailAddress());
 	}
 
 	/**
diff --git a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestController.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestController.java
index 7278e730..b8ddc311 100644
--- a/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestController.java
+++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookAdminUserWebRequestController.java
@@ -17,13 +17,7 @@
 package org.mxchange.addressbook.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,94 +33,6 @@ public interface AddressbookAdminUserWebRequestController 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);
-
-	/**
-	 * All public user profiles
-	 * <p>
-	 * @return A list of all public user profiles
-	 */
-	List<User> allVisibleUsers ();
-
-	/**
-	 * 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 ();
-
-	/**
-	 * Updates list with given user
-	 * <p>
-	 * @param user User to update
-	 */
-	void updateList (final User user);
-
-	/**
-	 * 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 ();
-
-	/**
-	 * 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,
diff --git a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java
index 3ef2fc19..93a52e5f 100644
--- a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java
+++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionBean.java
@@ -17,6 +17,9 @@
 package org.mxchange.addressbook.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.SessionScoped;
@@ -37,8 +40,11 @@ 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;
 import org.mxchange.jusercore.exceptions.UserPasswordMismatchException;
 import org.mxchange.jusercore.model.user.LoginUser;
 import org.mxchange.jusercore.model.user.User;
@@ -71,6 +77,11 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 	@Inject
 	private AddressbookUserLoginWebSessionController loginController;
 
+	/**
+	 * A list of all selectable contacts
+	 */
+	private List<Contact> selectableContacts;
+
 	/**
 	 * Event being fired when user updated personal data
 	 */
@@ -88,11 +99,27 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 	 */
 	private Long userId;
 
+	/**
+	 * A list of all user profiles
+	 */
+	private List<User> userList;
+
+	/**
+	 * Login bean (controller)
+	 */
+	@Inject
+	private AddressbookUserLoginWebSessionController userLoginController;
+
 	/**
 	 * User name
 	 */
 	private String userName;
 
+	/**
+	 * User name list
+	 */
+	private List<String> userNameList;
+
 	/**
 	 * User password (unencrypted from web form)
 	 */
@@ -108,6 +135,11 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 	 */
 	private ProfileMode userProfileMode;
 
+	/**
+	 * A list of all public user profiles
+	 */
+	private List<User> visibleUserList;
+
 	/**
 	 * Default constructor
 	 */
@@ -126,9 +158,72 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 	}
 
 	@Override
-	public void afterRegistrationEvent (final @Observes UserRegisteredEvent event) {
+	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
-		System.out.println(MessageFormat.format("UserWebBean:afterRegistration: event={0} - CALLED!", event)); //NOI18N
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterRegistration: event={0} - CALLED!", event)); //NOI18N
 
 		// event should not be null
 		if (null == event) {
@@ -136,10 +231,10 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 			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
@@ -149,7 +244,7 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		User registeredUser = event.getRegisteredUser();
 
 		// Debug message
-		System.out.println(MessageFormat.format("UserWebBean:afterRegistration: registeredUser={0}", registeredUser)); //NOI18N
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterRegistration: registeredUser={0}", registeredUser)); //NOI18N
 
 		// Copy all data from registered->user
 		this.copyUser(registeredUser);
@@ -157,17 +252,29 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		// 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());
 
 		// Trace message
-		System.out.println("UserWebBean:afterRegistration: EXIT!"); //NOI18N
+		//* NOISY-DEBUG: */ System.out.println("UserWebBean:afterRegistration: EXIT!"); //NOI18N
 	}
 
 	@Override
 	public void afterUserLogin (final @Observes UserLoggedInEvent event) {
 		// Trace message
-		System.out.println(MessageFormat.format("UserWebBean:afterUserLogin: event={0} - CALLED!", event)); //NOI18N
+		//* NOISY-DEBUG: */ System.out.println(MessageFormat.format("UserWebBean:afterUserLogin: event={0} - CALLED!", event)); //NOI18N
 
 		// event should not be null
 		if (null == event) {
@@ -175,10 +282,10 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 			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
@@ -187,13 +294,49 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		// Copy all data to this bean
 		this.copyUser(event.getLoggedInUser());
 
+		// Re-initialize list
+		this.visibleUserList = this.userBean.allMemberPublicVisibleUsers();
+
 		// Trace message
 	}
 
+	@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
@@ -208,11 +351,15 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		// 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;
 	}
@@ -308,11 +455,101 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		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
@@ -341,6 +578,78 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		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 {
+		// 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());
+	}
+
 	/**
 	 * Clears this bean
 	 */
@@ -372,4 +681,43 @@ public class AddressbookUserWebSessionBean implements AddressbookUserWebSessionC
 		DialableFaxNumber fax = user.getUserContact().getContactFaxNumber();
 		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/addressbook/beans/user/AddressbookUserWebSessionController.java b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java
index 3024ea2c..7ae377a3 100644
--- a/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java
+++ b/src/java/org/mxchange/addressbook/beans/user/AddressbookUserWebSessionController.java
@@ -17,8 +17,14 @@
 package org.mxchange.addressbook.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;
 
@@ -34,6 +40,27 @@ public interface AddressbookUserWebSessionController extends Serializable {
 	 */
 	public static final Integer MINIMUM_PASSWORD_LENGTH = 5;
 
+	/**
+	 * Event observer for newly added users by adminstrator
+	 * <p>
+	 * @param event Event being fired
+	 */
+	void afterAdminAddedUserEvent (final AdminAddedUserEvent event);
+
+	/**
+	 * Event observer for updated user data by administrator
+	 * <p>
+	 * @param event Event being updated
+	 */
+	void afterAdminUpdatedUserDataEvent (final AdminUpdatedUserDataEvent event);
+
+	/**
+	 * Listens to fired event when user updated personal data
+	 * <p>
+	 * @param event Event being fired
+	 */
+	void afterUserUpdatedPersonalData (final UpdatedUserPersonalDataEvent event);
+
 	/**
 	 * Event observer for new user registrations
 	 * <p>
@@ -48,6 +75,73 @@ public interface AddressbookUserWebSessionController 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 1c2b214f..a139d35f 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 c6948e68..e057389a 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_LIST_USER_ID}</f:facet>