From: Roland Haeder <roland@mxchange.org>
Date: Thu, 6 Aug 2015 06:32:20 +0000 (+0200)
Subject: Moved a lot classes and interfaces (generalized) to new jcore project + added a few... 
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=16289838616dbf25d96a20f82164415d40181e46;p=jfinancials-swing.git

Moved a lot classes and interfaces (generalized) to new jcore project + added a few specializations
Signed-off-by:Roland Häder <roland@mxchange.org>
---

diff --git a/Addressbook/src/org/mxchange/addressbook/BaseAddressbookSystem.java b/Addressbook/src/org/mxchange/addressbook/BaseAddressbookSystem.java
new file mode 100644
index 0000000..16c49c3
--- /dev/null
+++ b/Addressbook/src/org/mxchange/addressbook/BaseAddressbookSystem.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook;
+
+import org.mxchange.jcore.BaseFrameworkSystem;
+
+/**
+ * General class
+ *
+ * @author Roland Haeder
+ */
+public class BaseAddressbookSystem extends BaseFrameworkSystem {
+	/**
+	 * No instances can be created of this class
+	 */
+	protected BaseAddressbookSystem () {
+	}
+}
diff --git a/Addressbook/src/org/mxchange/addressbook/BaseFrameworkSystem.java b/Addressbook/src/org/mxchange/addressbook/BaseFrameworkSystem.java
deleted file mode 100644
index b7a6711..0000000
--- a/Addressbook/src/org/mxchange/addressbook/BaseFrameworkSystem.java
+++ /dev/null
@@ -1,684 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.StringTokenizer;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.mxchange.addressbook.application.Application;
-import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.database.frontend.DatabaseFrontend;
-import org.mxchange.addressbook.manager.contact.ManageableContact;
-
-/**
- * General class
- *
- * @author Roland Haeder
- */
-public class BaseFrameworkSystem implements FrameworkInterface {
-
-	/**
-	 * Instance for own properties
-	 */
-	private static final Properties properties = new Properties(System.getProperties());
-
-	/**
-	 * Class' logger
-	 */
-	private final Logger LOG;
-
-	/**
-	 * Application instance
-	 */
-	private Application application;
-
-	/**
-	 * Bundle instance
-	 */
-	private final ResourceBundle bundle;
-
-	/**
-	 * Client instance
-	 */
-	private Client client;
-
-	/**
-	 * Contact manager instance
-	 */
-	private ManageableContact contactManager;
-
-	/**
-	 * Name of used database table, handled over to backend
-	 */
-	private String tableName;
-
-	/**
-	 * DatabaseFrontend instance
-	 */
-	private DatabaseFrontend wrapper;
-
-	/**
-	 * Initialize object
-	 */
-	{
-		LOG = LogManager.getLogger(this);
-		bundle = ResourceBundle.getBundle("org/mxchange/addressbook/localization/bundle"); // NOI18N
-	}
-
-	/**
-	 * No instances can be created of this class
-	 */
-	protected BaseFrameworkSystem () {
-		// Init properties file
-		this.initProperties();
-	}
-
-	/**
-	 * Application instance
-	 *
-	 * @return the application
-	 */
-	@Override
-	public final Application getApplication () {
-		return this.application;
-	}
-
-	/**
-	 * Getter for human-readable string from given key
-	 *
-	 * @param key Key to return
-	 * @return Human-readable message
-	 */
-	@Override
-	public final String getMessageStringFromKey (final String key) {
-		// Return message
-		return this.getBundle().getString(key);
-	}
-
-	/**
-	 * Some "getter for a value from given column name. This name will be
-	 * translated into a method name and then this method is called.
-	 *
-	 * @param columnName Column name
-	 * @return Value from field
-	 */
-	@Override
-	public Object getValueFromColumn (final String columnName) {
-		throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0}", columnName)); //NOI18N
-	}
-
-	/**
-	 * Some "getter" for target class instance from given name.
-	 *
-	 * @param instance Instance to iterate on
-	 * @param targetClass Class name to look for
-	 * @return Class instance
-	 */
-	@SuppressWarnings ("unchecked")
-	private Class<? extends FrameworkInterface> getClassFromTarget (final FrameworkInterface instance, final String targetClass) {
-		// Trace message
-		this.getLogger().debug(MessageFormat.format("instance={0},targetClass={1}", instance, targetClass)); //NOI18N
-
-		// Instance reflaction of this class
-		Class<? extends FrameworkInterface> c = instance.getClass();
-
-		// Analyze class
-		while (!targetClass.equals(c.getSimpleName())) {
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("c={0}", c.getSimpleName())); //NOI18N
-
-			// Get super class (causes unchecked warning)
-			c = (Class<? extends FrameworkInterface>) c.getSuperclass();
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("c={0} - EXIT!", c)); //NOI18N
-
-		// Return it
-		return c;
-	}
-
-	/**
-	 * Some "getter" for a Method instance from given method name
-	 *
-	 * @param instance Actual instance to call
-	 * @param targetClass Target class name
-	 * @param methodName Method name
-	 * @return A Method instance
-	 */
-	private Method getMethodFromName (final FrameworkInterface instance, final String targetClass, final String methodName) {
-		// Trace messahe
-		this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N
-
-		// Get target class instance
-		Class<? extends FrameworkInterface> c = this.getClassFromTarget(instance, targetClass);
-
-		// Init field instance
-		Method method = null;
-
-		// Use reflection to get all attributes
-		try {
-			method = c.getDeclaredMethod(methodName, new Class<?>[0]);
-		} catch (final SecurityException ex) {
-			// Security problem
-			this.abortProgramWithException(ex);
-		} catch (final NoSuchMethodException ex) {
-			// Method not found
-			this.abortProgramWithException(ex);
-		}
-
-		// Assert on field
-		assert (method instanceof Method) : "method is not a Method instance"; //NOI18N
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("method={0} - EXIT!", method)); //NOI18N
-
-		// Return it
-		return method;
-	}
-
-	/**
-	 * Aborts program with given exception
-	 *
-	 * @param	throwable Any type of Throwable
-	 */
-	protected final void abortProgramWithException (final Throwable throwable) {
-		// Log exception ...
-		this.getLogger().catching(throwable);
-
-		// .. and exit
-		System.exit(1);
-
-	}
-
-	/**
-	 * Application instance
-	 *
-	 * @param application the application to set
-	 */
-	protected final void setApplication (final Application application) {
-		this.application = application;
-	}
-
-	/**
-	 * Client instance
-	 *
-	 * @return the client
-	 */
-	@Override
-	public final Client getClient () {
-		return this.client;
-	}
-
-	/**
-	 * Getter for bundle instance
-	 *
-	 * @return Resource bundle
-	 */
-	protected final ResourceBundle getBundle () {
-		return this.bundle;
-	}
-
-	/**
-	 * Client instance
-	 *
-	 * @param client the client to set
-	 */
-	protected final void setClient (final Client client) {
-		this.client = client;
-	}
-
-	/**
-	 * Contact manager instance
-	 *
-	 * @return the contactManager
-	 */
-	@Override
-	public final ManageableContact getContactManager () {
-		return this.contactManager;
-	}
-
-	/**
-	 * Contact manager instance
-	 *
-	 * @param contactManager the contactManager to set
-	 */
-	protected final void setContactManager (final ManageableContact contactManager) {
-		this.contactManager = contactManager;
-	}
-
-	/**
-	 * Checks if given boolean field is available and set to same value
-	 *
-	 * @param columnName Column name to check
-	 * @param bool Boolean value
-	 * @return Whether all conditions are met
-	 */
-	@Override
-	public boolean isValueEqual (final String columnName, final boolean bool) {
-		// Not implemented
-		throw new UnsupportedOperationException(MessageFormat.format("Not implemented. columnName={0},bool={1}", columnName, bool)); //NOI18N
-	}
-
-	/**
-	 * Log exception
-	 *
-	 * @param exception Exception to log
-	 */
-	@Override
-	public final void logException (final Throwable exception) {
-		// Log this exception
-		this.getLogger().catching(exception);
-	}
-
-	/**
-	 * Prepares all properties, the file is written if it is not found
-	 */
-	private void initProperties () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("{0} properties are loaded already.", BaseFrameworkSystem.properties.size())); //NOI18N
-
-		// Are some properties loaded?
-		if (!BaseFrameworkSystem.properties.isEmpty()) {
-			// Some are already loaded, abort here
-			return;
-		}
-
-		try {
-			// Try to read it
-			BaseFrameworkSystem.properties.load(new BufferedReader(new InputStreamReader(new FileInputStream(FrameworkInterface.PROPERTIES_CONFIG_FILE))));
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("{0} properties has been loaded.", BaseFrameworkSystem.properties.size())); //NOI18N
-		} catch (final FileNotFoundException ex) {
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("Properties file {0} not found: {1}", FrameworkInterface.PROPERTIES_CONFIG_FILE, ex)); //NOI18N
-
-			/*
-			 * The file is not found which is normal for first run, so
-			 * initialize default values.
-			 */
-			this.initPropertiesWithDefault();
-
-			// Write file
-			this.writePropertiesFile();
-		} catch (final IOException ex) {
-			// Something else didn't work
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes properties with default values
-	 */
-	private void initPropertiesWithDefault () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Init default values:
-		// Default database backend
-		BaseFrameworkSystem.properties.put("org.mxchange.addressbook.database.backendType", "base64csv"); //NOI18N
-
-		// For MySQL backend
-		BaseFrameworkSystem.properties.put("org.mxchange.addressbook.database.mysql.host", "localhost"); //NOI18N
-		BaseFrameworkSystem.properties.put("org.mxchange.addressbook.database.mysql.dbname", "test"); //NOI18N
-		BaseFrameworkSystem.properties.put("org.mxchange.addressbook.database.mysql.login", ""); //NOI18N
-		BaseFrameworkSystem.properties.put("org.mxchange.addressbook.database.mysql.password", ""); //NOI18N
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Writes the properties file to disk
-	 */
-	private void writePropertiesFile () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		try {
-			// Write it
-			BaseFrameworkSystem.properties.store(new PrintWriter(FrameworkInterface.PROPERTIES_CONFIG_FILE), "This file is automatically generated. You may wish to alter it."); //NOI18N
-		} catch (final IOException ex) {
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Converts a column name like "foo_bar" to an attribute name like "fooBar"
-	 *
-	 * @param columnName Column name to convert
-	 * @return Attribute name
-	 */
-	protected String convertColumnNameToAttribute (final String columnName) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName)); //NOI18N
-
-		// First all lower case
-		String lower = columnName.toLowerCase();
-
-		// Then split on "_"
-		StringTokenizer tokenizer = new StringTokenizer(lower, "_"); //NOI18N
-
-		// Resulting string
-		StringBuilder builder = new StringBuilder(tokenizer.countTokens());
-
-		// Init counter
-		int count = 0;
-
-		// Walk through all
-		while (tokenizer.hasMoreTokens()) {
-			// Get token
-			String token = tokenizer.nextToken();
-
-			// Is later than first element?
-			if (count > 0) {
-				// Make first character upper-case
-				char c = token.charAt(0);
-				token = String.valueOf(c).toUpperCase() + token.substring(1);
-			}
-
-			// Add token
-			builder.append(token);
-
-			// Increment counter
-			count++;
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("builder={0} - EXIT!", builder)); //NOI18N
-
-		// Return result
-		return builder.toString();
-	}
-
-	/**
-	 * Converts a column name like "foo_bar" to a method name like "getFooBar"
-	 * for non-booleans and to "isFooBar" for boolean fields.
-	 *
-	 * @param columnName Column name to convert
-	 * @param isBool Whether the parameter is boolean
-	 * @return Attribute name
-	 */
-	protected String convertColumnNameToGetterMethod (final String columnName, boolean isBool) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName)); //NOI18N
-
-		// Then split on "_"
-		StringTokenizer tokenizer = new StringTokenizer(columnName, "_"); //NOI18N
-
-		// Resulting string
-		StringBuilder builder = new StringBuilder(tokenizer.countTokens());
-
-		// Is it boolean?
-		if (isBool) {
-			// Append "is"
-			builder.append("is"); //NOI18N
-		} else {
-			// Append "get"
-			builder.append("get"); //NOI18N
-		}
-
-		// Walk through all
-		while (tokenizer.hasMoreTokens()) {
-			// Get token
-			String token = tokenizer.nextToken();
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("token={0}", token)); //NOI18N
-
-			// Make it upper-case
-			char c = token.charAt(0);
-			token = String.valueOf(c).toUpperCase() + token.substring(1);
-
-			// Add token
-			builder.append(token);
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("builder={0} - EXIT!", builder)); //NOI18N
-
-		// Return result
-		return builder.toString();
-	}
-
-	/**
-	 * Returns boolean field value from given method call
-	 *
-	 * @param instance The instance to call
-	 * @param targetClass Target class to look in
-	 * @param methodName Method name to look for
-	 * @return Boolean value from field
-	 */
-	protected boolean getBooleanField (final FrameworkInterface instance, final String targetClass, final String methodName) {
-		// Trace messahe
-		this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N
-
-		// Get method instance
-		Method method = this.getMethodFromName(instance, targetClass, methodName);
-
-		// Get value from field
-		Boolean value = false;
-
-		try {
-			value = (Boolean) method.invoke(instance);
-		} catch (final IllegalArgumentException ex) {
-			// Other problem
-			this.abortProgramWithException(ex);
-		} catch (final IllegalAccessException ex) {
-			// Other problem
-			this.abortProgramWithException(ex);
-		} catch (final InvocationTargetException ex) {
-			// Other problem
-			this.abortProgramWithException(ex);
-		}
-
-		// Return value
-		return value;
-	}
-
-	/**
-	 * Returns any field value from given method call
-	 *
-	 * @param instance The instance to call
-	 * @param targetClass Target class to look in
-	 * @param methodName Method name to look for
-	 * @return Any value from field
-	 */
-	protected Object getField (final FrameworkInterface instance, final String targetClass, final String methodName) {
-		// Trace messahe
-		this.getLogger().trace(MessageFormat.format("targetClass={0},methodName={1}", targetClass, methodName)); //NOI18N
-
-		// Get method to call
-		Method method = this.getMethodFromName(instance, targetClass, methodName);
-
-		// Get value from field
-		Object object = null;
-
-		try {
-			object = method.invoke(instance);
-		} catch (final IllegalArgumentException ex) {
-			// Other problem
-			this.abortProgramWithException(ex);
-		} catch (final IllegalAccessException ex) {
-			// Other problem
-			this.abortProgramWithException(ex);
-		} catch (final InvocationTargetException ex) {
-			// Other problem
-			this.abortProgramWithException(ex);
-		}
-
-		// Return value
-		return object;
-	}
-
-	/**
-	 * Getter for logger
-	 *
-	 * @return Logger
-	 */
-	protected final Logger getLogger () {
-		return this.LOG;
-	}
-
-	/**
-	 * Getter for property which must exist
-	 *
-	 * @param key Key to get
-	 * @return Propety value
-	 */
-	protected final String getProperty (final String key) {
-		return BaseFrameworkSystem.properties.getProperty(String.format("org.mxchange.addressbook.%s", key)); //NOI18N
-	}
-
-	/**
-	 * Name of used database table, handled over to backend
-	 *
-	 * @return the tableName
-	 */
-	protected final String getTableName () {
-		return this.tableName;
-	}
-
-	/**
-	 * Name of used database table, handled over to backend
-	 *
-	 * @param tableName the tableName to set
-	 */
-	protected final void setTableName (final String tableName) {
-		this.tableName = tableName;
-	}
-
-	/**
-	 * Getter for DatabaseFrontend instance
-	 *
-	 * @return DatabaseFrontend instance
-	 */
-	protected DatabaseFrontend getWrapper () {
-		return this.wrapper;
-	}
-
-	/**
-	 * Setter for wrapper instance
-	 *
-	 * @param wrapper A DatabaseFrontend instance
-	 */
-	protected void setWrapper (final DatabaseFrontend wrapper) {
-		this.wrapper = wrapper;
-	}
-
-	/**
-	 * Some "getter" for an array from given string and tokenizer
-	 *
-	 * @param str String to tokenize and get array from
-	 * @param delimiter Delimiter
-	 * @param size Size of array
-	 * @return Array from tokenized string
-	 */
-	protected String[] getArrayFromString (final String str, final String delimiter, final int size) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("str={0},delimiter={1},size={2} - CALLED!", str, delimiter, size)); //NOI18N
-
-		// Get tokenizer
-		StringTokenizer tokenizer = new StringTokenizer(str, delimiter);
-
-		// Init array and index
-		String[] tokens = new String[size];
-		int index = 0;
-
-		// Run through all tokens
-		while (tokenizer.hasMoreTokens()) {
-			// Get current token and add it
-			tokens[index] = tokenizer.nextToken();
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("Token at index{0}: {1}", index, tokens[1])); //NOI18N
-
-			// Increment index
-			index++;
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("tokens({0})={1} - EXIT!", tokens.length, Arrays.toString(tokens))); //NOI18N
-
-		// Return it
-		return tokens;
-	}
-
-	/**
-	 * Checks whether the given field is a boolean field by probing it.
-	 * 
-	 * @param instance Instance to call
-	 * @param targetClass Target class
-	 * @param columnName Column name to check
-	 * @return Whether the given column name represents a boolean field
-	 */
-	protected boolean isBooleanField (final FrameworkInterface instance, final String targetClass, final String columnName) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("instance={0},targetCLass={1},columnName={2} - CALLED!", instance, targetClass, columnName)); //NOI18N
-
-		// Convert column name to getter name (boolean)
-		String methodName = this.convertColumnNameToGetterMethod(columnName, true);
-
-		// Get class instance
-		Class<? extends FrameworkInterface> c = this.getClassFromTarget(instance, targetClass);
-
-		// Defauzlt is boolean
-		boolean isBool = true;
-
-		try {
-			// Now try to instance the method
-			Method method = c.getDeclaredMethod(methodName, new Class<?>[0]);
-		} catch (final NoSuchMethodException ex) {
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("Method {0} does not exist, field {1} cannot be boolean: {2}", methodName, columnName, ex)); //NOI18N
-
-			// Not found
-			isBool = false;
-		} catch (final SecurityException ex) {
-			// Really bad?
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("isBool={0} - EXIT!", isBool)); //NOI18N
-
-		// Return result
-		return isBool;
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/FrameworkInterface.java b/Addressbook/src/org/mxchange/addressbook/FrameworkInterface.java
deleted file mode 100644
index 8253f6d..0000000
--- a/Addressbook/src/org/mxchange/addressbook/FrameworkInterface.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook;
-
-import org.mxchange.addressbook.application.Application;
-import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.manager.contact.ManageableContact;
-
-/**
- * A general interface which should be always expanded
- *
- * @author Roland Haeder
- */
-public interface FrameworkInterface {
-	/*
-	 * Properties file name
-	 */
-	public static final String PROPERTIES_CONFIG_FILE = "config.properties";
-
-	/**
-	 * Getter for contact manager
-	 *
-	 * @return Contact manager instance
-	 */
-	public ManageableContact getContactManager ();
-
-	/**
-	 * Client instance
-	 *
-	 * @return the client
-	 */
-	public Client getClient ();
-
-	/**
-	 * Application instance
-	 *
-	 * @return the application
-	 */
-	public Application getApplication ();
-
-	/**
-	 * Getter for human-readable string from given key
-	 *
-	 * @param key Key to return
-	 * @return Human-readable message
-	 */
-	public String getMessageStringFromKey (final String key);
-
-	/**
-	 * Logs given exception
-	 *
-	 * @param exception Exception to log
-	 */
-	public void logException (final Throwable exception);
-
-	/**
-	 * Checks if given boolean field is available and set to same value
-	 *
-	 * @param columnName Column name to check
-	 * @param bool Boolean value
-	 * @return Whether all conditions are met
-	 */
-	public boolean isValueEqual (final String columnName, final boolean bool);
-
-	/**
-	 * Some "getter for a value from given column name. This name will be
-	 * translated into a method name and then this method is called.
-	 *
-	 * @param columnName Column name
-	 * @return Value from field
-	 */
-	public Object getValueFromColumn (final String columnName);
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/application/AddressbookApplication.java b/Addressbook/src/org/mxchange/addressbook/application/AddressbookApplication.java
index 5704a14..99be0be 100644
--- a/Addressbook/src/org/mxchange/addressbook/application/AddressbookApplication.java
+++ b/Addressbook/src/org/mxchange/addressbook/application/AddressbookApplication.java
@@ -17,12 +17,14 @@
 package org.mxchange.addressbook.application;
 
 import java.text.MessageFormat;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.BaseAddressbookSystem;
+import org.mxchange.addressbook.client.AddressbookClient;
 import org.mxchange.addressbook.client.console.ConsoleClient;
 import org.mxchange.addressbook.client.gui.SwingClient;
-import org.mxchange.addressbook.exceptions.UnhandledUserChoiceException;
-import org.mxchange.addressbook.manager.application.ApplicationManager;
+import org.mxchange.jcore.application.Application;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
+import org.mxchange.jcore.manager.application.ApplicationManager;
 
 /**
  * ============================================
@@ -114,7 +116,7 @@ import org.mxchange.addressbook.manager.application.ApplicationManager;
  * @author Roland Haeder
  * @version 0.0
  */
-public class AddressbookApplication extends BaseFrameworkSystem implements Application {
+public class AddressbookApplication extends BaseAddressbookSystem implements Application {
 
 	/**
 	 * Application title
@@ -205,6 +207,9 @@ public class AddressbookApplication extends BaseFrameworkSystem implements Appli
 	 */
 	@Override
 	public void doMainLoop () {
+		// Get client and cast it
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
 		// Debug message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
@@ -213,16 +218,16 @@ public class AddressbookApplication extends BaseFrameworkSystem implements Appli
 		this.showIntro();
 
 		// Set current menu to main
-		this.getClient().setCurrentMenu("main"); //NOI18N
+		client.setCurrentMenu("main"); //NOI18N
 
 		// --- Main loop starts here ---
 		while (this.getClient().isRunning()) {
 			// The application is still active, show menu selection
-			this.getClient().showCurrentMenu();
+			client.showCurrentMenu();
 
 			try {
 				// Ask for user input and run proper method
-				this.getClient().doUserMenuChoice();
+				client.doUserMenuChoice();
 			} catch (final UnhandledUserChoiceException ex) {
 				this.getLogger().catching(ex);
 			}
diff --git a/Addressbook/src/org/mxchange/addressbook/application/Application.java b/Addressbook/src/org/mxchange/addressbook/application/Application.java
deleted file mode 100644
index 5aa4a23..0000000
--- a/Addressbook/src/org/mxchange/addressbook/application/Application.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.application;
-
-import org.mxchange.addressbook.FrameworkInterface;
-
-/**
- *
- * @author Roland Haeder
- */
-public interface Application extends FrameworkInterface {
-
-	/**
-	 * Bootstraps the application
-	 */
-	public void doBootstrap ();
-
-	/**
-	 * Run the main loop
-	 */
-	public void doMainLoop ();
-
-	/**
-	 * Shutdown the application
-	 */
-	public void doShutdown ();
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/client/AddressbookClient.java b/Addressbook/src/org/mxchange/addressbook/client/AddressbookClient.java
new file mode 100644
index 0000000..15732f2
--- /dev/null
+++ b/Addressbook/src/org/mxchange/addressbook/client/AddressbookClient.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.client;
+
+import org.mxchange.addressbook.contact.Contact;
+import org.mxchange.addressbook.contact.Gender;
+import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
+
+/**
+ * A special client interface for addressbook applications.
+ * 
+ * @author Roland Haeder
+ */
+public interface AddressbookClient extends Client {
+
+	/**
+	 * Displays a "box" for the address
+	 *
+	 * @param contact Contact to show address from
+	 */
+	public void displayAddressBox (final Contact contact);
+
+	/**
+	 * The user changes own name data
+	 *
+	 * @param contact
+	 */
+	public void doChangeOwnNameData (final Contact contact);
+
+	/**
+	 * The user changes own address data
+	 *
+	 * @param contact Contact instance to change
+	 */
+	public void doChangeOwnAddressData (final Contact contact);
+
+	/**
+	 * The user changes own other data
+	 *
+	 * @param contact Constact instance to change
+	 */
+	public void doChangeOwnOtherData (final Contact contact);
+
+	/**
+	 * Allows the user to enter own data
+	 *
+	 * @return Finished Contact instance
+	 */
+	public Contact doEnterOwnData ();
+
+	/**
+	 * Asks the user to enter his/her gender (M=Male, F=Female, C=Company)
+	 *
+	 * @param message Message to output
+	 * @return Gender enum
+	 */
+	public Gender enterGender (final String message);
+
+	/**
+	 * Displays a "box" for the name
+	 *
+	 * @param contact Contact to show name from
+	 */
+	public void displayNameBox (final Contact contact);
+
+	/**
+	 * Displays a "box" for other data
+	 *
+	 * @param contact Contact to show other data from
+	 */
+	public void displayOtherDataBox (final Contact contact);
+
+	/**
+	 * Let the user choose what to change on the address: [n]ame, [a]ddress,
+	 * [o]ther
+	 *
+	 * @param contact Contact instance to let the user change data
+	 * @throws UnhandledUserChoiceException If choice is not supported
+	 */
+	public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException;
+
+	/**
+	 * Asks the user for a choice and proceeds accordingly
+	 *
+	 * @throws UnhandledUserChoiceException If choice is not supported
+	 */
+	public void doUserMenuChoice () throws UnhandledUserChoiceException;
+
+	/**
+	 * Asks the the user to enter a single character which must match validChars
+	 *
+	 * @param	validChars Valid chars that are accepted
+	 * @param	message	Message to user
+	 * @return	Allowed character
+	 */
+	public char enterChar (final char[] validChars, final String message);
+
+	/**
+	 * Reads a string of minimum and maximum length from the user. An empty
+	 * string should be generally not allowed, but might be okay for e.g.
+	 * company name.
+	 *
+	 * @param minLength	Minimum length of the string to read
+	 * @param maxLength	Maximum length of the string to read
+	 * @param message	Message to user
+	 * @param allowEmpty Whether empty strings are allowed
+	 * @return Entered string by user or null if empty string is allowed
+	 */
+	public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty);
+
+	/**
+	 * Reads an integer (int) from the user
+	 *
+	 * @param minimum Minimum allowed number
+	 * @param maximum Maximum allowed number
+	 * @param message	Message to user
+	 * @return Entered string by user or null if empty string is allowed
+	 */
+	public int enterInt (final int minimum, final int maximum, final String message);
+
+	/**
+	 * Setter for current menu choice
+	 *
+	 * @param currentMenu Current menu choice
+	 */
+	public void setCurrentMenu (final String currentMenu);
+
+	/**
+	 * Some "Getter" for menu item
+	 *
+	 * @param accessKey Key to press to access this menu
+	 * @param text Text to show to user
+	 * @return
+	 */
+	public SelectableMenuItem getMenuItem (final char accessKey, final String text);
+
+	/**
+	 * Shows given menu entry in client
+	 *
+	 * @param item Menu item to show
+	 */
+	public void showEntry (final SelectableMenuItem item);
+
+	/**
+	 * Shows current menu selection to the user
+	 */
+	public void showCurrentMenu ();
+}
diff --git a/Addressbook/src/org/mxchange/addressbook/client/BaseAddressbookClient.java b/Addressbook/src/org/mxchange/addressbook/client/BaseAddressbookClient.java
new file mode 100644
index 0000000..ff977bb
--- /dev/null
+++ b/Addressbook/src/org/mxchange/addressbook/client/BaseAddressbookClient.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.client;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+import org.mxchange.addressbook.manager.contact.ContactManager;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
+import org.mxchange.addressbook.menu.Menu;
+import org.mxchange.jcore.client.BaseClient;
+import org.mxchange.jcore.client.Client;
+
+/**
+ * A general addressbook client
+ *
+ * @author Roland Haeder
+ */
+public abstract class BaseAddressbookClient extends BaseClient {
+
+	/**
+	 * Current menu choice
+	 */
+	private String currentMenu;
+
+	/**
+	 * Menu system
+	 */
+	private final Map<String, Menu> menus;
+
+	/**
+	 * No instances can be created of this class
+	 */
+	protected BaseAddressbookClient () {
+		// Init menu map
+		this.menus = new HashMap<>(10);
+	}
+
+	/**
+	 * Current menu choice
+	 *
+	 * @return the currentMenu
+	 */
+	public final String getCurrentMenu () {
+		return this.currentMenu;
+	}
+
+	/**
+	 * Current menu choice
+	 *
+	 * @param currentMenu the currentMenu to set
+	 */
+	public final void setCurrentMenu (final String currentMenu) {
+		this.currentMenu = currentMenu;
+	}
+
+	/**
+	 * "Getter" for given menu type
+	 *
+	 * @param menuType Menu type instance to return
+	 * @return Menu or null if not found
+	 */
+	public Menu getMenu (final String menuType) {
+		// Default is not found
+		Menu menu = null;
+
+		// Check array
+		if (this.getMenus().containsKey(menuType)) {
+			// Found!
+			menu = this.getMenus().get(menuType);
+		}
+
+		// Return it
+		return menu;
+	}
+
+	/**
+	 * Fills menu map with swing menus
+	 */
+	protected abstract void fillMenuMap ();
+
+	/**
+	 * Getter for menus map
+	 *
+	 * @return Map of all menus
+	 */
+	protected final Map<String, Menu> getMenus () {
+		return this.menus;
+	}
+
+	/**
+	 * Initializes contact manager
+	 */
+	protected void initContactManager () {
+		// Trace message
+		this.getLogger().trace("CALLED!"); //NOI18N
+		
+		// Debug message
+		this.getLogger().debug("Initializing contact manager ..."); //NOI18N
+		
+		// Init contact manager with console client
+		// @TODO Static initial amount of contacts
+		ManageableContact manager = new ContactManager((Client) this);
+		
+		// Set it here
+		this.setContactManager(manager);
+		
+		// Debug message
+		this.getLogger().debug("Contact manager has been initialized."); //NOI18N
+		
+		// Trace message
+		this.getLogger().trace("EXIT!"); //NOI18N
+	}
+
+	/**
+	 * Shows given menu
+	 *
+	 * @param menuType Given menu to show
+	 */
+	protected void showMenu (final String menuType) {
+		// Trace message
+		this.getLogger().trace(MessageFormat.format("menuType={0} - CALLED!", menuType)); //NOI18N
+
+		Menu menu = this.getMenu(menuType);
+
+		// Is the menu set?
+		if (!(menu instanceof Menu)) {
+			// Not found
+			// @todo Own exception?
+			throw new NullPointerException(MessageFormat.format("Menu '{0}' not found.", menuType)); //NOI18N
+		}
+
+		// Show menu
+		menu.show((Client) this);
+
+		// Trace message
+		this.getLogger().trace("EXIT!"); //NOI18N
+	}
+}
diff --git a/Addressbook/src/org/mxchange/addressbook/client/BaseClient.java b/Addressbook/src/org/mxchange/addressbook/client/BaseClient.java
deleted file mode 100644
index df1573e..0000000
--- a/Addressbook/src/org/mxchange/addressbook/client/BaseClient.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.client;
-
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Map;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.manager.contact.ContactManager;
-import org.mxchange.addressbook.manager.contact.ManageableContact;
-import org.mxchange.addressbook.menu.Menu;
-
-/**
- * A general client
- *
- * @author Roland Haeder
- */
-public abstract class BaseClient extends BaseFrameworkSystem {
-
-	/**
-	 * Current menu choice
-	 */
-	private String currentMenu;
-
-	/**
-	 * Application is not running by default
-	 */
-	private boolean isRunning;
-
-	/**
-	 * Menu system
-	 */
-	private final Map<String, Menu> menus;
-
-	/**
-	 * No instances can be created of this class
-	 */
-	protected BaseClient () {
-		// Init menu map
-		this.menus = new HashMap<>(10);
-	}
-
-	/**
-	 * Shutdown method for all clients
-	 */
-	public void doShutdown () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Disable client
-		this.disableIsRunning();
-
-		// Shuts down contact manager
-		this.getContactManager().doShutdown();
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Enables the client
-	 */
-	public final void enableIsRunning () {
-		this.isRunning = true;
-	}
-
-	/**
-	 * Current menu choice
-	 *
-	 * @return the currentMenu
-	 */
-	public final String getCurrentMenu () {
-		return this.currentMenu;
-	}
-
-	/**
-	 * Current menu choice
-	 *
-	 * @param currentMenu the currentMenu to set
-	 */
-	public final void setCurrentMenu (final String currentMenu) {
-		this.currentMenu = currentMenu;
-	}
-
-	/**
-	 * "Getter" for given menu type
-	 *
-	 * @param menuType Menu type instance to return
-	 * @return Menu or null if not found
-	 */
-	public Menu getMenu (final String menuType) {
-		// Default is not found
-		Menu menu = null;
-
-		// Check array
-		if (this.getMenus().containsKey(menuType)) {
-			// Found!
-			menu = this.getMenus().get(menuType);
-		}
-
-		// Return it
-		return menu;
-	}
-
-	/**
-	 * Determines whether the application is still active by checking some
-	 * conditions
-	 *
-	 * @return Whether the application is still active
-	 */
-	public final boolean isRunning () {
-		// In console client, 0 may have been used
-		return this.isRunning;
-	}
-
-	/**
-	 * Disables the client
-	 */
-	protected final void disableIsRunning () {
-		this.isRunning = false;
-	}
-
-	/**
-	 * Fills menu map with swing menus
-	 */
-	protected abstract void fillMenuMap ();
-
-	/**
-	 * Getter for menus map
-	 *
-	 * @return Map of all menus
-	 */
-	protected final Map<String, Menu> getMenus () {
-		return this.menus;
-	}
-
-	/**
-	 * Initializes contact manager
-	 */
-	protected void initContactManager () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Debug message
-		this.getLogger().debug("Initializing contact manager ..."); //NOI18N
-
-		// Init contact manager with console client
-		// @TODO Static initial amount of contacts
-		ManageableContact manager = new ContactManager((Client) this);
-
-		// Set it here
-		this.setContactManager(manager);
-
-		// Debug message
-		this.getLogger().debug("Contact manager has been initialized."); //NOI18N
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Shows given menu
-	 *
-	 * @param menuType Given menu to show
-	 */
-	protected void showMenu (final String menuType) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("menuType={0} - CALLED!", menuType)); //NOI18N
-
-		Menu menu = this.getMenu(menuType);
-
-		// Is the menu set?
-		if (!(menu instanceof Menu)) {
-			// Not found
-			// @todo Own exception?
-			throw new NullPointerException(MessageFormat.format("Menu '{0}' not found.", menuType)); //NOI18N
-		}
-
-		// Show menu
-		menu.show((Client) this);
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/client/Client.java b/Addressbook/src/org/mxchange/addressbook/client/Client.java
deleted file mode 100644
index aba84ef..0000000
--- a/Addressbook/src/org/mxchange/addressbook/client/Client.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.client;
-
-import org.mxchange.addressbook.FrameworkInterface;
-import org.mxchange.addressbook.exceptions.UnhandledUserChoiceException;
-import org.mxchange.addressbook.contact.Contact;
-import org.mxchange.addressbook.contact.Gender;
-import org.mxchange.addressbook.menu.item.SelectableMenuItem;
-
-/**
- * An interface for application clients
- *
- * @author Roland Haeder
- */
-public interface Client extends FrameworkInterface {
-
-	/**
-	 * Displays a "box" for the address
-	 *
-	 * @param contact Contact to show address from
-	 */
-	public void displayAddressBox (final Contact contact);
-
-	/**
-	 * The user changes own name data
-	 *
-	 * @param contact
-	 */
-	public void doChangeOwnNameData (final Contact contact);
-
-	/**
-	 * The user changes own address data
-	 *
-	 * @param contact Contact instance to change
-	 */
-	public void doChangeOwnAddressData (final Contact contact);
-
-	/**
-	 * The user changes own other data
-	 *
-	 * @param contact Constact instance to change
-	 */
-	public void doChangeOwnOtherData (final Contact contact);
-
-	/**
-	 * Allows the user to enter own data
-	 *
-	 * @return Finished Contact instance
-	 */
-	public Contact doEnterOwnData ();
-
-	/**
-	 * Shuts down the client and therefore whole application
-	 */
-	public void doShutdown ();
-
-	/**
-	 * Asks the user to enter his/her gender (M=Male, F=Female, C=Company)
-	 *
-	 * @param message Message to output
-	 * @return Gender enum
-	 */
-	public Gender enterGender (final String message);
-
-	/**
-	 * Displays a message to the user
-	 *
-	 * @param message Message to show to the user
-	 */
-	public void outputMessage (final String message);
-
-	/**
-	 * Displays a "box" for the name
-	 *
-	 * @param contact Contact to show name from
-	 */
-	public void displayNameBox (final Contact contact);
-
-	/**
-	 * Displays a "box" for other data
-	 *
-	 * @param contact Contact to show other data from
-	 */
-	public void displayOtherDataBox (final Contact contact);
-
-	/**
-	 * Let the user choose what to change on the address: [n]ame, [a]ddress,
-	 * [o]ther
-	 *
-	 * @param contact Contact instance to let the user change data
-	 * @throws UnhandledUserChoiceException If choice is not supported
-	 */
-	public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException;
-
-	/**
-	 * Asks the user for a choice and proceeds accordingly
-	 *
-	 * @throws UnhandledUserChoiceException If choice is not supported
-	 */
-	public void doUserMenuChoice () throws UnhandledUserChoiceException;
-
-	/**
-	 * Enables isRunning attribute which singals that the client is running
-	 */
-	public void enableIsRunning ();
-
-	/**
-	 * Asks the the user to enter a single character which must match validChars
-	 *
-	 * @param	validChars Valid chars that are accepted
-	 * @param	message	Message to user
-	 * @return	Allowed character
-	 */
-	public char enterChar (final char[] validChars, final String message);
-
-	/**
-	 * Reads a string of minimum and maximum length from the user. An empty
-	 * string should be generally not allowed, but might be okay for e.g.
-	 * company name.
-	 *
-	 * @param minLength	Minimum length of the string to read
-	 * @param maxLength	Maximum length of the string to read
-	 * @param message	Message to user
-	 * @param allowEmpty Whether empty strings are allowed
-	 * @return Entered string by user or null if empty string is allowed
-	 */
-	public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty);
-
-	/**
-	 * Reads an integer (int) from the user
-	 *
-	 * @param minimum Minimum allowed number
-	 * @param maximum Maximum allowed number
-	 * @param message	Message to user
-	 * @return Entered string by user or null if empty string is allowed
-	 */
-	public int enterInt (final int minimum, final int maximum, final String message);
-
-	/**
-	 * Setter for current menu choice
-	 *
-	 * @param currentMenu Current menu choice
-	 */
-	public void setCurrentMenu (final String currentMenu);
-
-	/**
-	 * Some "Getter" for menu item
-	 *
-	 * @param accessKey Key to press to access this menu
-	 * @param text Text to show to user
-	 * @return
-	 */
-	public SelectableMenuItem getMenuItem (final char accessKey, final String text);
-
-	/**
-	 * Determines whether the client is still active by checking some conditions
-	 *
-	 * @return Whether the client is still active
-	 */
-	public boolean isRunning ();
-
-	/**
-	 * Shows given menu entry in client
-	 *
-	 * @param item Menu item to show
-	 */
-	public void showEntry (final SelectableMenuItem item);
-
-	/**
-	 * Shows introduction to user
-	 */
-	public void showWelcome ();
-
-	/**
-	 * Shows current menu selection to the user
-	 */
-	public void showCurrentMenu ();
-
-	/**
-	 * Inizializes this client
-	 */
-	public void init ();
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java b/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
index b523a13..f376ece 100644
--- a/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
+++ b/Addressbook/src/org/mxchange/addressbook/client/console/ConsoleClient.java
@@ -20,26 +20,27 @@ import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.Scanner;
 import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.application.Application;
-import org.mxchange.addressbook.client.BaseClient;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.client.AddressbookClient;
+import org.mxchange.addressbook.client.BaseAddressbookClient;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.contact.user.UserContact;
 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.addressbook.exceptions.UnhandledUserChoiceException;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
 import org.mxchange.addressbook.menu.Menu;
 import org.mxchange.addressbook.menu.MenuTools;
 import org.mxchange.addressbook.menu.console.ConsoleMenu;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
 import org.mxchange.addressbook.menu.item.console.ConsoleMenuItem;
+import org.mxchange.jcore.application.Application;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
 
 /**
  * A client for the console
  *
  * @author Roland Haeder
  */
-public class ConsoleClient extends BaseClient implements Client {
+public class ConsoleClient extends BaseAddressbookClient implements AddressbookClient {
 
 	/**
 	 * Scanner instance for reading data from console input
@@ -59,7 +60,7 @@ public class ConsoleClient extends BaseClient implements Client {
 		this.setApplication(application);
 
 		// Init scanner instance
-		this.scanner = new Scanner(System.in);
+		this.scanner = new Scanner(System.in, "UTF-8"); //NOI18N
 
 		// Trace message
 		this.getLogger().trace("EXIT!"); //NOI18N
@@ -164,17 +165,20 @@ public class ConsoleClient extends BaseClient implements Client {
 			throw new IllegalArgumentException("Contact is not own data."); //NOI18N
 		}
 
+		// Get manager and cast it
+		ManageableContact manager = (ManageableContact) this.getManager();
+
 		// Own address data
-		String street = this.getContactManager().enterOwnStreet();
+		String street = manager.enterOwnStreet();
 
 		// Get zip code
-		int zipCode = this.getContactManager().enterOwnZipCode();
+		int zipCode = manager.enterOwnZipCode();
 
 		// Get city name
-		String city = this.getContactManager().enterOwnCity();
+		String city = manager.enterOwnCity();
 
 		// Get country code
-		String countryCode = this.getContactManager().enterOwnCountryCode();
+		String countryCode = manager.enterOwnCountryCode();
 
 		// Update address data
 		contact.updateAddressData(street, zipCode, city, countryCode);
@@ -200,17 +204,20 @@ public class ConsoleClient extends BaseClient implements Client {
 			throw new IllegalArgumentException("Contact is not own data."); //NOI18N
 		}
 
+		// Get manager and cast it
+		ManageableContact manager = (ManageableContact) this.getManager();
+
 		// Gender:
-		Gender gender = this.getContactManager().enterOwnGender();
+		Gender gender = manager.enterOwnGender();
 
 		// Surname
-		String surname = this.getContactManager().enterOwnSurname();
+		String surname = manager.enterOwnSurname();
 
 		// Family name
-		String familyName = this.getContactManager().enterOwnFamilyName();
+		String familyName = manager.enterOwnFamilyName();
 
 		// And company
-		String companyName = this.getContactManager().enterOwnCompanyName();
+		String companyName = manager.enterOwnCompanyName();
 
 		// Update contact instance
 		contact.updateNameData(gender, surname, familyName, companyName);
@@ -236,20 +243,23 @@ public class ConsoleClient extends BaseClient implements Client {
 			throw new IllegalArgumentException("Contact is not own data."); //NOI18N
 		}
 
+		// Get manager and cast it
+		ManageableContact manager = (ManageableContact) this.getManager();
+
 		// Phone number
-		String phoneNumber = this.getContactManager().enterOwnPhoneNumber();
+		String phoneNumber = manager.enterOwnPhoneNumber();
 
 		// Phone number
-		String cellNumber = this.getContactManager().enterOwnCellNumber();
+		String cellNumber = manager.enterOwnCellNumber();
 
 		// Fax number
-		String faxNumber = this.getContactManager().enterOwnFaxNumber();
+		String faxNumber = manager.enterOwnFaxNumber();
 
 		// Email address
-		String email = this.getContactManager().enterOwnEmailAddress();
+		String email = manager.enterOwnEmailAddress();
 
 		// Comment
-		String comment = this.getContactManager().enterOwnComment();
+		String comment = manager.enterOwnComment();
 
 		// Update contact instance
 		contact.updateOtherData(phoneNumber, cellNumber, faxNumber, email, null, comment);
@@ -263,17 +273,20 @@ public class ConsoleClient extends BaseClient implements Client {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
+		// Get manager and cast it
+		ManageableContact manager = (ManageableContact) this.getManager();
+
 		// First ask for gender
-		Gender gender = this.getContactManager().enterOwnGender();
+		Gender gender = manager.enterOwnGender();
 
 		// 2nd for surname
-		String surname = this.getContactManager().enterOwnSurname();
+		String surname = manager.enterOwnSurname();
 
 		// And 3rd for family name
-		String familyName = this.getContactManager().enterOwnFamilyName();
+		String familyName = manager.enterOwnFamilyName();
 
 		// Company name ...
-		String companyName = this.getContactManager().enterOwnCompanyName();
+		String companyName = manager.enterOwnCompanyName();
 
 		// Construct UserContact instance
 		Contact contact = new UserContact(gender, surname, familyName, companyName);
@@ -313,12 +326,15 @@ public class ConsoleClient extends BaseClient implements Client {
 		// Output textural message and ask for a char as input
 		char choice = this.enterChar(accessKeys, "Bitte Auswahl eingeben (0=Programm beenden): ");
 
+		// Get manager and cast it
+		ManageableContact manager = (ManageableContact) this.getManager();
+
 		// @TODO Rewrite this ugly switch() block
 		switch (choice) {
 			case '1':
 				try {
 					// Enter/add own data
-					this.getContactManager().doEnterOwnData();
+					manager.doEnterOwnData();
 				} catch (final ContactAlreadyAddedException ex) {
 					// Already added
 					this.outputMessage("Sie haben bereits Ihre eigenen Daten eingegeben.");
@@ -326,27 +342,27 @@ public class ConsoleClient extends BaseClient implements Client {
 				break;
 
 			case '2': // Change own data
-				this.getContactManager().doChangeOwnData();
+				manager.doChangeOwnData();
 				break;
 
 			case '3': // Add new addess
-				this.getContactManager().doAddOtherAddress();
+				manager.doAddOtherAddress();
 				break;
 
 			case '4': // List contacts
-				this.getContactManager().doListContacts();
+				manager.doListContacts();
 				break;
 
 			case '5': // Search addresses
-				this.getContactManager().doSearchContacts();
+				manager.doSearchContacts();
 				break;
 
 			case '6': // Change other addess
-				this.getContactManager().doChangeOtherAddress();
+				manager.doChangeOtherAddress();
 				break;
 
 			case '7': // Delete other address
-				this.getContactManager().doDeleteOtherAddress();
+				manager.doDeleteOtherAddress();
 				break;
 
 			case '0': // Program exit
@@ -578,7 +594,7 @@ public class ConsoleClient extends BaseClient implements Client {
 		this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software");
 
 		// Debug message
-		this.getLogger().debug("Intro shown to user");
+		this.getLogger().debug("Intro shown to user"); //NOI18N
 	}
 
 	@Override
@@ -589,24 +605,27 @@ public class ConsoleClient extends BaseClient implements Client {
 		// Contact must not be null
 		if (contact == null) {
 			// Abort here
-			throw new NullPointerException("contact is null");
+			throw new NullPointerException("contact is null"); //NOI18N
 		}
 
 		// Ask the user for editing [name], [a]ddress or [other] data
 		char choice = this.enterChar(new char[] {'n', 'a', 'o', 'x'}, "Welchen Daten möchten Sie ändern? (n=Namensdaten, a=Anschriftsdaten, o=Andere, x=Zurück zur Hauptauswahl) ");
 
+		// Get manager and cast it
+		ManageableContact manager = (ManageableContact) this.getManager();
+
 		// @TODO Get rid of this ugly switch block, too
 		switch (choice) {
 			case 'n': // Name data
-				this.getContactManager().doChangeNameData(contact);
+				manager.doChangeNameData(contact);
 				break;
 
 			case 'a': // Address data
-				this.getContactManager().doChangeAddressData(contact);
+				manager.doChangeAddressData(contact);
 				break;
 
 			case 'o': // Other data
-				this.getContactManager().doChangeOtherData(contact);
+				manager.doChangeOtherData(contact);
 				break;
 
 			case 'x': // Exit this menu
@@ -615,7 +634,7 @@ public class ConsoleClient extends BaseClient implements Client {
 
 			default:
 				// @TODO throw own exception
-				throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice));
+				throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice)); //NOI18N
 		}
 
 		// Trace message
@@ -631,6 +650,9 @@ public class ConsoleClient extends BaseClient implements Client {
 		// Read line
 		String input = this.readString();
 
+		// Debug message
+		this.getLogger().debug(MessageFormat.format("input={0}", input)); //NOI18N
+
 		// This must be only one character
 		if (input.length() != 1) {
 			// Return zero
@@ -650,6 +672,9 @@ public class ConsoleClient extends BaseClient implements Client {
 		// First read a string
 		String input = this.readString();
 
+		// Debug message
+		this.getLogger().debug(MessageFormat.format("input={0}", input)); //NOI18N
+
 		// Init number with invalid value
 		int num = -1;
 
@@ -658,9 +683,12 @@ public class ConsoleClient extends BaseClient implements Client {
 			num = Integer.parseInt(input);
 		} catch (final NumberFormatException e) {
 			this.outputMessage("Bitte geben Sie nur Zahlen ein!");
-			this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage()));
+			this.getLogger().warn(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage())); //NOI18N
 		}
 
+		// Trace message
+		this.getLogger().trace(MessageFormat.format("num={0} - EXIT!", num)); //NOI18N
+
 		// Return read number
 		return num;
 	}
@@ -677,16 +705,15 @@ public class ConsoleClient extends BaseClient implements Client {
 	/**
 	 * Fills menu map with menu entries
 	 */
-	@Override
 	protected final void fillMenuMap () {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
 		// Initialize first (main) menu
-		Menu menu = new ConsoleMenu("main", this);
+		Menu menu = new ConsoleMenu("main", this); //NOI18N
 
 		// Add it
-		this.getMenus().put("main", menu);
+		this.getMenus().put("main", menu); //NOI18N
 
 		// Trace message
 		this.getLogger().trace("EXIT!"); //NOI18N
diff --git a/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java b/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
index c5d05e3..8dcddcb 100644
--- a/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
+++ b/Addressbook/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
@@ -44,20 +44,21 @@ import javax.swing.JTextArea;
 import javax.swing.JTextField;
 import javax.swing.border.TitledBorder;
 import javax.swing.table.TableModel;
-import org.mxchange.addressbook.BaseFrameworkSystem;
+import org.mxchange.addressbook.BaseAddressbookSystem;
 import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.client.Client;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
 import org.mxchange.addressbook.model.contact.ContactTableModel;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
 
 /**
  *
  * @author Roland Haeder
  */
-public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame {
+public class AddressbookFrame extends BaseAddressbookSystem implements ClientFrame {
 
 	/**
 	 * Own instance
@@ -209,8 +210,11 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 		// Debug line
 		this.getLogger().trace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
 
+		// Get and cast manager instance
+		ManageableContact manager = (ManageableContact) this.getClient().getManager();
+
 		// Has the user entered own data?
-		if (this.getClient().getContactManager().isOwnContactAdded()) {
+		if (manager.isOwnContactAdded()) {
 			// Debug message
 			this.getLogger().debug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
 
@@ -640,7 +644,8 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 			@Override
 			public void actionPerformed (final ActionEvent e) {
 				try {
-					self.getClient().getContactManager().doEnterOwnData();
+					ManageableContact manager = (ManageableContact) self.getClient().getManager();
+					manager.doEnterOwnData();
 				} catch (final ContactAlreadyAddedException ex) {
 					// Already added, log away
 					// @TODO maybe output message here?
@@ -664,7 +669,8 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 			 */
 			@Override
 			public void actionPerformed (final ActionEvent e) {
-				self.getClient().getContactManager().doChangeOwnData();
+				ManageableContact manager = (ManageableContact) self.getClient().getManager();
+				manager.doChangeOwnData();
 			}
 		});
 
@@ -681,7 +687,8 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 			 */
 			@Override
 			public void actionPerformed (final ActionEvent e) {
-				self.getClient().getContactManager().doAddOtherAddress();
+				ManageableContact manager = (ManageableContact) self.getClient().getManager();
+				manager.doAddOtherAddress();
 			}
 		});
 
@@ -906,7 +913,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 	/**
 	 * Class for "add address" button
 	 */
-	private static class AddActionListener extends BaseFrameworkSystem implements ActionListener {
+	private static class AddActionListener extends BaseAddressbookSystem implements ActionListener {
 		/**
 		 * Dialog instance
 		 */
@@ -943,7 +950,7 @@ public class AddressbookFrame extends BaseFrameworkSystem implements ClientFrame
 	/**
 	 * Class for "cancel address" button
 	 */
-	private static class CancelActionListener extends BaseFrameworkSystem implements ActionListener {
+	private static class CancelActionListener extends BaseAddressbookSystem implements ActionListener {
 		/**
 		 * Dialog instance
 		 */
diff --git a/Addressbook/src/org/mxchange/addressbook/client/gui/ClientFrame.java b/Addressbook/src/org/mxchange/addressbook/client/gui/ClientFrame.java
index b68a3b7..e7500e8 100644
--- a/Addressbook/src/org/mxchange/addressbook/client/gui/ClientFrame.java
+++ b/Addressbook/src/org/mxchange/addressbook/client/gui/ClientFrame.java
@@ -16,10 +16,10 @@
  */
 package org.mxchange.addressbook.client.gui;
 
-import org.mxchange.addressbook.FrameworkInterface;
-import org.mxchange.addressbook.client.Client;
 import org.mxchange.addressbook.contact.Contact;
-import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
+import org.mxchange.jcore.FrameworkInterface;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
 
 /**
  * An interface for applications with a frame
diff --git a/Addressbook/src/org/mxchange/addressbook/client/gui/SwingClient.java b/Addressbook/src/org/mxchange/addressbook/client/gui/SwingClient.java
index 2829d05..27b98de 100644
--- a/Addressbook/src/org/mxchange/addressbook/client/gui/SwingClient.java
+++ b/Addressbook/src/org/mxchange/addressbook/client/gui/SwingClient.java
@@ -16,21 +16,21 @@
  */
 package org.mxchange.addressbook.client.gui;
 
-import org.mxchange.addressbook.application.Application;
-import org.mxchange.addressbook.client.BaseClient;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.client.AddressbookClient;
+import org.mxchange.addressbook.client.BaseAddressbookClient;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.contact.Gender;
-import org.mxchange.addressbook.exceptions.FrameAlreadyInitializedException;
-import org.mxchange.addressbook.exceptions.UnhandledUserChoiceException;
 import org.mxchange.addressbook.menu.Menu;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.application.Application;
+import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
 
 /**
  *
  * @author Roland Haeder
  */
-public class SwingClient extends BaseClient implements Client {
+public class SwingClient extends BaseAddressbookClient implements AddressbookClient {
 
 	/**
 	 * Swing frame instance
diff --git a/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java b/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
index 45d2e17..4e590c2 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/BaseContact.java
@@ -18,8 +18,9 @@ package org.mxchange.addressbook.contact;
 
 import java.text.MessageFormat;
 import java.util.Objects;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.BaseAddressbookSystem;
+import org.mxchange.addressbook.client.AddressbookClient;
+import org.mxchange.jcore.client.Client;
 
 /**
  * A general contact
@@ -27,7 +28,7 @@ import org.mxchange.addressbook.client.Client;
  * @author Roland Haeder
  * @version 0.0
  */
-public class BaseContact extends BaseFrameworkSystem {
+public class BaseContact extends BaseAddressbookSystem {
 
 	/**
 	 * Birth day
@@ -236,7 +237,9 @@ public class BaseContact extends BaseFrameworkSystem {
 	 * "Serializes" this object into a CSV string (this time with semicolons)
 	 *
 	 * @return "CSV-serialized" version of the stored data
+	 * @deprecated Don't use this anymore
 	 */
+	@Deprecated
 	public String getCsvStringFromStoreableObject () {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
@@ -412,7 +415,7 @@ public class BaseContact extends BaseFrameworkSystem {
 	protected final void setZipCode (final long zipCode) {
 		this.zipCode = zipCode;
 	}
-
+	
 	@Override
 	public int hashCode () {
 		// Validate gender instance
@@ -449,14 +452,17 @@ public class BaseContact extends BaseFrameworkSystem {
 			throw new NullPointerException("client is null");
 		}
 
+		// Cast client
+		AddressbookClient c = (AddressbookClient) client;
+
 		// Display name "box"
-		client.displayNameBox((Contact) this);
+		c.displayNameBox((Contact) this);
 
 		// Display address "box"
-		client.displayAddressBox((Contact) this);
+		c.displayAddressBox((Contact) this);
 
 		// Display other data "box"
-		client.displayOtherDataBox((Contact) this);
+		c.displayOtherDataBox((Contact) this);
 	}
 
 	/**
@@ -609,40 +615,6 @@ public class BaseContact extends BaseFrameworkSystem {
 		this.birthday = birthday;
 	}
 
-	/**
-	 * Checks if given boolean field is available and set to same value
-	 *
-	 * @param columnName Column name to check
-	 * @param bool Boolean value
-	 * @return Whether all conditions are met
-	 */
-	@Override
-	public boolean isValueEqual (final String columnName, final boolean bool) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("columnName={0},bool={1} - CALLED!", columnName, bool));
-
-		// Convert column name to field name
-		String methodName = this.convertColumnNameToGetterMethod(columnName, true);
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("field={0}", methodName));
-
-		// Init class instance
-		boolean value = this.getBooleanField(this, "BaseContact", methodName);
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("value={0}", value));
-
-		// Compare it
-		boolean isFound = (bool == value);
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("isFound={0} - EXIT!", isFound));
-
-		// Return result
-		return isFound;
-	}
-
 	/**
 	 * Some "getter for a value from given column name. This name will be
 	 * translated into a method name and then this method is called.
@@ -654,26 +626,60 @@ public class BaseContact extends BaseFrameworkSystem {
 	public Object getValueFromColumn (final String columnName) {
 		// Trace message
 		this.getLogger().trace(MessageFormat.format("columnName={0} - CALLED!", columnName));
-
+		
 		// Determine if the given column is boolean
 		if (this.isBooleanField(this, "BaseContact", columnName)) {
 			// Yes, then call other method
 			return this.getBooleanField(this, "BaseContact", columnName);
 		}
-
+		
 		// Convert column name to field name
 		String methodName = this.convertColumnNameToGetterMethod(columnName, false);
-
+		
 		// Debug message
 		this.getLogger().debug(MessageFormat.format("field={0}", methodName));
-
+		
 		// Get field
 		Object value = this.getField(this, "BaseContact", methodName);
-
+		
 		// Trace message
 		this.getLogger().trace("value=" + value + " - EXIT!");
-
+		
 		// Return it
 		return value;
 	}
+
+	/**
+	 * Checks if given boolean field is available and set to same value
+	 *
+	 * @param columnName Column name to check
+	 * @param bool Boolean value
+	 * @return Whether all conditions are met
+	 */
+	@Override
+	public boolean isValueEqual (final String columnName, final boolean bool) {
+		// Trace message
+		this.getLogger().trace(MessageFormat.format("columnName={0},bool={1} - CALLED!", columnName, bool));
+		
+		// Convert column name to field name
+		String methodName = this.convertColumnNameToGetterMethod(columnName, true);
+		
+		// Debug message
+		this.getLogger().debug(MessageFormat.format("field={0}", methodName));
+		
+		// Init class instance
+		boolean value = this.getBooleanField(this, "BaseContact", methodName);
+		
+		// Debug message
+		this.getLogger().debug(MessageFormat.format("value={0}", value));
+		
+		// Compare it
+		boolean isFound = (bool == value);
+		
+		// Trace message
+		this.getLogger().trace(MessageFormat.format("isFound={0} - EXIT!", isFound));
+		
+		// Return result
+		return isFound;
+	}
 }
diff --git a/Addressbook/src/org/mxchange/addressbook/contact/Contact.java b/Addressbook/src/org/mxchange/addressbook/contact/Contact.java
index 829bb45..629e796 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/Contact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/Contact.java
@@ -16,8 +16,8 @@
  */
 package org.mxchange.addressbook.contact;
 
-import org.mxchange.addressbook.FrameworkInterface;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.jcore.FrameworkInterface;
+import org.mxchange.jcore.client.Client;
 
 /**
  *
diff --git a/Addressbook/src/org/mxchange/addressbook/contact/book/BookContact.java b/Addressbook/src/org/mxchange/addressbook/contact/book/BookContact.java
index a9e8b8c..4ac6ccf 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/book/BookContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/book/BookContact.java
@@ -18,7 +18,7 @@ package org.mxchange.addressbook.contact.book;
 
 import org.mxchange.addressbook.contact.BaseContact;
 import org.mxchange.addressbook.contact.Contact;
-import org.mxchange.addressbook.database.storage.csv.StoreableCsv;
+import org.mxchange.jcore.database.storage.csv.StoreableCsv;
 
 /**
  * A contact that can be placed into "contact books"
diff --git a/Addressbook/src/org/mxchange/addressbook/contact/user/UserContact.java b/Addressbook/src/org/mxchange/addressbook/contact/user/UserContact.java
index 9208a06..be19701 100644
--- a/Addressbook/src/org/mxchange/addressbook/contact/user/UserContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/contact/user/UserContact.java
@@ -20,7 +20,7 @@ import java.text.MessageFormat;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.contact.book.BookContact;
-import org.mxchange.addressbook.database.storage.csv.StoreableCsv;
+import org.mxchange.jcore.database.storage.csv.StoreableCsv;
 
 /**
  *
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/BaseDatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/BaseDatabaseBackend.java
deleted file mode 100644
index 5a66691..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/BaseDatabaseBackend.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.backend;
-
-import java.sql.Driver;
-import java.sql.DriverManager;
-import java.text.MessageFormat;
-import java.util.Enumeration;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.exceptions.UnsupportedDatabaseDriverException;
-
-/**
- * Generall database backend
- *
- * @author Roland Haeder
- */
-public class BaseDatabaseBackend extends BaseFrameworkSystem {
-
-	/**
-	 * No instances from this class
-	 */
-	protected BaseDatabaseBackend () {
-	}
-
-	/**
-	 * Validates driver name and throws an exception if the driver is not valid
-	 *
-	 * @param driverName Driver name (e.g. "mysql")
-	 * @throws org.mxchange.addressbook.exceptions.UnsupportedDatabaseDriverException If the given driver name cannot be solved into a driver instance
-	 */
-	protected void validateDriver (final String driverName) throws UnsupportedDatabaseDriverException {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("driverName={0} - CALLED!", driverName)); //NOI18N
-
-		// Try to find the driver in driver list
-		Enumeration<Driver> drivers = DriverManager.getDrivers();
-
-		// Default is not found
-		boolean isFound = false;
-
-		// Search for it
-		while (drivers.hasMoreElements()) {
-			// Get element
-			Driver driver = drivers.nextElement();
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("Driver {0} is installed.", driver)); //NOI18N
-
-			// Get class name
-			String className = driver.getClass().getName();
-
-			// Is this wanted?
-			if (className.contains(driverName)) {
-				// Debug message
-				this.getLogger().debug("Found driver!"); //NOI18N
-
-				// Found it
-				isFound = true;
-				break;
-			}
-		}
-
-		// Is it found?
-		if (!isFound) {
-			// Throw exception
-			throw new UnsupportedDatabaseDriverException(driverName);
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java
deleted file mode 100644
index 8fc30e6..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/DatabaseBackend.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.backend;
-
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.Iterator;
-import org.mxchange.addressbook.FrameworkInterface;
-import org.mxchange.addressbook.database.storage.Storeable;
-import org.mxchange.addressbook.exceptions.BadTokenException;
-
-/**
- * A generic interface for database frontends
- *
- * @author Roland Haeder
- */
-public interface DatabaseBackend extends FrameworkInterface {
-
-	/**
-	 * Tries a connection to the database
-	 * 
-	 * @throws java.sql.SQLException If the connection attempt fails
-	 */
-	public void connectToDatabase () throws SQLException;
-
-	/**
-	 * Shuts down this backend
-	 */
-	public void doShutdown ();
-
-	/**
-	 * Some "getter" for row index from given boolean row value
-	 *
-	 * @param columnName Name of column
-	 * @param bool Boolean value to look for
-	 * @return Row index
-	 */
-	public int getRowIndexFromColumn (final String columnName, final boolean bool);
-
-	/**
-	 * Some "getter" for total table row count
-	 * 
-	 * @return Total row count
-	 * @throws java.sql.SQLException If an SQL error occurs
-	 */
-	public int getTotalCount () throws SQLException;
-
-	/**
-	 * Checks whether at least one row is found with given boolean value.
-	 *
-	 * @param columnName Column to check for boolean value
-	 * @param bool Boolean value to check
-	 * @return Whether boolean value is found and returns at least one row
-	 * @throws java.sql.SQLException If an SQL error occurs
-	 */
-	public boolean isRowFound (final String columnName, final boolean bool) throws SQLException;
-
-	/**
-	 * Rewinds backend
-	 */
-	public void rewind ();
-
-	/**
-	 * Get length of underlaying file
-	 *
-	 * @return Length of underlaying file
-	 */
-	public long length ();
-
-	/**
-	 * Stores an object in the database.
-	 *
-	 * @param object Object to store in database
-	 * @throws java.io.IOException From inner class
-	 */
-	public void store (final Storeable object) throws IOException;
-
-	/**
-	 * Gets an iterator for contacts
-	 *
-	 * @return Iterator for contacts
-	 * @throws org.mxchange.addressbook.exceptions.BadTokenException If the CSV token is badly formulated
-	 */
-	public Iterator<? extends Storeable> iterator () throws BadTokenException;
-
-	/**
-	 * Reads a single row from database.
-	 * 
-	 * @param rowIndex Row index (or how much to skip)
-	 * @return A Storeable instance
-	 * @throws org.mxchange.addressbook.exceptions.BadTokenException If a token was badly formatted
-	 */
-	public Storeable readRow (final int rowIndex) throws BadTokenException;
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/Base64CsvDatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/csv/Base64CsvDatabaseBackend.java
deleted file mode 100644
index 39eef66..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/csv/Base64CsvDatabaseBackend.java
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.backend.csv;
-
-import java.io.DataOutput;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.sql.SQLException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Iterator;
-import java.util.List;
-import org.mxchange.addressbook.FrameworkInterface;
-import org.mxchange.addressbook.contact.Contact;
-import org.mxchange.addressbook.database.backend.BaseDatabaseBackend;
-import org.mxchange.addressbook.database.backend.DatabaseBackend;
-import org.mxchange.addressbook.database.frontend.DatabaseFrontend;
-import org.mxchange.addressbook.database.storage.Storeable;
-import org.mxchange.addressbook.database.storage.csv.StoreableCsv;
-import org.mxchange.addressbook.exceptions.BadTokenException;
-
-/**
- * A database backend with CSV file as storage implementation
- *
- * @author Roland Haeder
- */
-public class Base64CsvDatabaseBackend extends BaseDatabaseBackend implements DatabaseBackend {
-
-	/**
-	 * Output stream for this storage engine
-	 */
-	private RandomAccessFile storageFile;
-
-	/**
-	 * Constructor with table name
-	 *
-	 * @param tableName Name of "table"
-	 * @param wrapper Wrapper instance to call back
-	 */
-	public Base64CsvDatabaseBackend (final String tableName, final DatabaseFrontend wrapper) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("tableName={0},wrapper={1}", tableName, wrapper)); //NOI18N
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Trying to initialize table {0} ...", tableName)); //NOI18N
-
-		// Set table name here, too
-		this.setTableName(tableName);
-
-		// Set wrapper here
-		this.setWrapper(wrapper);
-
-		// Construct file name
-		String fileName = String.format("data/table_%s.b64", tableName); //NOI18N
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Trying to open file {0} ...", fileName)); //NOI18N
-
-		try {
-			// Try to initialize the storage (file instance)
-			this.storageFile = new RandomAccessFile(fileName, "rw"); //NOI18N
-		} catch (final FileNotFoundException ex) {
-			// Did not work
-			this.getLogger().error(MessageFormat.format("File {0} cannot be opened: {1}", fileName, ex.toString())); //NOI18N
-			System.exit(1);
-		}
-
-		// Output message
-		this.getLogger().debug(MessageFormat.format("Database for {0} has been initialized.", tableName)); //NOI18N
-	}
-
-	/**
-	 * This database backend does not need to connect
-	 */
-	@Override
-	public void connectToDatabase () throws SQLException {
-		// Empty body
-	}
-
-	/**
-	 * Shuts down this backend
-	 */
-	@Override
-	public void doShutdown () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		try {
-			// Close file
-			this.getStorageFile().close();
-		} catch (final IOException ex) {
-			// Abort program
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Some "getter" for row index from given boolean row value
-	 *
-	 * @param columnName Name of column
-	 * @param bool Boolean value to look for
-	 * @return Row index
-	 */
-	@Override
-	public int getRowIndexFromColumn (final String columnName, final boolean bool) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("columnName={0},bool={1} - CALLED!", columnName, bool)); //NOI18N
-
-		// Row indexes start with zero
-		int rowIndex = 0;
-
-		// First rewind
-		this.rewind();
-
-		// Try to find the proper row
-		while (!this.isEndOfFile()) {
-			// Read line
-			String line = this.readLine();
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("line={0}", line));
-
-			// Callback the wrapper to handle parsing
-			try {
-				Storeable storeable = this.getWrapper().parseLineToStoreable(line);
-
-				// Debug message
-				this.getLogger().debug(MessageFormat.format("storeable={0}", storeable));
-
-				// Is the value qual
-				if (storeable.isValueEqual(columnName, bool)) {
-					// Debug message
-					this.getLogger().debug(MessageFormat.format("Found storeable={0} for columnName={1} and bool={2}", storeable, columnName, bool));
-
-					// Found it
-					break;
-				}
-			} catch (final BadTokenException ex) {
-				// Bad token found
-				this.abortProgramWithException(ex);
-			}
-
-			// Count up
-			rowIndex++;
-		}
-
-		// Return it
-		return rowIndex;
-	}
-
-	/**
-	 * Some "getter" for total row count
-	 *
-	 * @return Total row count
-	 */
-	@Override
-	public int getTotalCount () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		try {
-			// Do a deprecated call
-			// @todo this needs rewrite!
-			return this.readList().size();
-		} catch (final BadTokenException ex) {
-			this.abortProgramWithException(ex);
-		}
-
-		// Invalid return
-		this.getLogger().trace("Returning -1 ... : EXIT!"); //NOI18N
-		return -1;
-	}
-
-	/**
-	 * Checks whether at least one row is found with given boolean value.
-	 *
-	 * @param columnName Column to check for boolean value
-	 * @param bool Boolean value to check
-	 * @return Whether boolean value is found and returns at least one row
-	 */
-	@Override
-	public boolean isRowFound (final String columnName, final boolean bool) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("columnName={0},bool={1} - CALLED!", columnName, bool)); //NOI18N
-
-		// Is at least one entry found?
-		if (this.getTotalCount() == 0) {
-			// No entry found at all
-			return false;
-		}
-
-		// Default is not found
-		boolean isFound = false;
-
-		// Firsr rewind
-		this.rewind();
-
-		// Then loop through all lines
-		while (!this.isEndOfFile()) {
-			// Read line
-			String line = this.readLine();
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("line={0}", line));
-
-			try {
-				// And parse it to a Contact instance
-				Contact contact = (Contact) this.getWrapper().parseLineToStoreable(line);
-
-				// Debug message
-				this.getLogger().debug(MessageFormat.format("contact={0}", contact));
-
-				// This should not be null
-				if (contact == null) {
-					// Throw exception
-					throw new NullPointerException("contact is null");
-				}
-
-				// Now let the contact object check if it has such attribute
-				if (contact.isValueEqual(columnName, bool)) {
-					// Yes, it is set
-					isFound = true;
-					break;
-				}
-			} catch (final BadTokenException ex) {
-				// Don't continue with bad data
-				this.abortProgramWithException(ex);
-			}
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("isFound={0} - EXIT!", isFound));
-
-		// Return result
-		return isFound;
-	}
-
-	/**
-	 * Gets an iterator for contacts
-	 *
-	 * @return Iterator for contacts
-	 * @throws org.mxchange.addressbook.exceptions.BadTokenException If the
-	 * underlaying method has found an invalid token
-	 */
-	@Override
-	public Iterator<? extends Storeable> iterator () throws BadTokenException {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		/*
-		 * Then read the file into RAM (yes, not perfect for >1000 entries ...)
-		 * and get a List back.
-		 */
-		List<? extends Storeable> list = this.readList();
-
-		// List must be set
-		assert (list instanceof List) : "list has not been set."; //NOI18N
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("list.iterator()={0} - EXIT!", list.iterator())); //NOI18N
-
-		// Get iterator from list and return it
-		return list.iterator();
-	}
-
-	/**
-	 * Get length of underlaying file
-	 *
-	 * @return Length of underlaying file
-	 */
-	@Override
-	public long length () {
-		long length = 0;
-
-		try {
-			length = this.getStorageFile().length();
-			this.getLogger().debug(MessageFormat.format("length={0}", length)); //NOI18N
-		} catch (final IOException ex) {
-			// Length cannot be determined
-			// Abort program
-			this.abortProgramWithException(ex);
-		}
-
-		// Return result
-		this.getLogger().trace(MessageFormat.format("length={0} : EXIT!", length)); //NOI18N
-		return length;
-	}
-
-	/**
-	 * Reads a single row from database.
-	 *
-	 * @param rowIndex Row index (or how much to skip)
-	 * @return A Storeable instance
-	 * @throws org.mxchange.addressbook.exceptions.BadTokenException If a token
-	 * was badly formatted
-	 */
-	@Override
-	public Storeable readRow (final int rowIndex) throws BadTokenException {
-		// First rewind
-		this.rewind();
-
-		// Intialize variables
-		int count = -1;
-		Storeable storeable = null;
-
-		// Read all rows
-		while (!this.isEndOfFile() || (count < rowIndex)) {
-			// Read row
-			String line = this.readLine();
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("line={0}", line));
-
-			// Callback the wrapper to handle parsing
-			storeable = this.getWrapper().parseLineToStoreable(line);
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("storeable={0}", storeable));
-
-			// Increment counter
-			count++;
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("storeable={0} - EXIT!", storeable));
-		// Return found element
-		return storeable;
-	}
-
-	/**
-	 * Rewinds backend
-	 */
-	@Override
-	public void rewind () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		try {
-			// Rewind underlaying database file
-			this.getStorageFile().seek(0);
-		} catch (final IOException ex) {
-			// Abort program
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Stores given object by "visiting" it
-	 *
-	 * @param object An object implementing Storeable
-	 * @throws java.io.IOException From "inner" class
-	 */
-	@Override
-	public void store (final Storeable object) throws IOException {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("object={0} - CALLED!", object)); //NOI18N
-
-		// Object must not be null
-		if (object == null) {
-			// Abort here
-			throw new NullPointerException("object is null"); //NOI18N
-		}
-
-		// Make sure the instance is there (DataOutput flawor)
-		assert (this.storageFile instanceof DataOutput);
-
-		// Try to cast it, this will fail if the interface is not implemented
-		StoreableCsv csv = (StoreableCsv) object;
-
-		// Now get a string from the object that needs to be stored
-		String str = csv.getCsvStringFromStoreableObject();
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("str({0})={1}", str.length(), str)); //NOI18N
-
-		// Encode line in BASE-64
-		byte[] encoded = Base64.getEncoder().encode(str.getBytes());
-
-		// The string is now a valid CSV string
-		this.getStorageFile().write(encoded);
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Adds given contact to list
-	 *
-	 * @param instance An instance of FrameworkInterface to add
-	 * @param list List instance
-	 */
-	private void addToList (final Storeable instance, final List<Storeable> list) {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("contact={0} - CALLED!", instance)); //NOI18N
-
-		// No null here
-		if (instance == null) {
-			// Throw exception
-			throw new NullPointerException("contact is null"); //NOI18N
-		} else if (list == null) {
-			// Throw exception
-			throw new NullPointerException("list is null"); //NOI18N
-		}
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("contact={0}", instance)); //NOI18N
-
-		// Is the contact read?
-		if (instance instanceof FrameworkInterface) {
-			// Then add it
-			boolean added = list.add(instance);
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("contact={0} added={1}", instance, added)); //NOI18N
-
-			// Has it been added?
-			if (!added) {
-				// Not added
-				this.getLogger().warn("Contact object has not been added."); //NOI18N
-			}
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Returns storage file
-	 *
-	 * @return Storage file instance
-	 */
-	private RandomAccessFile getStorageFile () {
-		return this.storageFile;
-	}
-
-	/**
-	 * Checks whether end of file has been reached
-	 *
-	 * @return Whether lines are left to read
-	 */
-	private boolean isEndOfFile () {
-		// Default is EOF
-		boolean isEof = true;
-
-		try {
-			isEof = (this.getStorageFile().getFilePointer() >= this.length());
-		} catch (final IOException ex) {
-			// Length cannot be determined
-			this.getLogger().catching(ex);
-		}
-
-		// Return status
-		this.getLogger().trace(MessageFormat.format("isEof={0} : EXIT!", isEof)); //NOI18N
-		return isEof;
-	}
-
-	/**
-	 * Reads a line from file base
-	 *
-	 * @return Read line from file
-	 */
-	private String readLine () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Init input
-		String input = null;
-
-		try {
-			// Read single line
-			String base64 = this.getStorageFile().readLine();
-
-			// Is the line null?
-			if (base64 == null) {
-				// Then throw NPE here
-				throw new NullPointerException("base64 is null");
-			}
-
-			// Decode BASE-64
-			byte[] decoded = Base64.getDecoder().decode(base64);
-
-			// Convert to string
-			input = new String(decoded);
-		} catch (final IOException ex) {
-			this.getLogger().catching(ex);
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
-
-		// Return read string or null
-		return input;
-	}
-
-	/**
-	 * Reads the database file, if available, and adds all read lines into the
-	 * list.
-	 *
-	 * @return A list with Contact instances
-	 */
-	private List<? extends Storeable> readList () throws BadTokenException {
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// First rewind
-		this.rewind();
-
-		// Get file size and divide it by 140 (possible average length of one line)
-		int lines = Math.round(this.length() / 140 + 0.5f);
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("lines={0}", lines)); //NOI18N
-
-		// Instance list
-		// @TODO The maximum length could be guessed from file size?
-		List<Storeable> list = new ArrayList<>(lines);
-
-		// Init variables
-		String line;
-		Storeable instance = null;
-
-		// Read all lines
-		while (!this.isEndOfFile()) {
-			// Then read a line
-			line = this.readLine();
-
-			// Parse line
-			instance = this.getWrapper().parseLineToStoreable(line);
-
-			// The contact instance should be there now
-			assert (instance instanceof FrameworkInterface) : MessageFormat.format("instance is not set: {0}", instance); //NOI18N
-
-			// Add contact
-			this.addToList(instance, list);
-		}
-
-		// Return finished list
-		this.getLogger().trace(MessageFormat.format("list.size()={0} : EXIT!", list.size())); //NOI18N
-		return list;
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/backend/mysql/MySqlDatabaseBackend.java b/Addressbook/src/org/mxchange/addressbook/database/backend/mysql/MySqlDatabaseBackend.java
deleted file mode 100644
index 5d8b6ed..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/backend/mysql/MySqlDatabaseBackend.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.backend.mysql;
-
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.text.MessageFormat;
-import java.util.Iterator;
-import org.mxchange.addressbook.database.backend.BaseDatabaseBackend;
-import org.mxchange.addressbook.database.backend.DatabaseBackend;
-import org.mxchange.addressbook.database.storage.Storeable;
-import org.mxchange.addressbook.exceptions.BadTokenException;
-import org.mxchange.addressbook.exceptions.UnsupportedDatabaseDriverException;
-
-/**
- * A backend class for MySQL connections
- *
- * @author Roland Haeder
- */
-public class MySqlDatabaseBackend extends BaseDatabaseBackend implements DatabaseBackend {
-	/**
-	 * An instance of a datbase connection
-	 */
-	private static Connection connection;
-
-	/**
-	 * Prepared statement for full row count
-	 */
-	private PreparedStatement totalRowCount;
-
-	/**
-	 * Constructor with table name
-	 * 
-	 * @param tableName Table to access
-	 * @throws org.mxchange.addressbook.exceptions.UnsupportedDatabaseDriverException
-	 */
-	public MySqlDatabaseBackend (final String tableName) throws UnsupportedDatabaseDriverException {
-		// Validate driver
-		this.validateDriver("mysql"); //NOI18N
-
-		// Now that the driver is there, set the table name
-		this.setTableName(tableName);
-	}
-
-	@Override
-	public void connectToDatabase () throws SQLException {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Is the connection already there?
-		if (MySqlDatabaseBackend.connection instanceof Connection) {
-			// Already connected
-			this.getLogger().debug("Connection is already established."); //NOI18N
-
-			// No need to connect
-			return;
-		}
-
-		// Generate connection string
-		String connect = String.format("jdbc:mysql://%s/%s", //NOI18N
-				this.getProperty("database.mysql.host"), //NOI18N
-				this.getProperty("database.mysql.dbname") //NOI18N
-		);
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Attempting to connect to {0} ...", connect)); //NOI18N
-
-		// Now get a connection instance back
-		MySqlDatabaseBackend.connection = DriverManager.getConnection(
-				connect,
-				this.getProperty("database.mysql.login"), //NOI18N
-				this.getProperty("database.mysql.password") //NOI18N
-		);
-
-		// Is the connection really up?
-		if (MySqlDatabaseBackend.connection.isClosed()) {
-			// Connection is closed again
-			throw new SQLException("Connection is closed."); //NOI18N
-		}
-
-		// Debug message
-		this.getLogger().debug("Connection is up, preparing some statements ..."); //NOI18N
-
-		// Here, the connection is established, so prepare some statements
-		this.totalRowCount = MySqlDatabaseBackend.connection.prepareStatement(String.format("SELECT COUNT(`id`) AS `cnt` FROM `%s` LIMIT 1", this.getTableName())); //NOI18N
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doShutdown () {
-		// This should not happen:
-		assert(MySqlDatabaseBackend.connection instanceof Connection) : MessageFormat.format("connection is not valid: {0}", MySqlDatabaseBackend.connection); //NOI18N
-
-		try {
-			// Close down database connection
-			MySqlDatabaseBackend.connection.close();
-		} catch (final SQLException ex) {
-			// Something happened during close()
-			this.abortProgramWithException(ex);
-		}
-	}
-
-	/**
-	 * Some "getter" for row index from given boolean row value
-	 *
-	 * @param columnName Name of column
-	 * @param bool Boolean value to look for
-	 * @return Row index
-	 */
-	@Override
-	public int getRowIndexFromColumn (final String columnName, final boolean bool) {
-		throw new UnsupportedOperationException(MessageFormat.format("columnName={0},bool={1}", columnName, bool));
-	}
-
-	@Override
-	public int getTotalCount () throws SQLException {
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("tableName={0} - CALLED!", this.getTableName())); //NOI18N
-
-		// Nothing counted by default
-		int count = 0;
-
-		// Prepared statements are cool ...
-		if (this.totalRowCount.execute()) {
-			// Did fully work, so get result set
-			ResultSet set = this.totalRowCount.getResultSet();
-
-			// First rewind it
-			assert(set.last()) : ": last() failed"; //NOI18N
-
-			// Get integer from 'cnt' alias (see statement)
-			count = set.getInt("cnt"); //NOI18N
-
-			// Debug message
-			this.getLogger().debug(MessageFormat.format("count={0}", count)); //NOI18N
-
-			// Go back to beginning
-			set.beforeFirst();
-		} else {
-			// Empty result
-			this.getLogger().warn(MessageFormat.format("COUNT() query didn't return any result on table {0}.", this.getTableName())); //NOI18N
-		}
-
-		// Trace message
-		this.getLogger().trace(MessageFormat.format("count={0} - EXIT!", count)); //NOI18N
-
-		// Return result
-		return count;
-	}
-
-	/**
-	 * Checks whether at least one row is found with given boolean value.
-	 *
-	 * @param columnName Column to check for boolean value
-	 * @param bool Boolean value to check
-	 * @return Whether boolean value is found and returns at least one row
-	 */
-	@Override
-	public boolean isRowFound (final String columnName, final boolean bool) throws SQLException {
-		// Is at least one entry found?
-		if (this.getTotalCount() == 0) {
-			// No entry found at all
-			return false;
-		}
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-	
-	@Override
-	public Iterator<? extends Storeable> iterator () throws BadTokenException {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public long length () {
-		throw new UnsupportedOperationException("Not implemented for this backend."); //NOI18N
-	}
-
-	@Override
-	public Storeable readRow (final int rowIndex) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public void rewind () {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public void store (final Storeable object) throws IOException {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/frontend/BaseDatabaseFrontend.java b/Addressbook/src/org/mxchange/addressbook/database/frontend/BaseDatabaseFrontend.java
deleted file mode 100644
index 462b096..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/frontend/BaseDatabaseFrontend.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.frontend;
-
-import java.sql.SQLException;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.database.backend.DatabaseBackend;
-import org.mxchange.addressbook.database.backend.csv.Base64CsvDatabaseBackend;
-import org.mxchange.addressbook.database.backend.mysql.MySqlDatabaseBackend;
-import org.mxchange.addressbook.exceptions.UnsupportedDatabaseBackendException;
-import org.mxchange.addressbook.exceptions.UnsupportedDatabaseDriverException;
-
-/**
- * General database frontend class
- *
- * @author Roland Haeder
- */
-public abstract class BaseDatabaseFrontend extends BaseFrameworkSystem implements DatabaseFrontend {
-
-	/**
-	 * Instance for database backend
-	 */
-	private DatabaseBackend backend;
-
-	/**
-	 * No instances from this class
-	 */
-	protected BaseDatabaseFrontend () {
-	}
-
-	/**
-	 * Instance for database backend
-	 *
-	 * @return the backend
-	 */
-	protected final DatabaseBackend getBackend () {
-		return this.backend;
-	}
-
-	/**
-	 * Instance for database backend
-	 *
-	 * @param backend the backend to set
-	 */
-	protected final void setBackend (final DatabaseBackend backend) {
-		this.backend = backend;
-	}
-
-	/**
-	 * Initialize backend
-	 * 
-	 * @throws org.mxchange.addressbook.exceptions.UnsupportedDatabaseBackendException If the backend is not supported
-	 * @throws java.sql.SQLException If a SQL database backend fails to connect
-	 */
-	protected void initBackend () throws UnsupportedDatabaseBackendException, SQLException {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Read property
-		// @TODO rewrite this to own properties file
-		String backendType = this.getProperty("database.backendType"); //NOI18N
-
-		// Try it
-		try {
-			// Switch on backend type
-			switch (backendType) {
-				case "mysql": // MySQL backend, this requires more information //NOI18N
-					this.backend = new MySqlDatabaseBackend(this.getTableName());
-					break;
-
-				case "base64csv": // BASE64-encoded CSV rows //NOI18N
-					this.backend = new Base64CsvDatabaseBackend(this.getTableName(), this);
-					break;
-
-				default: // Unsupported
-					throw new UnsupportedDatabaseBackendException(backendType);
-			}
-
-			// Try to run a connect on it
-			this.backend.connectToDatabase();
-		} catch (final UnsupportedDatabaseDriverException ex) {
-			// Continue to throw
-			throw new UnsupportedDatabaseBackendException(backendType, ex);
-		}
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/frontend/DatabaseFrontend.java b/Addressbook/src/org/mxchange/addressbook/database/frontend/DatabaseFrontend.java
deleted file mode 100644
index 8df158d..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/frontend/DatabaseFrontend.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.frontend;
-
-import org.mxchange.addressbook.FrameworkInterface;
-import org.mxchange.addressbook.database.storage.Storeable;
-import org.mxchange.addressbook.exceptions.BadTokenException;
-
-/**
- * A generic interface for database frontends
- *
- * @author Roland Haeder
- */
-public interface DatabaseFrontend extends FrameworkInterface {
-	/**
-	 * Parses given line from database backend into a Storeable instance. Please
-	 * note that not all backends need this.
-	 *
-	 * @param line Line from database backend
-	 * @return A Storeable instance
-	 * @throws org.mxchange.addressbook.exceptions.BadTokenException If a token was badly formatted
-	 */
-	public Storeable parseLineToStoreable (final String line) throws BadTokenException;
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java
index ecd30b4..3731a14 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactDatabaseFrontend.java
@@ -26,12 +26,12 @@ import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.contact.book.BookContact;
 import org.mxchange.addressbook.contact.user.UserContact;
 import org.mxchange.addressbook.database.contact.ContactDatabaseConstants;
-import org.mxchange.addressbook.database.frontend.BaseDatabaseFrontend;
-import org.mxchange.addressbook.database.storage.Storeable;
-import org.mxchange.addressbook.exceptions.BadTokenException;
 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.addressbook.exceptions.UnsupportedDatabaseBackendException;
 import org.mxchange.addressbook.manager.contact.ContactManager;
+import org.mxchange.jcore.database.frontend.BaseDatabaseFrontend;
+import org.mxchange.jcore.database.storage.Storeable;
+import org.mxchange.jcore.exceptions.BadTokenException;
+import org.mxchange.jcore.exceptions.UnsupportedDatabaseBackendException;
 
 /**
  * Stores and retrieves Contact instances
diff --git a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactFrontend.java b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactFrontend.java
index 66c224a..90aff3b 100644
--- a/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactFrontend.java
+++ b/Addressbook/src/org/mxchange/addressbook/database/frontend/contact/ContactFrontend.java
@@ -18,9 +18,9 @@ package org.mxchange.addressbook.database.frontend.contact;
 
 import java.sql.SQLException;
 import org.mxchange.addressbook.contact.Contact;
-import org.mxchange.addressbook.database.frontend.DatabaseFrontend;
-import org.mxchange.addressbook.exceptions.BadTokenException;
 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
+import org.mxchange.jcore.database.frontend.DatabaseFrontend;
+import org.mxchange.jcore.exceptions.BadTokenException;
 
 /**
  *
@@ -54,7 +54,7 @@ public interface ContactFrontend extends DatabaseFrontend {
 	 * 
 	 * @param contact Contact instance to check
 	 * @return Whether the given Contact instance is found
-	 * @throws org.mxchange.addressbook.exceptions.BadTokenException Continued throw
+	 * @throws org.mxchange.jcore.exceptions.BadTokenException Continued throw
 	 */
 	public boolean isContactFound (final Contact contact) throws BadTokenException;
 
diff --git a/Addressbook/src/org/mxchange/addressbook/database/storage/Storeable.java b/Addressbook/src/org/mxchange/addressbook/database/storage/Storeable.java
deleted file mode 100644
index ee97da3..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/storage/Storeable.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.storage;
-
-import org.mxchange.addressbook.FrameworkInterface;
-
-/**
- * An interface for objects being stored in databases
- *
- * @author Roland Haeder
- */
-public interface Storeable extends FrameworkInterface {
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/database/storage/csv/StoreableCsv.java b/Addressbook/src/org/mxchange/addressbook/database/storage/csv/StoreableCsv.java
deleted file mode 100644
index faf976b..0000000
--- a/Addressbook/src/org/mxchange/addressbook/database/storage/csv/StoreableCsv.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.database.storage.csv;
-
-import org.mxchange.addressbook.database.storage.Storeable;
-
-/**
- * An interface for classes which should be storeable as a CSV string
- *
- * @author Roland Haeder
- * @deprecated This method was for an old way of storing data into
- * comma-separated value files. Now that there is BASE64-encoding, this formating
- * is no longer needed.
- */
-@Deprecated
-public interface StoreableCsv extends Storeable {
-
-	/**
-	 * Getter for a CSV-formated string from object
-	 *
-	 * @return
-	 * @deprecated See interface deprecation
-	 */
-	@Deprecated
-	public String getCsvStringFromStoreableObject ();
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/exceptions/BadTokenException.java b/Addressbook/src/org/mxchange/addressbook/exceptions/BadTokenException.java
deleted file mode 100644
index c875171..0000000
--- a/Addressbook/src/org/mxchange/addressbook/exceptions/BadTokenException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.exceptions;
-
-import java.text.MessageFormat;
-
-/**
- * This exception is thrown when a token has been badly formated. This may
- * happen when a CSV file is broken.
- *
- * @author Roland Haeder
- */
-public class BadTokenException extends Exception {
-
-	/**
-	 * Constructor with token and count
-	 * @param token Token that is not valid
-	 * @param count Count
-	 */
-	public BadTokenException (final String token, final int count) {
-		super(MessageFormat.format("Token {0} at position {1} has not double-quotes on both ends.", token, count));
-	}
-
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/exceptions/FrameAlreadyInitializedException.java b/Addressbook/src/org/mxchange/addressbook/exceptions/FrameAlreadyInitializedException.java
deleted file mode 100644
index db2c3e4..0000000
--- a/Addressbook/src/org/mxchange/addressbook/exceptions/FrameAlreadyInitializedException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.exceptions;
-
-/**
- * This exception is thrown when initFrame() is called twice.
- *
- * @author Roland Haeder
- */
-public class FrameAlreadyInitializedException extends Exception {
-
-	/**
-	 * Default constructor
-	 */
-	public FrameAlreadyInitializedException () {
-	}
-
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/exceptions/UnhandledUserChoiceException.java b/Addressbook/src/org/mxchange/addressbook/exceptions/UnhandledUserChoiceException.java
deleted file mode 100644
index 24af4b2..0000000
--- a/Addressbook/src/org/mxchange/addressbook/exceptions/UnhandledUserChoiceException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.exceptions;
-
-/**
- * This exception is thrown when the user made a valid choice but it was not
- * handled by the program.
- *
- * @author Roland Haeder
- */
-public class UnhandledUserChoiceException extends Exception {
-
-	/**
-	 *
-	 * @param message
-	 */
-	public UnhandledUserChoiceException (final String message) {
-		super(message);
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/exceptions/UnsupportedDatabaseBackendException.java b/Addressbook/src/org/mxchange/addressbook/exceptions/UnsupportedDatabaseBackendException.java
deleted file mode 100644
index c7ac7c4..0000000
--- a/Addressbook/src/org/mxchange/addressbook/exceptions/UnsupportedDatabaseBackendException.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.exceptions;
-
-import java.text.MessageFormat;
-
-/**
- * An exception thrown when the given backend type is not valid
- * 
- * @author Roland Haeder
- */
-public class UnsupportedDatabaseBackendException extends Exception {
-
-	/**
-	 *
-	 * @param backendType
-	 */
-	public UnsupportedDatabaseBackendException (final String backendType) {
-		// Call super constructor
-		super(MessageFormat.format("Backend {0} is not supported.", backendType)); //NOI18N
-	}
-
-	/**
-	 * Constructor with backend type and cause
-	 *
-	 * @param backendType Backend type
-	 * @param cause 
-	 */
-	public UnsupportedDatabaseBackendException (final String backendType, final Throwable cause) {
-		// Call super constructor
-		super(MessageFormat.format("Backend {0} is not supported.", backendType), cause); //NOI18N
-	}
-	
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/localization/bundle_de_DE.properties b/Addressbook/src/org/mxchange/addressbook/localization/bundle_de_DE.properties
deleted file mode 100644
index dfd32fc..0000000
--- a/Addressbook/src/org/mxchange/addressbook/localization/bundle_de_DE.properties
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (C) 2015 Roland Haeder
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-AddressbookFrame.border.name.title.text=Anrede, Vorname, Nachname:
-AddressbookFrame.border.address.title.text=Anschrift:
-AddressbookFrame.border.other.title.text=Andere Angaben:
-AddressbookFrame.button.addAddress.text=Adresse hinzuf\u00fcgen
-AddressbookFrame.button.cancel.text=Abbrechen
-AddressbookFrame.menu.file.text=Datei
-AddressbookFrame.menu.addressbook.text=Adressbuch
-AddressbookFrame.statusLabel.initializing.text=Initialisiere ...
-AddressbookFrame.statusLabel.done.text=Fertig.
-AddressbookFrame.statusLabel.shutdown.text=Shuttting down ...
-AddressbookFrame.menuItem.exitProgram.text=Programm beenden
-AddressbookFrame.menuItem.exitProgram.toolTipText=Beendet das Programm und speichert alle Einstellungen ab.
-AddressbookFrame.menuItem.addOwnData.text=Eigene Adresse hinzuf\u00fcgen
-AddressbookFrame.menuItem.addOwnData.toolTipText=Erlaubt das Hinzuf\u00fcgen eigener Daten.
-AddressbookFrame.menuItem.editOwnData.text=Eigene Adresse \u00e4ndern
-AddressbookFrame.menuItem.editOwnData.toolTipText=Erlaubt das \u00c4ndern eigener Daten.
-AddressbookFrame.menuItem.addNewContact.text=Neue Adresse hinzuf\u00fcgen
-AddressbookFrame.menuItem.addNewContact.toolTipText=Eine neue Adresse hinzuf\u00fcgen.
-AddressbookFrame.dialog.addContact.title.text=Neue Adresse hinzuf\u00fcgen
-AddressbookFrame.main.title.text=Adressen auflisten
-AddressbookFrame.gender.text=Anrede:
-AddressbookFrame.gender.toolTipText=W\u00e4hlen Sie die Anrede aus.
-AddressbookFrame.surname.text=Vorname:
-AddressbookFrame.surname.toolTipText=Geben Sie den Vornamen ein.
-AddressbookFrame.familyName.text=Nachname:
-AddressbookFrame.familyName.toolTipText=Geben Sie den Nachnamen ein.
-AddressbookFrame.street.text=Stra\u00dfe:
-AddressbookFrame.street.toolTipText=Geben Sie die Stra\u00dfe ein.
-AddressbookFrame.number.text=Hausnummer:
-AddressbookFrame.number.toolTipText=Geben Sie die Hausnummer ein.
-AddressbookFrame.zip.text=PLZ:
-AddressbookFrame.zip.toolTipText=Geben Sie die Postleitzahl ein.
-AddressbookFrame.city.text=Stadt:
-AddressbookFrame.city.toolTipText=Geben Sie die Stadt ein.
-AddressbookFrame.emailAddress.text=Email-Adresse:
-AddressbookFrame.emailAddress.toolTipText=Geben Sie die Email-Adresse ein.
-AddressbookFrame.phoneNumber.text=Telefon:
-AddressbookFrame.phoneNumber.toolTipText=Geben Sie die Telefonnummer ein.
-AddressbookFrame.cellphoneNumber.text=Mobil:
-AddressbookFrame.cellphoneNumber.toolTipText=Geben Sie die Handynummer ein.
-AddressbookFrame.faxNumber.text=Fax:
-AddressbookFrame.faxNumber.toolTipText=Geben Sie die Faxnummer ein.
-AddressbookFrame.comment.text=Anmerkungen:
-AddressbookFrame.comment.toolTipText=Geben Sie eine Anmerkung (Freifeld) ein.
-BaseContact.gender.unknown.text=Unbekannt
-BaseContact.gender.male.text=Herr
-BaseContact.gender.female.text=Frau
-BaseContact.gender.company.text=Firma
-ContactManager.columnName.gender.text=Anrede
-ContactManager.columnName.surname.text=Vorname
-ContactManager.columnName.familyName.text=Nachname
-ContactManager.columnName.street.text=Strasse
-ContactManager.columnName.houseNumber.text=Hausnummer
-ContactManager.columnName.zipCode.text=Postleitzahl
-ContactManager.columnName.city.text=Stadt
diff --git a/Addressbook/src/org/mxchange/addressbook/localization/bundle_en_US.properties b/Addressbook/src/org/mxchange/addressbook/localization/bundle_en_US.properties
deleted file mode 100644
index 7e36fb5..0000000
--- a/Addressbook/src/org/mxchange/addressbook/localization/bundle_en_US.properties
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (C) 2015 Roland Haeder
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-AddressbookFrame.border.name.title.text=Gender, surname, family name:
-AddressbookFrame.border.address.title.text=Address:
-AddressbookFrame.border.other.title.text=Other data:
-AddressbookFrame.button.addAddress.text=Add address
-AddressbookFrame.button.cancel.text=Cancel
-AddressbookFrame.menu.file.text=File
-AddressbookFrame.menu.addressbook.text=Addressbook
-AddressbookFrame.statusLabel.initializing.text=Initializing ...
-AddressbookFrame.statusLabel.done.text=Done.
-AddressbookFrame.statusLabel.shutdown.text=Shuttting down ...
-AddressbookFrame.menuItem.exitProgram.toolTipText=Exits the program and saves all data.
-AddressbookFrame.menuItem.exitProgram.text=Exit program
-AddressbookFrame.menuItem.addOwnData.text=Add own address
-AddressbookFrame.menuItem.addOwnData.toolTipText=Allows the user to add own address data
-AddressbookFrame.menuItem.editOwnData.text=Edit own data
-AddressbookFrame.menuItem.editOwnData.toolTipText=Allows the user to edit own address data
-AddressbookFrame.menuItem.addNewContact.text=Add new address
-AddressbookFrame.menuItem.addNewContact.toolTipText=Add a new address.
-AddressbookFrame.dialog.addContact.title.text=Add new address
-AddressbookFrame.main.title.text=List addresses
-AddressbookFrame.gender.text=Gender:
-AddressbookFrame.gender.toolTipText=Choose gender.
-AddressbookFrame.surname.text=Surname:
-AddressbookFrame.surname.toolTipText=Enter surname.
-AddressbookFrame.familyName.text=Family name:
-AddressbookFrame.familyName.toolTipText=Enter family name.
-AddressbookFrame.street.text=Street:
-AddressbookFrame.street.toolTipText=Enter street.
-AddressbookFrame.number.text=Number:
-AddressbookFrame.number.toolTipText=Enter number.
-AddressbookFrame.zip.text=ZIP:
-AddressbookFrame.zip.toolTipText=Enter zip code.
-AddressbookFrame.city.text=City:
-AddressbookFrame.city.toolTipText=Enter city.
-AddressbookFrame.emailAddress.text=Email address:
-AddressbookFrame.emailAddress.toolTipText=Enter email address.
-AddressbookFrame.phoneNumber.text=Phone:
-AddressbookFrame.phoneNumber.toolTipText=Enter phone number.
-AddressbookFrame.cellphoneNumber.text=Mobile:
-AddressbookFrame.cellphoneNumber.toolTipText=Enter mobile number.
-AddressbookFrame.faxNumber.text=Fax:
-AddressbookFrame.faxNumber.toolTipText=Enter fax number.
-AddressbookFrame.comment.text=Note:
-AddressbookFrame.comment.toolTipText=Enter a note (free field).
-BaseContact.gender.unknown.text=Unknown
-BaseContact.gender.male.text=Mr.
-BaseContact.gender.female.text=Mrs.
-BaseContact.gender.company.text=Company
-ContactManager.columnName.gender.text=Gender
-ContactManager.columnName.surname.text=Surname
-ContactManager.columnName.familyName.text=Family name
-ContactManager.columnName.street.text=Street
-ContactManager.columnName.houseNumber.text=House number
-ContactManager.columnName.zipCode.text=ZIP code
-ContactManager.columnName.city.text=City
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/BaseManager.java b/Addressbook/src/org/mxchange/addressbook/manager/BaseManager.java
deleted file mode 100644
index 4dae2b1..0000000
--- a/Addressbook/src/org/mxchange/addressbook/manager/BaseManager.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.manager;
-
-import org.mxchange.addressbook.BaseFrameworkSystem;
-
-/**
- * A general manager
- *
- * @author Roland Haeder
- * @version 0.0
- */
-public class BaseManager extends BaseFrameworkSystem implements Manageable {
-
-	/**
-	 * No instances can be created of this class
-	 */
-	protected BaseManager () {
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/Manageable.java b/Addressbook/src/org/mxchange/addressbook/manager/Manageable.java
deleted file mode 100644
index af3cc6c..0000000
--- a/Addressbook/src/org/mxchange/addressbook/manager/Manageable.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.manager;
-
-import org.mxchange.addressbook.FrameworkInterface;
-
-/**
- *
- * @author Roland Haeder
- */
-public interface Manageable extends FrameworkInterface {
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/application/ApplicationManager.java b/Addressbook/src/org/mxchange/addressbook/manager/application/ApplicationManager.java
deleted file mode 100644
index 9a74efb..0000000
--- a/Addressbook/src/org/mxchange/addressbook/manager/application/ApplicationManager.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.manager.application;
-
-import org.mxchange.addressbook.application.Application;
-import org.mxchange.addressbook.manager.BaseManager;
-
-/**
- *
- * @author Roland Haeder
- */
-public class ApplicationManager extends BaseManager implements ManageableApplication {
-
-	/**
-	 * Getter for application manager
-	 *
-	 * @param application An instance of a Application class
-	 * @return
-	 */
-	public static final ManageableApplication getManager (final Application application) {
-		// Application instance must be set
-		if (application == null) {
-			// Abort here
-			throw new NullPointerException("application is null"); //NOI18N
-		}
-
-		// Get manager
-		ManageableApplication manager = new ApplicationManager(application);
-
-		// Return manager
-		return manager;
-	}
-
-	/**
-	 * Constructor for this manager
-	 *
-	 * @param application An instance of an Application class
-	 */
-	private ApplicationManager (final Application application) {
-		// Application instance must be set
-		if (application == null) {
-			// Abort here
-			throw new NullPointerException("application is null"); //NOI18N
-		}
-
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Set application instance
-		this.setApplication(application);
-	}
-
-	@Override
-	public void start () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Bootstrap application
-		this.getApplication().doBootstrap();
-
-		// Run the main loop
-		this.getApplication().doMainLoop();
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/application/ManageableApplication.java b/Addressbook/src/org/mxchange/addressbook/manager/application/ManageableApplication.java
deleted file mode 100644
index 8e732e7..0000000
--- a/Addressbook/src/org/mxchange/addressbook/manager/application/ManageableApplication.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.manager.application;
-
-import org.mxchange.addressbook.manager.Manageable;
-
-/**
- *
- * @author Roland Haeder
- */
-public interface ManageableApplication extends Manageable {
-
-	/**
-	 * Launches application
-	 */
-	public void start ();
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java b/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
index 4613e0d..4191f0c 100644
--- a/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
+++ b/Addressbook/src/org/mxchange/addressbook/manager/contact/ContactManager.java
@@ -22,15 +22,16 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.client.AddressbookClient;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.database.frontend.contact.ContactDatabaseFrontend;
 import org.mxchange.addressbook.database.frontend.contact.ContactFrontend;
-import org.mxchange.addressbook.exceptions.BadTokenException;
 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.addressbook.exceptions.UnhandledUserChoiceException;
-import org.mxchange.addressbook.manager.BaseManager;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.exceptions.BadTokenException;
+import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
+import org.mxchange.jcore.manager.BaseManager;
 
 /**
  * A manager for contacts, please note that this implementation loads the whole
@@ -136,13 +137,16 @@ public class ContactManager extends BaseManager implements ManageableContact {
 			throw new NullPointerException("contact is null"); //NOI18N
 		}
 
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
 		// First display it again
-		this.getClient().displayAddressBox(contact);
+		client.displayAddressBox(contact);
 
 		// Is it own data?
 		if (contact.isOwnContact()) {
 			// Deligate to client
-			this.getClient().doChangeOwnAddressData(contact);
+			client.doChangeOwnAddressData(contact);
 		} else {
 			// Other contact's address data to change
 			throw new UnsupportedOperationException("Changing contact entries not finished."); //NOI18N
@@ -168,13 +172,16 @@ public class ContactManager extends BaseManager implements ManageableContact {
 			throw new NullPointerException("contact is null"); //NOI18N
 		}
 
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
 		// First display them again
-		this.getClient().displayNameBox(contact);
+		client.displayNameBox(contact);
 
 		// Is this own data?
 		if (contact.isOwnContact()) {
 			// Re-ask own data
-			this.getClient().doChangeOwnNameData(contact);
+			client.doChangeOwnNameData(contact);
 		} else {
 			// Then re-ask them ...
 			throw new UnsupportedOperationException("Changing contact entries not finished."); //NOI18N
@@ -209,13 +216,16 @@ public class ContactManager extends BaseManager implements ManageableContact {
 			throw new NullPointerException("contact is null"); //NOI18N
 		}
 
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
 		// First display them again
-		this.getClient().displayOtherDataBox(contact);
+		client.displayOtherDataBox(contact);
 
 		// Is this own data?
 		if (contact.isOwnContact()) {
 			// Re-ask own data
-			this.getClient().doChangeOwnOtherData(contact);
+			client.doChangeOwnOtherData(contact);
 		} else {
 			// Then re-ask them ...
 			throw new UnsupportedOperationException("Changing contact entries not finished."); //NOI18N
@@ -254,9 +264,12 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Display contact
 		contact.show(this.getClient());
 
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
 		try {
 			// Ask user what to change
-			this.getClient().userChooseChangeContactData(contact);
+			client.userChooseChangeContactData(contact);
 		} catch (final UnhandledUserChoiceException ex) {
 			this.getLogger().catching(ex);
 		}
@@ -287,8 +300,11 @@ public class ContactManager extends BaseManager implements ManageableContact {
 			throw new ContactAlreadyAddedException();
 		}
 
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
 		// Deligate this call to the client
-		Contact contact = this.getClient().doEnterOwnData();
+		Contact contact = client.doEnterOwnData();
 
 		// Is it set?
 		if (contact instanceof Contact) {
@@ -335,7 +351,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(5, 30, "Bitte geben Sie Ihre Handynummer an: ", true);
 	}
 
 	/**
@@ -348,7 +367,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(3, 50, "Bitte geben Sie Ihre Wohnort ein: ", false);
 	}
 
 	/**
@@ -361,7 +383,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(0, 100, "Kommentar zu Ihrem Eintrag: ", true);
 	}
 
 	/**
@@ -374,7 +399,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(5, 50, "Bitte geben Sie Ihre Firmenbezeichnung ein: ", true);
 	}
 
 	/**
@@ -387,7 +415,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(2, 2, "Bitte geben Sie den zweistelligen Ländercode von Ihrem Land ein: ", false).toUpperCase();
 	}
 
 	/**
@@ -400,7 +431,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(10, 50, "Bitte geben Sie Ihre Email-Adresse ein: ", true);
 	}
 
 	/**
@@ -413,7 +447,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(2, 50, "Bitte geben Sie Ihren Nachnamen ein: ", false);
 	}
 
 	/**
@@ -426,7 +463,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(5, 30, "Bitte geben Sie Ihre Faxnummer an: ", true);
 	}
 
 	/**
@@ -439,7 +479,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterGender("Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterGender("Bitte geben Sie die Anrede ein: (M=Herr, F=Frau, C=Firma): ");
 	}
 
 	/**
@@ -452,7 +495,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(5, 30, "Bitte geben Sie Ihre Telefonnummer an: ", true);
 	}
 
 	/**
@@ -465,7 +511,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(5, 50, "Bitte geben Sie Ihre Strasse und Hausnummer ein: ", false);
 	}
 
 	/**
@@ -478,7 +527,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterString(2, 50, "Bitte geben Sie Ihren Vornamen ein: ", false);
 	}
 
 	/**
@@ -491,7 +543,10 @@ public class ContactManager extends BaseManager implements ManageableContact {
 		// Trace message
 		this.getLogger().trace("CALLED!"); //NOI18N
 
-		return this.getClient().enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");
+		// Get and cast client instance
+		AddressbookClient client = (AddressbookClient) this.getClient();
+
+		return client.enterInt(0, 99_999, "Bitte geben Sie Ihre Postleitzahl ein: ");
 	}
 
 	@Override
diff --git a/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java b/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java
index 1dd2fc9..cc22934 100644
--- a/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java
+++ b/Addressbook/src/org/mxchange/addressbook/manager/contact/ManageableContact.java
@@ -19,19 +19,13 @@ package org.mxchange.addressbook.manager.contact;
 import org.mxchange.addressbook.contact.Contact;
 import org.mxchange.addressbook.contact.Gender;
 import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.addressbook.manager.Manageable;
+import org.mxchange.jcore.manager.Manageable;
 
 /**
  *
  * @author Roland Haeder
  */
 public interface ManageableContact extends Manageable {
-
-	/**
-	 * Shuts down this contact manager
-	 */
-	public void doShutdown ();
-
 	/**
 	 * Allows the user to enter own cellphone number.
 	 *
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/AddressbookMenu.java b/Addressbook/src/org/mxchange/addressbook/menu/AddressbookMenu.java
index af29b11..12257eb 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/AddressbookMenu.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/AddressbookMenu.java
@@ -19,16 +19,17 @@ package org.mxchange.addressbook.menu;
 import java.text.MessageFormat;
 import java.util.List;
 import org.apache.logging.log4j.Logger;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.BaseAddressbookSystem;
+import org.mxchange.addressbook.client.AddressbookClient;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
 
 /**
  * Utility class for menu structure
  *
  * @author Roland Haeder
  */
-public class AddressbookMenu extends BaseFrameworkSystem {
+public class AddressbookMenu extends BaseAddressbookSystem {
 
 	/**
 	 * Copies entries for given type into the menu list
@@ -51,8 +52,14 @@ public class AddressbookMenu extends BaseFrameworkSystem {
 		} else if (client == null) {
 			// Abort here
 			throw new NullPointerException("contact is null"); //NOI18N
+		} else if (!(client instanceof AddressbookClient)) {
+			// Not correct instance
+			throw new IllegalArgumentException(MessageFormat.format("client{0} must implement AddressbookClient", client));
 		}
 
+		// Cast client to proper interface
+		AddressbookClient c = (AddressbookClient) client;
+
 		// Get list size
 		int size = menuList.size();
 
@@ -63,28 +70,28 @@ public class AddressbookMenu extends BaseFrameworkSystem {
 		switch (menuType) {
 			case "main": // Main menu //NOI18N
 				// Enter own data
-				menuList.add(client.getMenuItem('1', "Eigene Adresse anlegen"));
+				menuList.add(c.getMenuItem('1', "Eigene Adresse anlegen"));
 
 				// Change own data
-				menuList.add(client.getMenuItem('2', "Eigene Adresse ändern"));
+				menuList.add(c.getMenuItem('2', "Eigene Adresse ändern"));
 
 				// Add new addess
-				menuList.add(client.getMenuItem('3', "Neue Adresse hinzufügen"));
+				menuList.add(c.getMenuItem('3', "Neue Adresse hinzufügen"));
 
 				// List entries
-				menuList.add(client.getMenuItem('4', "Adressbuch anzeigen"));
+				menuList.add(c.getMenuItem('4', "Adressbuch anzeigen"));
 
 				// Address search
-				menuList.add(client.getMenuItem('5', "Adresse suchen"));
+				menuList.add(c.getMenuItem('5', "Adresse suchen"));
 
 				// Change other address
-				menuList.add(client.getMenuItem('6', "Adresse ändern"));
+				menuList.add(c.getMenuItem('6', "Adresse ändern"));
 
 				// Delete other address
-				menuList.add(client.getMenuItem('7', "Adresse löschen"));
+				menuList.add(c.getMenuItem('7', "Adresse löschen"));
 
 				// Always last line: Exit program
-				menuList.add(client.getMenuItem('0', "Programm verlassen"));
+				menuList.add(c.getMenuItem('0', "Programm verlassen"));
 				break;
 
 			default: // Not supported
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/BaseMenu.java b/Addressbook/src/org/mxchange/addressbook/menu/BaseMenu.java
index 5d1785d..f554820 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/BaseMenu.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/BaseMenu.java
@@ -20,15 +20,16 @@ import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.BaseAddressbookSystem;
+import org.mxchange.addressbook.client.AddressbookClient;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
 
 /**
  *
  * @author Roland Haeder
  */
-public class BaseMenu extends BaseFrameworkSystem {
+public class BaseMenu extends BaseAddressbookSystem {
 
 	/**
 	 * Menu list
@@ -86,7 +87,7 @@ public class BaseMenu extends BaseFrameworkSystem {
 			SelectableMenuItem item = iterator.next();
 
 			// Show this item
-			item.show(client);
+			item.show((AddressbookClient) client);
 		}
 
 		// Trace message
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/Menu.java b/Addressbook/src/org/mxchange/addressbook/menu/Menu.java
index 872719e..78a5fb1 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/Menu.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/Menu.java
@@ -17,8 +17,8 @@
 package org.mxchange.addressbook.menu;
 
 import java.util.Iterator;
-import org.mxchange.addressbook.client.Client;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
 
 /**
  *
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/MenuTools.java b/Addressbook/src/org/mxchange/addressbook/menu/MenuTools.java
index f1c1f2c..30d8164 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/MenuTools.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/MenuTools.java
@@ -19,14 +19,14 @@ package org.mxchange.addressbook.menu;
 import java.util.Iterator;
 import java.util.Map;
 import org.apache.logging.log4j.Logger;
-import org.mxchange.addressbook.BaseFrameworkSystem;
+import org.mxchange.addressbook.BaseAddressbookSystem;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
 
 /**
  *
  * @author Roland Haeder
  */
-public class MenuTools extends BaseFrameworkSystem {
+public class MenuTools extends BaseAddressbookSystem {
 
 	/**
 	 * Gets an array with all available access keys back from given menu map.
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java b/Addressbook/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java
index 6eff64f..5139c00 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java
@@ -17,10 +17,11 @@
 package org.mxchange.addressbook.menu.console;
 
 import java.text.MessageFormat;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.client.AddressbookClient;
 import org.mxchange.addressbook.menu.AddressbookMenu;
 import org.mxchange.addressbook.menu.BaseMenu;
 import org.mxchange.addressbook.menu.Menu;
+import org.mxchange.jcore.client.Client;
 
 /**
  *
@@ -48,6 +49,6 @@ public class ConsoleMenu extends BaseMenu implements Menu {
 		this.initMenu(menuType, client);
 
 		// Add all items
-		AddressbookMenu.addItemsToList(this.getMenuList(), menuType, client);
+		AddressbookMenu.addItemsToList(this.getMenuList(), menuType, (AddressbookClient) client);
 	}
 }
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java b/Addressbook/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java
index bc1bba7..4bb1cf9 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/item/BaseMenuItem.java
@@ -1,27 +1,27 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.menu.item;
-
-import org.mxchange.addressbook.BaseFrameworkSystem;
-
-/**
- *
- * @author Roland Haeder
- */
-public class BaseMenuItem extends BaseFrameworkSystem {
-
-}
+/*
+ * Copyright (C) 2015 Roland Haeder
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.mxchange.addressbook.menu.item;
+
+import org.mxchange.addressbook.BaseAddressbookSystem;
+
+/**
+ *
+ * @author Roland Haeder
+ */
+public class BaseMenuItem extends BaseAddressbookSystem {
+
+}
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java b/Addressbook/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java
index 22ed008..a6de00a 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/item/SelectableMenuItem.java
@@ -16,7 +16,7 @@
  */
 package org.mxchange.addressbook.menu.item;
 
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.jcore.client.Client;
 
 /**
  *
diff --git a/Addressbook/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java b/Addressbook/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java
index 8b863cd..1090a63 100644
--- a/Addressbook/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java
+++ b/Addressbook/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java
@@ -17,9 +17,10 @@
 package org.mxchange.addressbook.menu.item.console;
 
 import java.text.MessageFormat;
-import org.mxchange.addressbook.client.Client;
+import org.mxchange.addressbook.client.AddressbookClient;
 import org.mxchange.addressbook.menu.item.BaseMenuItem;
 import org.mxchange.addressbook.menu.item.SelectableMenuItem;
+import org.mxchange.jcore.client.Client;
 
 /**
  *
@@ -58,6 +59,15 @@ public class ConsoleMenuItem extends BaseMenuItem implements SelectableMenuItem
 		return this.accessKey;
 	}
 
+	/**
+	 * Access key
+	 *
+	 * @param accessKey the accessKey to set
+	 */
+	private void setAccessKey (char accessKey) {
+		this.accessKey = accessKey;
+	}
+
 	/**
 	 * Text to user
 	 *
@@ -68,6 +78,15 @@ public class ConsoleMenuItem extends BaseMenuItem implements SelectableMenuItem
 		return this.text;
 	}
 
+	/**
+	 * Text to user
+	 *
+	 * @param text the text to set
+	 */
+	private void setText (String text) {
+		this.text = text;
+	}
+
 	@Override
 	public void show (final Client client) {
 		// Trace message
@@ -77,31 +96,19 @@ public class ConsoleMenuItem extends BaseMenuItem implements SelectableMenuItem
 		if (client == null) {
 			// Abort here
 			throw new NullPointerException("client is null");
+		} else if (!(client instanceof AddressbookClient)) {
+			// Wrong interface
+			throw new IllegalArgumentException("client " + client + " must implement AddressbookClient");
 		}
 
+		// Cast it
+		AddressbookClient c = (AddressbookClient) client;
+
 		// Call-back client over menu
-		client.showEntry(this);
+		c.showEntry(this);
 
 		// Trace message
 		this.getLogger().trace("EXIT!"); //NOI18N
 	}
 
-	/**
-	 * Text to user
-	 *
-	 * @param text the text to set
-	 */
-	private void setText (String text) {
-		this.text = text;
-	}
-
-	/**
-	 * Access key
-	 *
-	 * @param accessKey the accessKey to set
-	 */
-	private void setAccessKey (char accessKey) {
-		this.accessKey = accessKey;
-	}
-
 }
diff --git a/Addressbook/src/org/mxchange/addressbook/model/BaseModel.java b/Addressbook/src/org/mxchange/addressbook/model/BaseModel.java
deleted file mode 100644
index c55261c..0000000
--- a/Addressbook/src/org/mxchange/addressbook/model/BaseModel.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2015 Roland Haeder
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.mxchange.addressbook.model;
-
-import java.text.MessageFormat;
-import javax.swing.event.EventListenerList;
-import javax.swing.event.ListDataListener;
-import javax.swing.event.TableModelListener;
-import org.mxchange.addressbook.BaseFrameworkSystem;
-
-/**
- *
- * @author Roland Haeder
- */
-public class BaseModel extends BaseFrameworkSystem {
-
-	/**
-	 * List of event listeners
-	 */
-	private final EventListenerList eventListenerList;
-
-	/**
-	 * Protected constructor
-	 */
-	protected BaseModel () {
-		// Trace message
-		this.getLogger().trace("CALLED!"); //NOI18N
-
-		// Init listener list
-		this.eventListenerList = new EventListenerList();
-	}
-
-	/**
-	 * Adds a lister of this type to the list
-	 *
-	 * @param listener Listener instance
-	 */
-	public void addListDataListener (final ListDataListener listener) {
-		// Trace message
-		this.getLogger().trace("listener=" + listener + " - CALLED!"); //NOI18N
-
-		// Listener must not be null
-		if (listener == null) {
-			// Abort here
-			throw new NullPointerException("listener is null");
-		}
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Adding listener {0} ...", listener.getClass()));
-
-		// Remove listener
-		this.eventListenerList.add(ListDataListener.class, listener);
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Adds a TableModel listener instance to the event list.
-	 *
-	 * @param listener Lister instance
-	 */
-	public void addTableModelListener (final TableModelListener listener) {
-		// Trace message
-		this.getLogger().trace("listener=" + listener + " - CALLED!"); //NOI18N
-
-		// Listener must not be null
-		if (listener == null) {
-			// Abort here
-			throw new NullPointerException("listener is null");
-		}
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Adding listener {0} ...", listener.getClass()));
-
-		// Add listener
-		this.eventListenerList.add(TableModelListener.class, listener);
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Removes given listener
-	 *
-	 * @param listener Listener instance
-	 */
-	public void removeListDataListener (final ListDataListener listener) {
-		// Trace message
-		this.getLogger().trace("listener=" + listener + " - CALLED!"); //NOI18N
-
-		// Listener must not be null
-		if (listener == null) {
-			// Abort here
-			throw new NullPointerException("listener is null");
-		}
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Removing listener {0} ...", listener.getClass()));
-
-		// Remove listener
-		this.eventListenerList.remove(ListDataListener.class, listener);
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Removes a TableModel listener instance from the event list.
-	 *
-	 * @param listener Listener instance
-	 */
-	public void removeTableModelListener (final TableModelListener listener) {
-		// Trace message
-		this.getLogger().trace("listener=" + listener + " - CALLED!"); //NOI18N
-
-		// Listener must not be null
-		if (listener == null) {
-			// Abort here
-			throw new NullPointerException("listener is null");
-		}
-
-		// Debug message
-		this.getLogger().debug(MessageFormat.format("Removing listener {0} ...", listener.getClass()));
-
-		// Remove listener
-		this.eventListenerList.remove(TableModelListener.class, listener);
-
-		// Trace message
-		this.getLogger().trace("EXIT!"); //NOI18N
-	}
-}
diff --git a/Addressbook/src/org/mxchange/addressbook/model/contact/ContactTableModel.java b/Addressbook/src/org/mxchange/addressbook/model/contact/ContactTableModel.java
index d0e2866..6c3b930 100644
--- a/Addressbook/src/org/mxchange/addressbook/model/contact/ContactTableModel.java
+++ b/Addressbook/src/org/mxchange/addressbook/model/contact/ContactTableModel.java
@@ -18,8 +18,9 @@ package org.mxchange.addressbook.model.contact;
 
 import java.text.MessageFormat;
 import javax.swing.table.TableModel;
-import org.mxchange.addressbook.client.Client;
-import org.mxchange.addressbook.model.BaseModel;
+import org.mxchange.addressbook.manager.contact.ManageableContact;
+import org.mxchange.jcore.client.Client;
+import org.mxchange.jcore.model.BaseModel;
 
 /**
  * A table model for contacts
@@ -55,26 +56,38 @@ public class ContactTableModel extends BaseModel implements TableModel {
 
 	@Override
 	public int getColumnCount () {
+		// Get manager
+		ManageableContact manager = (ManageableContact) this.getClient().getManager();
+
 		// Deligate this call to contact manager
-		return this.getClient().getContactManager().getColumnCount();
+		return manager.getColumnCount();
 	}
 
 	@Override
 	public String getColumnName (final int columnIndex) {
+		// Get manager
+		ManageableContact manager = (ManageableContact) this.getClient().getManager();
+
 		// Deligate this call to contact manager
-		return this.getClient().getContactManager().getTranslatedColumnName(columnIndex);
+		return manager.getTranslatedColumnName(columnIndex);
 	}
 
 	@Override
 	public int getRowCount () {
+		// Get manager
+		ManageableContact manager = (ManageableContact) this.getClient().getManager();
+
 		// Deligate this call to contact manager
-		return this.getClient().getContactManager().size();
+		return manager.size();
 	}
 
 	@Override
 	public Object getValueAt (final int rowIndex, final int columnIndex) {
-		// Let the manager do this job for us
-		return this.getClient().getContactManager().getValueFromRowColumn(rowIndex, columnIndex);
+		// Get manager
+		ManageableContact manager = (ManageableContact) this.getClient().getManager();
+
+		// Deligate this call to contact manager
+		return manager.getValueFromRowColumn(rowIndex, columnIndex);
 	}
 
 	@Override
diff --git a/Addressbook/src/org/mxchange/localization/bundle_de_DE.properties b/Addressbook/src/org/mxchange/localization/bundle_de_DE.properties
new file mode 100644
index 0000000..dfd32fc
--- /dev/null
+++ b/Addressbook/src/org/mxchange/localization/bundle_de_DE.properties
@@ -0,0 +1,70 @@
+# Copyright (C) 2015 Roland Haeder
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AddressbookFrame.border.name.title.text=Anrede, Vorname, Nachname:
+AddressbookFrame.border.address.title.text=Anschrift:
+AddressbookFrame.border.other.title.text=Andere Angaben:
+AddressbookFrame.button.addAddress.text=Adresse hinzuf\u00fcgen
+AddressbookFrame.button.cancel.text=Abbrechen
+AddressbookFrame.menu.file.text=Datei
+AddressbookFrame.menu.addressbook.text=Adressbuch
+AddressbookFrame.statusLabel.initializing.text=Initialisiere ...
+AddressbookFrame.statusLabel.done.text=Fertig.
+AddressbookFrame.statusLabel.shutdown.text=Shuttting down ...
+AddressbookFrame.menuItem.exitProgram.text=Programm beenden
+AddressbookFrame.menuItem.exitProgram.toolTipText=Beendet das Programm und speichert alle Einstellungen ab.
+AddressbookFrame.menuItem.addOwnData.text=Eigene Adresse hinzuf\u00fcgen
+AddressbookFrame.menuItem.addOwnData.toolTipText=Erlaubt das Hinzuf\u00fcgen eigener Daten.
+AddressbookFrame.menuItem.editOwnData.text=Eigene Adresse \u00e4ndern
+AddressbookFrame.menuItem.editOwnData.toolTipText=Erlaubt das \u00c4ndern eigener Daten.
+AddressbookFrame.menuItem.addNewContact.text=Neue Adresse hinzuf\u00fcgen
+AddressbookFrame.menuItem.addNewContact.toolTipText=Eine neue Adresse hinzuf\u00fcgen.
+AddressbookFrame.dialog.addContact.title.text=Neue Adresse hinzuf\u00fcgen
+AddressbookFrame.main.title.text=Adressen auflisten
+AddressbookFrame.gender.text=Anrede:
+AddressbookFrame.gender.toolTipText=W\u00e4hlen Sie die Anrede aus.
+AddressbookFrame.surname.text=Vorname:
+AddressbookFrame.surname.toolTipText=Geben Sie den Vornamen ein.
+AddressbookFrame.familyName.text=Nachname:
+AddressbookFrame.familyName.toolTipText=Geben Sie den Nachnamen ein.
+AddressbookFrame.street.text=Stra\u00dfe:
+AddressbookFrame.street.toolTipText=Geben Sie die Stra\u00dfe ein.
+AddressbookFrame.number.text=Hausnummer:
+AddressbookFrame.number.toolTipText=Geben Sie die Hausnummer ein.
+AddressbookFrame.zip.text=PLZ:
+AddressbookFrame.zip.toolTipText=Geben Sie die Postleitzahl ein.
+AddressbookFrame.city.text=Stadt:
+AddressbookFrame.city.toolTipText=Geben Sie die Stadt ein.
+AddressbookFrame.emailAddress.text=Email-Adresse:
+AddressbookFrame.emailAddress.toolTipText=Geben Sie die Email-Adresse ein.
+AddressbookFrame.phoneNumber.text=Telefon:
+AddressbookFrame.phoneNumber.toolTipText=Geben Sie die Telefonnummer ein.
+AddressbookFrame.cellphoneNumber.text=Mobil:
+AddressbookFrame.cellphoneNumber.toolTipText=Geben Sie die Handynummer ein.
+AddressbookFrame.faxNumber.text=Fax:
+AddressbookFrame.faxNumber.toolTipText=Geben Sie die Faxnummer ein.
+AddressbookFrame.comment.text=Anmerkungen:
+AddressbookFrame.comment.toolTipText=Geben Sie eine Anmerkung (Freifeld) ein.
+BaseContact.gender.unknown.text=Unbekannt
+BaseContact.gender.male.text=Herr
+BaseContact.gender.female.text=Frau
+BaseContact.gender.company.text=Firma
+ContactManager.columnName.gender.text=Anrede
+ContactManager.columnName.surname.text=Vorname
+ContactManager.columnName.familyName.text=Nachname
+ContactManager.columnName.street.text=Strasse
+ContactManager.columnName.houseNumber.text=Hausnummer
+ContactManager.columnName.zipCode.text=Postleitzahl
+ContactManager.columnName.city.text=Stadt
diff --git a/Addressbook/src/org/mxchange/localization/bundle_en_US.properties b/Addressbook/src/org/mxchange/localization/bundle_en_US.properties
new file mode 100644
index 0000000..7e36fb5
--- /dev/null
+++ b/Addressbook/src/org/mxchange/localization/bundle_en_US.properties
@@ -0,0 +1,70 @@
+# Copyright (C) 2015 Roland Haeder
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AddressbookFrame.border.name.title.text=Gender, surname, family name:
+AddressbookFrame.border.address.title.text=Address:
+AddressbookFrame.border.other.title.text=Other data:
+AddressbookFrame.button.addAddress.text=Add address
+AddressbookFrame.button.cancel.text=Cancel
+AddressbookFrame.menu.file.text=File
+AddressbookFrame.menu.addressbook.text=Addressbook
+AddressbookFrame.statusLabel.initializing.text=Initializing ...
+AddressbookFrame.statusLabel.done.text=Done.
+AddressbookFrame.statusLabel.shutdown.text=Shuttting down ...
+AddressbookFrame.menuItem.exitProgram.toolTipText=Exits the program and saves all data.
+AddressbookFrame.menuItem.exitProgram.text=Exit program
+AddressbookFrame.menuItem.addOwnData.text=Add own address
+AddressbookFrame.menuItem.addOwnData.toolTipText=Allows the user to add own address data
+AddressbookFrame.menuItem.editOwnData.text=Edit own data
+AddressbookFrame.menuItem.editOwnData.toolTipText=Allows the user to edit own address data
+AddressbookFrame.menuItem.addNewContact.text=Add new address
+AddressbookFrame.menuItem.addNewContact.toolTipText=Add a new address.
+AddressbookFrame.dialog.addContact.title.text=Add new address
+AddressbookFrame.main.title.text=List addresses
+AddressbookFrame.gender.text=Gender:
+AddressbookFrame.gender.toolTipText=Choose gender.
+AddressbookFrame.surname.text=Surname:
+AddressbookFrame.surname.toolTipText=Enter surname.
+AddressbookFrame.familyName.text=Family name:
+AddressbookFrame.familyName.toolTipText=Enter family name.
+AddressbookFrame.street.text=Street:
+AddressbookFrame.street.toolTipText=Enter street.
+AddressbookFrame.number.text=Number:
+AddressbookFrame.number.toolTipText=Enter number.
+AddressbookFrame.zip.text=ZIP:
+AddressbookFrame.zip.toolTipText=Enter zip code.
+AddressbookFrame.city.text=City:
+AddressbookFrame.city.toolTipText=Enter city.
+AddressbookFrame.emailAddress.text=Email address:
+AddressbookFrame.emailAddress.toolTipText=Enter email address.
+AddressbookFrame.phoneNumber.text=Phone:
+AddressbookFrame.phoneNumber.toolTipText=Enter phone number.
+AddressbookFrame.cellphoneNumber.text=Mobile:
+AddressbookFrame.cellphoneNumber.toolTipText=Enter mobile number.
+AddressbookFrame.faxNumber.text=Fax:
+AddressbookFrame.faxNumber.toolTipText=Enter fax number.
+AddressbookFrame.comment.text=Note:
+AddressbookFrame.comment.toolTipText=Enter a note (free field).
+BaseContact.gender.unknown.text=Unknown
+BaseContact.gender.male.text=Mr.
+BaseContact.gender.female.text=Mrs.
+BaseContact.gender.company.text=Company
+ContactManager.columnName.gender.text=Gender
+ContactManager.columnName.surname.text=Surname
+ContactManager.columnName.familyName.text=Family name
+ContactManager.columnName.street.text=Street
+ContactManager.columnName.houseNumber.text=House number
+ContactManager.columnName.zipCode.text=ZIP code
+ContactManager.columnName.city.text=City