diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/Messages.java b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/Messages.java
index 4b568bc..1c484b1 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/Messages.java
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/Messages.java
@@ -38,6 +38,33 @@
 	public static String NewAddonClassWizard_NewAddon;
 	public static String NewAddonClassWizard_NewAddonClass;
 	public static String NewApplicationModelWizard_IncludeDefaultAddons;
+	public static String NewApplicationWizardPage_AddLifecycleClass;
+	public static String NewApplicationWizardPage_AddOptionCleanPersistedState;
+	public static String NewApplicationWizardPage_ConfigureApplication;
+	public static String NewApplicationWizardPage_CreateSampleContent;
+	public static String NewApplicationWizardPage_CSSStyle;
+	public static String NewApplicationWizardPage_Dots;
+	public static String NewApplicationWizardPage_E4Lifecycle;
+	public static String NewApplicationWizardPage_Eclipse4Application;
+	public static String NewApplicationWizardPage_EnableDevelopmentMode;
+	public static String NewApplicationWizardPage_Height;
+	public static String NewApplicationWizardPage_InputValueEmpty;
+	public static String NewApplicationWizardPage_InputValueError;
+	public static String NewApplicationWizardPage_LifecycleClassName;
+	public static String NewApplicationWizardPage_Name;
+	public static String NewApplicationWizardPage_NewE4ApplicationWizardPage;
+	public static String NewApplicationWizardPage_OnlyNumericValues;
+	public static String NewApplicationWizardPage_PreferenceCustomization;
+	public static String NewApplicationWizardPage_Product;
+	public static String NewApplicationWizardPage_Properties;
+	public static String NewApplicationWizardPage_Property;
+	public static String NewApplicationWizardPage_Rectangle;
+	public static String NewApplicationWizardPage_SetRectangle;
+	public static String NewApplicationWizardPage_TemplateOption;
+	public static String NewApplicationWizardPage_ValueShouldNotBeEmpty;
+	public static String NewApplicationWizardPage_Width;
+	public static String NewApplicationWizardPage_X;
+	public static String NewApplicationWizardPage_Y;
 	public static String NewDynamicMenuContributionClassWizard_AboutToShowMethod;
 	public static String NewDynamicMenuContributionClassWizard_CreateNewContribution;
 	public static String NewDynamicMenuContributionClassWizard_NewDynamicContribution;
diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/messages.properties b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/messages.properties
index 5299e7d..8a4f5dd 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/messages.properties
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/messages.properties
@@ -27,6 +27,33 @@
 NewAddonClassWizard_NewAddon=New Addon
 NewAddonClassWizard_NewAddonClass=Create a new addon class
 NewApplicationModelWizard_IncludeDefaultAddons=Include default addons
+NewApplicationWizardPage_AddLifecycleClass=Add a lifecycle class
+NewApplicationWizardPage_AddOptionCleanPersistedState=Add option -clearPersistedState to the Product's Program Arguments
+NewApplicationWizardPage_ConfigureApplication=Configure application with special values.
+NewApplicationWizardPage_CreateSampleContent=Create sample content (parts, menu etc.)
+NewApplicationWizardPage_CSSStyle=CSS Style:
+NewApplicationWizardPage_Dots=...
+NewApplicationWizardPage_E4Lifecycle=E4LifeCycle
+NewApplicationWizardPage_Eclipse4Application=Eclipse 4 Application
+NewApplicationWizardPage_EnableDevelopmentMode=Enable development mode for application model
+NewApplicationWizardPage_Height=Height:
+NewApplicationWizardPage_InputValueEmpty=Input value empty
+NewApplicationWizardPage_InputValueError=Input value error
+NewApplicationWizardPage_LifecycleClassName=LifeCycle class name:
+NewApplicationWizardPage_Name=Name:*
+NewApplicationWizardPage_NewE4ApplicationWizardPage=New Eclipse 4 Application Wizard Page
+NewApplicationWizardPage_OnlyNumericValues=Only numeric is allowed\!
+NewApplicationWizardPage_PreferenceCustomization=Preference Customization:
+NewApplicationWizardPage_Product=Product
+NewApplicationWizardPage_Properties=Properties
+NewApplicationWizardPage_Property=Property "
+NewApplicationWizardPage_Rectangle=Rect
+NewApplicationWizardPage_SetRectangle=Set Rect
+NewApplicationWizardPage_TemplateOption=Template option
+NewApplicationWizardPage_ValueShouldNotBeEmpty=Value shoud not be empty\!
+NewApplicationWizardPage_Width=Width:
+NewApplicationWizardPage_X=X:
+NewApplicationWizardPage_Y=Y:
 NewDynamicMenuContributionClassWizard_AboutToShowMethod=AboutToShow Method
 NewDynamicMenuContributionClassWizard_CreateNewContribution=Create a new dynamic menu contribution class
 NewDynamicMenuContributionClassWizard_NewDynamicContribution=New Dynamic Menu Contribution
diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/NewApplicationWizardPage.java b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/NewApplicationWizardPage.java
index dfe2e28..fe9d24e 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/NewApplicationWizardPage.java
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/NewApplicationWizardPage.java
@@ -18,6 +18,7 @@
 import java.util.Map;
 
 import org.eclipse.core.resources.IProject;
+import org.eclipse.e4.internal.tools.Messages;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.dialogs.MessageDialog;
@@ -53,6 +54,9 @@
  * @author jin.liu (jin.liu@soyatec.com)
  */
 public class NewApplicationWizardPage extends WizardPage {
+	private static final String TRUE = "TRUE"; //$NON-NLS-1$
+	private static final String TRUESMALL = "true"; //$NON-NLS-1$
+	private static final String FALSE = "FALSE"; //$NON-NLS-1$
 	public static final String E4_APPLICATION = "org.eclipse.e4.ui.workbench.swt.E4Application"; //$NON-NLS-1$
 	public static final String APPLICATION_CSS_PROPERTY = "applicationCSS"; //$NON-NLS-1$
 	public static final String LIFECYCLE_URI_PROPERTY = "lifeCycleURI"; //$NON-NLS-1$
@@ -79,13 +83,13 @@
 
 	protected NewApplicationWizardPage(IProjectProvider projectProvider,
 		AbstractFieldData pluginData) {
-		super("New Eclipse 4 Application Wizard Page");
+		super(Messages.NewApplicationWizardPage_NewE4ApplicationWizardPage);
 		this.projectProvider = projectProvider;
 		this.pluginData = pluginData;
 		data = new HashMap<String, String>();
-		data.put(richSample, "FALSE");// minimalist by default
-		setTitle("Eclipse 4 Application");
-		setMessage("Configure application with special values.");
+		data.put(richSample, FALSE);// minimalist by default
+		setTitle(Messages.NewApplicationWizardPage_Eclipse4Application);
+		setMessage(Messages.NewApplicationWizardPage_ConfigureApplication);
 	}
 
 	public IProject getProject() {
@@ -124,7 +128,7 @@
 	private Group createTemplateGroup(Composite parent) {
 		final Group group = new Group(parent, SWT.NONE);
 		group.setLayout(new GridLayout(3, false));
-		group.setText("Template option");
+		group.setText(Messages.NewApplicationWizardPage_TemplateOption);
 
 		richSampleCheckbox = new Button(group, SWT.CHECK);
 
@@ -132,10 +136,10 @@
 		richSampleCheckbox.addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
-				data.put(richSample, richSampleCheckbox.getSelection() ? "TRUE" : "FALSE");
+				data.put(richSample, richSampleCheckbox.getSelection() ? TRUE : FALSE);
 			}
 		});
-		richSampleCheckbox.setText("Create sample content (parts, menu etc.)");
+		richSampleCheckbox.setText(Messages.NewApplicationWizardPage_CreateSampleContent);
 		richSampleCheckbox.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false, 2, 1));
 
 		{
@@ -143,26 +147,26 @@
 				@Override
 				public void widgetSelected(SelectionEvent e) {
 					lifeCycleName.setEnabled(generateLifecycleClassCheckbox.getSelection());
-					data.put(generateLifecycle, generateLifecycleClassCheckbox.getSelection() ? "TRUE" : "FALSE");
+					data.put(generateLifecycle, generateLifecycleClassCheckbox.getSelection() ? TRUE : FALSE);
 				}
 			};
 
 			generateLifecycleClassCheckbox = new Button(group, SWT.CHECK);
 			generateLifecycleClassCheckbox.setSelection(false);
 
-			generateLifecycleClassCheckbox.setText("Add a lifecycle class");
+			generateLifecycleClassCheckbox.setText(Messages.NewApplicationWizardPage_AddLifecycleClass);
 			generateLifecycleClassCheckbox.setLayoutData(new GridData(SWT.BEGINNING, SWT.TOP, false, false, 2, 1));
 			generateLifecycleClassCheckbox.addSelectionListener(listener);
 
 			new Label(group, SWT.NONE);
 			final Label lbl = new Label(group, SWT.NONE);
-			lbl.setText("LifeCycle class name:");
+			lbl.setText(Messages.NewApplicationWizardPage_LifecycleClassName);
 			final GridData gd = new GridData();
 			gd.horizontalIndent = 20;
 			lbl.setLayoutData(gd);
 
 			lifeCycleName = new Text(group, SWT.BORDER);
-			lifeCycleName.setText("E4LifeCycle");
+			lifeCycleName.setText(Messages.NewApplicationWizardPage_E4Lifecycle);
 			lifeCycleName.setEnabled(false);
 			lifeCycleName.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
 			lifeCycleName.addModifyListener(new ModifyListener() {
@@ -233,7 +237,7 @@
 
 	private Group createPropertyGroup(Composite control) {
 		final Group group = new Group(control, SWT.NONE);
-		group.setText("Properties");
+		group.setText(Messages.NewApplicationWizardPage_Properties);
 
 		group.setLayout(new GridLayout(3, false));
 
@@ -245,7 +249,7 @@
 
 		if (property.getType() == Boolean.class) {
 			final Button button = new Button(parent, SWT.CHECK);
-			button.setSelection("true".equalsIgnoreCase(property.getValue()));
+			button.setSelection(TRUESMALL.equalsIgnoreCase(property.getValue()));
 			button.addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
@@ -274,7 +278,7 @@
 			if (property.getType() == Color.class
 				|| property.getType() == Rectangle.class) {
 				final Button button = new Button(parent, SWT.PUSH);
-				button.setText("...");
+				button.setText(Messages.NewApplicationWizardPage_Dots);
 				button.addSelectionListener(new SelectionAdapter() {
 					@Override
 					public void widgetSelected(SelectionEvent e) {
@@ -293,7 +297,7 @@
 		final Label label = new Label(parent, SWT.NONE);
 		label.setText(property.getLabel());
 		label.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_BLUE));
-		label.setToolTipText("Property \"" + property.getName() + "\"");
+		label.setToolTipText(Messages.NewApplicationWizardPage_Property + property.getName() + "\""); //$NON-NLS-1$
 		if (property.getExtraTooltipInfo() != null) {
 			label.setToolTipText(label.getToolTipText() + EOL
 				+ property.getExtraTooltipInfo());
@@ -323,12 +327,12 @@
 	/**
 	 * exchange the color pattern of hex numeric
 	 *
-	 * @param number
+	 * @param color
 	 * @return
 	 */
 	public String hexColorConvert(String color) {
 		if (color.length() == 1) {
-			return "0" + color;
+			return "0" + color; //$NON-NLS-1$
 		}
 		return color;
 	}
@@ -354,29 +358,29 @@
 			protected Control createDialogArea(final Composite parent) {
 				final Composite composite = (Composite) super
 					.createDialogArea(parent);
-				composite.getShell().setText("Set Rect");
+				composite.getShell().setText(Messages.NewApplicationWizardPage_SetRectangle);
 				final Group group = new Group(composite, SWT.NONE);
-				group.setText("Rect");
+				group.setText(Messages.NewApplicationWizardPage_Rectangle);
 				final GridLayout gridLayout = new GridLayout();
 				gridLayout.numColumns = 4;
 				group.setLayout(gridLayout);
 
 				final Label xPointLabel = new Label(group, SWT.NONE);
-				xPointLabel.setText("X:");
+				xPointLabel.setText(Messages.NewApplicationWizardPage_X);
 				xPointText = new Text(group, SWT.BORDER);
 				final VerifyListener verifyListener = createVerifyListener(parent
 					.getShell());
 				xPointText.addVerifyListener(verifyListener);
 				final Label yPointLabel = new Label(group, SWT.NONE);
-				yPointLabel.setText("Y:");
+				yPointLabel.setText(Messages.NewApplicationWizardPage_Y);
 				yPointText = new Text(group, SWT.BORDER);
 				yPointText.addVerifyListener(verifyListener);
 				final Label widthLabel = new Label(group, SWT.NONE);
-				widthLabel.setText("Width:");
+				widthLabel.setText(Messages.NewApplicationWizardPage_Width);
 				widthText = new Text(group, SWT.BORDER);
 				widthText.addVerifyListener(verifyListener);
 				final Label heighttLabel = new Label(group, SWT.NONE);
-				heighttLabel.setText("Height:");
+				heighttLabel.setText(Messages.NewApplicationWizardPage_Height);
 				heightText = new Text(group, SWT.BORDER);
 				heightText.addVerifyListener(verifyListener);
 
@@ -393,11 +397,11 @@
 					if (xPoint.length() == 0 || yPoint.length() == 0
 						|| width.length() == 0 || height.length() == 0) {
 						MessageDialog.openWarning(parent.getShell(),
-							"Input value empty",
-							"Value shoud not be empty!");
+							Messages.NewApplicationWizardPage_InputValueEmpty,
+							Messages.NewApplicationWizardPage_ValueShouldNotBeEmpty);
 					} else {
-						valueText.setText(xPoint + "," + yPoint + "," + width
-							+ "," + height);
+						valueText.setText(xPoint + "," + yPoint + "," + width //$NON-NLS-1$ //$NON-NLS-2$
+							+ "," + height); //$NON-NLS-1$
 						okPressed();
 					}
 				} else if (IDialogConstants.CANCEL_ID == buttonId) {
@@ -418,10 +422,10 @@
 			@Override
 			public void verifyText(VerifyEvent e) {
 				final char c = e.character;
-				if ("0123456789".indexOf(c) == -1) {
+				if ("0123456789".indexOf(c) == -1) { //$NON-NLS-1$
 					e.doit = false;
-					MessageDialog.openWarning(shell, "Input value error",
-						"Only numeric is allowed!");
+					MessageDialog.openWarning(shell, Messages.NewApplicationWizardPage_InputValueError,
+						Messages.NewApplicationWizardPage_OnlyNumericValues);
 					return;
 				}
 			}
@@ -433,7 +437,7 @@
 			return;
 		}
 		String value = valueText.getText();
-		if (value.equals("")) {
+		if (value.equals("")) { //$NON-NLS-1$
 			value = null;
 		}
 		data.put(property, value);
@@ -448,12 +452,12 @@
 
 	private Group createProductGroup(Composite control) {
 		final Group proGroup = new Group(control, SWT.NONE);
-		proGroup.setText("Product");
+		proGroup.setText(Messages.NewApplicationWizardPage_Product);
 
 		proGroup.setLayout(new GridLayout(2, false));
 
 		final Label proNameLabel = new Label(proGroup, SWT.NONE);
-		proNameLabel.setText("Name:*");
+		proNameLabel.setText(Messages.NewApplicationWizardPage_Name);
 
 		proNameText = new Text(proGroup, SWT.BORDER);
 		proNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@@ -470,15 +474,15 @@
 	protected PropertyData[] getPropertyData() {
 		if (PROPERTIES == null) {
 			PROPERTIES = new PropertyData[] {
-				new PropertyData(APPLICATION_CSS_PROPERTY, "CSS Style:",
-					"css/default.css", String.class, true),
-				new PropertyData(
-					IProductConstants.PREFERENCE_CUSTOMIZATION,
-					"Preference Customization:", "", String.class, true),
-				new PropertyData(CLEAR_PERSISTED_STATE,
-					"Enable development mode for application model",
-					"true", Boolean.class, true,
-					"Add option -clearPersistedState to the Product's Program Arguments") }; // plugin_customization.ini
+				new PropertyData(APPLICATION_CSS_PROPERTY, Messages.NewApplicationWizardPage_CSSStyle,
+					"css/default.css", String.class, true), //$NON-NLS-1$
+					new PropertyData(
+						IProductConstants.PREFERENCE_CUSTOMIZATION,
+						Messages.NewApplicationWizardPage_PreferenceCustomization, "", String.class, true), //$NON-NLS-1$
+						new PropertyData(CLEAR_PERSISTED_STATE,
+					Messages.NewApplicationWizardPage_EnableDevelopmentMode,
+					TRUESMALL, Boolean.class, true,
+					Messages.NewApplicationWizardPage_AddOptionCleanPersistedState) }; // plugin_customization.ini
 		}
 		return PROPERTIES;
 	}
diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/ResourceLocator.java b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/ResourceLocator.java
index 1e2c5e2..ecb0627 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/ResourceLocator.java
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/ResourceLocator.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *     Soyatec - initial API and implementation
+ * Soyatec - initial API and implementation
  *******************************************************************************/
 package org.eclipse.e4.internal.tools.wizards.project;
 
@@ -18,7 +18,7 @@
 import org.eclipse.e4.internal.tools.ToolsPlugin;
 
 public class ResourceLocator {
-	private static final String TEMPLATE_FOLDER = "templates";
+	private static final String TEMPLATE_FOLDER = "templates"; //$NON-NLS-1$
 
 	private static ResourceLocator instance = new ResourceLocator();
 
@@ -30,19 +30,19 @@
 	}
 
 	public static URL getProjectTemplateFiles(String folder)
-			throws IOException {
-		Plugin plugin = getResorucePlugin();
-		URL installURL = plugin.getBundle().getEntry(
-				"/" + TEMPLATE_FOLDER + "/" + folder);
+		throws IOException {
+		final Plugin plugin = getResorucePlugin();
+		final URL installURL = plugin.getBundle().getEntry(
+			"/" + TEMPLATE_FOLDER + "/" + folder); //$NON-NLS-1$ //$NON-NLS-2$
 		// FileLocator.toFileURL(installURL);
-		URL corePath = FileLocator.resolve(installURL);
+		final URL corePath = FileLocator.resolve(installURL);
 		return corePath;
 	}
 
 	public static URL getFile(String relativePath) throws IOException {
-		Plugin plugin = getResorucePlugin();
-		URL installURL = plugin.getBundle().getEntry(relativePath);
-		URL corePath = FileLocator.resolve(installURL);
+		final Plugin plugin = getResorucePlugin();
+		final URL installURL = plugin.getBundle().getEntry(relativePath);
+		final URL corePath = FileLocator.resolve(installURL);
 		return corePath;
 	}
 
diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/SimpleTemplate.java b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/SimpleTemplate.java
index d13efba..57a52b6 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/SimpleTemplate.java
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/SimpleTemplate.java
@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *     Steven Spungin <steven@spungin.tv> - initial API and implementation
+ * Steven Spungin <steven@spungin.tv> - initial API and implementation
  *******************************************************************************/
 package org.eclipse.e4.internal.tools.wizards.project;
 
@@ -15,19 +15,20 @@
 /**
  * A <em>very</em> basic template processor.<br />
  * Any value between pairs of @@ will be substituted by the value in a map.<br />
- * Any values not in the map will be replaced by an empty string.
- * <br /> <br />
+ * Any values not in the map will be replaced by an empty string. <br />
+ * <br />
  * Behavior is undefined if keys or values contain the @@ marker.
+ * 
  * @author Steven Spungin
  *
  */
 public class SimpleTemplate {
 
 	public static String process(String source, Map<String, String> substitutionMap) {
-		for (String key : substitutionMap.keySet()) {
-			source = source.replaceAll("@@" + key + "@@", substitutionMap.get(key));
+		for (final String key : substitutionMap.keySet()) {
+			source = source.replaceAll("@@" + key + "@@", substitutionMap.get(key)); //$NON-NLS-1$ //$NON-NLS-2$
 		}
-		source = source.replaceAll("@@.*?@@", "");
+		source = source.replaceAll("@@.*?@@", ""); //$NON-NLS-1$ //$NON-NLS-2$
 		return source;
 	}
 }
diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/TemplateOperation.java b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/TemplateOperation.java
index ce2c7f4..6955852 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/TemplateOperation.java
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/TemplateOperation.java
@@ -4,10 +4,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
- *     Soyatec - initial API and implementation
- *     Sopot Cela - ongoing enhancements
+ * Soyatec - initial API and implementation
+ * Sopot Cela - ongoing enhancements
  *******************************************************************************/
 package org.eclipse.e4.internal.tools.wizards.project;
 
@@ -42,109 +42,116 @@
 import org.eclipse.ui.actions.WorkspaceModifyOperation;
 
 public class TemplateOperation extends WorkspaceModifyOperation implements
-		IVariableProvider {
+IVariableProvider {
 
 	private final URL templateDirectory;
 	private final IContainer target;
 	private final Map<String, String> keys;
 	private final Set<String> binaryExtentions;
-	private boolean isMinimalist;
+	private final boolean isMinimalist;
 
 	public TemplateOperation(URL source, IContainer target,
-			Map<String, String> keys, Set<String> binaryExtentions, boolean justProduct) {
+		Map<String, String> keys, Set<String> binaryExtentions, boolean justProduct) {
 		templateDirectory = source;
 		this.binaryExtentions = binaryExtentions;
 		this.target = target;
 		this.keys = keys;
-		this.isMinimalist = justProduct;
+		isMinimalist = justProduct;
 	}
 
 	@Override
 	protected void execute(IProgressMonitor monitor) throws CoreException,
-			InvocationTargetException, InterruptedException {
+	InvocationTargetException, InterruptedException {
 		monitor.setTaskName(PDEUIMessages.AbstractTemplateSection_generating);
 
 		if ("jar".equals(templateDirectory.getProtocol())) { //$NON-NLS-1$
-			String file = templateDirectory.getFile();
-			int exclamation = file.indexOf('!');
-			if (exclamation < 0)
+			final String file = templateDirectory.getFile();
+			final int exclamation = file.indexOf('!');
+			if (exclamation < 0) {
 				return;
+			}
 			URL fileUrl = null;
 			try {
 				fileUrl = new URL(file.substring(0, exclamation));
-			} catch (MalformedURLException mue) {
+			} catch (final MalformedURLException mue) {
 				ToolsPlugin.logError(mue);
 				return;
 			}
-			File pluginJar = new File(fileUrl.getFile());
-			if (!pluginJar.exists())
+			final File pluginJar = new File(fileUrl.getFile());
+			if (!pluginJar.exists()) {
 				return;
-			String templateDirectory = file.substring(exclamation + 1); // "/some/path/"
-			IPath path = new Path(templateDirectory);
+			}
+			final String templateDirectory = file.substring(exclamation + 1); // "/some/path/"
+			final IPath path = new Path(templateDirectory);
 			ZipFile zipFile = null;
 			try {
 				zipFile = new ZipFile(pluginJar);
 				generateFiles(zipFile, path, target, monitor);
-			} catch (ZipException ze) {
-			} catch (IOException ioe) {
+			} catch (final ZipException ze) {
+			} catch (final IOException ioe) {
 			} finally {
 				if (zipFile != null) {
 					try {
 						zipFile.close();
-					} catch (IOException e) {
+					} catch (final IOException e) {
 					}
 				}
 			}
 		} else if ("file".equals(templateDirectory.getProtocol())) { //$NON-NLS-1$
-			File directory = new File(templateDirectory.getFile());
-			if (!directory.exists())
+			final File directory = new File(templateDirectory.getFile());
+			if (!directory.exists()) {
 				return;
+			}
 			generateFiles(directory, target, true, monitor);
 		}
 	}
 
 	private void generateFiles(File src, IContainer dst, boolean firstLevel,
-			IProgressMonitor monitor) throws CoreException {
-		if ((!firstLevel)&&(isMinimalist))
-		return;
-		File[] members = src.listFiles();
+		IProgressMonitor monitor) throws CoreException {
+		if (!firstLevel && isMinimalist) {
+			return;
+		}
+		final File[] members = src.listFiles();
 
 		for (int i = 0; i < members.length; i++) {
-			File member = members[i];
-			String name = member.getName();
+			final File member = members[i];
+			final String name = member.getName();
 			if (member.isDirectory()) {
-				if (".svn".equals(name) || "cvs".equalsIgnoreCase(name))
+				if (".svn".equals(name) || "cvs".equalsIgnoreCase(name)) { //$NON-NLS-1$ //$NON-NLS-2$
 					continue;
+				}
 				IContainer dstContainer = null;
 
 				if (dstContainer == null) {
-					String folderName = getProcessedString(name, name);
+					final String folderName = getProcessedString(name, name);
 					dstContainer = dst.getFolder(new Path(folderName));
 				}
-				if (dstContainer != null && !dstContainer.exists())
+				if (dstContainer != null && !dstContainer.exists()) {
 					((IFolder) dstContainer).create(true, true, monitor);
-			
+				}
+
 				generateFiles(member, dstContainer, false, monitor);
 			} else {
 				InputStream in = null;
 				try {
 					in = new FileInputStream(member);
 					copyFile(name, in, dst, monitor);
-				} catch (IOException ioe) {
+				} catch (final IOException ioe) {
 				} finally {
-					if (in != null)
+					if (in != null) {
 						try {
 							in.close();
-						} catch (IOException ioe2) {
+						} catch (final IOException ioe2) {
 						}
+					}
 				}
 			}
 		}
 	}
 
 	/**
-	 * 
-	 * 
+	 *
+	 *
 	 * @param zipFile
 	 * @param path
 	 * @param dst
@@ -152,15 +159,15 @@
 	 * @throws CoreException
 	 */
 	private void generateFiles(ZipFile zipFile, IPath path, IContainer dst,
-			IProgressMonitor monitor) throws CoreException {
-		int pathLength = path.segmentCount();
+		IProgressMonitor monitor) throws CoreException {
+		final int pathLength = path.segmentCount();
 		// Immidiate children
-		Map childZipEntries = new HashMap(); // "dir/" or "dir/file.java"
+		final Map childZipEntries = new HashMap(); // "dir/" or "dir/file.java"
 
-		for (Enumeration zipEntries = zipFile.entries(); zipEntries
-				.hasMoreElements();) {
-			ZipEntry zipEntry = (ZipEntry) zipEntries.nextElement();
-			IPath entryPath = new Path(zipEntry.getName());
+		for (final Enumeration zipEntries = zipFile.entries(); zipEntries
+			.hasMoreElements();) {
+			final ZipEntry zipEntry = (ZipEntry) zipEntries.nextElement();
+			final IPath entryPath = new Path(zipEntry.getName());
 			if (entryPath.segmentCount() <= pathLength) {
 				// ancestor or current directory
 				continue;
@@ -172,55 +179,57 @@
 			if (entryPath.segmentCount() == pathLength + 1) {
 				childZipEntries.put(zipEntry.getName(), zipEntry);
 			} else {
-				String name = entryPath.uptoSegment(pathLength + 1)
-						.addTrailingSeparator().toString();
+				final String name = entryPath.uptoSegment(pathLength + 1)
+					.addTrailingSeparator().toString();
 				if (!childZipEntries.containsKey(name)) {
-					ZipEntry dirEntry = new ZipEntry(name);
+					final ZipEntry dirEntry = new ZipEntry(name);
 					childZipEntries.put(name, dirEntry);
 				}
 			}
 		}
 
-		for (Iterator it = childZipEntries.values().iterator(); it.hasNext();) {
-			ZipEntry zipEnry = (ZipEntry) it.next();
-			String name = new Path(zipEnry.getName()).lastSegment().toString();
+		for (final Iterator it = childZipEntries.values().iterator(); it.hasNext();) {
+			final ZipEntry zipEnry = (ZipEntry) it.next();
+			final String name = new Path(zipEnry.getName()).lastSegment().toString();
 			if (zipEnry.isDirectory()) {
 				IContainer dstContainer = null;
 
 				if (dstContainer == null) {
-					String folderName = getProcessedString(name, name);
+					final String folderName = getProcessedString(name, name);
 					dstContainer = dst.getFolder(new Path(folderName));
 				}
-				if (dstContainer != null && !dstContainer.exists())
+				if (dstContainer != null && !dstContainer.exists()) {
 					((IFolder) dstContainer).create(true, true, monitor);
+				}
 				generateFiles(zipFile, path.append(name), dstContainer, monitor);
 			} else {
 				InputStream in = null;
 				try {
 					in = zipFile.getInputStream(zipEnry);
 					copyFile(name, in, dst, monitor);
-				} catch (IOException ioe) {
+				} catch (final IOException ioe) {
 				} finally {
-					if (in != null)
+					if (in != null) {
 						try {
 							in.close();
-						} catch (IOException ioe2) {
+						} catch (final IOException ioe2) {
 						}
+					}
 				}
 			}
 		}
 	}
 
 	private void copyFile(String fileName, InputStream input, IContainer dst,
-			IProgressMonitor monitor) throws CoreException {
-		String targetFileName = getProcessedString(fileName, fileName);
+		IProgressMonitor monitor) throws CoreException {
+		final String targetFileName = getProcessedString(fileName, fileName);
 
 		monitor.subTask(targetFileName);
-		IFile dstFile = dst.getFile(new Path(targetFileName));
+		final IFile dstFile = dst.getFile(new Path(targetFileName));
 
 		try {
-			InputStream stream = isBinary(fileName) ? input
-					: getProcessedStream(fileName, input);
+			final InputStream stream = isBinary(fileName) ? input
+				: getProcessedStream(fileName, input);
 			if (dstFile.exists()) {
 				dstFile.setContents(stream, true, true, monitor);
 			} else {
@@ -228,12 +237,12 @@
 			}
 			stream.close();
 
-		} catch (IOException e) {
+		} catch (final IOException e) {
 		}
 	}
 
 	protected void copyFile(String fileName, InputStream input, IContainer dst,
-			final String destPath, IProgressMonitor monitor)
+		final String destPath, IProgressMonitor monitor)
 			throws CoreException {
 		String targetFileName = null;
 		if (destPath == null) {
@@ -243,11 +252,11 @@
 		}
 
 		monitor.subTask(targetFileName);
-		IFile dstFile = dst.getFile(new Path(targetFileName));
+		final IFile dstFile = dst.getFile(new Path(targetFileName));
 
 		try {
-			InputStream stream = isBinary(fileName) ? input
-					: getProcessedStream(fileName, input);
+			final InputStream stream = isBinary(fileName) ? input
+				: getProcessedStream(fileName, input);
 			if (dstFile.exists()) {
 				dstFile.setContents(stream, true, true, monitor);
 			} else {
@@ -255,12 +264,12 @@
 			}
 			stream.close();
 
-		} catch (IOException e) {
+		} catch (final IOException e) {
 		}
 	}
 
 	/**
-	 * 
+	 *
 	 * @param fileName
 	 * @param input
 	 * @param dst
@@ -269,21 +278,21 @@
 	 * @throws CoreException
 	 */
 	public void copyFile(String fileName, InputStream input, IContainer dst,
-			final String basePath, final String destName,
-			IProgressMonitor monitor) throws CoreException {
-		if (basePath == null || basePath.equals("")) {
+		final String basePath, final String destName,
+		IProgressMonitor monitor) throws CoreException {
+		if (basePath == null || basePath.equals("")) { //$NON-NLS-1$
 			copyFile(fileName, input, dst, monitor);
 		}
 
-		String targetFileName = destName == null ? getProcessedString(fileName,
-				fileName) : destName;
+		final String targetFileName = destName == null ? getProcessedString(fileName,
+			fileName) : destName;
 
 		monitor.subTask(targetFileName);
-		IFile dstFile = dst.getFile(new Path(basePath + targetFileName));
+		final IFile dstFile = dst.getFile(new Path(basePath + targetFileName));
 
 		try {
-			InputStream stream = isBinary(fileName) ? input
-					: getProcessedStream(fileName, input);
+			final InputStream stream = isBinary(fileName) ? input
+				: getProcessedStream(fileName, input);
 			if (dstFile.exists()) {
 				dstFile.setContents(stream, true, true, monitor);
 			} else {
@@ -291,7 +300,7 @@
 			}
 			stream.close();
 
-		} catch (IOException e) {
+		} catch (final IOException e) {
 		}
 	}
 
@@ -300,27 +309,29 @@
 			return false;
 		}
 
-		String ext = getfileExtention(fileName);
-		if (ext == null)
+		final String ext = getfileExtention(fileName);
+		if (ext == null) {
 			return false;
+		}
 		return binaryExtentions.contains(ext);
 	}
 
 	private String getfileExtention(String name) {
-		int indexOf = name.lastIndexOf('.');
-		if (indexOf == -1)
+		final int indexOf = name.lastIndexOf('.');
+		if (indexOf == -1) {
 			return null;
+		}
 		return name.substring(indexOf);
 	}
 
 	private InputStream getProcessedStream(String fileName, InputStream stream)
-			throws IOException, CoreException {
-		InputStreamReader reader = new InputStreamReader(stream);
-		int bufsize = 1024;
-		char[] cbuffer = new char[bufsize];
+		throws IOException, CoreException {
+		final InputStreamReader reader = new InputStreamReader(stream);
+		final int bufsize = 1024;
+		final char[] cbuffer = new char[bufsize];
 		int read = 0;
-		StringBuffer keyBuffer = new StringBuffer();
-		StringBuffer outBuffer = new StringBuffer();
+		final StringBuffer keyBuffer = new StringBuffer();
+		final StringBuffer outBuffer = new StringBuffer();
 
 		boolean replacementMode = false;
 		boolean almostReplacementMode = false;
@@ -328,10 +339,10 @@
 		while (read != -1) {
 			read = reader.read(cbuffer);
 			for (int i = 0; i < read; i++) {
-				char c = cbuffer[i];
+				final char c = cbuffer[i];
 
 				if (escape) {
-					StringBuffer buf = outBuffer;
+					final StringBuffer buf = outBuffer;
 					buf.append(c);
 					escape = false;
 					continue;
@@ -342,9 +353,9 @@
 						almostReplacementMode = false;
 					} else if (replacementMode) {
 						replacementMode = false;
-						String key = keyBuffer.toString();
-						String value = key.length() == 0 ? "@@" //$NON-NLS-1$
-								: getReplacementString(key);
+						final String key = keyBuffer.toString();
+						final String value = key.length() == 0 ? "@@" //$NON-NLS-1$
+							: getReplacementString(key);
 						outBuffer.append(value);
 						keyBuffer.delete(0, keyBuffer.length());
 					} else if (almostReplacementMode) {
@@ -353,11 +364,12 @@
 						almostReplacementMode = true;
 					}
 				} else {
-					if (replacementMode)
+					if (replacementMode) {
 						keyBuffer.append(c);
-					else {
-						if (almostReplacementMode)
+					} else {
+						if (almostReplacementMode) {
 							outBuffer.append('@');
+						}
 						outBuffer.append(c);
 						almostReplacementMode = false;
 					}
@@ -371,17 +383,18 @@
 	}
 
 	private String getProcessedString(String fileName, String source) {
-		if (source.indexOf('$') == -1)
+		if (source.indexOf('$') == -1) {
 			return source;
+		}
 		int loc = -1;
-		StringBuffer buffer = new StringBuffer();
+		final StringBuffer buffer = new StringBuffer();
 		boolean replacementMode = false;
 		for (int i = 0; i < source.length(); i++) {
-			char c = source.charAt(i);
+			final char c = source.charAt(i);
 			if (c == '$') {
 				if (replacementMode) {
-					String key = source.substring(loc, i);
-					String value = key.length() == 0 ? "$" : getReplacementString(key); //$NON-NLS-1$
+					final String key = source.substring(loc, i);
+					final String value = key.length() == 0 ? "$" : getReplacementString(key); //$NON-NLS-1$
 					buffer.append(value);
 					replacementMode = false;
 				} else {
@@ -389,17 +402,19 @@
 					loc = i + 1;
 					continue;
 				}
-			} else if (!replacementMode)
+			} else if (!replacementMode) {
 				buffer.append(c);
+			}
 		}
 		return buffer.toString();
 	}
 
 	public String getReplacementString(String key) {
-		String result = keys.get(key);
+		final String result = keys.get(key);
 		return result != null ? result : key;
 	}
 
+	@Override
 	public Object getValue(String variable) {
 		return getReplacementString(variable);
 	}
