diff --git a/asterix-events/src/main/resources/events/node_info/node_info.sh b/asterix-events/src/main/resources/events/node_info/node_info.sh
index ae72490..2179d5a 100755
--- a/asterix-events/src/main/resources/events/node_info/node_info.sh
+++ b/asterix-events/src/main/resources/events/node_info/node_info.sh
@@ -1,4 +1,2 @@
 JAVA_VERSION=`java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'`
-HOME_DIR=`echo ~`
-echo JAVA_VERSION=$JAVA_VERSION
-echo HOME_DIR=$HOME_DIR
+echo "java_version=$JAVA_VERSION" 1>&2
diff --git a/asterix-installer/pom.xml b/asterix-installer/pom.xml
index 28ad995..fa5666a 100644
--- a/asterix-installer/pom.xml
+++ b/asterix-installer/pom.xml
@@ -6,9 +6,7 @@
           <groupId>edu.uci.ics.asterix</groupId>
           <version>0.0.4-SNAPSHOT</version>
   </parent>
-  <groupId>edu.uci.ics.asterix</groupId>
   <artifactId>asterix-installer</artifactId>
-  <version>0.0.4-SNAPSHOT</version>
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/CreateCommand.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/CreateCommand.java
index 854ee8e..55e172b 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/CreateCommand.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/CreateCommand.java
@@ -26,6 +26,7 @@
 import edu.uci.ics.asterix.event.schema.cluster.Cluster;
 import edu.uci.ics.asterix.event.schema.cluster.Env;
 import edu.uci.ics.asterix.event.schema.cluster.Property;
+import edu.uci.ics.asterix.event.schema.cluster.WorkingDir;
 import edu.uci.ics.asterix.event.schema.pattern.Patterns;
 import edu.uci.ics.asterix.installer.driver.InstallerDriver;
 import edu.uci.ics.asterix.installer.driver.InstallerUtil;
@@ -37,78 +38,97 @@
 
 public class CreateCommand extends AbstractCommand {
 
-    private String asterixInstanceName;
-    private Cluster cluster;
+	private String asterixInstanceName;
+	private Cluster cluster;
 
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig();
-        ValidateCommand validateCommand = new ValidateCommand();
-        boolean valid = validateCommand.validateCluster(((CreateConfig) config).clusterPath);
-        if (!valid) {
-            throw new Exception("Cannot create an Asterix instance.");
-        }
-        asterixInstanceName = ((CreateConfig) config).name;
-        InstallerUtil.validateAsterixInstanceNotExists(asterixInstanceName);
-        CreateConfig createConfig = (CreateConfig) config;
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        cluster = (Cluster) unmarshaller.unmarshal(new File(createConfig.clusterPath));
-        AsterixInstance asterixInstance = InstallerUtil.createAsterixInstance(asterixInstanceName, cluster);
-        InstallerUtil.evaluateConflictWithOtherInstances(asterixInstance);
-        InstallerUtil.createAsterixZip(asterixInstance, true);
-        List<Property> clusterProperties = new ArrayList<Property>();
-        clusterProperties.add(new Property("ASTERIX_HOME", cluster.getWorkingDir().getDir() + File.separator
-                + "asterix"));
-        clusterProperties.add(new Property("JAVA_OPTS", "-Xmx" + cluster.getRam()));
-        clusterProperties.add(new Property("CLUSTER_NET_IP", cluster.getMasterNode().getClusterIp()));
-        clusterProperties.add(new Property("CLIENT_NET_IP", cluster.getMasterNode().getIp()));
-        clusterProperties.add(new Property("LOG_DIR", cluster.getLogdir()));
-        clusterProperties.add(new Property("JAVA_HOME", cluster.getJavaHome()));
-        cluster.setEnv(new Env(clusterProperties));
+	@Override
+	protected void execCommand() throws Exception {
+		InstallerDriver.initConfig();
+		ValidateCommand validateCommand = new ValidateCommand();
+		boolean valid = validateCommand
+				.validateCluster(((CreateConfig) config).clusterPath);
+		if (!valid) {
+			throw new Exception("Cannot create an Asterix instance.");
+		}
+		asterixInstanceName = ((CreateConfig) config).name;
+		InstallerUtil.validateAsterixInstanceNotExists(asterixInstanceName);
+		CreateConfig createConfig = (CreateConfig) config;
+		JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
+		Unmarshaller unmarshaller = ctx.createUnmarshaller();
+		cluster = (Cluster) unmarshaller.unmarshal(new File(
+				createConfig.clusterPath));
+		cluster.setWorkingDir(new WorkingDir(cluster.getWorkingDir().getDir()
+				+ File.separator + asterixInstanceName, cluster.getWorkingDir()
+				.isNFS()));
+		cluster.setLogdir(cluster.getLogdir() + File.separator
+				+ asterixInstanceName);
+		AsterixInstance asterixInstance = InstallerUtil.createAsterixInstance(
+				asterixInstanceName, cluster);
+		InstallerUtil.evaluateConflictWithOtherInstances(asterixInstance);
+		InstallerUtil.createAsterixZip(asterixInstance, true);
+		List<Property> clusterProperties = new ArrayList<Property>();
+		clusterProperties.add(new Property("ASTERIX_HOME", cluster
+				.getWorkingDir().getDir() + File.separator + "asterix"));
+		clusterProperties.add(new Property("JAVA_OPTS", "-Xmx"
+				+ cluster.getRam()));
+		clusterProperties.add(new Property("CLUSTER_NET_IP", cluster
+				.getMasterNode().getClusterIp()));
+		clusterProperties.add(new Property("CLIENT_NET_IP", cluster
+				.getMasterNode().getIp()));
+		clusterProperties.add(new Property("LOG_DIR", cluster.getLogdir()));
+		clusterProperties.add(new Property("JAVA_HOME", cluster.getJavaHome()));
+		clusterProperties.add(new Property("WORKING_DIR", cluster
+				.getWorkingDir().getDir()));
+		cluster.setEnv(new Env(clusterProperties));
 
-        PatternCreator pc = new PatternCreator();
-        Patterns patterns = pc.getStartAsterixPattern(asterixInstanceName, cluster);
-        InstallerUtil.getEventrixClient(cluster).submit(patterns);
+		PatternCreator pc = new PatternCreator();
+		Patterns patterns = pc.getStartAsterixPattern(asterixInstanceName,
+				cluster);
+		InstallerUtil.getEventrixClient(cluster).submit(patterns);
 
-        AsterixRuntimeState runtimeState = VerificationUtil.getAsterixRuntimeState(asterixInstance);
-        VerificationUtil.updateInstanceWithRuntimeDescription(asterixInstance, runtimeState, true);
-        ServiceProvider.INSTANCE.getLookupService().writeAsterixInstance(asterixInstance);
-        InstallerUtil.deleteDirectory(InstallerDriver.getManagixHome() + File.separator + InstallerDriver.ASTERIX_DIR
-                + File.separator + asterixInstanceName);
-        LOGGER.info(asterixInstance.getDescription(false));
+		AsterixRuntimeState runtimeState = VerificationUtil
+				.getAsterixRuntimeState(asterixInstance);
+		VerificationUtil.updateInstanceWithRuntimeDescription(asterixInstance,
+				runtimeState, true);
+		ServiceProvider.INSTANCE.getLookupService().writeAsterixInstance(
+				asterixInstance);
+		InstallerUtil.deleteDirectory(InstallerDriver.getManagixHome()
+				+ File.separator + InstallerDriver.ASTERIX_DIR + File.separator
+				+ asterixInstanceName);
+		LOGGER.info(asterixInstance.getDescription(false));
+	}
 
-    }
+	@Override
+	protected CommandConfig getCommandConfig() {
+		return new CreateConfig();
+	}
 
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new CreateConfig();
-    }
+	public Cluster getCluster() {
+		return cluster;
+	}
 
-    public Cluster getCluster() {
-        return cluster;
-    }
+	public String getAsterixInstanceName() {
+		return asterixInstanceName;
+	}
 
-    public String getAsterixInstanceName() {
-        return asterixInstanceName;
-    }
+	@Override
+	protected String getUsageDescription() {
+		return "\nCreates an ASTERIX instance with a specified name."
+				+ "\n\nPost creation, the instance is in ACTIVE state, indicating its "
+				+ "\navailability for executing statements/queries."
+				+ "\n\nUsage arguments/options:"
+				+ "\n-n Name of the ASTERIX instance."
+				+ "\n-c Path to the cluster configuration file";
+	}
 
-    @Override
-    protected String getUsageDescription() {
-        return "\nCreates an ASTERIX instance with a specified name."
-                + "\n\nPost creation, the instance is in ACTIVE state, signifying its "
-                + "\navailability for executing statements/queries." + "\n\nUsage arguments/options:"
-                + "\n-n Name of the ASTERIX instance." + "\n-c Path to the cluster configuration file"
-                + "\n-a Path to the ASTERIX configuration file";
-    }
 }
 
 class CreateConfig extends AbstractCommandConfig {
 
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
+	@Option(name = "-n", required = true, usage = "Name of Asterix Instance")
+	public String name;
 
-    @Option(name = "-c", required = true, usage = "Path to cluster configuration")
-    public String clusterPath;
+	@Option(name = "-c", required = true, usage = "Path to cluster configuration")
+	public String clusterPath;
 
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DeleteCommand.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DeleteCommand.java
index e97fe3f..a2788b4 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DeleteCommand.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DeleteCommand.java
@@ -26,34 +26,41 @@
 
 public class DeleteCommand extends AbstractCommand {
 
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig();
-        String asterixInstanceName = ((DeleteConfig) config).name;
-        AsterixInstance instance = InstallerUtil.validateAsterixInstanceExists(asterixInstanceName, State.INACTIVE);
-        PatternCreator pc = new PatternCreator();
-        Patterns patterns = pc.createDeleteInstancePattern(instance);
-        InstallerUtil.getEventrixClient(instance.getCluster()).submit(patterns);
-        ServiceProvider.INSTANCE.getLookupService().removeAsterixInstance(asterixInstanceName);
-        LOGGER.info(" Asterix instance: " + asterixInstanceName + " deleted");
-    }
+	@Override
+	protected void execCommand() throws Exception {
+		InstallerDriver.initConfig();
+		String asterixInstanceName = ((DeleteConfig) config).name;
+		AsterixInstance instance = InstallerUtil.validateAsterixInstanceExists(
+				asterixInstanceName, State.INACTIVE);
+		PatternCreator pc = new PatternCreator();
+		Patterns patterns = pc.createDeleteInstancePattern(instance);
+		InstallerUtil.getEventrixClient(instance.getCluster()).submit(patterns);
 
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new DeleteConfig();
-    }
+		patterns = pc.createRemoveAsterixWorkingDirPattern(instance);
+		InstallerUtil.getEventrixClient(instance.getCluster()).submit(patterns);
+		ServiceProvider.INSTANCE.getLookupService().removeAsterixInstance(
+				asterixInstanceName);
+		LOGGER.info("Deleted Asterix instance: " + asterixInstanceName);
+	}
 
-    @Override
-    protected String getUsageDescription() {
-        return "\nPermanently deletes an ASTERIX instance." + "\n" + "The instance must be in the INACTIVE state."
-                + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance.";
-    }
+	@Override
+	protected CommandConfig getCommandConfig() {
+		return new DeleteConfig();
+	}
+
+	@Override
+	protected String getUsageDescription() {
+		return "\nPermanently deletes an ASTERIX instance." + "\n"
+				+ "The instance must be in the INACTIVE state."
+				+ "\n\nAvailable arguments/options"
+				+ "\n-n name of the ASTERIX instance.";
+	}
 
 }
 
 class DeleteConfig extends AbstractCommandConfig {
 
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
+	@Option(name = "-n", required = true, usage = "Name of Asterix Instance")
+	public String name;
 
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DescribeCommand.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DescribeCommand.java
index 63dcc30..bec82d5 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DescribeCommand.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/DescribeCommand.java
@@ -29,63 +29,77 @@
 
 public class DescribeCommand extends AbstractCommand {
 
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig();
-        String asterixInstanceName = ((DescribeConfig) config).name;
-        boolean adminView = ((DescribeConfig) config).admin;
-        if (asterixInstanceName != null) {
-            InstallerUtil.validateAsterixInstanceExists(asterixInstanceName, State.INACTIVE, State.ACTIVE,
-                    State.UNUSABLE);
-            AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(
-                    asterixInstanceName);
-            if (instance != null) {
-                AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-                boolean expectedRunning = instance.getState().equals(State.UNUSABLE) ? instance.getPreviousState()
-                        .equals(State.ACTIVE) : !instance.getState().equals(State.INACTIVE);
-                VerificationUtil.updateInstanceWithRuntimeDescription(instance, state, expectedRunning);
-                ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-                LOGGER.info(instance.getDescription(adminView));
-            } else {
-                throw new InstallerException("Asterix instance by the name " + asterixInstanceName + " does not exist.");
-            }
-        } else {
-            List<AsterixInstance> asterixInstances = ServiceProvider.INSTANCE.getLookupService().getAsterixInstances();
-            if (asterixInstances.size() > 0) {
-                for (AsterixInstance instance : asterixInstances) {
-                    AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-                    boolean expectedRunning = instance.getState().equals(State.UNUSABLE) ? instance.getPreviousState()
-                            .equals(State.ACTIVE) : !instance.getState().equals(State.INACTIVE);
-                    VerificationUtil.updateInstanceWithRuntimeDescription(instance, state, expectedRunning);
-                    ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-                    LOGGER.info(instance.getDescription(adminView));
-                }
-            } else {
-                LOGGER.info("No Asterix instances found!");
-            }
+	@Override
+	protected void execCommand() throws Exception {
+		InstallerDriver.initConfig();
+		String asterixInstanceName = ((DescribeConfig) config).name;
+		boolean adminView = ((DescribeConfig) config).admin;
+		if (asterixInstanceName != null) {
+			InstallerUtil.validateAsterixInstanceExists(asterixInstanceName,
+					State.INACTIVE, State.ACTIVE, State.UNUSABLE);
+			AsterixInstance instance = ServiceProvider.INSTANCE
+					.getLookupService().getAsterixInstance(asterixInstanceName);
+			if (instance != null) {
+				AsterixRuntimeState state = VerificationUtil
+						.getAsterixRuntimeState(instance);
+				boolean expectedRunning = instance.getState().equals(
+						State.UNUSABLE) ? instance.getPreviousState().equals(
+						State.ACTIVE) : !instance.getState().equals(
+						State.INACTIVE);
+				VerificationUtil.updateInstanceWithRuntimeDescription(instance,
+						state, expectedRunning);
+				ServiceProvider.INSTANCE.getLookupService()
+						.updateAsterixInstance(instance);
+				LOGGER.info(instance.getDescription(adminView));
+			} else {
+				throw new InstallerException("Asterix instance by the name "
+						+ asterixInstanceName + " does not exist.");
+			}
+		} else {
+			List<AsterixInstance> asterixInstances = ServiceProvider.INSTANCE
+					.getLookupService().getAsterixInstances();
+			if (asterixInstances.size() > 0) {
+				for (AsterixInstance instance : asterixInstances) {
+					AsterixRuntimeState state = VerificationUtil
+							.getAsterixRuntimeState(instance);
+					boolean expectedRunning = instance.getState().equals(
+							State.UNUSABLE) ? instance.getPreviousState()
+							.equals(State.ACTIVE) : !instance.getState()
+							.equals(State.INACTIVE);
+					VerificationUtil.updateInstanceWithRuntimeDescription(
+							instance, state, expectedRunning);
+					ServiceProvider.INSTANCE.getLookupService()
+							.updateAsterixInstance(instance);
+					LOGGER.info(instance.getDescription(adminView));
+				}
+			} else {
+				LOGGER.info("No Asterix instances found!");
+			}
 
-        }
-    }
+		}
+	}
 
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new DescribeConfig();
-    }
+	@Override
+	protected CommandConfig getCommandConfig() {
+		return new DescribeConfig();
+	}
 
-    @Override
-    protected String getUsageDescription() {
-        return "\nProvides information about an ASTERIX instance." + "\n\nUsage arguments/options:-"
-                + "\n[-n] Name of the ASTERIX instance." + "\n[-admin] Provides a detailed description";
-    }
+	@Override
+	protected String getUsageDescription() {
+		return "\nProvides information about an ASTERIX instance."
+				+ "\n\nUsage arguments/options:-"
+				+ "\n[-n]       Name of the ASTERIX instance."
+				+ "\n[-admin]   Provides a detailed description";
+	}
 
 }
 
 class DescribeConfig extends AbstractCommandConfig {
 
-    @Option(name = "-n", required = false, usage = "Name of Asterix Instance")
-    public String name;
+	@Option(name = "-n", required = false, usage = "Name of Asterix Instance")
+	public String name;
 
-    @Option(name = "-admin", required = false, usage = "Detailed description")
-    public boolean admin;
+	@Option(name = "-admin", required = false, usage = "Detailed description")
+	public boolean admin;
 
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ICommand.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ICommand.java
index 5d6d9ac..d27fee9 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ICommand.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ICommand.java
@@ -16,9 +16,19 @@
 
 public interface ICommand {
 
-	public enum CommandType {
-		CREATE, DELETE, START, STOP, BACKUP, RESTORE, DESCRIBE, ALTER, VALIDATE, CONFIGURE, SHUTDOWN
-	}
+    public enum CommandType {
+        CREATE,
+        DELETE,
+        START,
+        STOP,
+        BACKUP,
+        RESTORE,
+        DESCRIBE,
+        ALTER,
+        VALIDATE,
+        CONFIGURE,
+        SHUTDOWN
+    }
 
-	public void execute(String args[]) throws Exception;
+    public void execute(String args[]) throws Exception;
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/RestoreCommand.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/RestoreCommand.java
index 958ce6c..49629a4 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/RestoreCommand.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/RestoreCommand.java
@@ -55,7 +55,7 @@
     protected String getUsageDescription() {
         return "\nRestores an ASTERIX instance's data from a previously taken backup snapshot."
                 + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance"
-                + "\n-b id of the backed up snapshot ";
+                + "\n-b id of the backup snapshot ";
     }
 
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ValidateCommand.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ValidateCommand.java
index 9638ac6..dcdbe18 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ValidateCommand.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/command/ValidateCommand.java
@@ -29,214 +29,247 @@
 import edu.uci.ics.asterix.event.schema.cluster.Cluster;
 import edu.uci.ics.asterix.event.schema.cluster.MasterNode;
 import edu.uci.ics.asterix.event.schema.cluster.Node;
+import edu.uci.ics.asterix.event.schema.pattern.Patterns;
 import edu.uci.ics.asterix.installer.driver.InstallerDriver;
+import edu.uci.ics.asterix.installer.driver.InstallerUtil;
+import edu.uci.ics.asterix.installer.events.PatternCreator;
 import edu.uci.ics.asterix.installer.schema.conf.Configuration;
 import edu.uci.ics.asterix.installer.schema.conf.Zookeeper;
 
 public class ValidateCommand extends AbstractCommand {
 
-    private static final String OK = " [" + "\u2713" + "]";
-    private static final String ERROR = " [" + "x" + "]";
-    private static final String WARNING = " [" + "!" + "]";
+	private static final String OK = " [" + "\u2713" + "]";
+	private static final String ERROR = " [" + "x" + "]";
+	private static final String WARNING = " [" + "!" + "]";
 
-    @Override
-    protected void execCommand() throws Exception {
-        ValidateConfig vConfig = (ValidateConfig) config;
-        logValidationResult("Enviornment", validateEnvironment());
-        if (((ValidateConfig) config).cluster != null) {
-            logValidationResult("Cluster configuration", validateCluster(vConfig.cluster));
-        } else {
-            logValidationResult("Installer Configuration", validateConfiguration());
-        }
-    }
+	@Override
+	protected void execCommand() throws Exception {
+		ValidateConfig vConfig = (ValidateConfig) config;
+		logValidationResult("Enviornment", validateEnvironment());
+		if (((ValidateConfig) config).cluster != null) {
+			logValidationResult("Cluster configuration",
+					validateCluster(vConfig.cluster));
+		} else {
+			logValidationResult("Installer Configuration",
+					validateConfiguration());
+		}
+	}
 
-    private void logValidationResult(String prefix, boolean isValid) {
-        if (!isValid) {
-            LOGGER.fatal(prefix + ERROR);
-        } else {
-            LOGGER.info(prefix + OK);
-        }
-    }
+	private void logValidationResult(String prefix, boolean isValid) {
+		if (!isValid) {
+			LOGGER.fatal(prefix + ERROR);
+		} else {
+			LOGGER.info(prefix + OK);
+		}
+	}
 
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new ValidateConfig();
-    }
+	@Override
+	protected CommandConfig getCommandConfig() {
+		return new ValidateConfig();
+	}
 
-    @Override
-    protected String getUsageDescription() {
-        return "\nValidate the installer's configuration or a cluster configuration" + "\nUsage"
-                + "\nFor validating the installer configuration" + "\n use $ managix validate"
-                + "\n\nFor validating a cluster configuration"
-                + "\n$ use managix validate -c <path to the cluster configuration file>";
-    }
+	@Override
+	protected String getUsageDescription() {
+		return "\nValidate the installer's configuration or a cluster configuration"
+				+ "\nUsage"
+				+ "\nFor validating the installer configuration"
+				+ "\n use $ managix validate"
+				+ "\n\nFor validating a cluster configuration"
+				+ "\n$ use managix validate -c <path to the cluster configuration file>";
+	}
 
-    public boolean validateEnvironment() throws Exception {
-        boolean valid = true;
-        String managixHome = System.getenv(InstallerDriver.ENV_MANAGIX_HOME);
-        if (managixHome == null) {
-            valid = false;
-            LOGGER.fatal(InstallerDriver.ENV_MANAGIX_HOME + " not set " + ERROR);
-        } else {
-            File home = new File(managixHome);
-            if (!home.exists()) {
-                valid = false;
-                LOGGER.fatal(InstallerDriver.ENV_MANAGIX_HOME + ": " + home.getAbsolutePath() + " does not exist!"
-                        + ERROR);
-            }
-        }
-        return valid;
+	public boolean validateEnvironment() throws Exception {
+		boolean valid = true;
+		String managixHome = System.getenv(InstallerDriver.ENV_MANAGIX_HOME);
+		if (managixHome == null) {
+			valid = false;
+			LOGGER.fatal(InstallerDriver.ENV_MANAGIX_HOME + " not set " + ERROR);
+		} else {
+			File home = new File(managixHome);
+			if (!home.exists()) {
+				valid = false;
+				LOGGER.fatal(InstallerDriver.ENV_MANAGIX_HOME + ": "
+						+ home.getAbsolutePath() + " does not exist!" + ERROR);
+			}
+		}
+		return valid;
 
-    }
+	}
 
-    public boolean validateCluster(String clusterPath) throws Exception {
-        boolean valid = true;
-        File f = new File(clusterPath);
-        if (!f.exists() || !f.isFile()) {
-            LOGGER.error(" Invalid path " + f.getAbsolutePath() + ERROR);
-            valid = false;
-        } else {
-            JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-            Unmarshaller unmarshaller = ctx.createUnmarshaller();
-            Cluster cluster = (Cluster) unmarshaller.unmarshal(new File(clusterPath));
-            validateClusterProperties(cluster);
+	public boolean validateCluster(String clusterPath) throws Exception {
+		boolean valid = true;
+		Cluster cluster = null;
+		File f = new File(clusterPath);
+		if (!f.exists() || !f.isFile()) {
+			LOGGER.error(" Invalid path " + f.getAbsolutePath() + ERROR);
+			valid = false;
+		} else {
+			JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
+			Unmarshaller unmarshaller = ctx.createUnmarshaller();
+			cluster = (Cluster) unmarshaller.unmarshal(new File(clusterPath));
+			validateClusterProperties(cluster);
 
-            Set<String> servers = new HashSet<String>();
-            Set<String> serverIds = new HashSet<String>();
-            servers.add(cluster.getMasterNode().getIp());
-            serverIds.add(cluster.getMasterNode().getId());
+			Set<String> servers = new HashSet<String>();
+			Set<String> serverIds = new HashSet<String>();
+			servers.add(cluster.getMasterNode().getIp());
+			serverIds.add(cluster.getMasterNode().getId());
 
-            MasterNode masterNode = cluster.getMasterNode();
-            Node master = new Node(masterNode.getId(), masterNode.getIp(), masterNode.getRam(),
-                    masterNode.getJavaHome(), masterNode.getLogdir(), null, masterNode.getDebug());
+			MasterNode masterNode = cluster.getMasterNode();
+			Node master = new Node(masterNode.getId(), masterNode.getIp(),
+					masterNode.getRam(), masterNode.getJavaHome(),
+					masterNode.getLogdir(), null, masterNode.getDebug());
 
-            valid = valid & validateNodeConfiguration(master, cluster);
+			valid = valid & validateNodeConfiguration(master, cluster);
 
-            for (Node node : cluster.getNode()) {
-                servers.add(node.getIp());
-                if (serverIds.contains(node.getId())) {
-                    valid = false;
-                    LOGGER.error("Duplicate node id :" + node.getId() + ERROR);
-                } else {
-                    valid = valid & validateNodeConfiguration(node, cluster);
-                }
-            }
-        }
-        return valid;
-    }
+			for (Node node : cluster.getNode()) {
+				servers.add(node.getIp());
+				if (serverIds.contains(node.getId())) {
+					valid = false;
+					LOGGER.error("Duplicate node id :" + node.getId() + ERROR);
+				} else {
+					valid = valid & validateNodeConfiguration(node, cluster);
+				}
+			}
+		}
 
-    private void validateClusterProperties(Cluster cluster) {
-        List<String> tempDirs = new ArrayList<String>();
-        if (cluster.getLogdir() != null && checkTemporaryPath(cluster.getLogdir())) {
-            tempDirs.add("Log directory: " + cluster.getLogdir());
-        }
-        if (cluster.getStore() != null && checkTemporaryPath(cluster.getStore())) {
-            tempDirs.add("Store directory: " + cluster.getStore());
-        }
+		if (valid) {
+			checkJavaVersion(cluster);
+		}
+		return valid;
+	}
 
-        if (tempDirs.size() > 0) {
-            StringBuffer msg = new StringBuffer();
-            msg.append("The following paths are subject to be cleaned up by OS");
-            for (String tempDir : tempDirs) {
-                msg.append("\n" + tempDir + WARNING);
-            }
-            LOGGER.warn(msg);
-        }
+	private void checkJavaVersion(Cluster cluster) throws Exception {
+		PatternCreator pc = new PatternCreator();
+		Patterns patterns = pc.getClusterInfoPattern(cluster);
+		InstallerUtil.getEventrixClient(cluster).submit(patterns);
+	}
 
-    }
+	private void validateClusterProperties(Cluster cluster) {
+		List<String> tempDirs = new ArrayList<String>();
+		if (cluster.getLogdir() != null
+				&& checkTemporaryPath(cluster.getLogdir())) {
+			tempDirs.add("Log directory: " + cluster.getLogdir());
+		}
+		if (cluster.getStore() != null
+				&& checkTemporaryPath(cluster.getStore())) {
+			tempDirs.add("Store directory: " + cluster.getStore());
+		}
 
-    private boolean validateNodeConfiguration(Node node, Cluster cluster) {
-        boolean valid = true;
-        valid = checkNodeReachability(node.getIp());
-        if (node.getJavaHome() == null || node.getJavaHome().length() == 0) {
-            if (cluster.getJavaHome() == null || cluster.getJavaHome().length() == 0) {
-                valid = false;
-                LOGGER.fatal("java_home not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
+		if (tempDirs.size() > 0) {
+			StringBuffer msg = new StringBuffer();
+			msg.append("The following paths are subject to be cleaned up by OS");
+			for (String tempDir : tempDirs) {
+				msg.append("\n" + tempDir + WARNING);
+			}
+			LOGGER.warn(msg);
+		}
 
-        if (node.getLogdir() == null || node.getLogdir().length() == 0) {
-            if (cluster.getLogdir() == null || cluster.getLogdir().length() == 0) {
-                valid = false;
-                LOGGER.fatal("log_dir not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
+	}
 
-        if (node.getStore() == null || cluster.getStore().length() == 0) {
-            if (cluster.getMasterNode().getId().equals(node.getId())
-                    && (cluster.getStore() == null || cluster.getStore().length() == 0)) {
-                valid = false;
-                LOGGER.fatal("store not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
+	private boolean validateNodeConfiguration(Node node, Cluster cluster) {
+		boolean valid = true;
+		valid = checkNodeReachability(node.getIp());
+		if (node.getJavaHome() == null || node.getJavaHome().length() == 0) {
+			if (cluster.getJavaHome() == null
+					|| cluster.getJavaHome().length() == 0) {
+				valid = false;
+				LOGGER.fatal("java_home not defined at cluster/node level for node: "
+						+ node.getId() + ERROR);
+			}
+		}
 
-        if (node.getRam() == null || node.getRam().length() == 0) {
-            if (cluster.getRam() == null || cluster.getRam().length() == 0) {
-                valid = false;
-                LOGGER.fatal("ram not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
-        return valid;
-    }
+		if (node.getLogdir() == null || node.getLogdir().length() == 0) {
+			if (cluster.getLogdir() == null
+					|| cluster.getLogdir().length() == 0) {
+				valid = false;
+				LOGGER.fatal("log_dir not defined at cluster/node level for node: "
+						+ node.getId() + ERROR);
+			}
+		}
 
-    private boolean checkTemporaryPath(String logdir) {
-        return logdir.startsWith("/tmp/");
+		if (node.getStore() == null || cluster.getStore().length() == 0) {
+			if (cluster.getMasterNode().getId().equals(node.getId())
+					&& (cluster.getStore() == null || cluster.getStore()
+							.length() == 0)) {
+				valid = false;
+				LOGGER.fatal("store not defined at cluster/node level for node: "
+						+ node.getId() + ERROR);
+			}
+		}
 
-    }
+		if (node.getRam() == null || node.getRam().length() == 0) {
+			if (cluster.getRam() == null || cluster.getRam().length() == 0) {
+				valid = false;
+				LOGGER.fatal("ram not defined at cluster/node level for node: "
+						+ node.getId() + ERROR);
+			}
+		}
+		return valid;
+	}
 
-    public boolean validateConfiguration() throws Exception {
-        String managixHome = System.getenv(InstallerDriver.ENV_MANAGIX_HOME);
-        File configFile = new File(managixHome + File.separator + InstallerDriver.MANAGIX_CONF_XML);
-        JAXBContext configCtx = JAXBContext.newInstance(Configuration.class);
-        Unmarshaller unmarshaller = configCtx.createUnmarshaller();
-        Configuration conf = (Configuration) unmarshaller.unmarshal(configFile);
-        return validateZookeeperConfiguration(conf);
-    }
+	private boolean checkTemporaryPath(String logdir) {
+		return logdir.startsWith("/tmp/");
 
-    private boolean validateZookeeperConfiguration(Configuration conf) throws Exception {
-        boolean valid = true;
-        Zookeeper zk = conf.getZookeeper();
+	}
 
-        if (zk.getHomeDir() == null || zk.getHomeDir().length() == 0) {
-            valid = false;
-            LOGGER.fatal("Zookeeper home dir not configured" + ERROR);
-        } else if (checkTemporaryPath(zk.getHomeDir())) {
-            LOGGER.warn("Zookeeper home dir is subject to be cleaned up by OS" + WARNING);
-        }
+	public boolean validateConfiguration() throws Exception {
+		String managixHome = System.getenv(InstallerDriver.ENV_MANAGIX_HOME);
+		File configFile = new File(managixHome + File.separator
+				+ InstallerDriver.MANAGIX_CONF_XML);
+		JAXBContext configCtx = JAXBContext.newInstance(Configuration.class);
+		Unmarshaller unmarshaller = configCtx.createUnmarshaller();
+		Configuration conf = (Configuration) unmarshaller.unmarshal(configFile);
+		return validateZookeeperConfiguration(conf);
+	}
 
-        if (zk.getServers().getServer().isEmpty()) {
-            valid = false;
-            LOGGER.fatal("Zookeeper servers not configured" + ERROR);
-        }
+	private boolean validateZookeeperConfiguration(Configuration conf)
+			throws Exception {
+		boolean valid = true;
+		Zookeeper zk = conf.getZookeeper();
 
-        boolean validEnsemble = true;
-        for (String server : zk.getServers().getServer()) {
-            validEnsemble = validEnsemble && checkNodeReachability(server);
-        }
+		if (zk.getHomeDir() == null || zk.getHomeDir().length() == 0) {
+			valid = false;
+			LOGGER.fatal("Zookeeper home dir not configured" + ERROR);
+		} else if (checkTemporaryPath(zk.getHomeDir())) {
+			LOGGER.warn("Zookeeper home dir is subject to be cleaned up by OS"
+					+ WARNING);
+		}
 
-        return valid;
-    }
+		if (zk.getServers().getServer().isEmpty()) {
+			valid = false;
+			LOGGER.fatal("Zookeeper servers not configured" + ERROR);
+		}
 
-    private boolean checkNodeReachability(String server) {
-        boolean reachable = true;
-        try {
-            InetAddress address = InetAddress.getByName(server);
-            if (!address.isReachable(1000)) {
-                LOGGER.fatal("\n" + "Server: " + server + " unreachable" + ERROR);
-                reachable = false;
-            }
-        } catch (Exception e) {
-            reachable = false;
-            LOGGER.fatal("\n" + "Server: " + server + " Invalid address" + ERROR);
-        }
-        return reachable;
-    }
+		boolean validEnsemble = true;
+		for (String server : zk.getServers().getServer()) {
+			validEnsemble = validEnsemble && checkNodeReachability(server);
+		}
+
+		return valid;
+	}
+
+	private boolean checkNodeReachability(String server) {
+		boolean reachable = true;
+		try {
+			InetAddress address = InetAddress.getByName(server);
+			if (!address.isReachable(1000)) {
+				LOGGER.fatal("\n" + "Server: " + server + " unreachable"
+						+ ERROR);
+				reachable = false;
+			}
+		} catch (Exception e) {
+			reachable = false;
+			LOGGER.fatal("\n" + "Server: " + server + " Invalid address"
+					+ ERROR);
+		}
+		return reachable;
+	}
 
 }
 
 class ValidateConfig extends AbstractCommandConfig {
 
-    @Option(name = "-c", required = false, usage = "Path to the cluster configuration xml")
-    public String cluster;
+	@Option(name = "-c", required = false, usage = "Path to the cluster configuration xml")
+	public String cluster;
 
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerDriver.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerDriver.java
index bd8568f..321fd1a 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerDriver.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerDriver.java
@@ -24,7 +24,6 @@
 import org.apache.log4j.Logger;
 
 import edu.uci.ics.asterix.installer.command.CommandHandler;
-import edu.uci.ics.asterix.installer.command.ICommand.CommandType;
 import edu.uci.ics.asterix.installer.schema.conf.Configuration;
 import edu.uci.ics.asterix.installer.service.ILookupService;
 import edu.uci.ics.asterix.installer.service.ServiceProvider;
@@ -39,8 +38,8 @@
     public static final String EVENTS_DIR = "events";
 
     private static final Logger LOGGER = Logger.getLogger(InstallerDriver.class.getName());
-    public static final String ENV_MANAGIX_HOME = "INSTALLER_HOME";
-    public static final String MANAGIX_CONF_XML = "conf" + File.separator + "installer-conf.xml";
+    public static final String ENV_MANAGIX_HOME = "MANAGIX_HOME";
+    public static final String MANAGIX_CONF_XML = "conf" + File.separator + "managix-conf.xml";
 
     private static Configuration conf;
     private static String managixHome;
@@ -110,7 +109,7 @@
             LOGGER.error("Unknown command");
             printUsage();
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(e.getMessage());
         }
     }
 
@@ -128,6 +127,10 @@
         buffer.append("configure" + ":" + " Auto-generate configuration for local psedu-distributed Asterix instance"
                 + "\n");
         buffer.append("shutdown " + ":" + " Shutdown the installer service" + "\n");
+        buffer.append("validate " + ":" + " Validates the installer/cluster configuration" + "\n");
+        buffer.append("configure" + ":" + " Auto-generate configuration for local psedu-distributed Asterix instance"
+                + "\n");
+        buffer.append("shutdown " + ":" + " Shutdown the installer service" + "\n");
         LOGGER.info(buffer.toString());
     }
 }
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerUtil.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerUtil.java
index 1007c01..24b531a 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerUtil.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/driver/InstallerUtil.java
@@ -81,12 +81,58 @@
 
     }
 
+    public static void addLibraryToAsterixZip(AsterixInstance asterixInstance, String dataverseName,
+            String libraryName, String libraryPath) throws IOException {
+        File instanceDir = new File(InstallerDriver.getAsterixDir() + File.separator + asterixInstance.getName());
+        if (!instanceDir.exists()) {
+            instanceDir.mkdirs();
+        }
+        String asterixZipName = InstallerDriver.getAsterixZip().substring(
+                InstallerDriver.getAsterixZip().lastIndexOf(File.separator) + 1);
+
+        String sourceZip = instanceDir.getAbsolutePath() + File.separator + asterixZipName;
+        unzip(sourceZip, instanceDir.getAbsolutePath());
+        File libraryPathInZip = new File(instanceDir.getAbsolutePath() + File.separator + "external" + File.separator
+                + "library" + dataverseName + File.separator + "to-add" + File.separator + libraryName);
+        libraryPathInZip.mkdirs();
+        Runtime.getRuntime().exec("cp" + " " + libraryPath + " " + libraryPathInZip.getAbsolutePath());
+        Runtime.getRuntime().exec("rm " + sourceZip);
+        String destZip = InstallerDriver.getAsterixDir() + File.separator + asterixInstance.getName() + File.separator
+                + asterixZipName;
+        zipDir(instanceDir, new File(destZip));
+        Runtime.getRuntime().exec("mv" + " " + destZip + " " + sourceZip);
+    }
+
     private static Node getMetadataNode(Cluster cluster) {
         Random random = new Random();
         int nNodes = cluster.getNode().size();
         return cluster.getNode().get(random.nextInt(nNodes));
     }
 
+    public static String getNodeDirectories(String asterixInstanceName, Node node, Cluster cluster) {
+        String storeDataSubDir = asterixInstanceName + File.separator + "data" + File.separator;
+        String storeLibrarySubDir = asterixInstanceName + File.separator + "library" + File.separator;
+        String[] storeDirs = null;
+        StringBuffer nodeDataStore = new StringBuffer();
+        String storeDirValue = node.getStore();
+        if (storeDirValue == null) {
+            storeDirValue = cluster.getStore();
+            if (storeDirValue == null) {
+                throw new IllegalStateException(" Store not defined for node " + node.getId());
+            }
+            storeDataSubDir = node.getId() + File.separator + storeDataSubDir;
+            storeLibrarySubDir = node.getId() + File.separator + storeLibrarySubDir;
+        }
+
+        storeDirs = storeDirValue.split(",");
+        for (String ns : storeDirs) {
+            nodeDataStore.append(ns + File.separator + storeDataSubDir.trim());
+            nodeDataStore.append(",");
+        }
+        nodeDataStore.deleteCharAt(nodeDataStore.length() - 1);
+        return nodeDataStore.toString();
+    }
+
     private static void writeAsterixConfigurationFile(AsterixInstance asterixInstance, boolean newData)
             throws IOException {
         String asterixInstanceName = asterixInstance.getName();
@@ -98,30 +144,8 @@
         conf.append("NewUniverse=" + newData + "\n");
 
         for (Node node : cluster.getNode()) {
-            StringBuffer nodeDataStore = new StringBuffer();
-            if (node.getStore() != null) {
-                String[] nodeStores = node.getStore().split(",");
-                for (String ns : nodeStores) {
-                    nodeDataStore.append(ns + File.separator + asterixInstanceName + File.separator);
-                    nodeDataStore.append(",");
-                }
-                nodeDataStore.deleteCharAt(nodeDataStore.length() - 1);
-            } else {
-                if (cluster.getStore() != null) {
-                    String[] nodeStores = cluster.getStore().split(",");
-                    for (String ns : nodeStores) {
-                        nodeDataStore.append(ns + File.separator + node.getId() + File.separator + asterixInstanceName
-                                + File.separator);
-                        nodeDataStore.append(",");
-                    }
-                    nodeDataStore.deleteCharAt(nodeDataStore.length() - 1);
-                }
-            }
-            if (nodeDataStore.length() == 0) {
-                throw new IllegalStateException(" Store not defined for node " + node.getId());
-            }
-            conf.append(asterixInstanceName + "_" + node.getId() + ".stores" + "=" + nodeDataStore + "\n");
-
+            String nodeDir = getNodeDirectories(asterixInstance.getName(), node, cluster);
+            conf.append(asterixInstanceName + "_" + node.getId() + ".stores" + "=" + nodeDir + "\n");
         }
         Properties asterixConfProp = asterixInstance.getConfiguration();
         String outputDir = asterixConfProp.getProperty("output_dir");
@@ -251,7 +275,7 @@
             throws Exception {
         AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(name);
         if (instance == null) {
-            throw new InstallerException(" Asterix instance by name " + name + " does not exist.");
+            throw new InstallerException("Asterix instance by name " + name + " does not exist.");
         }
         boolean valid = false;
         for (State state : permissibleStates) {
@@ -261,7 +285,7 @@
             }
         }
         if (!valid) {
-            throw new InstallerException(" Asterix instance by the name " + name + " is in " + instance.getState()
+            throw new InstallerException("Asterix instance by the name " + name + " is in " + instance.getState()
                     + " state ");
         }
         return instance;
@@ -270,7 +294,7 @@
     public static void validateAsterixInstanceNotExists(String name) throws Exception {
         AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(name);
         if (instance != null) {
-            throw new InstallerException(" Asterix instance by name " + name + " already exists.");
+            throw new InstallerException("Asterix instance by name " + name + " already exists.");
         }
     }
 
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/error/OutputHandler.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/error/OutputHandler.java
index 16b86df..4699402 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/error/OutputHandler.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/error/OutputHandler.java
@@ -40,19 +40,18 @@
         switch (eventType) {
             case FILE_TRANSFER:
                 if (trimmedOutput.length() > 0) {
-                    if (!output.contains("Permission denied") || output.contains("does not exist")
-                            || output.contains("File exist")) {
-                        ignore = true;
-                    } else {
+                    if (output.contains("Permission denied") || output.contains("cannot find or open")) {
                         ignore = false;
+                        break;
                     }
                 }
                 break;
 
             case BACKUP:
+            case RESTORE:
                 if (trimmedOutput.length() > 0) {
                     if (trimmedOutput.contains("AccessControlException")) {
-                        errorMessage.append("Insufficient permissions on HDFS back up directory");
+                        errorMessage.append("Insufficient permissions on back up directory");
                         ignore = false;
                     }
                     if (output.contains("does not exist") || output.contains("File exist")
@@ -64,42 +63,19 @@
                 }
                 break;
 
-            case RESTORE:
-                if (trimmedOutput.length() > 0) {
-                    if (trimmedOutput.contains("AccessControlException")) {
-                        errorMessage.append("Insufficient permissions on HDFS back up directory");
-                        ignore = false;
-                    }
-                    if (output.contains("does not exist") || output.contains("File exist")
-                            || output.contains("No such file or directory")) {
-                        ignore = true;
-                    } else {
-                        ignore = false;
-                    }
-                }
-                break;
-
-            case ASTERIX_DEPLOY:
-                if (trimmedOutput.length() > 0) {
-                    if (trimmedOutput.contains("Exception")) {
-                        ignore = false;
-                        errorMessage.append("Error in deploying Asterix: " + output);
-                        errorMessage.append("\nStop the instance to initiate a cleanup");
-                    }
-                }
             case NODE_INFO:
                 Properties p = new Properties();
                 try {
                     p.load(new ByteArrayInputStream(trimmedOutput.getBytes()));
                 } catch (IOException e) {
                 }
-                String javaVersion = (String) p.get("JAVA_VERSION");
-                if (p.get("JAVA_VERSION") == null) {
+                String javaVersion = (String) p.get("java_version");
+                if (p.get("java_version") == null) {
                     errorMessage.append("Java not installed on " + event.getNodeid().getValue().getAbsvalue());
                     ignore = false;
-                } else if (!javaVersion.contains("1.8")) {
+                } else if (!javaVersion.contains("1.7")) {
                     errorMessage.append("Asterix requires Java 1.7.x. Incompatible version found on  "
-                            + event.getNodeid().getValue().getAbsvalue());
+                            + event.getNodeid().getValue().getAbsvalue() + "\n");
                     ignore = false;
                 }
                 break;
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/events/PatternCreator.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/events/PatternCreator.java
index 1217c0b..46b909c 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/events/PatternCreator.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/events/PatternCreator.java
@@ -16,7 +16,9 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import edu.uci.ics.asterix.event.driver.EventDriver;
 import edu.uci.ics.asterix.event.schema.cluster.Cluster;
@@ -266,18 +268,43 @@
         List<Pattern> patternList = new ArrayList<Pattern>();
         patternList.addAll(createRemoveAsterixStoragePattern(instance).getPattern());
         if (instance.getBackupInfo() != null && instance.getBackupInfo().size() > 0) {
-            patternList.addAll(createRemoveHDFSBackupPattern(instance).getPattern());
+            List<BackupInfo> backups = instance.getBackupInfo();
+            Set<String> removedBackupDirsHDFS = new HashSet<String>();
+            Set<String> removedBackupDirsLocal = new HashSet<String>();
+
+            String backupDir;
+            for (BackupInfo binfo : backups) {
+                backupDir = binfo.getBackupConf().getBackupDir();
+                switch (binfo.getBackupType()) {
+                    case HDFS:
+                        if (removedBackupDirsHDFS.contains(backups)) {
+                            continue;
+                        }
+                        patternList.addAll(createRemoveHDFSBackupPattern(instance, backupDir).getPattern());
+                        removedBackupDirsHDFS.add(backupDir);
+                        break;
+
+                    case LOCAL:
+                        if (removedBackupDirsLocal.contains(backups)) {
+                            continue;
+                        }
+                        patternList.addAll(createRemoveLocalBackupPattern(instance, backupDir).getPattern());
+                        removedBackupDirsLocal.add(backupDir);
+                        break;
+                }
+
+            }
         }
+        patternList.addAll(createRemoveAsterixLogDirPattern(instance).getPattern());
         Patterns patterns = new Patterns(patternList);
         return patterns;
     }
 
-    private Patterns createRemoveHDFSBackupPattern(AsterixInstance instance) throws Exception {
+    private Patterns createRemoveHDFSBackupPattern(AsterixInstance instance, String hdfsBackupDir) throws Exception {
         List<Pattern> patternList = new ArrayList<Pattern>();
         Cluster cluster = instance.getCluster();
         String hdfsUrl = InstallerDriver.getConfiguration().getBackup().getHdfs().getUrl();
         String hadoopVersion = InstallerDriver.getConfiguration().getBackup().getHdfs().getVersion();
-        String hdfsBackupDir = InstallerDriver.getConfiguration().getBackup().getBackupDir();
         String workingDir = cluster.getWorkingDir().getDir();
         Node launchingNode = cluster.getNode().get(0);
         Nodeid nodeid = new Nodeid(new Value(null, launchingNode.getId()));
@@ -289,6 +316,66 @@
         return patterns;
     }
 
+    private Patterns createRemoveLocalBackupPattern(AsterixInstance instance, String localBackupDir) throws Exception {
+        List<Pattern> patternList = new ArrayList<Pattern>();
+        Cluster cluster = instance.getCluster();
+
+        String pathToDelete = localBackupDir + File.separator + instance.getName();
+        String pargs = pathToDelete;
+        List<String> removedBackupDirs = new ArrayList<String>();
+        for (Node node : cluster.getNode()) {
+            if (removedBackupDirs.contains(node.getIp())) {
+                continue;
+            }
+            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
+            Event event = new Event("file_delete", nodeid, pargs);
+            patternList.add(new Pattern(null, 1, null, event));
+            removedBackupDirs.add(node.getIp());
+        }
+
+        Patterns patterns = new Patterns(patternList);
+        return patterns;
+    }
+
+    public Patterns createRemoveAsterixWorkingDirPattern(AsterixInstance instance) throws Exception {
+        List<Pattern> patternList = new ArrayList<Pattern>();
+        Cluster cluster = instance.getCluster();
+        String workingDir = cluster.getWorkingDir().getDir();
+        String pargs = workingDir;
+        Nodeid nodeid = new Nodeid(new Value(null, cluster.getMasterNode().getId()));
+        Event event = new Event("file_delete", nodeid, pargs);
+        patternList.add(new Pattern(null, 1, null, event));
+
+        if (!cluster.getWorkingDir().isNFS()) {
+            for (Node node : cluster.getNode()) {
+                nodeid = new Nodeid(new Value(null, node.getId()));
+                event = new Event("file_delete", nodeid, pargs);
+                patternList.add(new Pattern(null, 1, null, event));
+            }
+        }
+        Patterns patterns = new Patterns(patternList);
+        return patterns;
+    }
+
+    private Patterns createRemoveAsterixLogDirPattern(AsterixInstance instance) throws Exception {
+        List<Pattern> patternList = new ArrayList<Pattern>();
+        Cluster cluster = instance.getCluster();
+        String pargs = instance.getCluster().getLogdir();
+        Nodeid nodeid = new Nodeid(new Value(null, cluster.getMasterNode().getId()));
+        Event event = new Event("file_delete", nodeid, pargs);
+        patternList.add(new Pattern(null, 1, null, event));
+
+        if (!cluster.getWorkingDir().isNFS()) {
+            for (Node node : cluster.getNode()) {
+                nodeid = new Nodeid(new Value(null, node.getId()));
+                event = new Event("file_delete", nodeid, pargs);
+                patternList.add(new Pattern(null, 1, null, event));
+            }
+        }
+        Patterns patterns = new Patterns(patternList);
+        return patterns;
+    }
+
     private Patterns createRemoveAsterixStoragePattern(AsterixInstance instance) throws Exception {
         List<Pattern> patternList = new ArrayList<Pattern>();
         Cluster cluster = instance.getCluster();
@@ -320,8 +407,8 @@
         String username = cluster.getUsername() != null ? cluster.getUsername() : System.getProperty("user.name");
         String asterixZipName = InstallerDriver.getAsterixZip().substring(
                 InstallerDriver.getAsterixZip().lastIndexOf(File.separator) + 1);
-        String fileToTransfer = InstallerDriver.getAsterixDir() + File.separator + instanceName + File.separator
-                + asterixZipName;
+        String fileToTransfer = new File(InstallerDriver.getAsterixDir() + File.separator + instanceName
+                + File.separator + asterixZipName).getAbsolutePath();
         String pargs = username + " " + fileToTransfer + " " + destinationIp + " " + destDir + " " + "unpack";
         Event event = new Event("file_transfer", nodeid, pargs);
         return new Pattern(null, 1, null, event);
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/AsterixInstance.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/AsterixInstance.java
index b0a7501..d3ba758 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/AsterixInstance.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/AsterixInstance.java
@@ -18,7 +18,6 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Properties;
 
 import edu.uci.ics.asterix.event.schema.cluster.Cluster;
@@ -161,7 +160,6 @@
             buffer.append(node.getId() + ":" + node.getIp() + "\n");
         }
 
-        buffer.append("\n");
         if (backupInfo != null && backupInfo.size() > 0) {
             for (BackupInfo info : backupInfo) {
                 buffer.append(info + "\n");
@@ -169,10 +167,6 @@
         }
         buffer.append("\n");
         buffer.append("Asterix version:" + asterixVersion + "\n");
-        buffer.append("Asterix Configuration" + "\n");
-        for (Entry<Object, Object> entry : configuration.entrySet()) {
-            buffer.append(entry.getKey() + " = " + entry.getValue() + "\n");
-        }
         buffer.append("Metadata Node:" + metadataNodeId + "\n");
         buffer.append("Processes" + "\n");
         for (ProcessInfo pInfo : runtimeState.getProcesses()) {
diff --git a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/EventList.java b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/EventList.java
index 8ab6adc..b605889 100644
--- a/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/EventList.java
+++ b/asterix-installer/src/main/java/edu/uci/ics/asterix/installer/model/EventList.java
@@ -21,12 +21,12 @@
         NODE_FAILURE,
         CC_START,
         CC_FAILURE,
-        ASTERIX_DEPLOY,
         BACKUP,
         RESTORE,
         FILE_DELETE,
         HDFS_DELETE,
         FILE_TRANSFER,
+        FILE_CREATE,
         DIRECTORY_TRANSFER,
         NODE_INFO
     }
diff --git a/asterix-installer/src/main/resources/clusters/local/local.xml b/asterix-installer/src/main/resources/clusters/local/local.xml
index 827b3fa..1413999 100644
--- a/asterix-installer/src/main/resources/clusters/local/local.xml
+++ b/asterix-installer/src/main/resources/clusters/local/local.xml
@@ -17,8 +17,4 @@
      <id>node1</id>
      <ip>127.0.0.1</ip>
   </node>
-  <node>
-     <id>node2</id>
-     <ip>127.0.0.1</ip>
-  </node>
 </cluster>
diff --git a/asterix-installer/src/main/resources/conf/installer-conf.xml b/asterix-installer/src/main/resources/conf/managix-conf.xml
similarity index 100%
rename from asterix-installer/src/main/resources/conf/installer-conf.xml
rename to asterix-installer/src/main/resources/conf/managix-conf.xml
diff --git a/asterix-installer/src/main/resources/scripts/managix b/asterix-installer/src/main/resources/scripts/managix
index 11810ef..cd0794e 100755
--- a/asterix-installer/src/main/resources/scripts/managix
+++ b/asterix-installer/src/main/resources/scripts/managix
@@ -1,20 +1,20 @@
-if [ -z $INSTALLER_HOME ] 
+if [ -z $MANAGIX_HOME ] 
  then
-   echo "INSTALLER_HOME is not defined"
+   echo "MANAGIX_HOME is not defined"
    exit 1
 fi
 
 VERSION=0.0.4-SNAPSHOT
 
-for jar in `ls $INSTALLER_HOME/lib/*.jar`
+for jar in `ls $MANAGIX_HOME/lib/*.jar`
   do 
-  if [ -z $INSTALLER_CLASSPATH ] 
+  if [ -z $MANAGIX_CLASSPATH ] 
   then 
-    INSTALLER_CLASSPATH=$jar 
+    MANAGIX_CLASSPATH=$jar 
   else
-    INSTALLER_CLASSPATH=$INSTALLER_CLASSPATH:$jar 
+    MANAGIX_CLASSPATH=$MANAGIX_CLASSPATH:$jar 
   fi
 done
 
-INSTALLER_CLASSPATH=$INSTALLER_CLASSPATH:$INSTALLER_HOME/conf/log4j.properties
-java $JAVA_OPTS -Dlog4j.configuration=file:$INSTALLER_HOME/conf/log4j.properties -cp $INSTALLER_CLASSPATH edu.uci.ics.asterix.installer.driver.InstallerDriver $@
+MANAGIX_CLASSPATH=$MANAGIX_CLASSPATH:$MANAGIX_HOME/conf/log4j.properties
+java $JAVA_OPTS -Dlog4j.configuration=file:$MANAGIX_HOME/conf/log4j.properties -cp $MANAGIX_CLASSPATH edu.uci.ics.asterix.installer.driver.InstallerDriver $@
diff --git a/asterix-installer/src/main/resources/zookeeper/zk.init b/asterix-installer/src/main/resources/zookeeper/zk.init
index 7aa7c10..937d8b3 100755
--- a/asterix-installer/src/main/resources/zookeeper/zk.init
+++ b/asterix-installer/src/main/resources/zookeeper/zk.init
@@ -1,6 +1,6 @@
 ZK_HOME=$1
 shift 1
-cd $INSTALLER_HOME/.installer/zookeeper
+cd $MANAGIX_HOME/.installer/zookeeper
 tar cf zk.pkg.tar *
 zk_server_id=1
 for zk_host in  $@
