From 5062296af62bf6fa63c2a440d47cca4edcda78d1 Mon Sep 17 00:00:00 2001
From: Roland Haeder <roland@mxchange.org>
Date: Thu, 1 Oct 2015 09:59:40 +0200
Subject: [PATCH] =?utf8?q?splitted=20project=20into=20lib=20and=20swing=20?=
 =?utf8?q?(anyway=20a=20good=20idea)=20Signed-off-by:Roland=20H=C3=A4der?=
 =?utf8?q?=20<roland@mxchange.org>?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 build.xml                                     |    6 +-
 nbproject/genfiles.properties                 |    4 +-
 nbproject/project.properties                  |    4 +-
 nbproject/project.xml                         |    2 +-
 .../application/AddressbookApplication.java   |  393 -------
 .../client/console/ConsoleClient.java         |  679 -----------
 .../client/gui/AddressbookFrame.java          | 1026 -----------------
 .../addressbook/client/gui/SwingClient.java   |  239 ----
 .../addressbook/menu/console/ConsoleMenu.java |   54 -
 .../menu/item/console/ConsoleMenuItem.java    |  105 --
 .../localization/bundle_de_DE.properties      |   69 --
 .../localization/bundle_en_US.properties      |   69 --
 12 files changed, 8 insertions(+), 2642 deletions(-)
 delete mode 100644 src/org/mxchange/addressbook/application/AddressbookApplication.java
 delete mode 100644 src/org/mxchange/addressbook/client/console/ConsoleClient.java
 delete mode 100644 src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
 delete mode 100644 src/org/mxchange/addressbook/client/gui/SwingClient.java
 delete mode 100644 src/org/mxchange/addressbook/menu/console/ConsoleMenu.java
 delete mode 100644 src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java
 delete mode 100644 src/org/mxchange/localization/bundle_de_DE.properties
 delete mode 100644 src/org/mxchange/localization/bundle_en_US.properties

diff --git a/build.xml b/build.xml
index e2f0ff89..878a1049 100644
--- a/build.xml
+++ b/build.xml
@@ -7,8 +7,8 @@
 <!-- the Compile on Save feature is turned off for the project. -->
 <!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
 <!-- in the project's Project Properties dialog box.-->
-<project name="addressbook" default="default" basedir=".">
-    <description>Builds, tests, and runs the project addressbook.</description>
+<project name="addressbook-lib" default="default" basedir=".">
+    <description>Builds, tests, and runs the project addressbook-lib.</description>
     <import file="nbproject/build-impl.xml"/>
     <!--
 
@@ -58,7 +58,7 @@
 
     An example of overriding the target for project execution could look like this:
 
-        <target name="run" depends="addressbook-impl.jar">
+        <target name="run" depends="addressbook-lib-impl.jar">
             <exec dir="bin" executable="launcher.exe">
                 <arg file="${dist.jar}"/>
             </exec>
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
index 87b13598..a91cda39 100644
--- a/nbproject/genfiles.properties
+++ b/nbproject/genfiles.properties
@@ -1,5 +1,5 @@
-build.xml.data.CRC32=9ad00d87
-build.xml.script.CRC32=8387809e
+build.xml.data.CRC32=5c7b88c5
+build.xml.script.CRC32=3172ff94
 build.xml.stylesheet.CRC32=8064a381@1.75.2.48
 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
diff --git a/nbproject/project.properties b/nbproject/project.properties
index fcba7648..425beda7 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -3,7 +3,7 @@ annotation.processing.enabled.in.editor=true
 annotation.processing.processors.list=
 annotation.processing.run.all.processors=true
 annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
-application.title=addressbook
+application.title=addressbook-lib
 application.vendor=Roland Haeder
 auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml
 build.classes.dir=${build.dir}/classes
@@ -26,7 +26,7 @@ debug.test.classpath=\
 dist.archive.excludes=
 # This directory is removed when the project is cleaned:
 dist.dir=dist
-dist.jar=${dist.dir}/addressbook.jar
+dist.jar=${dist.dir}/addressbook-lib.jar
 dist.javadoc.dir=${dist.dir}/javadoc
 endorsed.classpath=
 excludes=
diff --git a/nbproject/project.xml b/nbproject/project.xml
index 4dc92444..c0017505 100644
--- a/nbproject/project.xml
+++ b/nbproject/project.xml
@@ -3,7 +3,7 @@
     <type>org.netbeans.modules.java.j2seproject</type>
     <configuration>
         <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
-            <name>addressbook</name>
+            <name>addressbook-lib</name>
             <source-roots>
                 <root id="src.dir"/>
             </source-roots>
diff --git a/src/org/mxchange/addressbook/application/AddressbookApplication.java b/src/org/mxchange/addressbook/application/AddressbookApplication.java
deleted file mode 100644
index 813e7974..00000000
--- a/src/org/mxchange/addressbook/application/AddressbookApplication.java
+++ /dev/null
@@ -1,393 +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 java.io.IOException;
-import java.sql.SQLException;
-import java.text.MessageFormat;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import org.mxchange.addressbook.client.AddressbookClient;
-import org.mxchange.addressbook.client.console.ConsoleClient;
-import org.mxchange.addressbook.client.gui.SwingClient;
-import org.mxchange.jcore.application.Application;
-import org.mxchange.jcore.application.BaseApplication;
-import org.mxchange.jcore.client.Client;
-import org.mxchange.jcore.exceptions.MenuInitializationException;
-import org.mxchange.jcore.exceptions.UnhandledUserChoiceException;
-import org.mxchange.jcore.manager.application.ApplicationManager;
-import org.mxchange.jcoreeelogger.beans.local.logger.Log;
-import org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal;
-
-/**
- * Address book application class. Please see ROADMAP.txt for details.
- * <p>
- * @author Roland Haeder
- * @version 0.0
- */
-public class AddressbookApplication extends BaseApplication implements Application {
-
-	/**
-	 * Application title
-	 */
-	public static final String APP_TITLE = "Adressbuch"; //NOI18N
-
-	/**
-	 * Application version
-	 */
-	public static final String APP_VERSION = "0.0"; //NOI18N
-
-	/**
-	 * Console client is enabled by default
-	 */
-	private boolean consoleClient = true;
-
-	/**
-	 * GUI client is disabled by default
-	 */
-	private boolean guiClient = false;
-
-	/**
-	 * Logger instance
-	 */
-	@Log
-	private LoggerBeanLocal logger;
-
-	/**
-	 * Protected constructor
-	 */
-	protected AddressbookApplication () {
-		// Try this
-		try {
-			// Get context
-			Context context = new InitialContext();
-
-			// Get logger
-			this.logger = (LoggerBeanLocal) context.lookup("java:global/jcore-logger-ejb/logger!org.mxchange.jcoreeelogger.beans.local.logger.LoggerBeanLocal");
-		} catch (final NamingException ex) {
-			// Output it and exit
-			System.err.println(MessageFormat.format("Cannot initialize: {0}", ex));
-
-			// Abort here
-			System.exit(1);
-		}
-
-		// Call init method
-		this.init();
-	}
-
-	/**
-	 * Main method (entry point)
-	 * <p>
-	 * @param args the command line arguments
-	 */
-	public static void main (String[] args) {
-		// Start application
-		new AddressbookApplication().start(args);
-	}
-
-	/**
-	 * Getter for printable application name
-	 * <p>
-	 * @return A printable name
-	 */
-	public static String printableTitle () {
-		return MessageFormat.format("{0} v{1}", APP_TITLE, APP_VERSION); //NOI18N
-	}
-
-	@Override
-	public void doBootstrap () {
-		this.getLogger().logDebug("Initializing application ..."); //NOI18N
-
-		// Init client variable
-		Client client = null;
-
-		// Is console or Swing choosen?
-		if (this.isConsole()) {
-			// Debug message
-			this.getLogger().logDebug("Initializing console client ..."); //NOI18N
-
-			// Init console client instance
-			client = new ConsoleClient(this);
-		} else if (this.isGui()) {
-			// Debug message
-			this.getLogger().logDebug("Initializing GUI (Swing) client ..."); //NOI18N
-
-			// Init console instance
-			client = new SwingClient(this);
-		} else {
-			// Not client choosen
-			this.getLogger().logError("No client choosen. Cannot launch."); //NOI18N
-
-			try {
-				this.doShutdown();
-			} catch (final SQLException | IOException ex) {
-				// Abort here
-				this.abortProgramWithException(ex);
-			}
-
-			// Bye ...
-			System.exit(1);
-		}
-
-		// Init client
-		client.init();
-
-		// Set client instance
-		this.setClient(client);
-
-		// The application is running at this point
-		this.getClient().enableIsRunning();
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doMainLoop () throws MenuInitializationException {
-		// Get client and cast it
-		AddressbookClient client = (AddressbookClient) this.getClient();
-
-		// Debug message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// TODO The application should be running now
-		// Output introduction
-		this.showIntro();
-
-		// Set current menu to main
-		client.setCurrentMenu("main"); //NOI18N
-
-		// --- Main loop starts here ---
-		while (this.getClient().isRunning()) {
-			// The application is still active, show menu selection
-			client.showCurrentMenu();
-
-			try {
-				// Ask for user input and run proper method
-				client.doUserMenuChoice();
-			} catch (final UnhandledUserChoiceException ex) {
-				// Log exception
-				this.getLogger().logException(ex);
-			}
-
-			try {
-				// Sleep a little to reduce system load
-				Thread.sleep(100);
-			} catch (final InterruptedException ex) {
-				// Ignore it
-			}
-		}
-		// --- Main loop ends here ---
-
-		// Debug message
-		this.getLogger().logDebug("Main loop exit - shutting down ..."); //NOI18N
-	}
-
-	/**
-	 * Shuts down the application.
-	 */
-	@Override
-	public void doShutdown () throws SQLException, IOException {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Shutdown client
-		this.getClient().doShutdown();
-
-		// Regular exit reached
-		this.getLogger().logInfo("End of program (last line)"); //NOI18N
-		System.exit(0);
-	}
-
-	/**
-	 * Enables console client by setting propper flag
-	 */
-	private void enableConsoleClient () {
-		this.getLogger().logDebug("Enabling console client (may become optional client) ..."); //NOI18N
-		this.consoleClient = true;
-		this.guiClient = false;
-	}
-
-	/**
-	 * Enables GUI client by setting propper flag
-	 */
-	private void enableGuiClient () {
-		this.getLogger().logDebug("Enabling GUI client (may become new default client) ..."); //NOI18N
-		this.consoleClient = false;
-		this.guiClient = true;
-	}
-
-	/**
-	 * Initializes this application
-	 */
-	private void init () {
-		// Try this
-		try {
-			// Init properties file
-			this.initProperties();
-		} catch (final IOException ex) {
-			// Abort here
-			this.abortProgramWithException(ex);
-		}
-
-		// Is the bundle initialized?
-		if (!isBundledInitialized()) {
-			// Temporary initialize default bundle
-			// TODO The enum Gender uses this
-			this.initBundle();
-		}
-	}
-
-	/**
-	 * Initializes properties
-	 */
-	private void initProperties () throws IOException {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	/**
-	 * Checks whether the client shoule be console client should be launched by
-	 * checking if -console is set.
-	 * <p>
-	 * @return Whether console client should be taken
-	 */
-	private boolean isConsole () {
-		return this.consoleClient;
-	}
-
-	/**
-	 * Checks whether the client shoule be GUI client should be launched by
-	 * checking if -gui is set.
-	 * <p>
-	 * @return Whether GUI client should be taken
-	 */
-	private boolean isGui () {
-		return this.guiClient;
-	}
-
-	/**
-	 * Parses all given arguments
-	 * <p>
-	 * @param args Arguments from program launch
-	 */
-	private void parseArguments (final String[] args) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("args()={0} - CALLED!", args.length)); //NOI18N
-
-		// Debug message
-		this.getLogger().logDebug(MessageFormat.format("Parsing {0} arguments ...", args.length)); //NOI18N
-
-		for (final String arg : args) {
-			// Switch on it
-			switch (arg) {
-				case "-console": //NOI18N
-					enableConsoleClient();
-					break;
-
-				case "-gui": //NOI18N
-					enableGuiClient();
-					break;
-			}
-		}
-	}
-
-	/**
-	 * Show introduction which depends on client
-	 */
-	private void showIntro () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Let the client show it
-		this.getClient().showWelcome();
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Launches the application
-	 * <p>
-	 * @param args Arguments handled to program
-	 */
-	private void start (final String args[]) {
-		this.getLogger().logInfo("Program is started."); //NOI18N
-
-		try {
-			// Init properties file
-			this.initProperties();
-		} catch (final IOException ex) {
-			// Something bad happened
-			this.abortProgramWithException(ex);
-		}
-
-		// Parse arguments
-		this.parseArguments(args);
-
-		try {
-			// Launch application
-			ApplicationManager.getSingeltonManager(this).start();
-		} catch (final MenuInitializationException ex) {
-			// Something bad happened
-			this.abortProgramWithException(ex);
-		}
-
-		// Good bye, but this should not be reached ...
-		this.getLogger().logWarning("Unusual exit reached."); //NOI18N
-
-		try {
-			this.doShutdown();
-		} catch (final SQLException | IOException ex) {
-			// Something bad happened
-			this.abortProgramWithException(ex);
-		}
-	}
-
-	/**
-	 * Log exception and abort program.
-	 * <p>
-	 * @param throwable Throwable
-	 */
-	protected void abortProgramWithException (final Throwable throwable) {
-		// Log exception
-		this.logException(throwable);
-		
-		// Abort here
-		System.exit(1);
-	}
-
-	/**
-	 * Getter for logger instance
-	 * <p>
-	 * @return Logger instance
-	 */
-	protected LoggerBeanLocal getLogger () {
-		return this.logger;
-	}
-
-	/**
-	 * Logs given exception
-	 * <p>
-	 * @param exception Throwable
-	 */
-	protected void logException (final Throwable exception) {
-		this.getLogger().logException(exception);
-	}
-
-}
diff --git a/src/org/mxchange/addressbook/client/console/ConsoleClient.java b/src/org/mxchange/addressbook/client/console/ConsoleClient.java
deleted file mode 100644
index b01739ee..00000000
--- a/src/org/mxchange/addressbook/client/console/ConsoleClient.java
+++ /dev/null
@@ -1,679 +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.console;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.sql.SQLException;
-import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.Scanner;
-import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.client.AddressbookClient;
-import org.mxchange.addressbook.client.BaseAddressbookClient;
-import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.jcore.exceptions.MenuInitializationException;
-import org.mxchange.addressbook.manager.contact.ManageableContactAddressbook;
-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;
-import org.mxchange.jcore.model.contact.Contact;
-import org.mxchange.jcore.model.contact.UserContact;
-import org.mxchange.jcore.model.contact.gender.Gender;
-import org.mxchange.jcore.model.contact.gender.GenderUtils;
-
-/**
- * A client for the console
- * <p>
- * @author Roland Haeder
- */
-public class ConsoleClient extends BaseAddressbookClient implements AddressbookClient {
-
-	/**
-	 * Scanner instance for reading data from console input
-	 */
-	private final Scanner scanner;
-
-	/**
-	 * Parameterless constructor
-	 * <p>
-	 * @param application An instance of an Application class
-	 */
-	public ConsoleClient (final Application application) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("application={0} - CALLED!", application)); //NOI18N
-
-		// Set application instance
-		this.setApplication(application);
-
-		// Init scanner instance
-		this.scanner = new Scanner(System.in, "UTF-8"); //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void displayAddressBox (final Contact contact) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
-
-		// Is it null?
-		if (null == contact) {
-			// Abort here
-			throw new NullPointerException("contact is null"); //NOI18N
-		}
-
-		// Simple display ...
-		this.outputMessage(MessageFormat.format("Strasse, PLZ Ort, Land: {0}\n{1} {2}\n{3}", contact.getStreet(), contact.getZipCode(), contact.getCity(), contact.getCountryCode()));
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void displayNameBox (final Contact contact) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
-
-		// Is it null?
-		if (null == contact) {
-			// Abort here
-			throw new NullPointerException("contact is null"); //NOI18N
-		}
-
-		// Get translated gender as the user may want to see "Mr.", "Mrs."
-		String gender = GenderUtils.getTranslatedGender(contact);
-
-		// Get company name
-		String companyName = contact.getCompanyName();
-
-		// If it is empty/null, then assume private contact
-		if ((null == companyName) || (companyName.isEmpty())) {
-			// Now put all together: gender, surname, family name
-			// TODO Use mask
-			this.outputMessage(MessageFormat.format("Anrede, Vorname, Name: {0} {1} {2}", gender, contact.getFirstName(), contact.getFamilyName()));
-		} else {
-			// Company contact
-			this.outputMessage(MessageFormat.format("Firma: {0}\nAnsprechpartner: {1} {2} {3}", companyName, gender, contact.getFirstName(), contact.getFamilyName()));
-		}
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void displayOtherDataBox (final Contact contact) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
-
-		// Is it null?
-		if (null == contact) {
-			// Abort here
-			throw new NullPointerException("contact is null"); //NOI18N
-		}
-
-		// Cellphone and such ...
-		this.outputMessage(MessageFormat.format("Telefonnumer: {0}\nFaxnummer: {1}\nHandy: {2}\nKommentar:\n{3}", contact.getPhoneNumber(), contact.getFaxNumber(), contact.getCellphoneNumber(), contact.getComment()));
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doChangeOwnAddressData (final Contact contact) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
-
-		// Is it null?
-		if (null == contact) {
-			// Abort here
-			throw new NullPointerException("contact is null"); //NOI18N
-		}
-
-		// Make sure it is own contact
-		if (!contact.isOwnContact()) {
-			// Not own contact
-			throw new IllegalArgumentException("Contact is not own data."); //NOI18N
-		}
-
-		// Get manager and cast it
-		ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager();
-
-		// Own street and number
-		String streetNumber = manager.enterOwnStreet();
-
-		// Get zip code
-		Long zipCode = (long) manager.enterOwnZipCode();
-
-		// Get city name
-		String city = manager.enterOwnCity();
-
-		// Get country code
-		String countryCode = manager.enterOwnCountryCode();
-
-		// Update address data
-		contact.setStreet(streetNumber);
-		contact.setZipCode(zipCode);
-		contact.setCity(city);
-		contact.setCountryCode(countryCode);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doChangeOwnNameData (final Contact contact) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
-
-		// Is it null?
-		if (null == contact) {
-			// Abort here
-			throw new NullPointerException("contact is null"); //NOI18N
-		}
-
-		// Make sure it is own contact
-		if (!contact.isOwnContact()) {
-			// Not own contact
-			throw new IllegalArgumentException("Contact is not own data."); //NOI18N
-		}
-
-		// Get manager and cast it
-		ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager();
-
-		// Gender:
-		Gender gender = manager.enterOwnGender();
-
-		// Surname
-		String firstName = manager.enterOwnFirstName();
-
-		// Family name
-		String familyName = manager.enterOwnFamilyName();
-
-		// And company
-		String companyName = manager.enterOwnCompanyName();
-
-		// Update contact instance
-		contact.setGender(gender);
-		contact.setFirstName(firstName);
-		contact.setFamilyName(familyName);
-		contact.setCompanyName(companyName);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doChangeOwnOtherData (final Contact contact) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - CALLED!", contact)); //NOI18N
-
-		// Is it null?
-		if (null == contact) {
-			// Abort here
-			throw new NullPointerException("contact is null"); //NOI18N
-		}
-
-		// Make sure it is own contact
-		if (!contact.isOwnContact()) {
-			// Not own contact
-			throw new IllegalArgumentException("Contact is not own data."); //NOI18N
-		}
-
-		// Get manager and cast it
-		ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager();
-
-		// Phone number
-		String phoneNumber = manager.enterOwnPhoneNumber();
-
-		// Phone number
-		String cellphonePhoneNumber = manager.enterOwnCellNumber();
-
-		// Fax number
-		String faxNumber = manager.enterOwnFaxNumber();
-
-		// Email address
-		String email = manager.enterOwnEmailAddress();
-
-		// Comment
-		String comment = manager.enterOwnComment();
-
-		// Update contact instance
-		contact.setPhoneNumber(phoneNumber);
-		contact.setCellphoneNumber(cellphonePhoneNumber);
-		contact.setFaxNumber(faxNumber);
-		contact.setEmailAddress(email);
-		contact.setComment(comment);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public Contact doEnterOwnData () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Get manager and cast it
-		ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager();
-
-		// First ask for gender
-		Gender gender = manager.enterOwnGender();
-
-		// 2nd for first name
-		String firstName = manager.enterOwnFirstName();
-
-		// And 3rd for family name
-		String familyName = manager.enterOwnFamilyName();
-
-		// Company name ...
-		String companyName = manager.enterOwnCompanyName();
-
-		// Construct UserContact instance
-		Contact contact = new UserContact(gender, firstName, familyName, companyName);
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} - EXIT!", contact)); //NOI18N
-
-		// And return object
-		return contact;
-	}
-
-	@Override
-	public void doShutdown () throws SQLException, IOException {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Parent call
-		super.doShutdown();
-
-		// TODO Add other shutdown stuff
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doUserMenuChoice () throws UnhandledUserChoiceException, MenuInitializationException {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Get all access keys from menu
-		char[] accessKeys = MenuTools.getAccessKeysFromMenuMap(this.getMenus(), this.getCurrentMenu());
-
-		// 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
-		ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager();
-
-		// Try it!
-		try {
-			// TODO Rewrite this ugly switch() block
-			switch (choice) {
-				case '1':
-					try {
-						// Enter/add own data
-						manager.doEnterOwnData();
-					} catch (final ContactAlreadyAddedException ex) {
-						// Already added
-						this.outputMessage("Sie haben bereits Ihre eigenen Daten eingegeben.");
-					}
-					break;
-
-				case '2': // Change own data
-					manager.doChangeOwnData();
-					break;
-
-				case '3': // Add new addess
-					manager.doAddOtherAddress();
-					break;
-
-				case '4': // List contacts
-					manager.doListContacts();
-					break;
-
-				case '5': // Search addresses
-					manager.doSearchContacts();
-					break;
-
-				case '6': // Change other addess
-					manager.doChangeOtherAddress();
-					break;
-
-				case '7': // Delete other address
-					manager.doDeleteOtherAddress();
-					break;
-
-				case '0':
-					try {
-						// Program exit
-						this.getApplication().doShutdown();
-					} catch (final SQLException | IOException ex) {
-						this.abortProgramWithException(ex);
-					}
-					break;
-
-				default:
-					// TODO throw own exception
-					throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice)); //NOI18N
-			}
-		} catch (final IOException | SQLException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
-			// Something bad happened
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public char enterChar (final char[] validChars, final String message) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("validChars={0},message={1} - CALLED!", Arrays.toString(validChars), message)); //NOI18N
-
-		// The validChars must not null be null and filled with at least one char
-		if (null == validChars) {
-			// Is null
-			throw new NullPointerException("validChars is null"); //NOI18N
-		} else if (validChars.length == 0) {
-			// Is not filled
-			throw new IllegalArgumentException("validChars is not filled."); //NOI18N
-		}
-
-		char input = 0;
-
-		// Sort array, else binarySearch() won't work
-		Arrays.sort(validChars);
-
-		// Keep asking until valid char has been entered
-		while (Arrays.binarySearch(validChars, input) < 0) {
-			// Output message
-			System.out.print(message);
-
-			// Read char
-			input = this.readChar();
-		}
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
-
-		// Return read char
-		return input;
-	}
-
-	@Override
-	public Gender enterGender (final String message) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("message={0} - CALLED!", message)); //NOI18N
-
-		// Get valid chars
-		char[] validChars = Gender.validChars();
-
-		// Debug message
-		//* NOISY-DEBUG: */ System.out.println(validChars);
-		// Call inner method
-		char gender = this.enterChar(validChars, message);
-
-		// Now get a Gender instance back
-		Gender g = Gender.fromChar(gender);
-
-		// g must not be null
-		assert (g instanceof Gender) : "g is not set."; //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("g={0} - EXIT!", g)); //NOI18N
-
-		// Return it
-		return g;
-	}
-
-	@Override
-	public int enterInt (final int minimum, final int maximum, final String message) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("minimum={0},maximum={1},message={2} - CALLED!", minimum, maximum, message)); //NOI18N
-
-		// Minimum should not be below zero
-		assert (minimum >= 0) : MessageFormat.format("minimum={0} is below zero", minimum); //NOI18N
-		assert (maximum > minimum) : MessageFormat.format("maximum {0} is smaller than minimum {1}", maximum, minimum); //NOI18N
-
-		// Init input
-		int input = -1;
-
-		while ((input < minimum) || (input > maximum)) {
-			// Output message
-			System.out.print(message);
-
-			// Read integer from user
-			input = this.readInt();
-		}
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
-
-		// Return it
-		return input;
-	}
-
-	@Override
-	public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("minLength={0},maxLength={1},message={2}allowEmpty={3} - CALLED!", minLength, maxLength, message, allowEmpty)); //NOI18N
-
-		// Check on length, e.g. country codes are excactly 2 chars long
-		assert (maxLength >= minLength);
-
-		// Init input
-		String input = null;
-
-		// Check if it is to short or to long
-		while (((null == input) || ((input.length() < minLength) && (!allowEmpty))) || ((input.length() > 0) && (input.length() < minLength) && (allowEmpty)) || ((input instanceof String) && (input.length() > maxLength))) {
-			// Output message
-			System.out.print(message);
-
-			// Read line
-			input = this.readString();
-		}
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("input={0} - EXIT!", input)); //NOI18N
-
-		// Return it
-		return input;
-	}
-
-	@Override
-	public SelectableMenuItem getMenuItem (final char accessKey, final String text) {
-		// Return a new console menu item
-		return new ConsoleMenuItem(accessKey, text);
-	}
-
-	@Override
-	public void init () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Init contact manager here
-		try {
-			this.initContactManager();
-		} catch (final SQLException ex) {
-			// End here
-			this.abortProgramWithException(ex);
-		}
-
-		// Fill menu map
-		this.fillMenuMap();
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void outputMessage (final String message) {
-		System.out.println(message);
-	}
-
-	@Override
-	public void show (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public void showCurrentMenu () {
-		this.showMenu(this.getCurrentMenu());
-	}
-
-	@Override
-	public void showEntry (final SelectableMenuItem item) {
-		// Access key then text
-		this.outputMessage(MessageFormat.format("[{0}] {1}", item.getAccessKey(), item.getText())); //NOI18N
-	}
-
-	@Override
-	public void showWelcome () {
-		this.outputMessage(MessageFormat.format("Welcome to {0}", AddressbookApplication.printableTitle())); //NOI18N
-		this.outputMessage(""); //NOI18N
-		this.outputMessage("Copyright(c) 2015 by Roland Haeder, this is free software"); //NOI18N
-
-		// Debug message
-		this.getLogger().logDebug("Intro shown to user"); //NOI18N
-	}
-
-	@Override
-	public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("contact={0} CALLED!", contact)); //NOI18N
-
-		// Contact must not be null
-		if (null == contact) {
-			// Abort here
-			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
-		ManageableContactAddressbook manager = (ManageableContactAddressbook) this.getManager();
-
-		// TODO Get rid of this ugly switch block, too
-		switch (choice) {
-			case 'n': // Name data
-				manager.doChangeNameData(contact);
-				break;
-
-			case 'a': // Address data
-				manager.doChangeAddressData(contact);
-				break;
-
-			case 'o': // Other data
-				manager.doChangeOtherData(contact);
-				break;
-
-			case 'x': // Exit this menu
-				// Ignored as it should go back
-				break;
-
-			default:
-				// TODO throw own exception
-				throw new UnhandledUserChoiceException(MessageFormat.format("Choice '{0}' not handled yet.", choice)); //NOI18N
-		}
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Reads one character
-	 * <p>
-	 * @return A single character
-	 */
-	private char readChar () {
-		// Read line
-		String input = this.readString();
-
-		// Debug message
-		this.getLogger().logDebug(MessageFormat.format("input={0}", input)); //NOI18N
-
-		// This must be only one character
-		if (input.length() != 1) {
-			// Return zero
-			return 0;
-		}
-
-		// Get char from first (and only) position
-		return input.charAt(0);
-	}
-
-	/**
-	 * Reads an integer (int) from user
-	 * <p>
-	 * @return An integer number
-	 */
-	private int readInt () {
-		// First read a string
-		String input = this.readString();
-
-		// Debug message
-		this.getLogger().logDebug(MessageFormat.format("input={0}", input)); //NOI18N
-
-		// Init number with invalid value
-		int num = -1;
-
-		// Parse number, this can be risky
-		try {
-			num = Integer.parseInt(input);
-		} catch (final NumberFormatException e) {
-			this.outputMessage("Bitte geben Sie nur Zahlen ein!");
-			this.getLogger().logWarning(MessageFormat.format("No numbers-only entered. input={0},message={1}", input, e.getMessage())); //NOI18N
-		}
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("num={0} - EXIT!", num)); //NOI18N
-
-		// Return read number
-		return num;
-	}
-
-	/**
-	 * Reads a string from a scanner until RETURN is pressed
-	 * <p>
-	 * @return Read string from scanner
-	 */
-	private String readString () {
-		return this.scanner.nextLine();
-	}
-
-	@Override
-	protected final void fillMenuMap () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Initialize first (main) menu
-		Menu menu = new ConsoleMenu("main", this); //NOI18N
-
-		// Add it
-		this.getMenus().put("main", menu); //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-}
diff --git a/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java b/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
deleted file mode 100644
index 3ad6edb5..00000000
--- a/src/org/mxchange/addressbook/client/gui/AddressbookFrame.java
+++ /dev/null
@@ -1,1026 +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.gui;
-
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.sql.SQLException;
-import java.text.MessageFormat;
-import javax.swing.BorderFactory;
-import javax.swing.BoxLayout;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JFormattedTextField;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.border.TitledBorder;
-import javax.swing.table.TableModel;
-import org.mxchange.addressbook.BaseAddressbookSystem;
-import org.mxchange.addressbook.application.AddressbookApplication;
-import org.mxchange.addressbook.exceptions.ContactAlreadyAddedException;
-import org.mxchange.addressbook.manager.contact.ManageableContactAddressbook;
-import org.mxchange.jcore.application.Application;
-import org.mxchange.jcore.client.Client;
-import org.mxchange.jcore.exceptions.FrameAlreadyInitializedException;
-import org.mxchange.jcore.manager.Manageable;
-import org.mxchange.jcore.model.contact.Contact;
-import org.mxchange.jcore.model.contact.gender.Gender;
-import org.mxchange.jcoreswing.client.gui.ClientFrame;
-import org.mxchange.jcoreswing.model.swing.contact.ContactTableModel;
-
-/**
- * A Swing frame for addressbook.
- * <p>
- * @author Roland Haeder
- */
-public class AddressbookFrame extends BaseAddressbookSystem implements ClientFrame {
-
-	/**
-	 * Own instance
-	 */
-	private static ClientFrame self;
-
-	/**
-	 * Singelton getter for this frame instance.
-	 * <p>
-	 * @param client Client instance
-	 * @return Returns a singelton instance of this frame
-	 */
-	public static final ClientFrame getSelfInstance (final Client client) {
-		// Is it set?
-		if (!(self instanceof ClientFrame)) {
-			// Create new instance
-			self = new AddressbookFrame(client);
-		}
-
-		// Return instance
-		return self;
-	}
-
-	/**
-	 * Dialog box "add contact"
-	 */
-	private JDialog addContact;
-
-	/**
-	 * Frame instance for "add own data"
-	 */
-	private JMenuItem addOwnItem;
-
-	/**
-	 * Instance to table model
-	 */
-	private TableModel dataModel;
-
-	/**
-	 * Table instance
-	 */
-	private JTable dataTable;
-
-	/**
-	 * Frame instance for "edit own data"
-	 */
-	private JMenuItem editOwnItem;
-
-	/**
-	 * Frame instance
-	 */
-	private final JFrame frame;
-
-	/**
-	 * Whether this frame has been initialized
-	 */
-	private boolean initialized;
-
-	/**
-	 * Status label needs to be updated
-	 */
-	private JLabel statusLabel;
-
-	/**
-	 * Creates an instance of this frame with a client instance
-	 * <p>
-	 * @param client
-	 */
-	private AddressbookFrame (final Client client) {
-		// Debug line
-		this.getLogger().logTrace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
-
-		// Set frame instance
-		this.frame = new JFrame();
-		this.frame.setTitle(this.generateFrameTitle("main")); //NOI18N
-
-		// Set client here
-		this.setClient(client);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public Contact doEnterOwnData () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Is the "add contact" window visible?
-		if (this.addContact.isVisible()) {
-			// Something bad happened
-			throw new IllegalStateException("Window addContact is already visible."); //NOI18N
-		}
-
-		// Disable main window
-		this.frame.setEnabled(false);
-
-		// Make other window visible
-		this.addContact.setVisible(true);
-
-		// Trace message
-		this.getLogger().logTrace("Returning null : EXIT!"); //NOI18N
-
-		// Return value is not supported
-		return null;
-	}
-
-	/**
-	 * Shutdown this frame
-	 */
-	@Override
-	public void doShutdown () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// First only show shutdown status
-		this.updateStatus("shutdown"); //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Enables main window (frame)
-	 */
-	@Override
-	public void enableMainWindow () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Enable it again
-		this.frame.setEnabled(true);
-
-		// Request focus for this window
-		this.frame.requestFocus();
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public Application getApplication () {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public Client getClient () {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public Manageable getManager () {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public String getMessageStringFromKey (String key) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	/**
-	 * Setups the frame, do not set isInitialized here
-	 * <p>
-	 * @param client Client instance
-	 */
-	@Override
-	public void setupFrame (final Client client) throws IOException {
-		// Debug line
-		this.getLogger().logTrace(MessageFormat.format("client={0}: CALLED!", client)); //NOI18N
-
-		// Has the user entered own data?
-		if (((ManageableContactAddressbook) this.getClient().getManager()).isOwnContactAdded()) {
-			// Debug message
-			this.getLogger().logDebug("Disabling menus: isOwnContactAdded()=false"); //NOI18N
-
-			// Not entered yet, so disable "add" menu
-			this.addOwnItem.setEnabled(false);
-		} else {
-			// Disable "edit"
-			this.editOwnItem.setEnabled(false);
-		}
-
-		// Make the frame visible
-		this.frame.setVisible(true);
-
-		// All done here
-		this.updateStatus("done"); //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initalizes this frame. Having initComponents() exposed (publicly
-	 * accessible) means that any other object can initialize components which
-	 * you may not want.
-	 * <p>
-	 * @throws org.mxchange.jcore.exceptions.FrameAlreadyInitializedException If
-	 * this method has been called twice
-	 */
-	@Override
-	public void init () throws FrameAlreadyInitializedException {
-		// Debug line
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Has this frame been initialized?
-		if (this.isInitialized()) {
-			// Throw exception
-			throw new FrameAlreadyInitializedException();
-		}
-
-		// Init components
-		this.initComponents();
-
-		// Set flag
-		this.initialized = true;
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Returns field isInitialized. This flag indicates whether this frame has
-	 * been initialized or not.
-	 * <p>
-	 * @return Field isInitialized
-	 */
-	@Override
-	public final boolean isInitialized () {
-		return this.initialized;
-	}
-
-	@Override
-	public void logException (Throwable exception) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	/**
-	 * Shuts down the application.
-	 */
-	@Override
-	public void shutdownApplication () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// To do this, the frame must be initialized
-		if (!this.isInitialized()) {
-			// Not initalized, so bad call
-			this.getLogger().logFatal("Bad call of shutdownApplication(). Please report this."); //NOI18N
-			return;
-		}
-
-		// Call shutdown method
-		try {
-			this.getClient().getApplication().doShutdown();
-		} catch (final SQLException | IOException ex) {
-			// Abort here
-			this.abortProgramWithException(ex);
-		}
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Adds a new menu item with given key to menu instance
-	 * <p>
-	 * @param menu Menu instance to add item to
-	 * @param key Message key part
-	 * @param listener Listener instance
-	 */
-	private void addMenuItem (final JMenu menu, final String key, final ActionListener listener) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("menu={0},key={1},listener={2} - CALLED!", menu, key, listener)); //NOI18N
-
-		// New instance
-		JMenuItem item = this.initMenuItemWithTooltip(key);
-
-		// Add listener
-		item.addActionListener(listener);
-
-		// Add item -> menu
-		menu.add(item);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Adds a JTextField with label and tool tip to given panel
-	 * <p>
-	 * @param panel Panel instance to add text field
-	 * @param key Part of message key from resource bundle
-	 * @param fieldLength Length of text field
-	 */
-	private void addTextFieldWithLabelToPanel (final JPanel panel, final String key, final int fieldLength) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("panel={0},key={1},fieldLength={2} - CALLED!", panel, key, fieldLength)); //NOI18N
-
-		// Init label for given key
-		JLabel label = new JLabel(this.getBundle().getString(String.format("AddressbookFrame.%s.text", key))); //NOI18N
-
-		// And input box wih tool tip
-		JTextField field = new JTextField(fieldLength);
-		field.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.%s.toolTipText", key))); //NOI18N
-
-		// Add both to panel
-		panel.add(label);
-		panel.add(field);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Generates a title for borders
-	 * <p>
-	 * @param key Key part to look for
-	 * @return Human-readable title
-	 */
-	private String generateBorderTitle (final String key) {
-		// Call bundle instance
-		return this.getBundle().getString(String.format("AddressbookFrame.border.%s.title.text", key)); //NOI18N
-	}
-
-	/**
-	 * Generates a title for all frames based on given sub title key. If null is
-	 * given, the sub title is not generated.
-	 * <p>
-	 * @param subKey Key for sub title resource
-	 * @return A full application title
-	 */
-	private String generateFrameTitle (final String subKey) {
-		// Base title
-		String title = AddressbookApplication.printableTitle();
-
-		// Is key given?
-		if (subKey != null) {
-			// Add sub title
-			title = String.format("%s - %s", title, this.getBundle().getString(String.format("AddressbookFrame.%s.title.text", subKey))); //NOI18N
-		}
-
-		// Return it
-		return title;
-	}
-
-	/**
-	 * Initializes "add" and "cancel" buttons
-	 */
-	private void initAddCancelButtons () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Init panel
-		JPanel panel = new JPanel();
-		panel.setLayout(new GridLayout(1, 2, 10, 10));
-
-		// Generate "add" button
-		JButton addButton = new JButton(this.getBundle().getString("AddressbookFrame.button.addAddress.text"));
-
-		// Add listener
-		addButton.addActionListener(new AddActionListener(this.addContact, this));
-
-		// Add button to panel
-		panel.add(addButton);
-
-		// Generate "cancel" button
-		JButton cancelButton = new JButton(this.getBundle().getString("AddressbookFrame.button.cancel.text"));
-
-		// Add listener
-		cancelButton.addActionListener(new CancelActionListener(this.addContact, this));
-
-		// Add button to panel
-		panel.add(cancelButton);
-
-		// Add panel to main panel
-		this.addContact.add(panel);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes "add contact" dialog
-	 */
-	private void initAddContactDialog () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Instance dialog and set title
-		this.addContact = new JDialog();
-		this.addContact.setTitle(this.generateFrameTitle("dialog.addContact")); //NOI18N
-
-		// Set layout
-		this.addContact.setLayout(new GridLayout(0, 1, 2, 2));
-
-		// Only hide it on close and make it appear in middle of screen
-		this.addContact.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
-		this.addContact.setLocationRelativeTo(this.frame);
-
-		// Set always on top and auto-focus
-		this.addContact.setAlwaysOnTop(true);
-		this.addContact.setAutoRequestFocus(true);
-
-		// Initial dimension
-		this.addContact.setSize(500, 500);
-
-		// And it is not resizeable
-		this.addContact.setResizable(false);
-
-		/*
-		 * Add listener which asks for confirmation, if data has been entered
-		 * but not saved yet. The user may appriciate this ... ;-)
-		 *
-		 * TODO Unfinished
-		 */
-		this.addContact.addWindowListener(new WindowAdapter() {
-			/**
-			 * Invoked when a window has been closed.
-			 */
-			@Override
-			public void windowClosed (final WindowEvent e) {
-				// Enable main window again
-				AddressbookFrame.getSelfInstance(null).enableMainWindow();
-			}
-
-			/**
-			 * Invoked when a window is in the process of being closed. The
-			 * close operation can be overridden at this point.
-			 */
-			@Override
-			public void windowClosing (final WindowEvent e) {
-				e.getWindow().dispose();
-			}
-		});
-
-		// Init 3 panels:
-		// 1) "name" panel
-		initNameDataPanel(this.addContact);
-
-		// 2) "address" panel
-		initAddressDataPanel(this.addContact);
-
-		// 3) "other" panel
-		initOtherDataPanel(this.addContact);
-
-		// 4) "Add" and "Cancel" buttons, combined they are unique for this dialog
-		initAddCancelButtons();
-
-		// x)Only for developing:
-		/*
-		 * DEBUG:
-		 */ this.addContact.setVisible(true);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes address panel
-	 * <p>
-	 * @param dialog A JDialog instance to this components to
-	 */
-	private void initAddressDataPanel (final JDialog dialog) {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Panel "address" input boxes
-		JPanel addressPanel = new JPanel();
-		addressPanel.setLayout(new GridLayout(0, 4, 3, 3));
-
-		// Set border to titled version
-		addressPanel.setBorder(new TitledBorder(this.generateBorderTitle("address"))); //NOI18N
-
-		// Add text field for street
-		this.addTextFieldWithLabelToPanel(addressPanel, "street", 20); //NOI18N
-
-		// Number label
-		JLabel numberLabel = new JLabel(this.getBundle().getString("AddressbookFrame.number.text"));
-
-		// And text field, but only accept numbers
-		JFormattedTextField number = new JFormattedTextField();
-		number.setToolTipText(this.getBundle().getString("AddressbookFrame.number.toolTipText"));
-
-		// Add both to street panel
-		addressPanel.add(numberLabel);
-		addressPanel.add(number);
-
-		// Label for ZIP code, again numbers only
-		JLabel zipLabel = new JLabel(this.getBundle().getString("AddressbookFrame.zip.text"));
-
-		// Init text field with label
-		JFormattedTextField zip = new JFormattedTextField();
-		zip.setToolTipText(this.getBundle().getString("AddressbookFrame.zip.toolTipText"));
-
-		// Add both to street panel
-		addressPanel.add(zipLabel);
-		addressPanel.add(zip);
-
-		// Add text field for city name
-		this.addTextFieldWithLabelToPanel(addressPanel, "city", 20); //NOI18N
-
-		// Add panel to dialog
-		dialog.add(addressPanel);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initialize components
-	 */
-	private void initComponents () {
-		// Debug line
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Set default close operation
-		this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
-		// Register shutdown listener
-		this.frame.addWindowListener(new WindowAdapter() {
-			/**
-			 * Invoked when a window has been closed.
-			 */
-			@Override
-			public void windowClosed (final WindowEvent e) {
-				// Shutdown application cleanly
-				self.shutdownApplication();
-			}
-
-			/**
-			 * Invoked when a window is in the process of being closed. The
-			 * close operation can be overridden at this point.
-			 */
-			@Override
-			public void windowClosing (final WindowEvent e) {
-				// Also shutdown cleanly here
-				self.shutdownApplication();
-			}
-		});
-
-		// Setup layout manager
-		this.frame.setLayout(new BorderLayout(2, 2));
-
-		// Set window size
-		this.frame.setSize(700, 400);
-
-		// Center window in middle of screen, instead of top-left corner
-		this.frame.setLocationRelativeTo(null);
-
-		// Init menu system
-		this.initMenuSystem();
-
-		// Init table
-		this.initTable();
-
-		// Init status panel
-		this.initStatusPanel();
-
-		// Init other windows
-		this.initOtherDialogs();
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes a menu item instance with tool tip
-	 * <p>
-	 * @param key Message key part
-	 * @return A finished JMenuItem instance
-	 */
-	private JMenuItem initMenuItemWithTooltip (final String key) {
-		// Debug line
-		this.getLogger().logTrace(MessageFormat.format("key={0} - CALLED!", key)); //NOI18N
-
-		JMenuItem item = new JMenuItem(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.text", key))); //NOI18N
-		item.setToolTipText(this.getBundle().getString(String.format("AddressbookFrame.menuItem.%s.toolTipText", key))); //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("item={0} - EXIT!", item)); //NOI18N
-
-		// Return it
-		return item;
-	}
-
-	/**
-	 * Initializes the menu system
-	 */
-	private void initMenuSystem () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Init menu bar, menu and item instances
-		JMenuBar menuBar = new JMenuBar();
-		JMenu menu;
-		JMenuItem item;
-
-		// Init some menus:
-		// 1) File menu
-		menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.file.text"));
-
-		// Add menu items:
-		// 1.x) Exit program (should be last)
-		this.addMenuItem(menu, "exitProgram", new ActionListener() { //NOI18N
-			/**
-			 * If the user has performed this action
-			 * <p>
-			 * @param e An instance of an ActionEvent class
-			 */
-			@Override
-			public void actionPerformed (final ActionEvent e) {
-				self.shutdownApplication();
-			}
-		});
-
-		// Add menu -> menu bar
-		menuBar.add(menu);
-
-		// Init some menus:
-		// 2) Addressbook menu
-		menu = new JMenu(this.getBundle().getString("AddressbookFrame.menu.addressbook.text"));
-
-		// 2.1) Add own data
-		this.addOwnItem = this.initMenuItemWithTooltip("addOwnData"); //NOI18N
-
-		// Add listener to exit menu
-		this.addOwnItem.addActionListener(new ActionListener() {
-			/**
-			 * If the user has performed this action
-			 * <p>
-			 * @param e An instance of an ActionEvent class
-			 */
-			@Override
-			public void actionPerformed (final ActionEvent e) {
-				try {
-					((ManageableContactAddressbook) self.getClient().getManager()).doEnterOwnData();
-				} catch (final ContactAlreadyAddedException ex) {
-					// Already added, log away
-					// TODO maybe output message here?
-					self.logException(ex);
-				} catch (final IOException ex) {
-					// Somethind bad happened here
-					// TODO Output error message here?
-				}
-			}
-		});
-
-		// Add item -> menu
-		menu.add(this.addOwnItem);
-
-		// 2.2) Edit own data
-		this.editOwnItem = this.initMenuItemWithTooltip("editOwnData"); //NOI18N
-
-		// Add listener to exit menu
-		this.editOwnItem.addActionListener(new ActionListener() {
-			/**
-			 * If the user has performed this action
-			 * <p>
-			 * @param e An instance of an ActionEvent class
-			 */
-			@Override
-			public void actionPerformed (final ActionEvent e) {
-				try {
-					((ManageableContactAddressbook) self.getClient().getManager()).doChangeOwnData();
-				} catch (final IOException | SQLException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) {
-					self.logException(ex);
-				}
-			}
-		});
-
-		// Add item -> menu
-		menu.add(this.editOwnItem);
-
-		// Init more menus:
-		// 1) Add new contact
-		this.addMenuItem(menu, "addNewContact", new ActionListener() { //NOI18N
-			/**
-			 * If the user has performed this action
-			 * <p>
-			 * @param e An instance of an ActionEvent class
-			 */
-			@Override
-			public void actionPerformed (final ActionEvent e) {
-				((ManageableContactAddressbook) self.getClient().getManager()).doAddOtherAddress();
-			}
-		});
-
-		// Add menu -> menu bar
-		menuBar.add(menu);
-
-		// Add menu bar -> frame
-		this.frame.add(menuBar, BorderLayout.NORTH);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes name panel
-	 * <p>
-	 * @param dialog A JDialog instance to this components to
-	 */
-	private void initNameDataPanel (final JDialog dialog) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N
-
-		// Panel "name" input boxes
-		JPanel namePanel = new JPanel();
-		namePanel.setLayout(new GridLayout(0, 2, 3, 3));
-
-		// Set border to titled version
-		namePanel.setBorder(new TitledBorder(this.generateBorderTitle("name"))); //NOI18N
-
-		// Gender text field
-		JLabel gLabel = new JLabel(this.getBundle().getString("AddressbookFrame.gender.text"));
-
-		// Get all genders
-		Gender[] genders = Gender.values();
-
-		// Init gender combo box with tool tip
-		JComboBox<Gender> gender = new JComboBox<>(new DefaultComboBoxModel<>(genders));
-		gender.setToolTipText(this.getBundle().getString("AddressbookFrame.gender.toolTipText"));
-
-		// Add both to gender panel
-		namePanel.add(gLabel);
-		namePanel.add(gender);
-
-		// Add text field for surname
-		this.addTextFieldWithLabelToPanel(namePanel, "surname", 20); //NOI18N
-
-		// Add text field for family name
-		this.addTextFieldWithLabelToPanel(namePanel, "familyName", 20); //NOI18N
-
-		// Finally add panel to dialog
-		dialog.add(namePanel);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes "other" data panel
-	 * <p>
-	 * @param dialog A JDialog instance to this components to TODO Fill this
-	 * with life
-	 */
-	private void initOtherDataPanel (final JDialog dialog) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("dialog={0} - CALLED!", dialog)); //NOI18N
-
-		// Panel "other" input boxes
-		JPanel otherPanel = new JPanel();
-		otherPanel.setLayout(new GridLayout(0, 2, 3, 3));
-		otherPanel.setBorder(new TitledBorder(this.generateBorderTitle("other"))); //NOI18N
-
-		// Add text field for email address
-		this.addTextFieldWithLabelToPanel(otherPanel, "emailAddress", 20); //NOI18N
-
-		// Add text field for phone number
-		this.addTextFieldWithLabelToPanel(otherPanel, "phoneNumber", 20); //NOI18N
-
-		// Add text field for cellphone number
-		this.addTextFieldWithLabelToPanel(otherPanel, "cellphoneNumber", 20); //NOI18N
-
-		// Add text field for fax number
-		this.addTextFieldWithLabelToPanel(otherPanel, "faxNumber", 20); //NOI18N
-
-		// Init label
-		JLabel commentLabel = new JLabel(this.getBundle().getString("AddressbookFrame.comment.text"));
-
-		// Init text area with tool tip
-		JTextArea comment = new JTextArea(5, 20);
-		comment.setToolTipText(this.getBundle().getString("AddressbookFrame.comment.toolTipText"));
-
-		// Add both to panel
-		otherPanel.add(commentLabel);
-		otherPanel.add(comment);
-
-		// Finally add panel to dialog
-		dialog.add(otherPanel);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initialize other dialogs (e.g. "Add contact")
-	 */
-	private void initOtherDialogs () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Init other windows:
-		// 1) Add contact
-		initAddContactDialog();
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes status panel
-	 */
-	private void initStatusPanel () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Init status label (which needs to be updated
-		this.statusLabel = new JLabel();
-		this.updateStatus("initializing"); //NOI18N
-
-		// Init status bar in south
-		JPanel panel = new JPanel();
-		panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
-		panel.add(this.statusLabel);
-		panel.setBorder(BorderFactory.createEtchedBorder());
-
-		// Add panel to frame
-		this.frame.add(panel, BorderLayout.SOUTH);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Initializes the table which will show all contacts
-	 */
-	private void initTable () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Instance table model
-		this.dataModel = new ContactTableModel(this.getClient().getManager());
-
-		// Instance table
-		this.dataTable = new JTable(this.dataModel);
-
-		// Add mouse listener
-		this.dataTable.addMouseListener(new MouseAdapter() {
-			/**
-			 * If the user peformed a click on a cell
-			 * <p>
-			 * @param e Mouse event instance
-			 */
-			@Override
-			public void mouseClicked (final MouseEvent e) {
-				throw new UnsupportedOperationException("Unfinished."); //NOI18N
-			}
-		});
-
-		// Instance scroll pane
-		JScrollPane scroller = new JScrollPane();
-
-		// Add table to scroll pane
-		scroller.setViewportView(this.dataTable);
-		scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
-		scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-
-		// Add pane to frame
-		this.frame.add(scroller, BorderLayout.CENTER);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Updates status to given type
-	 * <p>
-	 * @param type Status type
-	 */
-	private void updateStatus (final String type) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("type={0} - CALLED!", type)); //NOI18N
-
-		// Set status message
-		this.statusLabel.setText(this.getBundle().getString(String.format("AddressbookFrame.statusLabel.%s.text", type))); //NOI18N
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Class for "add address" button
-	 */
-	private static class AddActionListener extends BaseAddressbookSystem implements ActionListener {
-
-		/**
-		 * Dialog instance
-		 */
-		private final JDialog dialog;
-
-		/**
-		 * Frame (not JFrame) instance
-		 */
-		private final ClientFrame frame;
-
-		/**
-		 * Constructor for action listener
-		 * <p>
-		 * @param dialog Dialog instance to call back
-		 * @param frame Frame instance (not JFrame)
-		 */
-		protected AddActionListener (final JDialog dialog, final ClientFrame frame) {
-			// Set dialog and frame here
-			this.dialog = dialog;
-			this.frame = frame;
-		}
-
-		/**
-		 * If the action has been performed
-		 * <p>
-		 * @param e The performed action event
-		 */
-		@Override
-		public void actionPerformed (final ActionEvent e) {
-			throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-		}
-	}
-
-	/**
-	 * Class for "cancel address" button
-	 */
-	private static class CancelActionListener extends BaseAddressbookSystem implements ActionListener {
-
-		/**
-		 * Dialog instance
-		 */
-		private final JDialog dialog;
-
-		/**
-		 * Frame (not JFrame) instance
-		 */
-		private final ClientFrame frame;
-
-		/**
-		 * Constructor for action listener
-		 * <p>
-		 * @param dialog Dialog instance to call back
-		 * @param frame Frame instance (not JFrame)
-		 */
-		protected CancelActionListener (final JDialog dialog, final ClientFrame frame) {
-			// Set dialog and frame here
-			this.dialog = dialog;
-			this.frame = frame;
-		}
-
-		/**
-		 * If the action has been performed
-		 * <p>
-		 * @param e The performed action event
-		 */
-		@Override
-		public void actionPerformed (final ActionEvent e) {
-			throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-		}
-	}
-}
diff --git a/src/org/mxchange/addressbook/client/gui/SwingClient.java b/src/org/mxchange/addressbook/client/gui/SwingClient.java
deleted file mode 100644
index 20d0e5fd..00000000
--- a/src/org/mxchange/addressbook/client/gui/SwingClient.java
+++ /dev/null
@@ -1,239 +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.gui;
-
-import java.io.IOException;
-import java.sql.SQLException;
-import org.mxchange.addressbook.client.AddressbookClient;
-import org.mxchange.addressbook.client.BaseAddressbookClient;
-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;
-import org.mxchange.jcore.model.contact.Contact;
-import org.mxchange.jcore.model.contact.gender.Gender;
-import org.mxchange.jcoreswing.client.gui.ClientFrame;
-
-/**
- * A swing client
- * <p>
- * @author Roland Haeder
- */
-public class SwingClient extends BaseAddressbookClient implements AddressbookClient {
-
-	/**
-	 * Swing frame instance
-	 */
-	private final ClientFrame frame;
-
-	/**
-	 * Constructor with an Application instance.
-	 * <p>
-	 * @param application Application instance
-	 */
-	public SwingClient (final Application application) {
-		// Debug message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Set application instance
-		this.setApplication(application);
-
-		// Init frame instance
-		this.frame = AddressbookFrame.getSelfInstance(this);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void displayAddressBox (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void displayNameBox (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void displayOtherDataBox (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void doChangeOwnAddressData (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void doChangeOwnNameData (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void doChangeOwnOtherData (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	/**
-	 * Shows dialog to enter new contact
-	 * <p>
-	 * @return Returns finished Contact instance
-	 */
-	@Override
-	public Contact doEnterOwnData () {
-		// Trace message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Deligate this call to the frame
-		return this.frame.doEnterOwnData();
-	}
-
-	/**
-	 * Shuts down this client
-	 */
-	@Override
-	public void doShutdown () throws SQLException, IOException {
-		// Debug message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Parent call
-		super.doShutdown();
-
-		// Shutdown frame
-		this.frame.doShutdown();
-
-		// TODO Add other shutdown stuff
-		// Debug message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void doUserMenuChoice () throws UnhandledUserChoiceException {
-		// Debug message
-		//* NOISY-DEBUG: */ this.getLogger().logTrace("CALLED!");
-
-		// Not implemented here
-	}
-
-	@Override
-	public char enterChar (final char[] validChars, String message) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public Gender enterGender (final String message) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public int enterInt (final int minimum, final int maximum, final String message) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public String enterString (final int minLength, final int maxLength, final String message, final boolean allowEmpty) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	/**
-	 * Returns a Swing menu item
-	 * <p>
-	 * @param accessKey Key to access the menu
-	 * @param text Text to show to user
-	 * @return A SelectableMenuItem
-	 */
-	@Override
-	public SelectableMenuItem getMenuItem (final char accessKey, final String text) {
-		// Debug message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Returns null as the menu is now no longer controlled here.
-		return null;
-	}
-
-	/**
-	 * Inizializes this client
-	 */
-	@Override
-	public void init () {
-		// Debug message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		try {
-			// Init contact manager here
-			this.initContactManager();
-
-			// Init frame
-			this.frame.init();
-
-			// Now start the frame
-			this.frame.setupFrame(this);
-		} catch (final FrameAlreadyInitializedException | IOException | SQLException ex) {
-			// Abort program
-			this.abortProgramWithException(ex);
-		}
-
-		// Debug message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	@Override
-	public void outputMessage (final String message) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void show (final Contact contact) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-	}
-
-	@Override
-	public void showCurrentMenu () {
-		// Debug message
-		//* NOISY-DEBUG: */ this.getLogger().logTrace("CALLED!");
-
-		// Not implemented here
-	}
-
-	@Override
-	public void showEntry (final SelectableMenuItem item) {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	@Override
-	public void showWelcome () {
-		// Debug message
-		this.getLogger().logTrace("CALLED!"); //NOI18N
-
-		// Not implemented here
-	}
-
-	@Override
-	public void userChooseChangeContactData (final Contact contact) throws UnhandledUserChoiceException {
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. //NOI18N
-	}
-
-	/**
-	 * Fills menu map with swing menus
-	 */
-	@Override
-	protected final void fillMenuMap () {
-		// Nothing to fill here as the Swing frame is handling this all
-		throw new UnsupportedOperationException("Not implemented."); //NOI18N
-	}
-}
diff --git a/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java b/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java
deleted file mode 100644
index 6c7d8bf7..00000000
--- a/src/org/mxchange/addressbook/menu/console/ConsoleMenu.java
+++ /dev/null
@@ -1,54 +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.menu.console;
-
-import java.text.MessageFormat;
-import org.mxchange.addressbook.menu.AddressbookMenu;
-import org.mxchange.addressbook.menu.BaseMenu;
-import org.mxchange.addressbook.menu.Menu;
-import org.mxchange.jcore.client.Client;
-
-/**
- * A menu system for the console
- * <p>
- * @author Roland Haeder
- */
-public class ConsoleMenu extends BaseMenu implements Menu {
-
-	/**
-	 * Constructor for this menu
-	 * <p>
-	 * @param menuType	Menu type to initialize
-	 * @param client CLient to call back
-	 */
-	public ConsoleMenu (final String menuType, final Client client) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("menuType={0},client={1} - CALLED!", menuType, client)); //NOI18N
-
-		// Client must not be null
-		if (null == client) {
-			// Abort here
-			throw new NullPointerException("client is null");
-		}
-
-		// Init menu
-		this.initMenu(menuType, client);
-
-		// Add all items
-		AddressbookMenu.addItemsToList(this.getMenuList(), menuType, client);
-	}
-}
diff --git a/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java b/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java
deleted file mode 100644
index 74f81801..00000000
--- a/src/org/mxchange/addressbook/menu/item/console/ConsoleMenuItem.java
+++ /dev/null
@@ -1,105 +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.menu.item.console;
-
-import java.text.MessageFormat;
-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;
-
-/**
- * A menu item class for the console
- * <p>
- * @author Roland Haeder
- */
-public class ConsoleMenuItem extends BaseMenuItem implements SelectableMenuItem {
-
-	/**
-	 * Access key
-	 */
-	private char accessKey;
-
-	/**
-	 * Text to user
-	 */
-	private String text;
-
-	/**
-	 * Constructor for building a console menu with access key and text
-	 * <p>
-	 * @param accessKey Access key for this menu entry
-	 * @param text Text to show to user
-	 */
-	public ConsoleMenuItem (final char accessKey, final String text) {
-		this.setAccessKey(accessKey);
-		this.setText(text);
-	}
-
-	@Override
-	public final char getAccessKey () {
-		return this.accessKey;
-	}
-
-	@Override
-	public String getText () {
-		return this.text;
-	}
-
-	@Override
-	public void show (final Client client) {
-		// Trace message
-		this.getLogger().logTrace(MessageFormat.format("client={0} - CALLED!", client)); //NOI18N
-
-		// Client must not be null
-		if (null == client) {
-			// 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
-		c.showEntry(this);
-
-		// Trace message
-		this.getLogger().logTrace("EXIT!"); //NOI18N
-	}
-
-	/**
-	 * Text to user
-	 * <p>
-	 * @param text the text to set
-	 */
-	private void setText (final String text) {
-		this.text = text;
-	}
-
-	/**
-	 * Access key
-	 * <p>
-	 * @param accessKey the accessKey to set
-	 */
-	private void setAccessKey (final char accessKey) {
-		this.accessKey = accessKey;
-	}
-
-}
diff --git a/src/org/mxchange/localization/bundle_de_DE.properties b/src/org/mxchange/localization/bundle_de_DE.properties
deleted file mode 100644
index 521436c4..00000000
--- a/src/org/mxchange/localization/bundle_de_DE.properties
+++ /dev/null
@@ -1,69 +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.
-GENDER_UNKNOWN=Unbekannt
-GENDER_MALE=Herr
-GENDER_FEMALE=Frau
-GENDER_COMPANY=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/src/org/mxchange/localization/bundle_en_US.properties b/src/org/mxchange/localization/bundle_en_US.properties
deleted file mode 100644
index d1b03462..00000000
--- a/src/org/mxchange/localization/bundle_en_US.properties
+++ /dev/null
@@ -1,69 +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).
-GENDER_UNKNOWN=Unknown
-GENDER_MALE=Mr.
-GENDER_FEMALE=Mrs.
-GENDER_COMPANY=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
-- 
2.39.5