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 177ada5..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
@@ -38,82 +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));
-        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));
+	@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, 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";
-    }
+	@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";
+	}
 
 }
 
 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 d32284a..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("Deleted Asterix instance: " + asterixInstanceName);
-    }
+	@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/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 6cfa355..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
@@ -39,7 +39,7 @@
 
     private static final Logger LOGGER = Logger.getLogger(InstallerDriver.class.getName());
     public static final String ENV_MANAGIX_HOME = "MANAGIX_HOME";
-    public static final String MANAGIX_CONF_XML = "conf" + File.separator + "installer-conf.xml";
+    public static final String MANAGIX_CONF_XML = "conf" + File.separator + "managix-conf.xml";
 
     private static Configuration conf;
     private static String managixHome;
@@ -109,7 +109,7 @@
             LOGGER.error("Unknown command");
             printUsage();
         } catch (Exception e) {
-            LOGGER.error(e);
+            LOGGER.error(e.getMessage());
         }
     }
 
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 3fa42bd..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
@@ -69,13 +69,13 @@
                     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 0f51225..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
@@ -295,7 +295,6 @@
 
             }
         }
-        patternList.addAll(createRemoveAsterixWorkingDirPattern(instance).getPattern());
         patternList.addAll(createRemoveAsterixLogDirPattern(instance).getPattern());
         Patterns patterns = new Patterns(patternList);
         return patterns;
@@ -338,7 +337,7 @@
         return patterns;
     }
 
-    private Patterns createRemoveAsterixWorkingDirPattern(AsterixInstance instance) throws Exception {
+    public Patterns createRemoveAsterixWorkingDirPattern(AsterixInstance instance) throws Exception {
         List<Pattern> patternList = new ArrayList<Pattern>();
         Cluster cluster = instance.getCluster();
         String workingDir = cluster.getWorkingDir().getDir();
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/pom.xml b/pom.xml
index 592edc5..b82b253 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,11 +82,11 @@
                 <module>asterix-hyracks-glue</module>
                 <module>asterix-external-data</module>
                 <module>asterix-metadata</module>
-                <module>asterix-installer</module>
-                <module>asterix-events</module>
                 <module>asterix-test-framework</module>
                 <module>asterix-maven-plugins</module>
                 <module>asterix-server</module>
+                <module>asterix-installer</module>
+                <module>asterix-events</module>
         </modules>
 
 	<repositories>
