diff --git a/src/de/deadlocker8/budgetmaster/logic/Updater.java b/src/de/deadlocker8/budgetmaster/logic/updater/Updater.java
similarity index 55%
rename from src/de/deadlocker8/budgetmaster/logic/Updater.java
rename to src/de/deadlocker8/budgetmaster/logic/updater/Updater.java
index c8701a4d7db38b322ddab5b575a0a13243c43fca..f969d027697615e491abf257f7c84bcf70ca5531 100644
--- a/src/de/deadlocker8/budgetmaster/logic/Updater.java
+++ b/src/de/deadlocker8/budgetmaster/logic/updater/Updater.java
@@ -1,22 +1,32 @@
-package de.deadlocker8.budgetmaster.logic;
+package de.deadlocker8.budgetmaster.logic.updater;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
 import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 
-import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
+import de.deadlocker8.budgetmaster.logic.utils.Strings;
+import logger.Logger;
+import tools.Localization;
+import tools.PathUtils;
 
 public class Updater
 {
 	private VersionInformation latestVersion;
 	private static final String LATEST_VERSION_INFO_URL = "https://raw.githubusercontent.com/deadlocker8/BudgetMaster/master/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties";
 	private static final String CHANGELOG_URL = "https://raw.githubusercontent.com/deadlocker8/BudgetMaster/master/src/de/deadlocker8/budgetmaster/resources/changelog.json";
+	private static final String BUILD_FOLDER = "https://github.com/deadlocker8/BudgetMaster/raw/master/build/";
 	
 	public Updater()
 	{	
@@ -102,4 +112,64 @@ public class Updater
 		}
 		return null;
 	}
+	
+	private void downloadLatestUpdater() throws IOException
+	{
+		//download into temp directory and file					
+		Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/Updater.jar");			
+		download(BUILD_FOLDER + "Updater.jar", target);		
+	}
+	
+	private File getCurrentExecutableName()
+	{
+		return new File(Updater.class.getProtectionDomain().getCodeSource().getLocation().getPath());
+	}
+	
+	
+	public void downloadLatestVersion() throws IOException
+	{
+		File currentExecutable = getCurrentExecutableName();
+		File currentFolder = currentExecutable.getParentFile();
+		String currentFileName = currentExecutable.getName();
+		String fileEnding;
+		
+		//check if BudgetMaster is running from executable
+		//no updating procedure if running from source
+		if(currentFileName.contains("."))
+		{
+			fileEnding = currentExecutable.getAbsolutePath().substring(currentExecutable.getAbsolutePath().indexOf("."), currentExecutable.getAbsolutePath().length());			
+		}
+		else
+		{
+			Logger.debug("Update procedure will be skipped because BudgetMaster is running from source");
+			return;
+		}
+		
+		PathUtils.checkFolder(new File(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER)));
+		
+		//download latest updater.jar
+		downloadLatestUpdater();
+		
+		//download into temp directory and file
+		if(fileEnding.equalsIgnoreCase("exe"))
+		{			
+			Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/update_BudgetMaster.exe");			
+			download(BUILD_FOLDER + "BudgetMaster.exe", target);
+		}
+		else
+		{
+			Path target = Paths.get(PathUtils.getOSindependentPath() + Localization.getString(Strings.FOLDER) + "/update_BudgetMasterClient.jar");			
+			download(BUILD_FOLDER + "BudgetMasterClient.jar", target);
+		}
+		
+		//TODO start upater with params
+		//--> move temp jar/exe to currentFolder with currentFileName
+	}
+	
+	public void download(String url, Path target) throws IOException
+	{
+		URL website = new URL(url);
+		InputStream in = website.openStream();
+		Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING);
+	}
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java
index 1d8693f632532ded522ce0fe57954fd1dcfadbe3..c018357fb1b0dc181e0341a93ecec7debe89efe8 100644
--- a/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java
+++ b/src/de/deadlocker8/budgetmaster/logic/utils/Strings.java
@@ -41,6 +41,7 @@ public class Strings
     public static final String LOAD_DATABASE_EXPORT = "load.database.export";
     public static final String LOAD_DATABASE_IMPORT = "load.database.import";
     public static final String LOAD_DATABASE_DELETE = "load.database.delete";
+    public static final String LOAD_UPDATE = "load.update";
     
     //MISC
     public static final String CATEGORY_NONE = "category.none";
@@ -183,4 +184,5 @@ public class Strings
     public static final String ERROR_DATABASE_IMPORT_WRONG_FILE = "error.database.import.wrong.file";
     public static final String ERROR_PASSWORD_SAVE = "error.password.save";
     public static final String ERROR_UPDATER_GET_LATEST_VERSION = "error.updater.get.latest.version";
+    public static final String ERROR_UPDATER_DOWNLOAD_LATEST_VERSION = "error.updater.download.latest.version";
 }
\ No newline at end of file
diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
index 85268750b60aec53721a06b3593e8c8c16ad2887..3a8c9004931bb7fd7056e05ddd957d5315e27273 100644
--- a/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
+++ b/src/de/deadlocker8/budgetmaster/resources/languages/_de.properties
@@ -39,6 +39,7 @@ load.report=Der Monatsbericht wird erstellt, bitte warten...
 load.database.export=Die Datenbank wird exportiert, bitte warten...
 load.database.import=Die Datenbank wird importiert, bitte warten...
 load.database.delete=Die Datenbank wird gel�scht, bitte warten...
+load.update=Update wird heruntergeladen, bitte warten...
 
 # MISC
 category.none=Keine Kategorie
@@ -180,6 +181,7 @@ error.database.import=Beim Einlesen der Datei ist ein Fehler aufgetreten.
 error.database.import.wrong.file=Die angegebene Datei enth�lt kein g�ltiges BudgetMaster-Datenformat und kann daher nicht importiert werden.
 error.password.save=Beim Speichern des Passworts ist ein Fehler aufgetreten.
 error.updater.get.latest.version=Beim �berpr�fen auf Updates ist ein Fehler aufgetreten. Informationen zu neuen Versionen konnten nicht abgerufen werden. Versuche es sp�ter noch einmal.
+error.updater.download.latest.version=Beim Herunterladen des Updates ist ein Fehler aufgetreten.\n\n{0}
 
 # UI
 categorytab.button.category.new=\ Neue Kategorie
diff --git a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties
index a1d9e6dd66aa79279f4f77e43213ac823d5886b2..eeda9a8d506e74c321a3c593e03b88836e94abb9 100644
--- a/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties
+++ b/src/de/deadlocker8/budgetmaster/resources/languages/_en.properties
@@ -39,6 +39,7 @@ load.report=Please wait while the report is being generated...
 load.database.export=Please wait while the database is being exported...
 load.database.import=Please wait while the database is being imported...
 load.database.delete=Please wait while the database is being deleted...
+load.update=Please wait while the update is being downloaded...
 
 # MISC
 category.none=No Category
@@ -180,6 +181,7 @@ error.database.import=An error occurred while reading the file.
 error.database.import.wrong.file=The specified file does not contain a valid BudgetMaster data format thus can not be imported.
 error.password.save=An error occurred while saving the password.
 error.updater.get.latest.version=An error occurred while checking for updates. Information about latest versions could not be retrieved. Please try again later.
+error.updater.download.latest.version=An error occurred while downloading the update.\n\n{0}
 
 # UI
 categorytab.button.category.new=\ New Category
diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java
index c35bb05415888b0f0675ba7d9963a80cf5637d83..e6be8ee3043cc89465906dcfa5ba59bea4d15220 100644
--- a/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java
+++ b/src/de/deadlocker8/budgetmaster/ui/controller/Controller.java
@@ -12,9 +12,9 @@ import de.deadlocker8.budgetmaster.logic.FilterSettings;
 import de.deadlocker8.budgetmaster.logic.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.PaymentHandler;
 import de.deadlocker8.budgetmaster.logic.Settings;
-import de.deadlocker8.budgetmaster.logic.Updater;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.updater.Updater;
 import de.deadlocker8.budgetmaster.logic.updater.VersionInformation;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
@@ -97,10 +97,15 @@ public class Controller
 		updater = new Updater();
 		
 		if(settings.isAutoUpdateCheckEnabled())
-		{
+		{			
 			checkForUpdates();
 		}
-
+				
+		initUI();		
+	}
+	
+	private void initUI()
+	{
 		try
 		{
 			FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/de/deadlocker8/budgetmaster/ui/fxml/HomeTab.fxml"));
@@ -347,35 +352,69 @@ public class Controller
 		try
 		{
 			boolean updateAvailable = updater.isUpdateAvailable(Integer.parseInt(Localization.getString(Strings.VERSION_CODE)));
-			String changes = updater.getChangelog(updater.getLatestVersion().getVersionCode());
+			//DEBUG
+			//String changes = updater.getChangelog(updater.getLatestVersion().getVersionCode());
+			String changes = "";
 			
 			if(!updateAvailable)
 				return;
 			
-			Alert alert = new Alert(AlertType.INFORMATION);
-			alert.setTitle(Localization.getString(Strings.INFO_TITLE_UPDATE_AVAILABLE));
-			alert.setHeaderText("");
-			alert.setContentText(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE,
-														updater.getLatestVersion().getVersionName(),
-														changes));			
-			Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
-			dialogStage.getIcons().add(icon);					
-			
-			ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE_NOW));
-			ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.CANCEL));							
-			alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo);
-			
-			Optional<ButtonType> result = alert.showAndWait();						
-			if (result.get() == buttonTypeOne)
-			{				
-				//TODO update			
-			}
-			else
-			{
-				alert.close();
-			}
+			Platform.runLater(()->{
+				Alert alert = new Alert(AlertType.INFORMATION);
+				alert.setTitle(Localization.getString(Strings.INFO_TITLE_UPDATE_AVAILABLE));
+				alert.setHeaderText("");
+				alert.setContentText(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE,
+															updater.getLatestVersion().getVersionName(),
+															changes));			
+				Stage dialogStage = (Stage)alert.getDialogPane().getScene().getWindow();
+				dialogStage.getIcons().add(icon);					
+				
+				ButtonType buttonTypeOne = new ButtonType(Localization.getString(Strings.INFO_TEXT_UPDATE_AVAILABLE_NOW));
+				ButtonType buttonTypeTwo = new ButtonType(Localization.getString(Strings.CANCEL));							
+				alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo);
+				
+				Optional<ButtonType> result = alert.showAndWait();						
+				if (result.get() == buttonTypeOne)
+				{		
+					//TODO download latest updater first
+				
+					Stage modalStage = Helpers.showModal(Localization.getString(Strings.TITLE_MODAL), Localization.getString(Strings.LOAD_UPDATE), stage, icon);
+					
+					Worker.runLater(() -> {
+						try 
+						{
+							updater.downloadLatestVersion();
+							Platform.runLater(() -> {
+								if(modalStage != null)
+								{
+									modalStage.close();
+								}							
+							});
+						}
+						catch(IOException ex)
+						{
+							Logger.error(ex);
+							Platform.runLater(() -> {
+								if(modalStage != null)
+								{
+									modalStage.close();
+									AlertGenerator.showAlert(AlertType.ERROR, 
+															Localization.getString(Strings.TITLE_ERROR),
+															"", 
+															Localization.getString(Strings.ERROR_UPDATER_DOWNLOAD_LATEST_VERSION, ex.getMessage()), 
+															icon, null, null, true);
+								}							
+							});
+						}
+					});
+				}
+				else
+				{
+					alert.close();
+				}
+			});
 		}		
-		catch(NumberFormatException | IOException e)
+		catch(IOException e)
 		{
 			Logger.error(e);
 			AlertGenerator.showAlert(AlertType.ERROR, 
@@ -448,8 +487,7 @@ public class Controller
 				categoryHandler = new CategoryHandler(connection.getCategories());
 				
 				categoryBudgets = connection.getCategoryBudgets(currentDate.getYear(), currentDate.getMonthOfYear());	
-				paymentHandler.filter(newFilterSettings);
-				
+				paymentHandler.filter(newFilterSettings);				
 
 				Platform.runLater(() -> {
 					if(modalStage != null)
diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java b/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java
index 7af334bae27f95da802da482f22f48c5c79673b7..57c1e1190e9859ce75056ae8dd843cf57a41d467 100644
--- a/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/controller/SettingsController.java
@@ -6,9 +6,9 @@ import java.util.ArrayList;
 import java.util.Optional;
 
 import de.deadlocker8.budgetmaster.logic.Settings;
-import de.deadlocker8.budgetmaster.logic.Updater;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ExceptionHandler;
 import de.deadlocker8.budgetmaster.logic.serverconnection.ServerConnection;
+import de.deadlocker8.budgetmaster.logic.updater.Updater;
 import de.deadlocker8.budgetmaster.logic.utils.Colors;
 import de.deadlocker8.budgetmaster.logic.utils.FileHelper;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;