diff --git a/src/main/java/com/ardublock/Main.java b/src/main/java/com/ardublock/Main.java
index facd690ddd5124acba82f5c7dbaa7cfdcf74ca4f..1f4d9ead41228e75dc564d19b303e9ac705c911b 100644
--- a/src/main/java/com/ardublock/Main.java
+++ b/src/main/java/com/ardublock/Main.java
@@ -1,5 +1,6 @@
 package com.ardublock;
 
+import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.IOException;
 
@@ -33,6 +34,7 @@ public class Main
 	{
 		openblocksFrame = new OpenblocksFrame();
 		openblocksFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
 		Context context = Context.getContext();
 		context.setInArduino(false);
 		openblocksFrame.setVisible(true);
diff --git a/src/main/java/com/ardublock/core/Context.java b/src/main/java/com/ardublock/core/Context.java
index 7ab7e7d6dc4b4bce300832ccb1dc3745a9835851..ecd42a1d8349f635fec18bc4e7785465f2bb11a7 100644
--- a/src/main/java/com/ardublock/core/Context.java
+++ b/src/main/java/com/ardublock/core/Context.java
@@ -16,17 +16,21 @@ import java.util.Set;
 
 
 import processing.app.Editor;
+import processing.app.PreferencesData;
+
 import com.ardublock.ui.listener.OpenblocksFrameListener;
 import edu.mit.blocks.controller.WorkspaceController;
 import edu.mit.blocks.renderable.RenderableBlock;
 import edu.mit.blocks.workspace.Workspace;
 
+
 public class Context
 {
 	public final static String LANG_DTD_PATH = "/com/ardublock/block/lang_def.dtd";
 	public final static String ARDUBLOCK_LANG_PATH = "/com/ardublock/block/ardublock.xml";
 	public final static String ARDUBLOCK_LANG_RESOURCE_BUNDLE = "com/ardublock/block/ardublock";
 	public final static String DEFAULT_ARDUBLOCK_PROGRAM_PATH = "/com/ardublock/defaultProgram.abp";
+	public final static String DEFAULT_ARDUBLOCK_PREFRENCES_PATH = "/com/ardublock/defaultArduBlockPreferences.txt";
 	public final static String ARDUINO_VERSION_UNKNOWN = "unknown";
 	public final boolean isNeedAutoFormat = true;	
 	
@@ -80,6 +84,11 @@ public class Context
 	
 	private Context()
 	{
+		//set default values to preferences.txt
+		if(!PreferencesData.has("ardublock")){
+			setDefaultPreferences();
+		}
+				
 		workspaceController = new WorkspaceController();
 		resetWorkspace();
 		workspace = workspaceController.getWorkspace();
@@ -124,8 +133,7 @@ public class Context
 	}
 	
 	private void loadDefaultArdublockProgram()
-	{
-		
+	{	
 		workspaceController.resetWorkspace();
 		String loadPath = "";
 		
@@ -137,7 +145,12 @@ public class Context
 			e2.printStackTrace();
 		}
 		try {
-			workspaceController.loadProjectFromPath(loadPath);
+			if(PreferencesData.get("ardublock.workspace.mode").contains("custom") || PreferencesData.get("ardublock.workspace.mode").contains("page")) {
+				workspaceController.loadProjectFromPath(loadPath, PreferencesData.get("ardublock.workspace.mode"));
+			}else {
+				workspaceController.loadProjectFromPath(loadPath);
+			}
+			
 		} catch (IOException e1) {
 			try {
 		    	InputStream is = getClass().getResourceAsStream(DEFAULT_ARDUBLOCK_PROGRAM_PATH);
@@ -153,8 +166,12 @@ public class Context
 		    	br.close();
 		 	    isr.close();
 				is.close();
-			
-				workspaceController.loadProject(defaultFileString, null , "default");
+				
+				if(PreferencesData.get("ardublock.workspace.mode").contains("custom") || PreferencesData.get("ardublock.workspace.mode").contains("page")) {
+					workspaceController.loadProject(defaultFileString, null , PreferencesData.get("ardublock.workspace.mode"));
+				} else {
+					workspaceController.loadProject(defaultFileString, null , "default");
+				}
 				
 			} catch (IOException e) {
 				// TODO Auto-generated catch block
@@ -163,6 +180,14 @@ public class Context
 		}
 	}
 	
+	private void setDefaultPreferences() {//letsgoING
+		PreferencesData.setBoolean("ardublock", true);
+		//PreferencesData.set("ardublock.ui.language", "DE");			//TODO: implement
+		PreferencesData.set("ardublock.workspace.mode", "default"); //"default" / "custom" / "page"
+		PreferencesData.setInteger("ardublock.workspace.zoom", 10); // float values between 
+		//PreferencesData.set("ardublock.workspace.code", "simple");  //TODO: implement
+}
+	
 	//determine OS
 	private OsType determineOsType()
 	{
diff --git a/src/main/java/com/ardublock/ui/OpenblocksFrame.java b/src/main/java/com/ardublock/ui/OpenblocksFrame.java
index bf10a0c2632d74c3efc98508c9e1a79d61098cd4..37ae8f113d8a6a1649f8b35a417c2c333befef68 100644
--- a/src/main/java/com/ardublock/ui/OpenblocksFrame.java
+++ b/src/main/java/com/ardublock/ui/OpenblocksFrame.java
@@ -11,6 +11,8 @@ import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -65,6 +67,7 @@ import edu.mit.blocks.controller.WorkspaceController;
 import edu.mit.blocks.workspace.SearchBar;
 import edu.mit.blocks.workspace.SearchableContainer;
 import edu.mit.blocks.workspace.Workspace;
+import processing.app.PreferencesData;
 //import edu.mit.blocks.workspace.ZoomSlider;
 import tec.letsgoing.ardublock.simulator.view.GUI;
 
@@ -83,14 +86,17 @@ public class OpenblocksFrame extends JFrame
 	private JFileChooser fileChooser;
 	private FileFilter ffilter;
 	private boolean workspaceModeState = false;
-	private ResourceBundle uiMessageBundle;
 	private String appPrefix = "";
+	//private ResourceBundle uiMessageBundle;
+	private static ResourceBundle uiMessageBundle = ResourceBundle.getBundle("com/ardublock/block/ardublock");
 	
-	JButton modeBasicButton = null;
-	JButton modeProButton   = null;
-	JButton modeSimButton   = null;
+	private JButton modeBasicButton = null;
+	private JButton modeProButton   = null;
+	private JButton modeSimButton   = null;
 	
-	SearchBar searchBar = null;
+	private SearchBar searchBar = null;
+	
+	private String blockMenuMode = "default";
 	
 	public void addListener(OpenblocksFrameListener ofl)
 	{
@@ -98,7 +104,7 @@ public class OpenblocksFrame extends JFrame
 	}
 	
 	public String makeFrameTitle()
-	{
+	{	
 		String title = Context.APP_NAME + " " + appPrefix +" "+context.getSaveFileName();
 		if (context.isWorkspaceChanged())
 		{
@@ -118,8 +124,6 @@ public class OpenblocksFrame extends JFrame
 		this.setLocationRelativeTo(null);
 		//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		
-		uiMessageBundle = ResourceBundle.getBundle("com/ardublock/block/ardublock");
-		
 		fileChooser = new JFileChooser();
 		ffilter = new FileNameExtensionFilter(uiMessageBundle.getString("ardublock.file.suffix"), "abp");
 		fileChooser.setFileFilter(ffilter);
@@ -133,7 +137,7 @@ public class OpenblocksFrame extends JFrame
 	}
 	
 	private void initOpenBlocks()
-	{
+	{		
 		final Context context = Context.getContext();
 		
 		/*
@@ -143,6 +147,18 @@ public class OpenblocksFrame extends JFrame
 		
 		final Workspace workspace = context.getWorkspace();
 		
+		
+		//override close operation
+		this.addWindowListener(new WindowAdapter() {
+			  public void windowClosing(WindowEvent we) {
+				  PreferencesData.set("ardublock.workspace.mode", blockMenuMode);
+				  PreferencesData.setInteger("ardublock.workspace.zoom", (int)(workspace.getCurrentWorkspaceZoom()*10));
+				  if(context.isWorkspaceChanged() && askUserSaveFileOnExit()){
+					  doSaveArduBlockFile();
+				  }
+			  }
+			});
+		
 		// WTF I can't add workspacelistener by workspace controller
 		workspace.addWorkspaceListener(new ArdublockWorkspaceListener(this));
 		
@@ -151,6 +167,21 @@ public class OpenblocksFrame extends JFrame
 		
 		searchBar = new SearchBar(uiMessageBundle.getString("ardublock.ui.search"), uiMessageBundle.getString("ardublock.ui.search.tooltip"), workspace);
 	    addSearchableBlocks(workspace);
+	    
+	    blockMenuMode = PreferencesData.get("ardublock.workspace.mode");
+	    
+	    String zoomString = PreferencesData.get("ardublock.workspace.zoom");
+	    if(zoomString != null && zoomString.matches("[0-9.]+")) {
+	    	workspace.setWorkspaceZoom(((double) Integer.parseInt(zoomString))/10.0);
+	    }
+	    
+	    if(blockMenuMode.contentEquals("custom")) {
+			appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.pro");
+		}else if (blockMenuMode.contentEquals("page")) {
+			appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.sim");
+		} else {
+			appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.standard");
+		}
 		
 		//NEW
 		//**********
@@ -521,6 +552,8 @@ public class OpenblocksFrame extends JFrame
 		ButtonMouseListener modeProButtonMouseListener = new ButtonMouseListener(modeProButtonIcon, modeProButtonIconHovered, modeProButtonIconPressed, modeProButtonIconSelected);
 		ButtonMouseListener modeSimButtonMouseListener = new ButtonMouseListener(modeSimButtonIcon, modeSimButtonIconHovered, modeSimButtonIconPressed, modeSimButtonIconSelected);
 		
+		
+		
 		//Workspace: BASIC
 		//*****************
 		ActionListener modeBasicButtonListener = new ActionListener () {
@@ -564,6 +597,7 @@ public class OpenblocksFrame extends JFrame
 				    
 			        appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.standard");
 			        setTitle(makeFrameTitle());
+			        blockMenuMode = "default";
 			        //zoomSlider.reset();
 			        //zoomSlider.setValue(currentWorkspaceZoom);
 			        workspace.setWorkspaceZoom(currentWorkspaceZoom);
@@ -633,7 +667,7 @@ public class OpenblocksFrame extends JFrame
 			        //modeSimButton.setFont(new Font("Sans", Font.PLAIN, 12));
 			        appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.pro");
 			        setTitle(makeFrameTitle());
-			        
+			        blockMenuMode = "custom";
 			        //zoomSlider.reset();
 			        //zoomSlider.setValue(currentWorkspaceZoom);
 			        workspace.setWorkspaceZoom(currentWorkspaceZoom);
@@ -702,7 +736,7 @@ public class OpenblocksFrame extends JFrame
 			        //modeSimButton.setFont(new Font("Sans", Font.BOLD, 12));
 				    appPrefix = uiMessageBundle.getString("ardublock.ui.appprefix.sim");
 				    setTitle(makeFrameTitle());
-			        
+			        blockMenuMode = "page";
 				    //zoomSlider.reset();
 				    //zoomSlider.setValue(currentWorkspaceZoom);
 				    workspace.setWorkspaceZoom(currentWorkspaceZoom); 
@@ -730,6 +764,51 @@ public class OpenblocksFrame extends JFrame
 		//*****************************************
 		
 		
+		if(PreferencesData.get("ardublock.workspace.mode").contentEquals("custom")) {
+			generateButton.setVisible(true);
+	        generateMenuItem.setVisible(true);
+	        generateMenuItem.registerKeyboardAction(generateButtonListener, ctrluKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
+	        simulateButton.setVisible(false);
+	        simulateMenuItem.setVisible(false);
+	        simulateMenuItem.unregisterKeyboardAction(ctrluKeyStroke);
+	        //helpButton.setVisible(false);
+	        helpButton.removeActionListener(simulatorHelpButtonListener);
+	        helpButton.addActionListener(helpButtonListener);
+			helpButton.setToolTipText(uiMessageBundle.getString("ardublock.ui.help.tooltip"));
+	        serialMonitorButton.setVisible(true);
+		    serialPlotterButton.setVisible(true);
+		    modeBasicButtonMouseListener.setSelected(false);
+		    modeProButtonMouseListener.setSelected(true);
+		    modeSimButtonMouseListener.setSelected(false);
+		    modeBasicButton.setIcon(modeBasicButtonIcon);
+		    modeProButton.setIcon(modeProButtonIconSelected);
+		    modeSimButton.setIcon(modeSimButtonIcon);
+		}else if (PreferencesData.get("ardublock.workspace.mode").contentEquals("page")) {
+			generateButton.setVisible(false);
+		    generateMenuItem.setVisible(false);
+		    generateMenuItem.unregisterKeyboardAction(ctrluKeyStroke);
+		    simulateButton.setVisible(true);
+		    simulateMenuItem.setVisible(true);
+		    simulateMenuItem.registerKeyboardAction(simulateButtonListener, ctrluKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
+		    //helpButton.setVisible(true);
+		    helpButton.removeActionListener(helpButtonListener);
+		    helpButton.addActionListener(simulatorHelpButtonListener);
+			helpButton.setToolTipText(uiMessageBundle.getString("ardublock.ui.simulatorHelp.tooltip"));
+		    serialMonitorButton.setVisible(false);
+		    serialPlotterButton.setVisible(false);
+		    modeBasicButtonMouseListener.setSelected(false);
+		    modeProButtonMouseListener.setSelected(false);
+		    modeSimButtonMouseListener.setSelected(true);
+		    modeBasicButton.setIcon(modeBasicButtonIcon);
+		    modeProButton.setIcon(modeProButtonIcon);
+		    modeSimButton.setIcon(modeSimButtonIconSelected);
+		} else {
+			//modeBasicButtonMouseListener.setSelected(true);
+			//modeProButtonMouseListener.setSelected(false);
+			//modeSimButtonMouseListener.setSelected(false);
+		}
+		
+				
 		//COPY PROGRAM
 		//*****************************************
 		KeyStroke ctrlcKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK);
@@ -1114,9 +1193,15 @@ public class OpenblocksFrame extends JFrame
 		return null;
 	}
 	
+	private boolean askUserSaveFileOnExit()
+	{
+		int optionValue = JOptionPane.showOptionDialog(this, uiMessageBundle.getString("message.content.saveOnExit"), uiMessageBundle.getString("message.title.question"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION);
+		return (optionValue == JOptionPane.YES_OPTION);
+	}
+	
 	private boolean askUserOverwriteExistedFile()
 	{
-		int optionValue = JOptionPane.showOptionDialog(this, uiMessageBundle.getString("message.content.overwrite"), uiMessageBundle.getString("message.title.question"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION);
+		int optionValue = JOptionPane.showOptionDialog(this, uiMessageBundle.getString("message.content.overwrite"), uiMessageBundle.getString("message.title.question"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION);
 		return (optionValue == JOptionPane.YES_OPTION);
 	}
 	
@@ -1297,6 +1382,14 @@ public class OpenblocksFrame extends JFrame
 		return workspaceModeState; 
 	}
 	
+	
+
+	
+	private void savePreferences(Workspace workspace) { //on ArduBlock close???
+		//PreferencesData.set("ardublock.workspace.mode", blockMenuMode); //"default" / "standard" / "custom";
+		PreferencesData.setInteger("ardublock.workspace.zoom", (int)(workspace.getCurrentWorkspaceZoom()*10)); // float values between 
+	}
+	
 	//TODO: TESTTESTTEST
 	private void addLibrary(String libraryName) 
 	{
diff --git a/src/main/resources/com/ardublock/block/ardublock.properties b/src/main/resources/com/ardublock/block/ardublock.properties
index 4649738ea521a99a3002f688452baaeb6f5403ab..38d61eb46a4648a62398d792105e954de7fff8f2 100644
--- a/src/main/resources/com/ardublock/block/ardublock.properties
+++ b/src/main/resources/com/ardublock/block/ardublock.properties
@@ -142,6 +142,7 @@ message.content.overwriteDefault=Do you want to overwrite default file?
 message.file_not_found=File not found or permission denied
 message.file_not_found_new_file=File Not Found or permission denied.\nCreate new file?
 message.content.overwriteImage=Do you want to overwrite existing image?
+message.content.saveOnExit=Do you want to save the file before closing ArduBlock?
 
 message.question.newfile_on_workspace_changed=The program has changed, do you want to create a new Ardublock file?
 
diff --git a/src/main/resources/com/ardublock/block/ardublock_de.properties b/src/main/resources/com/ardublock/block/ardublock_de.properties
index 33bbb7922931d687a64e17f9f81382b07691e73f..d2b41b88da9058b5107551941296e30400061961 100644
--- a/src/main/resources/com/ardublock/block/ardublock_de.properties
+++ b/src/main/resources/com/ardublock/block/ardublock_de.properties
@@ -146,6 +146,7 @@ message.file_not_found=Datei wurde nicht gefunden oder der Zugriff wurde verweig
 message.file_not_found_new_file=Datei wurde nicht gefunden oder der Zugriff wurde verweigert.\nSoll eine neue Datei erstellt werden?
 message.question.newfile_on_workspace_changed=Das Programm hat sich geändert, soll eine neue Ardublock-Datei erstellt werden?
 message.content.overwriteImage=Soll das vorhandene Bild überschrieben werden?
+message.content.saveOnExit=Soll das Programm gespeichert werden bevor ArduBlock geschlossen wird?
 
 ##################
 #  BLOCK CONFIG  #
diff --git a/src/main/resources/com/ardublock/block/ardublock_en_GB.properties b/src/main/resources/com/ardublock/block/ardublock_en_GB.properties
index 80189ecde1f3da08d0354f738bcdc25f5711263f..de3fdf2c1c27ab00a120faedfa9e810bfc445ea2 100644
--- a/src/main/resources/com/ardublock/block/ardublock_en_GB.properties
+++ b/src/main/resources/com/ardublock/block/ardublock_en_GB.properties
@@ -147,6 +147,7 @@ message.file_not_found=Datei wurde nicht gefunden oder der Zugriff wurde verweig
 message.file_not_found_new_file=Datei wurde nicht gefunden oder der Zugriff wurde verweigert.\nSoll eine neue Datei erstellt werden?
 message.question.newfile_on_workspace_changed=Das Programm hat sich geändert, soll eine neue Ardublock-Datei erstellt werden?
 message.content.overwriteImage=Soll das vorhandene Bild überschrieben werden?
+message.content.saveOnExit=Soll das Programm gespeichert werden bevor ArduBlock geschlossen wird?
 
 ##################
 #  BLOCK CONFIG  #