diff --git a/installation/resource/installer/bin/finish-installation.sh b/installation/resource/installer/bin/finish-installation.sh
index 9de1717de2559215ab8b33ebed98d9f6bcb4095a..460b2d9298781a1e2426eacbca046ced179e9cf3 100644
--- a/installation/resource/installer/bin/finish-installation.sh
+++ b/installation/resource/installer/bin/finish-installation.sh
@@ -16,6 +16,7 @@ DSS_ROOT_DIR=$3
 INSTALL_PATH=$4
 DISABLED_TECHNOLOGIES=$5
 
+echo Finish installation...
 source $BASE/chmodx-all-scripts.sh
 
 
diff --git a/installation/resource/installer/install.xml b/installation/resource/installer/install.xml
index 88d7f944bef44965f6e94b3b32825eaf44f48d67..b12e70000cf8e38e1b5401ce162e05164b351a20 100644
--- a/installation/resource/installer/install.xml
+++ b/installation/resource/installer/install.xml
@@ -96,6 +96,12 @@
         <validator classname="ch.systemsx.cisd.openbis.installer.izpack.PostgresToolsPathValidator"/>
     </panel>
     
+    <panel classname="com.izforge.izpack.panels.userinput.UserInputPanel" id="UserInputPanel.KEY_STORE" >
+      <actions>
+        <action stage="preactivate" classname="ch.systemsx.cisd.openbis.installer.izpack.KeystoreAction" />
+      </actions>
+    </panel>
+    
     <panel classname="com.izforge.izpack.panels.userinput.UserInputPanel" id="UserInputPanel.TECHNOLOGIES" condition="isStandardTechnologies">
       <actions>
         <action stage="preactivate" classname="ch.systemsx.cisd.openbis.installer.izpack.SetTechnologyCheckBoxesAction" />
diff --git a/installation/resource/installer/userInputSpec.xml b/installation/resource/installer/userInputSpec.xml
index c0a926d789ba4b5eee61e12c3c14e37b53483402..cadca9dd8793e89842f6589180dd549aa0608f5d 100644
--- a/installation/resource/installer/userInputSpec.xml
+++ b/installation/resource/installer/userInputSpec.xml
@@ -8,6 +8,39 @@
     </field>
   </panel>
 
+  <panel id="UserInputPanel.KEY_STORE">
+    <field type="title" txt="Key Store" bold="true" size="2" />
+    <field type="staticText" align="left"
+      txt="Please, select a new key store if the current one should be replace." />
+    <field type="file" align="left" variable="KEY_STORE_FILE">
+      <spec txt="Key store" size="20" set="" mustExist="true" allowEmptyValue="true" />
+    </field>
+    <field type="staticText" align="left"
+      txt="Passwords need only be changed in case of a new key store with different password." />
+    <field type="password" align="left" variable="KEY_STORE_PASSWORD">
+      <spec>
+        <pwd txt="Key store password" size="20" set="" />
+        <pwd txt="Re-type key store password" size="20" set=""/>
+      </spec>
+      <validator class="com.izforge.izpack.panels.userinput.validator.PasswordEqualityValidator" txt="The specified key store passwords do not match." />
+      <validator class="com.izforge.izpack.panels.userinput.validator.RegularExpressionValidator" txt="Key store password cannot be empty.">
+        <param name="pattern" value="^.+$" />
+      </validator>
+    </field>
+    <field type="password" align="left" variable="KEY_PASSWORD">
+      <spec>
+        <pwd txt="Key password" size="20" set="" />
+        <pwd txt="Re-type key password" size="20" set=""/>
+      </spec>
+      <validator class="com.izforge.izpack.panels.userinput.validator.PasswordEqualityValidator" txt="The specified key passwords do not match." />
+      <validator class="com.izforge.izpack.panels.userinput.validator.RegularExpressionValidator" txt="key password cannot be empty.">
+        <param name="pattern" value="^.+$" />
+      </validator>
+    </field>
+    
+    
+  </panel>
+
   <panel id="UserInputPanel.TECHNOLOGIES">
     <field type="title" txt="Technologies" bold="true" size="2" />
     <field type="staticText" align="left"
diff --git a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java
index b25bb379b885acf606fd967885883f99b626827f..3882b3544489c37e19ad1f0cf99b39ca59e8cf5e 100644
--- a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java
+++ b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsAction.java
@@ -19,18 +19,26 @@ package ch.systemsx.cisd.openbis.installer.izpack;
 import static ch.systemsx.cisd.openbis.installer.izpack.GlobalInstallationContext.ADMIN_PASSWORD_VARNAME;
 import static ch.systemsx.cisd.openbis.installer.izpack.GlobalInstallationContext.ETL_SERVER_PASSWORD_VARNAME;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.io.FileUtils;
+
 import com.izforge.izpack.api.data.AutomatedInstallData;
 import com.izforge.izpack.api.data.PanelActionConfiguration;
 import com.izforge.izpack.api.handler.AbstractUIHandler;
 import com.izforge.izpack.data.PanelAction;
 
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+
 /**
- * Executes a script that configures the installation.
+ * Executes a script that configures the installation, copies key store (if specified) and inject
+ * passwords.
  * 
  * @author Kaloyan Enimanev
+ * @author Franz-Josef Elmer
  */
 public class ExecuteSetupScriptsAction extends AbstractScriptExecutor implements PanelAction
 {
@@ -53,8 +61,62 @@ public class ExecuteSetupScriptsAction extends AbstractScriptExecutor implements
         {
             executRestoreConfigScript(data);
         }
+        String keyStoreFileName =
+                data.getVariable(GlobalInstallationContext.KEY_STORE_FILE_VARNAME);
+        String keyStorePassword =
+                data.getVariable(GlobalInstallationContext.KEY_STORE_PASSWORD_VARNAME);
+        String certificatePassword =
+                data.getVariable(GlobalInstallationContext.KEY_PASSWORD_VARNAME);
+        File installDir = GlobalInstallationContext.installDir;
+        installKeyStore(keyStoreFileName, installDir);
+        injectPasswords(keyStorePassword, certificatePassword, installDir);
     }
 
+    void installKeyStore(String keyStoreFileName, File installDir)
+    {
+        if (keyStoreFileName != null && keyStoreFileName.length() > 0)
+        {
+            try
+            {
+                File keyStoreFile = new File(keyStoreFileName);
+                File keystoreFileAS = new File(installDir, Utils.AS_PATH + Utils.KEYSTORE_PATH);
+                FileUtils.copyFile(keyStoreFile, keystoreFileAS);
+                File keystoreFileDSS = new File(installDir, Utils.DSS_PATH + Utils.KEYSTORE_PATH);
+                FileUtils.copyFile(keyStoreFile, keystoreFileDSS);
+            } catch (IOException ex)
+            {
+                throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+            }
+        }
+    }
+    
+    void injectPasswords(String keyStorePassword, String keyPassword, File installDir)
+    {
+        File dssServicePropertiesFile =
+                new File(installDir, Utils.DSS_PATH + Utils.SERVICE_PROPERTIES_PATH);
+        Utils.updateOrAppendProperty(dssServicePropertiesFile, Utils.DSS_KEYSTORE_PASSWORD_KEY,
+                keyStorePassword);
+        Utils.updateOrAppendProperty(dssServicePropertiesFile, Utils.DSS_KEYSTORE_KEY_PASSWORD_KEY,
+                keyPassword);
+        
+        File jettyXMLFile = new File(installDir, Utils.AS_PATH + Utils.JETTY_XML_PATH);
+        try
+        {
+            String jettyXML = FileUtils.readFileToString(jettyXMLFile);
+            jettyXML =
+                    jettyXML.replaceAll("<Set name=\"Password\">.*</Set>",
+                            "<Set name=\"Password\"><![CDATA[" + keyStorePassword + "]]></Set>")
+                            .replaceAll(
+                                    "<Set name=\"KeyPassword\">.*</Set>",
+                                    "<Set name=\"KeyPassword\"><![CDATA[" + keyPassword
+                                            + "]]></Set>");
+            FileUtils.writeStringToFile(jettyXMLFile, jettyXML);
+        } catch (IOException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        }
+    }
+    
     private void executRestoreConfigScript(AutomatedInstallData data)
     {
         String script = getAdminScript(data, RESTORE_CONFIG_FROM_BACKUP_SCRIPT);
diff --git a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java
index 3f1f32580b99be6b06b96a92427cf49af6ced70b..f7d8372167f0cd1ac23337fc32a23cd6bdd9796e 100644
--- a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java
+++ b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java
@@ -33,6 +33,12 @@ public class GlobalInstallationContext
 
     public static final String ETL_SERVER_PASSWORD_VARNAME = "ETLSERVER_PASSWORD";
 
+    public static final String KEY_STORE_FILE_VARNAME = "KEY_STORE_FILE";
+
+    public static final String KEY_STORE_PASSWORD_VARNAME = "KEY_STORE_PASSWORD";
+    
+    public static final String KEY_PASSWORD_VARNAME = "KEY_PASSWORD";
+    
     public static final String DATA_DIR_VARNAME = "DSS_ROOT_DIR";
 
     public static final String BACKUP_FOLDER_VARNAME = "BACKUP_FOLDER";
diff --git a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/KeystoreAction.java b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/KeystoreAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..642cfc1eb620dbd3be9753bbb51607571a4e4774
--- /dev/null
+++ b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/KeystoreAction.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.installer.izpack;
+
+import com.izforge.izpack.api.data.AutomatedInstallData;
+import com.izforge.izpack.api.data.PanelActionConfiguration;
+import com.izforge.izpack.api.handler.AbstractUIHandler;
+import com.izforge.izpack.data.PanelAction;
+
+/**
+ * Action which extracts the passwords from DSS service.properties to fill the passwords in page for
+ * key store.
+ * 
+ * @author Franz-Josef Elmer
+ */
+public class KeystoreAction implements PanelAction
+{
+
+    private static final String DEFAULT_PASSWORD = "changeit";
+    private static final String DEFAULT_KEY_PASSWORD = "changeit";
+
+    public void initialize(PanelActionConfiguration configuration)
+    {
+    }
+    
+    public void executeAction(AutomatedInstallData data, AbstractUIHandler handler)
+    {
+        data.setVariable(GlobalInstallationContext.KEY_STORE_PASSWORD_VARNAME,
+                getDssServiceProperty(Utils.DSS_KEYSTORE_PASSWORD_KEY, DEFAULT_PASSWORD));
+        data.setVariable(GlobalInstallationContext.KEY_PASSWORD_VARNAME,
+                getDssServiceProperty(Utils.DSS_KEYSTORE_KEY_PASSWORD_KEY, DEFAULT_KEY_PASSWORD));
+    }
+
+    public String getDssServiceProperty(String propertyKey, String defaultValue)
+    {
+        String property =
+                Utils.tryToGetServicePropertyOfDSS(GlobalInstallationContext.installDir,
+                        propertyKey);
+        return property == null ? defaultValue : property;
+    }
+
+}
diff --git a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java
index 0a38f546e0ec57d0318f3fa6a639d16b102843c4..237f6e40f225f6b991ed03ad5d5f0abb410ff599 100644
--- a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java
+++ b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/SetDisableTechnologiesVariableAction.java
@@ -19,15 +19,11 @@ package ch.systemsx.cisd.openbis.installer.izpack;
 import static ch.systemsx.cisd.openbis.installer.izpack.SetTechnologyCheckBoxesAction.DISABLED_TECHNOLOGIES_KEY;
 
 import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.commons.io.IOUtils;
 
 import com.izforge.izpack.api.data.AutomatedInstallData;
 import com.izforge.izpack.api.data.PanelActionConfiguration;
@@ -67,44 +63,11 @@ public class SetDisableTechnologiesVariableAction implements PanelAction
         if (isFirstTimeInstallation == false)
         {
             File configFile = new File(installDir, Utils.AS_PATH + Utils.SERVICE_PROPERTIES_PATH);
-            List<String> list = FileUtilities.loadToStringList(configFile);
-            boolean defined = false;
-            boolean unchanged = false;
-            String propertiesEntry = DISABLED_TECHNOLOGIES_KEY + " = " + newTechnologyList;
-            for (int i = 0; i < list.size(); i++)
-            {
-                String line = list.get(i);
-                if (line.startsWith(DISABLED_TECHNOLOGIES_KEY))
-                {
-                    defined = true;
-                    String currentTechnologyList =
-                            line.substring(DISABLED_TECHNOLOGIES_KEY.length()).trim();
-                    if (currentTechnologyList.startsWith("="))
-                    {
-                        currentTechnologyList = currentTechnologyList.substring(1).trim();
-                    }
-                    unchanged = currentTechnologyList.equals(newTechnologyList);
-                    if (unchanged == false)
-                    {
-                        list.set(i, propertiesEntry);
-                    }
-                    break;
-                }
-            }
-            if (defined)
-            {
-                if (unchanged == false)
-                {
-                    updateConfigFile(configFile, list);
-                }
-            } else
-            {
-                appendEntryToConfigFile(configFile, propertiesEntry);
-            }
+            Utils.updateOrAppendProperty(configFile, DISABLED_TECHNOLOGIES_KEY, newTechnologyList);
             updateDisabledDssPluginsProperty(data, installDir);
         }
     }
-    
+
     private void updateDisabledDssPluginsProperty(AutomatedInstallData data, File installDir)
     {
         Set<String> disabledTechnologies = new LinkedHashSet<String>();
@@ -121,7 +84,7 @@ public class SetDisableTechnologiesVariableAction implements PanelAction
         File configFile = new File(installDir, Utils.DSS_PATH + Utils.SERVICE_PROPERTIES_PATH);
         List<String> list = FileUtilities.loadToStringList(configFile);
         updateDisabledDssPluginsProperty(list, technologies, disabledTechnologies);
-        updateConfigFile(configFile, list);
+        Utils.updateConfigFile(configFile, list);
     }
 
     private void updateDisabledDssPluginsProperty(List<String> list, Set<String> technologies,
@@ -187,42 +150,4 @@ public class SetDisableTechnologiesVariableAction implements PanelAction
         return builder.toString();
     }
 
-    private void updateConfigFile(File configFile, List<String> list)
-    {
-        PrintWriter printWriter = null;
-        try
-        {
-            printWriter = new PrintWriter(configFile);
-            for (String line : list)
-            {
-                printWriter.println(line);
-            }
-        } catch (IOException ex)
-        {
-            throw new RuntimeException("Couldn't update " + configFile, ex);
-        } finally
-        {
-            IOUtils.closeQuietly(printWriter);
-        }
-    }
-
-    private void appendEntryToConfigFile(File configFile, String propertiesEntry)
-    {
-        FileWriter fileWriter = null;
-        try
-        {
-            fileWriter = new FileWriter(configFile, true);
-            PrintWriter printWriter = new PrintWriter(fileWriter);
-            printWriter.println();
-            printWriter.println(propertiesEntry);
-        } catch (IOException ex)
-        {
-            throw new RuntimeException("Couldn't append property " + DISABLED_TECHNOLOGIES_KEY
-                    + " to " + configFile, ex);
-        } finally
-        {
-            IOUtils.closeQuietly(fileWriter);
-        }
-    }
-
 }
diff --git a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/Utils.java b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/Utils.java
index 71a70bdcd7850d820a1e8d7186a262ebad8a1091..7116eef439709e697900212a7ad489d0408eaecc 100644
--- a/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/Utils.java
+++ b/installation/source/java/ch/systemsx/cisd/openbis/installer/izpack/Utils.java
@@ -16,13 +16,21 @@
 
 package ch.systemsx.cisd.openbis.installer.izpack;
 
+import static ch.systemsx.cisd.openbis.installer.izpack.SetTechnologyCheckBoxesAction.DISABLED_TECHNOLOGIES_KEY;
+
 import java.io.File;
 import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
 import java.util.Map.Entry;
 import java.util.Properties;
 
 import org.apache.commons.io.IOUtils;
 
+import ch.systemsx.cisd.common.filesystem.FileUtilities;
+
 /**
  * Utility functions for exploring <code>service.properties</code> files of an installation.
  *
@@ -34,6 +42,8 @@ class Utils
     static final String AS_PATH = SERVERS_PATH + "openBIS-server/jetty/";
     static final String DSS_PATH = SERVERS_PATH + "datastore_server/";
     static final String SERVICE_PROPERTIES_PATH = "etc/service.properties";
+    static final String JETTY_XML_PATH = "etc/jetty.xml";
+    static final String KEYSTORE_PATH = "etc/openBIS.keystore";
 
     static String tryToGetServicePropertyOfAS(File installDir, String propertyKey)
     {
@@ -41,6 +51,12 @@ class Utils
         return serviceProperties == null ? null : serviceProperties.getProperty(propertyKey);
     }
     
+    static String tryToGetServicePropertyOfDSS(File installDir, String propertyKey)
+    {
+        Properties serviceProperties = tryToGetServicePropertiesOfDSS(installDir);
+        return serviceProperties == null ? null : serviceProperties.getProperty(propertyKey);
+    }
+    
     static boolean dssPropertiesContains(File installDir, String string)
     {
         Properties properties =
@@ -70,6 +86,11 @@ class Utils
         return tryToGetServiceProperties(installDir, AS_PATH + SERVICE_PROPERTIES_PATH);
     }
     
+    private static Properties tryToGetServicePropertiesOfDSS(File installDir)
+    {
+        return tryToGetServiceProperties(installDir, DSS_PATH + SERVICE_PROPERTIES_PATH);
+    }
+    
     private static Properties tryToGetServiceProperties(File installDir, String relativePath)
     {
         Properties properties = new Properties();
@@ -87,4 +108,83 @@ class Utils
             IOUtils.closeQuietly(fileReader);
         }
     }
+
+    static void updateConfigFile(File configFile, List<String> list)
+    {
+        PrintWriter printWriter = null;
+        try
+        {
+            printWriter = new PrintWriter(configFile);
+            for (String line : list)
+            {
+                printWriter.println(line);
+            }
+        } catch (IOException ex)
+        {
+            throw new RuntimeException("Couldn't update " + configFile, ex);
+        } finally
+        {
+            IOUtils.closeQuietly(printWriter);
+        }
+    }
+
+    static void appendEntryToConfigFile(File configFile, String propertiesEntry)
+    {
+        FileWriter fileWriter = null;
+        try
+        {
+            fileWriter = new FileWriter(configFile, true);
+            PrintWriter printWriter = new PrintWriter(fileWriter);
+            printWriter.println();
+            printWriter.println(propertiesEntry);
+        } catch (IOException ex)
+        {
+            throw new RuntimeException("Couldn't append property " + DISABLED_TECHNOLOGIES_KEY
+                    + " to " + configFile, ex);
+        } finally
+        {
+            IOUtils.closeQuietly(fileWriter);
+        }
+    }
+
+    static void updateOrAppendProperty(File configFile, String propertyKey, String propertyValue)
+    {
+        List<String> list = FileUtilities.loadToStringList(configFile);
+        boolean defined = false;
+        boolean unchanged = false;
+        String propertiesEntry = propertyKey + " = " + propertyValue;
+        for (int i = 0; i < list.size(); i++)
+        {
+            String line = list.get(i);
+            if (line.startsWith(propertyKey))
+            {
+                defined = true;
+                String currentPropertyValue =
+                        line.substring(propertyKey.length()).trim();
+                if (currentPropertyValue.startsWith("="))
+                {
+                    currentPropertyValue = currentPropertyValue.substring(1).trim();
+                }
+                unchanged = currentPropertyValue.equals(propertyValue);
+                if (unchanged == false)
+                {
+                    list.set(i, propertiesEntry);
+                }
+                break;
+            }
+        }
+        if (defined)
+        {
+            if (unchanged == false)
+            {
+                updateConfigFile(configFile, list);
+            }
+        } else
+        {
+            appendEntryToConfigFile(configFile, propertiesEntry);
+        }
+    }
+
+    static final String DSS_KEYSTORE_KEY_PASSWORD_KEY = "keystore.key-password";
+    static final String DSS_KEYSTORE_PASSWORD_KEY = "keystore.password";
 }
diff --git a/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsActionTest.java b/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsActionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ae9b63ba891857c0d1bc42dd4506ee952a474d1
--- /dev/null
+++ b/installation/sourceTest/java/ch/systemsx/cisd/openbis/installer/izpack/ExecuteSetupScriptsActionTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.installer.izpack;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
+import ch.systemsx.cisd.common.filesystem.FileUtilities;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class ExecuteSetupScriptsActionTest extends AbstractFileSystemTestCase
+{
+    private File dssServicePropertiesFile;
+    private File jettyXMLFile;
+    private ExecuteSetupScriptsAction action;
+    private File myKeystoreFile;
+    private File keystoreFileAS;
+    private File keystoreFileDSS;
+
+    @BeforeMethod
+    public void setUpFiles() throws IOException
+    {
+        dssServicePropertiesFile =
+                new File(workingDirectory, Utils.DSS_PATH + Utils.SERVICE_PROPERTIES_PATH);
+        jettyXMLFile = new File(workingDirectory, Utils.AS_PATH + Utils.JETTY_XML_PATH);
+        FileUtils.copyFile(new File("../datastore_server/dist/etc/service.properties/"),
+                dssServicePropertiesFile);
+        FileUtils.copyFile(new File("../openbis/dist/server/jetty.xml/"), jettyXMLFile);
+
+        keystoreFileAS = new File(workingDirectory, Utils.AS_PATH + Utils.KEYSTORE_PATH);
+        keystoreFileDSS = new File(workingDirectory, Utils.DSS_PATH + Utils.KEYSTORE_PATH);
+        myKeystoreFile = new File(workingDirectory, "my-keystore");
+        FileUtils.writeStringToFile(myKeystoreFile, "my-keys");
+        action = new ExecuteSetupScriptsAction();
+    }
+    
+    @Test
+    public void testInstallKeyStoreWithUndefinedKeyStoreFileName() throws Exception
+    {
+        action.installKeyStore("", workingDirectory);
+        
+        assertEquals(false, keystoreFileAS.exists());
+        assertEquals(false, keystoreFileDSS.exists());
+    }
+    
+    @Test
+    public void testInstallKeyStoreWithKeyStoreFileName() throws Exception
+    {
+        action.installKeyStore(myKeystoreFile.getPath(), workingDirectory);
+        
+        assertEquals(true, keystoreFileAS.exists());
+        assertEquals("my-keys", FileUtils.readFileToString(keystoreFileAS));
+        assertEquals(true, keystoreFileDSS.exists());
+        assertEquals("my-keys", FileUtils.readFileToString(keystoreFileDSS));
+    }
+    
+    @Test
+    public void testInjectPasswords() throws Exception
+    {
+        action.injectPasswords("my-<store>", "my-<key>", workingDirectory);
+
+        Properties properties = loadProperties(dssServicePropertiesFile);
+        assertEquals("my-<store>", properties.getProperty(Utils.DSS_KEYSTORE_PASSWORD_KEY));
+        assertEquals("my-<key>", properties.getProperty(Utils.DSS_KEYSTORE_KEY_PASSWORD_KEY));
+        assertEquals("[<Set name=\"Password\"><![CDATA[my-<store>]]></Set>, "
+                + "<Set name=\"KeyPassword\"><![CDATA[my-<key>]]></Set>]",
+                loadFilteredAndTrimmedJettyXMLFile().toString());
+    }
+
+    public List<String> loadFilteredAndTrimmedJettyXMLFile()
+    {
+        List<String> lines = FileUtilities.loadToStringList(jettyXMLFile);
+        List<String> result = new ArrayList<String>();
+        for (String line : lines)
+        {
+            if (line.indexOf("Password") > 0)
+            {
+                result.add(line.trim());
+            }
+        }
+        return result;
+    }
+
+    public Properties loadProperties(File propertiesFile) throws Exception
+    {
+        Properties properties = new Properties();
+        FileReader fileReader = null;
+        try
+        {
+            fileReader = new FileReader(propertiesFile);
+            properties.load(fileReader);
+        } finally
+        {
+            IOUtils.closeQuietly(fileReader);
+        }
+        return properties;
+    }
+}