Merge branch 'master' into blur-0.2.4-parcel
diff --git a/blur-core/src/main/java/org/apache/blur/server/TableContext.java b/blur-core/src/main/java/org/apache/blur/server/TableContext.java
index d8cf3e2..46a649b 100644
--- a/blur-core/src/main/java/org/apache/blur/server/TableContext.java
+++ b/blur-core/src/main/java/org/apache/blur/server/TableContext.java
@@ -343,7 +343,7 @@
 
   public static synchronized Configuration getSystemConfiguration() {
     if (_systemConfiguration == null) {
-      _systemConfiguration = BlurUtil.newHadoopConfiguration();
+      _systemConfiguration = BlurUtil.newHadoopConfiguration(null);
     }
     return new Configuration(_systemConfiguration);
   }
diff --git a/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurControllerServer.java b/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurControllerServer.java
index e46a791..a1c0f88 100644
--- a/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurControllerServer.java
+++ b/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurControllerServer.java
@@ -46,9 +46,6 @@
 import static org.apache.blur.utils.BlurConstants.BLUR_THRIFT_DEFAULT_MAX_FRAME_SIZE;
 import static org.apache.blur.utils.BlurConstants.BLUR_THRIFT_MAX_FRAME_SIZE;
 import static org.apache.blur.utils.BlurConstants.BLUR_TMP_PATH;
-import static org.apache.blur.utils.BlurConstants.BLUR_ZOOKEEPER_CONNECTION;
-import static org.apache.blur.utils.BlurConstants.BLUR_ZOOKEEPER_TIMEOUT;
-import static org.apache.blur.utils.BlurConstants.BLUR_ZOOKEEPER_TIMEOUT_DEFAULT;
 import static org.apache.blur.utils.BlurUtil.quietClose;
 
 import java.io.File;
@@ -81,7 +78,6 @@
 import org.apache.blur.utils.BlurUtil;
 import org.apache.blur.utils.GCWatcher;
 import org.apache.blur.utils.MemoryReporter;
-import org.apache.blur.zookeeper.ZkUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.zookeeper.ZooKeeper;
 import org.eclipse.jetty.servlet.ServletHolder;
@@ -111,7 +107,7 @@
   }
 
   public static ThriftServer createServer(int serverIndex, BlurConfiguration configuration) throws Exception {
-    Configuration config = BlurUtil.newHadoopConfiguration();
+    Configuration config = BlurUtil.newHadoopConfiguration(configuration);
     TableContext.setSystemBlurConfiguration(configuration);
     TableContext.setSystemConfiguration(config);
     
diff --git a/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurShardServer.java b/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurShardServer.java
index 7809ffa..15d861c 100644
--- a/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurShardServer.java
+++ b/blur-core/src/main/java/org/apache/blur/thrift/ThriftBlurShardServer.java
@@ -53,9 +53,6 @@
 import static org.apache.blur.utils.BlurConstants.BLUR_SHARD_THRIFT_SELECTOR_THREADS;
 import static org.apache.blur.utils.BlurConstants.BLUR_THRIFT_DEFAULT_MAX_FRAME_SIZE;
 import static org.apache.blur.utils.BlurConstants.BLUR_THRIFT_MAX_FRAME_SIZE;
-import static org.apache.blur.utils.BlurConstants.BLUR_ZOOKEEPER_CONNECTION;
-import static org.apache.blur.utils.BlurConstants.BLUR_ZOOKEEPER_TIMEOUT;
-import static org.apache.blur.utils.BlurConstants.BLUR_ZOOKEEPER_TIMEOUT_DEFAULT;
 import static org.apache.blur.utils.BlurUtil.quietClose;
 
 import java.io.Closeable;
@@ -112,7 +109,6 @@
 import org.apache.blur.utils.BlurUtil;
 import org.apache.blur.utils.GCWatcher;
 import org.apache.blur.utils.MemoryReporter;
-import org.apache.blur.zookeeper.ZkUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.zookeeper.ZooKeeper;
@@ -148,7 +144,7 @@
   }
 
   public static ThriftServer createServer(int serverIndex, BlurConfiguration configuration) throws Exception {
-    Configuration config = BlurUtil.newHadoopConfiguration();
+    Configuration config = BlurUtil.newHadoopConfiguration(configuration);
     TableContext.setSystemBlurConfiguration(configuration);
     TableContext.setSystemConfiguration(config);
 
diff --git a/blur-core/src/main/java/org/apache/blur/utils/BlurUtil.java b/blur-core/src/main/java/org/apache/blur/utils/BlurUtil.java
index e4db03b..9406e66 100644
--- a/blur-core/src/main/java/org/apache/blur/utils/BlurUtil.java
+++ b/blur-core/src/main/java/org/apache/blur/utils/BlurUtil.java
@@ -21,6 +21,7 @@
 import static org.apache.blur.metrics.MetricsConstants.THRIFT_CALLS;
 import static org.apache.blur.utils.BlurConstants.BLUR_CONTROLLER_FILTERED_SERVER_CLASS;
 import static org.apache.blur.utils.BlurConstants.BLUR_SHARD_FILTERED_SERVER_CLASS;
+import static org.apache.blur.utils.BlurConstants.HADOOP_CONF;
 import static org.apache.blur.utils.BlurConstants.SHARD_PREFIX;
 
 import java.io.ByteArrayInputStream;
@@ -48,6 +49,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 import java.util.UUID;
@@ -703,7 +705,7 @@
     FileSystem fileSystem = tablePath.getFileSystem(configuration);
     if (createPath(fileSystem, tablePath)) {
       LOG.info("Table uri existed.");
-//      validateShardCount(shardCount, fileSystem, tablePath);
+      // validateShardCount(shardCount, fileSystem, tablePath);
     }
     ThreadWatcher.resetStatus();
   }
@@ -1286,14 +1288,26 @@
       throw new RuntimeException(e);
     }
   }
-  
-  public static Configuration newHadoopConfiguration() {
-    return addHdfsConfig(new Configuration());
+
+  public static Configuration newHadoopConfiguration(BlurConfiguration blurConfiguration) {
+    return addHdfsConfig(new Configuration(), blurConfiguration);
   }
 
-  public static Configuration addHdfsConfig(Configuration configuration) {
+  public static Configuration addHdfsConfig(Configuration configuration, BlurConfiguration blurConfiguration) {
     configuration.addResource("hdfs-default.xml");
     configuration.addResource("hdfs-site.xml");
+    if (blurConfiguration != null) {
+      Map<String, String> properties = blurConfiguration.getProperties();
+      for (Entry<String, String> e : properties.entrySet()) {
+        String key = e.getKey();
+        if (key.startsWith(HADOOP_CONF)) {
+          String hadoopKey = key.substring(HADOOP_CONF.length());
+          String hadoopValue = e.getValue();
+          LOG.info("Adding hadoop configuration item [{0}] [{1}]", hadoopKey, hadoopValue);
+          configuration.set(hadoopKey, hadoopValue);
+        }
+      }
+    }
     return configuration;
   }
 
diff --git a/blur-mapred/src/test/java/org/apache/blur/mapreduce/lib/BlurOutputFormatTest.java b/blur-mapred/src/test/java/org/apache/blur/mapreduce/lib/BlurOutputFormatTest.java
index f4e7074..d197b90 100644
--- a/blur-mapred/src/test/java/org/apache/blur/mapreduce/lib/BlurOutputFormatTest.java
+++ b/blur-mapred/src/test/java/org/apache/blur/mapreduce/lib/BlurOutputFormatTest.java
@@ -320,7 +320,7 @@
     for (int i = 0; i < tableDescriptor.getShardCount(); i++) {
       Path path = new Path(output, ShardUtil.getShardName(i));
       Collection<Path> commitedTasks = getCommitedTasks(path);
-      assertTrue(multiple >= commitedTasks.size());
+      assertTrue(commitedTasks.size() >= multiple);
       for (Path p : commitedTasks) {
         DirectoryReader reader = DirectoryReader.open(new HdfsDirectory(_conf, p));
         total += reader.numDocs();
diff --git a/blur-shell/src/main/java/org/apache/blur/shell/QueryCommandHelper.java b/blur-shell/src/main/java/org/apache/blur/shell/QueryCommandHelper.java
index 72db77b..5e244fd 100644
--- a/blur-shell/src/main/java/org/apache/blur/shell/QueryCommandHelper.java
+++ b/blur-shell/src/main/java/org/apache/blur/shell/QueryCommandHelper.java
@@ -18,7 +18,6 @@
 
 package org.apache.blur.shell;
 
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Writer;
 import java.util.ArrayList;
diff --git a/blur-thrift/pom.xml b/blur-thrift/pom.xml
index 748f6c0..49e7137 100644
--- a/blur-thrift/pom.xml
+++ b/blur-thrift/pom.xml
@@ -51,7 +51,7 @@
 			<groupId>javax.servlet</groupId>
 			<artifactId>javax.servlet-api</artifactId>
 			<version>${servlet-api.version}</version>
-			<scope>provided</scope>
+			<scope>compile</scope>
 		</dependency>
 	</dependencies>
 
@@ -149,14 +149,6 @@
 					<name>hadoop2-mr1</name>
 				</property>
 			</activation>
-			<dependencies>
-				<dependency>
-					<groupId>javax.servlet</groupId>
-					<artifactId>javax.servlet-api</artifactId>
-					<version>${servlet-api.version}</version>
-					<scope>provided</scope>
-				</dependency>
-			</dependencies>
 		</profile>
 		<profile>
 			<id>hadoop2</id>
@@ -165,14 +157,6 @@
 					<name>hadoop2</name>
 				</property>
 			</activation>
-			<dependencies>
-				<dependency>
-					<groupId>javax.servlet</groupId>
-					<artifactId>javax.servlet-api</artifactId>
-					<version>${servlet-api.version}</version>
-					<scope>provided</scope>
-				</dependency>
-			</dependencies>
 		</profile>
 	</profiles>
 </project>
diff --git a/blur-util/src/main/java/org/apache/blur/doc/BlurPropertyParser.java b/blur-util/src/main/java/org/apache/blur/doc/BlurPropertyParser.java
new file mode 100644
index 0000000..752f266
--- /dev/null
+++ b/blur-util/src/main/java/org/apache/blur/doc/BlurPropertyParser.java
@@ -0,0 +1,200 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import com.google.common.collect.Lists;
+
+public class BlurPropertyParser {
+
+  public Map<String, List<BlurProp>> parse() throws IOException {
+    InputStream inputStream = BlurPropertyParser.class.getResourceAsStream("/blur-default.properties");
+    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+    String line;
+    String prevLine = null;
+
+    String key = "|||General-Server-Properties|||";
+
+    Set<String> requiredProperties = getRequiredProperties();
+
+    Map<String, List<BlurProp>> map = new HashMap<String, List<BlurProp>>();
+    while ((line = reader.readLine()) != null) {
+      line = line.trim();
+      if (line.equals("### Shard Server Configuration")) {
+        key = "|||Shard-Server-Properties|||";
+      } else if (line.equals("### Controller Server Configuration")) {
+        key = "|||Controller-Server-Properties|||";
+      }
+      if (!line.startsWith("#") && !line.isEmpty()) {
+        String desc = getDesc(prevLine);
+        String name = getName(line);
+        String value = getValue(line);
+        String type = getType(value);
+        List<BlurProp> props = map.get(key);
+        if (props == null) {
+          props = Lists.newArrayList();
+          map.put(key, props);
+        }
+        BlurProp p = new BlurProp();
+        p.setName(name);
+        p.setDefaultVal(value);
+        p.setDescription(desc);
+        p.setType(type); // infer type...
+        p.setRequired(requiredProperties.contains(name));
+        props.add(p);
+      }
+      prevLine = line;
+    }
+    return map;
+  }
+
+  private Set<String> getRequiredProperties() throws IOException {
+    InputStream inputStream = getClass().getResourceAsStream("/blur-site.properties");
+    Properties properties = new Properties();
+    properties.load(inputStream);
+    inputStream.close();
+    Set<String> result = new HashSet<String>();
+    for (Object o : properties.keySet()) {
+      result.add(o.toString());
+    }
+    return result;
+  }
+
+  String getType(String value) {
+    if (value == null || value.isEmpty()) {
+      return "string";
+    }
+
+    if (isNumeric(value)) {
+      return "long";
+    }
+
+    if ("true".equals(value) || "false".equals(value)) {
+      return "boolean";
+    }
+
+    if (isDouble(value)) {
+      return "double";
+    }
+    return "string";
+  }
+
+  private boolean isDouble(String value) {
+    try {
+      Double.parseDouble(value);
+      return true;
+    } catch (NumberFormatException e) {
+      return false;
+    }
+  }
+
+  private boolean isNumeric(String value) {
+    byte[] chars = value.getBytes();
+
+    int start = 0;
+    if (value.charAt(0) == '-') {
+      start = 1;
+    }
+
+    for (int i = start; i < chars.length; i++) {
+      if (!Character.isDigit(chars[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private static String getValue(String line) {
+    int index = line.indexOf('=');
+    if (index < 0) {
+      throw new RuntimeException();
+    }
+    return line.substring(index + 1);
+  }
+
+  private static String getName(String line) {
+    int index = line.indexOf('=');
+    if (index < 0) {
+      throw new RuntimeException();
+    }
+    return line.substring(0, index);
+  }
+
+  private static String getDesc(String prevLine) {
+    return prevLine.substring(1).trim();
+  }
+
+  public static class BlurProp {
+    private String name;
+    private String description;
+    private String defaultVal;
+    private String type;
+    private boolean required;
+
+    public String getName() {
+      return name;
+    }
+
+    public void setName(String name) {
+      this.name = name;
+    }
+
+    public String getDescription() {
+      return description;
+    }
+
+    public void setDescription(String description) {
+      this.description = description;
+    }
+
+    public String getDefaultVal() {
+      return defaultVal;
+    }
+
+    public void setDefaultVal(String defaultVal) {
+      this.defaultVal = defaultVal;
+    }
+
+    public String getType() {
+      return type;
+    }
+
+    public void setType(String type) {
+      this.type = type;
+    }
+
+    public boolean isRequired() {
+      return required;
+    }
+
+    public void setRequired(boolean required) {
+      this.required = required;
+    }
+
+  }
+
+}
diff --git a/blur-util/src/main/java/org/apache/blur/doc/CreateBlurApiHtmlPage.java b/blur-util/src/main/java/org/apache/blur/doc/CreateBlurApiHtmlPage.java
index d867f31..7b860f4 100644
--- a/blur-util/src/main/java/org/apache/blur/doc/CreateBlurApiHtmlPage.java
+++ b/blur-util/src/main/java/org/apache/blur/doc/CreateBlurApiHtmlPage.java
@@ -1,5 +1,3 @@
-package org.apache.blur.doc;
-
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -16,6 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.blur.doc;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
diff --git a/blur-util/src/main/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPage.java b/blur-util/src/main/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPage.java
index bcba22b..fb81a00 100644
--- a/blur-util/src/main/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPage.java
+++ b/blur-util/src/main/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPage.java
@@ -24,45 +24,36 @@
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import org.apache.blur.doc.BlurPropertyParser.BlurProp;
+
 public class CreateBlurServerSetupHtmlPage {
 
   public static void main(String[] args) throws IOException {
-    InputStream inputStream = CreateBlurServerSetupHtmlPage.class.getResourceAsStream("/blur-default.properties");
-    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
-    String line;
-    String prevLine = null;
-
-    String key = "|||General-Server-Properties|||";
+    BlurPropertyParser parser = new BlurPropertyParser();
+    Map<String, List<BlurProp>> props = parser.parse();
     Map<String, StringBuffer> map = new HashMap<String, StringBuffer>();
-    while ((line = reader.readLine()) != null) {
-      line = line.trim();
-      if (line.equals("### Shard Server Configuration")) {
-        key = "|||Shard-Server-Properties|||";
-      } else if (line.equals("### Controller Server Configuration")) {
-        key = "|||Controller-Server-Properties|||";
+
+    for (Map.Entry<String, List<BlurProp>> prop : props.entrySet()) {
+
+      StringBuffer buffer = map.get(prop.getKey());
+      if (buffer == null) {
+        buffer = new StringBuffer();
+        map.put(prop.getKey(), buffer);
       }
-      if (!line.startsWith("#") && !line.isEmpty()) {
-        System.out.println(prevLine);
-        System.out.println(line);
-        String desc = getDesc(prevLine);
-        String name = getName(line);
-        String value = getValue(line);
-        StringBuffer buffer = map.get(key);
-        if (buffer == null) {
-          buffer = new StringBuffer();
-          map.put(key, buffer);
+      for (BlurProp p : prop.getValue()) {
+
+        buffer.append("<tr><td>").append(p.getName());
+        if (!p.getDefaultVal().trim().isEmpty()) {
+          buffer.append(" (").append(p.getDefaultVal()).append(")");
         }
-        buffer.append("<tr><td>").append(name);
-        if (!value.trim().isEmpty()) {
-          buffer.append(" (").append(value).append(")");
-        }
-        buffer.append("</td><td>").append(desc).append("</td></tr>");
+        buffer.append("</td><td>").append(p.getDescription()).append("</td></tr>");
       }
-      prevLine = line;
+
     }
-    reader.close();
+
     String source = args[0];
     String dest = args[1];
     replaceValuesInFile(source, dest, map);
@@ -91,24 +82,4 @@
 
   }
 
-  private static String getValue(String line) {
-    int index = line.indexOf('=');
-    if (index < 0) {
-      throw new RuntimeException();
-    }
-    return line.substring(index + 1);
-  }
-
-  private static String getName(String line) {
-    int index = line.indexOf('=');
-    if (index < 0) {
-      throw new RuntimeException();
-    }
-    return line.substring(0, index);
-  }
-
-  private static String getDesc(String prevLine) {
-    return prevLine.substring(1).trim();
-  }
-
 }
diff --git a/blur-util/src/main/java/org/apache/blur/doc/CreateCSDDescriptor.java b/blur-util/src/main/java/org/apache/blur/doc/CreateCSDDescriptor.java
new file mode 100644
index 0000000..83d31d0
--- /dev/null
+++ b/blur-util/src/main/java/org/apache/blur/doc/CreateCSDDescriptor.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.blur.doc.BlurPropertyParser.BlurProp;
+
+public class CreateCSDDescriptor {
+
+  private static final String BLUR_VERSION = "|||BLUR-VERSION|||";
+
+  public static void main(String[] args) throws IOException {
+    BlurPropertyParser parser = new BlurPropertyParser();
+    Map<String, List<BlurProp>> props = parser.parse();
+    Map<String, StringBuffer> map = new HashMap<String, StringBuffer>();
+
+    JsonPropertyFormatter formatter = new JsonPropertyFormatter();
+
+    for (Map.Entry<String, List<BlurProp>> prop : props.entrySet()) {
+
+      StringBuffer buffer = map.get(prop.getKey());
+      if (buffer == null) {
+        buffer = new StringBuffer();
+        map.put(prop.getKey(), buffer);
+      }
+      boolean first = true;
+
+      for (BlurProp p : prop.getValue()) {
+        if (!first) {
+          buffer.append(formatter.separator());
+        }
+        buffer.append(formatter.format(p));
+        first = false;
+      }
+    }
+
+    String source = args[0];
+    String dest = args[1];
+    String blurVersion = args[2];
+
+    replaceValuesInFile(source, dest, map, formatVersion(blurVersion));
+  }
+
+  public static String formatVersion(String blurVersion) {
+    return blurVersion.replace("-", ".");
+  }
+
+  private static void replaceValuesInFile(String s, String o, Map<String, StringBuffer> replacements, String blurVersion)
+      throws IOException {
+
+    File source = new File(s);
+    File output = new File(o);
+    System.out.println("Source[" + source.getAbsolutePath() + "]");
+    System.out.println("Output[" + output.getAbsolutePath() + "]");
+    PrintWriter writer = new PrintWriter(output);
+
+    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(source)));
+    String line;
+    while ((line = reader.readLine()) != null) {
+      StringBuffer newData = replacements.get(line.trim());
+      if (line.contains(BLUR_VERSION)) {
+        writer.println(line.replace(BLUR_VERSION, blurVersion));
+      } else if (newData != null) {
+        writer.println(newData.toString());
+      } else {
+        writer.println(line);
+      }
+    }
+    writer.close();
+    reader.close();
+  }
+
+}
diff --git a/blur-util/src/main/java/org/apache/blur/doc/JsonPropertyFormatter.java b/blur-util/src/main/java/org/apache/blur/doc/JsonPropertyFormatter.java
new file mode 100644
index 0000000..b0cee3c
--- /dev/null
+++ b/blur-util/src/main/java/org/apache/blur/doc/JsonPropertyFormatter.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import org.apache.blur.doc.BlurPropertyParser.BlurProp;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import com.google.common.base.Splitter;
+
+public class JsonPropertyFormatter {
+
+  private static final String BLUR = "blur";
+  private static final String DEFAULT = "default";
+  private static final String TYPE = "type";
+  private static final String CONFIGURABLE_IN_WIZARD = "configurableInWizard";
+  private static final String REQUIRED = "required";
+  private static final String CONFIG_NAME = "configName";
+  private static final String DESCRIPTION = "description";
+  private static final String LABEL = "label";
+  private static final String NAME = "name";
+
+  public String separator() {
+    return ",";
+  }
+
+  public String format(BlurProp prop) {
+    JSONObject jsonObject = new JSONObject();
+    try {
+      jsonObject.put(NAME, prop.getName().replace(".", "_"));
+      jsonObject.put(LABEL, pretty(prop.getName()));
+      jsonObject.put(DESCRIPTION, prop.getDescription());
+      jsonObject.put(CONFIG_NAME, prop.getName());
+      jsonObject.put(REQUIRED, prop.isRequired());
+      jsonObject.put(CONFIGURABLE_IN_WIZARD, prop.isRequired());
+      jsonObject.put(TYPE, prop.getType());
+      jsonObject.put(DEFAULT, prop.getDefaultVal());
+      return jsonObject.toString(1);
+    } catch (JSONException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private String pretty(String s) {
+    Splitter splitter = Splitter.on('.');
+    StringBuilder builder = new StringBuilder();
+    for (String split : splitter.split(s)) {
+      if (builder.length() == 0 && split.equals(BLUR)) {
+        // skip
+      } else {
+        if (builder.length() != 0) {
+          builder.append(' ');
+        }
+        builder.append(split.substring(0, 1).toUpperCase()).append(split.substring(1));
+      }
+    }
+    return builder.toString();
+  }
+}
diff --git a/blur-util/src/main/java/org/apache/blur/doc/ParcelJsonTemplate.java b/blur-util/src/main/java/org/apache/blur/doc/ParcelJsonTemplate.java
new file mode 100644
index 0000000..f165963
--- /dev/null
+++ b/blur-util/src/main/java/org/apache/blur/doc/ParcelJsonTemplate.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+
+public class ParcelJsonTemplate {
+
+  private static final String BLUR_VERSION = "|||BLUR-VERSION|||";
+
+  public static void main(String[] args) throws IOException {
+
+    String source = args[0];
+    String dest = args[1];
+    String blurVersion = args[2];
+
+    replaceValuesInFile(source, dest, blurVersion);
+  }
+
+  private static void replaceValuesInFile(String s, String o, String blurVersion) throws IOException {
+    File source = new File(s);
+    File output = new File(o);
+    System.out.println("Source[" + source.getAbsolutePath() + "]");
+    System.out.println("Output[" + output.getAbsolutePath() + "]");
+    PrintWriter writer = new PrintWriter(output);
+
+    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(source)));
+    String line;
+    while ((line = reader.readLine()) != null) {
+      if (line.contains(BLUR_VERSION)) {
+        writer.println(line.replace(BLUR_VERSION, blurVersion));
+      } else {
+        writer.println(line);
+      }
+    }
+    writer.close();
+    reader.close();
+  }
+
+}
diff --git a/blur-util/src/main/java/org/apache/blur/utils/BlurConstants.java b/blur-util/src/main/java/org/apache/blur/utils/BlurConstants.java
index 955d6cf..08fb745 100644
--- a/blur-util/src/main/java/org/apache/blur/utils/BlurConstants.java
+++ b/blur-util/src/main/java/org/apache/blur/utils/BlurConstants.java
@@ -197,6 +197,8 @@
   public static final String SHARED_MERGE_SCHEDULER_PREFIX = "shared-merge-scheduler";
 
   public static final String BLUR_FILTER_ALIAS = "blur.filter.alias.";
+  
+  public static final String HADOOP_CONF = "hadoop_conf.";
 
   static {
     try {
diff --git a/blur-util/src/main/resources/blur-default.properties b/blur-util/src/main/resources/blur-default.properties
index 999389b..209ffdf 100644
--- a/blur-util/src/main/resources/blur-default.properties
+++ b/blur-util/src/main/resources/blur-default.properties
@@ -76,13 +76,13 @@
 # The command lib path where the controller and shard server processes will poll for new commands to enable.
 blur.tmp.path=
 
-### Shard Server Configuration
 # The map reduce working path for map reduce incremental updates.
 blur.bulk.update.working.path=
 
 # The desired permission on the blur.bulk.update.working.path and sub directories.  If blank the default permissions will be applied.
 blur.bulk.update.working.path.permission=
 
+### Shard Server Configuration
 # The hostname for the shard, if blank the hostname is automatically detected
 blur.shard.hostname=
 
diff --git a/blur-util/src/test/java/org/apache/blur/doc/BlurPropertyParserTest.java b/blur-util/src/test/java/org/apache/blur/doc/BlurPropertyParserTest.java
new file mode 100644
index 0000000..e8ecc89
--- /dev/null
+++ b/blur-util/src/test/java/org/apache/blur/doc/BlurPropertyParserTest.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class BlurPropertyParserTest {
+  private BlurPropertyParser parser;
+
+  @Before
+  public void setUp() throws Exception {
+    parser = new BlurPropertyParser();
+  }
+
+  @Test
+  public void testDefaultValNull() {
+    assertEquals("string", parser.getType(""));
+    assertEquals("string", parser.getType(null));
+  }
+
+  @Test
+  public void testDefaultValInt() {
+    assertEquals("long", parser.getType(Integer.toString(Integer.MIN_VALUE)));
+    assertEquals("long", parser.getType(Integer.toString(Integer.MAX_VALUE)));
+  }
+
+  @Test
+  public void testDefaultValBoolean() {
+    assertEquals("boolean", parser.getType("true"));
+    assertEquals("boolean", parser.getType("false"));
+  }
+
+  @Test
+  public void testDefaultValDouble() {
+    assertEquals("double", parser.getType("0.75"));
+    assertEquals("double", parser.getType("-0.75"));
+  }
+
+}
diff --git a/blur-util/src/test/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPageTest.java b/blur-util/src/test/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPageTest.java
new file mode 100644
index 0000000..9015cbb
--- /dev/null
+++ b/blur-util/src/test/java/org/apache/blur/doc/CreateBlurServerSetupHtmlPageTest.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class CreateBlurServerSetupHtmlPageTest {
+  private File source;
+  private File dest = new File("target/gen.prop.doc.html");
+
+  @Before
+  public void before() {
+    source = new File(CreateBlurServerSetupHtmlPageTest.class.getResource("/prop.doc.base.html").getFile());
+  }
+
+  // Not a great test but makes sure i get it mostly put back together.
+  @Test
+  public void testGeneration() throws IOException {
+    CreateBlurServerSetupHtmlPage.main(new String[] { source.getAbsolutePath(), dest.getAbsolutePath() });
+
+    Properties defaultProperties = new Properties();
+    defaultProperties.load(CreateBlurServerSetupHtmlPageTest.class.getResourceAsStream("/blur-default.properties"));
+    int numProps = defaultProperties.size();
+    int numDocumentedProps = getDocumentedProps();
+
+    assertEquals(numProps, numDocumentedProps);
+  }
+
+  private int getDocumentedProps() throws IOException {
+    int count = 0;
+    String docs = readGeneratedDocs();
+    String[] props = docs.split("<tr>");
+
+    // System.out.println("PROPERTIES:");
+
+    for (String p : props) {
+      if (!p.isEmpty()) {
+        count++;
+        // System.out.println("PROP: " + p);
+      }
+    }
+
+    return count;
+  }
+
+  private String readGeneratedDocs() throws IOException {
+    StringBuffer buffer = new StringBuffer();
+    FileInputStream fis = new FileInputStream(dest);
+    BufferedReader reader = null;
+    try {
+      reader = new BufferedReader(new InputStreamReader(fis));
+      String line;
+      while ((line = reader.readLine()) != null) {
+        buffer.append(line);
+      }
+    } finally {
+      if (fis != null) {
+        fis.close();
+      }
+      if (reader != null) {
+        reader.close();
+      }
+    }
+    return buffer.toString();
+  }
+
+}
diff --git a/blur-util/src/test/java/org/apache/blur/doc/CreateCSDDescriptorTest.java b/blur-util/src/test/java/org/apache/blur/doc/CreateCSDDescriptorTest.java
new file mode 100644
index 0000000..cc9217e
--- /dev/null
+++ b/blur-util/src/test/java/org/apache/blur/doc/CreateCSDDescriptorTest.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.blur.doc;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class CreateCSDDescriptorTest {
+  private File source;
+  private File dest = new File("target/service.sdl");
+
+  @Before
+  public void before() {
+    source = new File(CreateCSDDescriptorTest.class.getResource("/service.sdl.template").getFile());
+  }
+
+  // Not a great test but makes sure i get it mostly put back together.
+  @Test
+  public void testGeneration() throws IOException {
+    Properties defaultProperties = new Properties();
+    defaultProperties.load(CreateCSDDescriptorTest.class.getResourceAsStream("/blur-default.properties"));
+    int numProps = defaultProperties.size();
+    int numDocumentedProps = getDocumentedProps();
+
+    assertEquals(numProps, numDocumentedProps);
+  }
+
+  private int getDocumentedProps() throws IOException {
+    int count = 0;
+    String docs = readGeneratedDocs();
+    String[] props = docs.split("configurableInWizard");
+
+    // System.out.println("PROPERTIES:");
+
+    for (String p : props) {
+      if (!p.isEmpty()) {
+        count++;
+        // System.out.println("PROP: " + p);
+      }
+    }
+
+    return count;
+  }
+
+  private String readGeneratedDocs() throws IOException {
+    StringBuffer buffer = new StringBuffer();
+    FileInputStream fis = new FileInputStream(dest);
+    BufferedReader reader = null;
+    try {
+      reader = new BufferedReader(new InputStreamReader(fis));
+      String line;
+      while ((line = reader.readLine()) != null) {
+        buffer.append(line);
+      }
+    } finally {
+      if (fis != null) {
+        fis.close();
+      }
+      if (reader != null) {
+        reader.close();
+      }
+    }
+    return buffer.toString();
+  }
+
+}
diff --git a/blur-util/src/test/resources/prop.doc.base.html b/blur-util/src/test/resources/prop.doc.base.html
new file mode 100644
index 0000000..2e85566
--- /dev/null
+++ b/blur-util/src/test/resources/prop.doc.base.html
@@ -0,0 +1,5 @@
+|||General-Server-Properties|||
+
+|||Shard-Server-Properties|||
+
+|||Controller-Server-Properties|||
\ No newline at end of file
diff --git a/blur-util/src/test/resources/service.sdl.template b/blur-util/src/test/resources/service.sdl.template
new file mode 100644
index 0000000..3f9f6dc
--- /dev/null
+++ b/blur-util/src/test/resources/service.sdl.template
@@ -0,0 +1,191 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{
+  "name"  : "BLUR",
+  "label" : "Blur",
+  "description": "Apache Blur Search Service",
+  "version" : "0.2.4",
+  "runAs" : {
+    "user"  : "blur",
+    "group" : "blur"
+  },
+  "rolesWithExternalLinks":["BLUR_CONTROLLER","BLUR_SHARD"],
+  "hdfsDirs" : [
+  	{
+  		"name" : "CreateBlurTablesDir",
+  		"label": "Create Blur Tables Directory",
+  		"description" : "Creates the Blur Tables Directory",
+  		"directoryDescription": "Location of Blur tables.",
+  		"path":"/user/${user}/${blur_cluster_name}/tables",
+  		"permissions":"0755"
+  	},
+  	{
+  		"name" : "CreateBlurCommandsDir",
+  		"label": "Create Blur Commands Directory",
+  		"description" : "Creates the Blur Commands Directory",
+  		"directoryDescription": "Path that Blur will look for installed commands.",
+  		"path":"/user/${user}/${blur_cluster_name}/commands",
+  		"permissions":"0755"
+  	}
+  ],
+  "serviceInit": {
+  	"preStartSteps": [
+		{"commandName":"CreateBlurTablesDir"},
+		{"commandName":"CreateBlurCommandsDir"}  	
+  	]
+  },
+  
+  "parameters": [
+    
+    {
+      "name":"blur_cluster_name",
+      "label":"Blur Cluster Name",
+      "description": "Name of Blur Cluster",
+      "configName":"blur.cluster.name",
+      "required":"true",
+      "type":"string",
+      "default":"default",
+      "configurableInWizard":true
+    },
+    {
+      "name":"blur_zookeeper_root",
+      "label":"Zookeeper Root",
+      "description": "Advanced: Root ZK connection to alternate path.",
+      "configName":"blur.zookeeper.root",
+      "required":"false",
+      "type":"string",
+      "default":"",
+      "configurableInWizard":true
+    },    
+   
+|||General-Server-Properties|||
+  ],
+  
+  "roles" : [
+    {
+      "name" : "BLUR_CONTROLLER",
+      "label" : "Blur Controller Server",
+      "pluralLabel" : "Blur Controller Servers",
+      "startRunner" : {
+        "program" : "scripts/control.sh",
+        "args" : [ "start-controller" ],
+        "environmentVariables" : {
+            "BLUR_ZK_ROOT": "${blur_zookeeper_root}",
+            "BLUR_DEFAULT_TABLE_PATH": "/user/${user}/${blur_cluster_name}/tables",
+            "BLUR_COMMAND_PATH":"/user/${user}/${blur_cluster_name}/commands",
+            "BLUR_CLUSTER_NAME":"${blur_cluster_name}",
+            "BLUR_CONTROLLER_JVM_OPTIONS":"${blur_controller_jvm_options}"
+        }
+      },
+      "externalLink" : {
+      	"name":"blur_controller_ui",
+      	"label":"Blur Controller Status UI",
+      	"url":"http://${host}:${blur_gui_controller_port}"
+      },
+      "logging": {
+    	  "dir":"/var/log/blur",
+    	  "filename": "blur--controller-server-${host}-0_main.log",
+    	  "configName" :"blur.log.dir",    	  
+    	  "isModifiable":true,
+    	  "loggingType":"log4j"
+      },
+      "configWriter" : {
+      	"generators" : [
+      		{
+      			"filename" : "blur-site.properties",
+            	"configFormat" : "properties",
+            	"excludedParams": ["blur_controller_jvm_options"]
+      		}
+      	 ]
+      },
+	  "parameters": [
+	    {
+          "name":"blur_controller_jvm_options",
+          "label":"JVM Options for Controllers",
+          "description": "JAVA JVM OPTIONS for the controller servers, jvm tuning parameters are placed here.",
+          "configName":"blur.controller.jvm.options",
+	      "required":"false",
+	      "type":"string",
+	      "default":"-Xmx1024m -Djava.net.preferIPv4Stack=true",
+	      "configurableInWizard":true
+      },
+|||Controller-Server-Properties|||
+                 ]
+   },
+   {
+	   "name" : "BLUR_SHARD",
+	   "label" : "Blur Shard Server",
+	   "pluralLabel" : "Blur Shard Servers",
+	   "startRunner" : {
+	     "program" : "scripts/control.sh",
+	     "args" : [ "start-shard" ],
+	     "environmentVariables" : {
+            "BLUR_ZK_ROOT": "${blur_zookeeper_root}",
+            "BLUR_DEFAULT_TABLE_PATH": "/user/${user}/${blur_cluster_name}/tables",
+            "BLUR_COMMAND_PATH":"/user/${user}/${blur_cluster_name}/commands",
+            "BLUR_CLUSTER_NAME":"${blur_cluster_name}",
+            "BLUR_SHARD_JVM_OPTIONS":"${blur_shard_jvm_options}"
+          }
+	    },
+      "externalLink" : {
+      	"name":"blur_shard_ui",
+      	"label":"Blur Shard Status UI",
+      	"url":"http://${host}:${blur_gui_shard_port}"
+      },
+	     "logging": {
+	    	  "dir":"/var/log/blur",
+	    	  "filename": "blur--shard-server-${host}-0_main.log",
+	    	  "configName" :"blur.log.dir",
+	    	  "isModifiable":true,
+	    	  "loggingType":"log4j"
+	     },
+      "configWriter" : {
+      	"generators" : [
+      		{
+      			"filename" : "blur-site.properties",
+            	"configFormat" : "properties",
+            	"excludedParams": ["blur_shard_jvm_options"]
+      		}
+      	 ]
+      },
+	     "parameters": [
+		    {
+	          "name":"blur_shard_jvm_options",
+	          "label":"JVM OPTIONS for Shards",
+	          "description": "JAVA JVM OPTIONS for the shard servers, jvm tuning parameters are placed here.",
+	          "configName":"blur.shard.jvm.options",
+		      "required":"false",
+		      "type":"string",
+		      "default":"-Xmx1024m -Djava.net.preferIPv4Stack=true -XX:MaxDirectMemorySize=256m",
+		      "configurableInWizard":true
+	      	},
+|||Shard-Server-Properties|||
+                 ]
+	}   
+  ],
+  "parcel" : {
+  	"requiredTags": ["blurcontroller"],
+  	"optionalTags": ["blurcontroller", "blurshard", "blurconsole"]
+  },
+  "serviceDependencies" : [
+        {"name":"HDFS", "required":"true"},
+        {"name":"ZOOKEEPER", "required":"true"},
+        {"name":"YARN", "required":"true"}
+   ]
+  	
+  
+}
diff --git a/distribution/pom.xml b/distribution/pom.xml
index 97707df..19be49e 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -60,6 +60,43 @@
 	<build>
 		<plugins>
 			<plugin>
+							<groupId>org.codehaus.mojo</groupId>
+							<artifactId>exec-maven-plugin</artifactId>
+							<version>1.2.1</version>
+							<executions>
+								<execution>
+									<id>create-service-descriptor</id>
+									<phase>package</phase>
+									<goals>
+										<goal>java</goal>
+									</goals>
+									<configuration>
+										<mainClass>org.apache.blur.doc.CreateCSDDescriptor</mainClass>
+										<arguments>
+											<argument>${project.build.scriptSourceDirectory}/../../assemble/cdh/csd/descriptor/service.sdl.template</argument>
+											<argument>${project.build.directory}/service.sdl</argument>
+											<argument>${project.version}</argument>
+										</arguments>
+									</configuration>
+								</execution>
+								<execution>
+									<id>create-parcel-json</id>
+									<phase>package</phase>
+									<goals>
+										<goal>java</goal>
+									</goals>
+									<configuration>
+										<mainClass>org.apache.blur.doc.ParcelJsonTemplate</mainClass>
+										<arguments>
+											<argument>${project.build.scriptSourceDirectory}/../../assemble/cdh/parcel/meta/parcel.json.template</argument>
+											<argument>${project.build.directory}/parcel.json</argument>
+											<argument>${project.version}</argument>
+										</arguments>
+									</configuration>
+								</execution>
+							</executions>
+						</plugin>		
+						<plugin>
 				<artifactId>maven-assembly-plugin</artifactId>
 				<executions>
 					<execution>
@@ -87,6 +124,35 @@
 							</descriptors>
 						</configuration>
 					</execution>
+										<execution>
+											<id>distro-assembly-parcel</id>
+											<phase>package</phase>
+											<goals>
+												<goal>single</goal>
+											</goals>
+											<configuration>
+												<descriptors>
+													<descriptor>${parcel.assembly.file}</descriptor>
+												</descriptors>
+												<finalName>blur-${project.version}.parcel</finalName>
+												<appendAssemblyId>false</appendAssemblyId>
+												<ignoreDirFormatExtensions>false</ignoreDirFormatExtensions>
+											</configuration>
+										</execution>
+										<execution>
+											<id>distro-assembly-csd</id>
+											<phase>package</phase>
+											<goals>
+												<goal>single</goal>
+											</goals>
+											<configuration>
+												<descriptors>
+													<descriptor>${csd.assembly.file}</descriptor>
+												</descriptors>
+												<finalName>BLUR-${project.version}</finalName>
+												<appendAssemblyId>false</appendAssemblyId>
+											</configuration>
+										</execution>
 				</executions>
 			</plugin>
 		</plugins>
@@ -124,6 +190,9 @@
 			</activation>
 			<properties>
                 <bin.assembly.file>src/assemble/bin-hadoop2.xml</bin.assembly.file>
+
+								<csd.assembly.file>src/assemble/csd-hadoop2.xml</csd.assembly.file>
+								<parcel.assembly.file>src/assemble/parcel-hadoop2.xml</parcel.assembly.file>
 			</properties>
 		</profile>
 	</profiles>
diff --git a/distribution/run_parcel_server.sh b/distribution/run_parcel_server.sh
new file mode 100755
index 0000000..1cec125
--- /dev/null
+++ b/distribution/run_parcel_server.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+PROJECT_DIR=`dirname "$0"`
+PROJECT_DIR=`cd "$PROJECT_DIR"; pwd`
+
+BLUR_VERSION=`mvn help:evaluate -Dexpression=project.version -Dhadoop2 | grep -Ev '(^\[|Download\w+:)'`
+echo "BLUR_VERSION=${BLUR_VERSION}"
+TARGET="${PROJECT_DIR}/target"
+
+LAST_UPDATED_SEC=`date +%s`
+LAST_UPDATED="${LAST_UPDATED_SEC}0000"
+
+PARCEL="${TARGET}/blur-${BLUR_VERSION}.parcel.tar.gz"
+PARCEL_SHA="${PARCEL}.sha"
+BLUR_CSD="${TARGET}/BLUR-${BLUR_VERSION}.jar"
+
+HTTP_DIR="${TARGET}/http"
+MANIFEST="${HTTP_DIR}/manifest.json"
+
+rm -r $HTTP_DIR
+mkdir $HTTP_DIR
+
+sha1sum $PARCEL | awk '{print $1}' > $PARCEL_SHA
+HASH=`cat $PARCEL_SHA`
+echo "{\"lastUpdated\":${LAST_UPDATED},\"parcels\": [" > $MANIFEST
+for DISTRO in el5 el6 sles11 lucid precise trusty squeeze wheezy
+do
+	if [ $DISTRO != "el5" ] ; then
+		echo "," >> $MANIFEST
+	fi
+	DISTRO_PARCEL="blur-${BLUR_VERSION}-${DISTRO}.parcel"
+	DISTRO_PARCEL_SHA="blur-${BLUR_VERSION}-${DISTRO}.parcel.sha"
+	ln $PARCEL "${HTTP_DIR}/${DISTRO_PARCEL}"
+	ln $PARCEL_SHA "${HTTP_DIR}/${DISTRO_PARCEL_SHA}"
+	echo "{\"parcelName\":\"${DISTRO_PARCEL}\",\"components\": [{\"name\" : \"blur\",\"version\" : \"${BLUR_VERSION}\",\"pkg_version\": \"${BLUR_VERSION}\"}],\"hash\":\"${HASH}\"}" >> $MANIFEST
+done
+echo "]}" >> $MANIFEST
+CSD_BLUR_VERSION=`echo ${BLUR_VERSION} | tr - .`
+ln $BLUR_CSD "${HTTP_DIR}/BLUR-${CSD_BLUR_VERSION}.jar"
+cd ${HTTP_DIR}
+python -m SimpleHTTPServer
+
+
diff --git a/distribution/src/assemble/cdh/README.txt b/distribution/src/assemble/cdh/README.txt
new file mode 100644
index 0000000..588cbfa
--- /dev/null
+++ b/distribution/src/assemble/cdh/README.txt
@@ -0,0 +1,37 @@
+== Overview ==
+This provides some info on testing the CSD/Parcel packaging for Apache Blur.
+
+== CSD ==
+ sudo cp distribution/target/BLUR-0.2.4.jar /opt/cloudera/csd/BLUR-0.2.4.jar
+ sudo service cloudera-scm-server restart
+ 
+== Parcel ==
+Note that the '.tar.gz' extension is ripped off in the copy
+sudo cp distribution/target/blur-hadoop2-2.5.0-cdh5.2.0-0.2.4-incubating-SNAPSHOT-el6.parcel.tar.gz /opt/cloudera/parcel-repo/blur-hadoop2-2.5.0-cdh5.2.0-0.2.4-incubating-SNAPSHOT-el6.parcel
+
+Then, in /opt/cloudera/parcel-repo:
+sha1sum blur-hadoop2-2.5.0-cdh5.2.0-0.2.4-incubating-SNAPSHOT-el6.parcel | awk '{print $1}' > blur-hadoop2-2.5.0-cdh5.2.0-0.2.4-incubating-SNAPSHOT-el6.parcel.sha && cat blur-hadoop2-2.5.0-cdh5.2.0-0.2.4-incubating-SNAPSHOT-el6.parcel.sha
+
+... which will write the sha file and print it to the screen.  You can then copy that into a manifest in the
+ same directory [/opt/cloudera/parcel-repo/manifest.json] and substitute it in the hash value, which will look
+ like this:
+ 
+ 
+{
+  "lastUpdated":14286139390000,
+  "parcels": [
+    {
+      "parcelName":"blur-hadoop2-2.5.0-cdh5.2.0-0.2.4-incubating-SNAPSHOT-el6.parcel",
+      "components": [
+        {
+          "name" : "blur",
+          "version" : "0.2.4",
+          "pkg_version": "0.2.4"
+        }
+      ],
+      "hash":"632bd8d320f27ba68b9595f39ca2d99a203dd43c"
+    }
+  ]
+}
+ 
+Now you should be able to click the "Check for new parcels" in CM and begin activating it.
\ No newline at end of file
diff --git a/distribution/src/assemble/cdh/csd/descriptor/service.sdl.template b/distribution/src/assemble/cdh/csd/descriptor/service.sdl.template
new file mode 100644
index 0000000..af96568
--- /dev/null
+++ b/distribution/src/assemble/cdh/csd/descriptor/service.sdl.template
@@ -0,0 +1,170 @@
+{
+  "name"  : "BLUR",
+  "label" : "Blur",
+  "description": "Apache Blur Search Service",
+  "version" : "|||BLUR-VERSION|||",
+  "runAs" : {
+    "user"  : "blur",
+    "group" : "blur"
+  },
+  "rolesWithExternalLinks":["BLUR_CONTROLLER","BLUR_SHARD"],
+  "hdfsDirs" : [
+  	{
+  		"name" : "CreateBlurTablesDir",
+  		"label": "Create Blur Tables Directory",
+  		"description" : "Creates the Blur Tables Directory",
+  		"directoryDescription": "Location of Blur tables.",
+  		"path":"/user/${user}/${blur_cluster_name}/tables",
+  		"permissions":"0755"
+  	},
+  	{
+  		"name" : "CreateBlurCommandsDir",
+  		"label": "Create Blur Commands Directory",
+  		"description" : "Creates the Blur Commands Directory",
+  		"directoryDescription": "Path that Blur will look for installed commands.",
+  		"path":"/user/${user}/${blur_cluster_name}/commands",
+  		"permissions":"0755"
+  	}
+  ],
+  "serviceInit": {
+  	"preStartSteps": [
+		{"commandName":"CreateBlurTablesDir"},
+		{"commandName":"CreateBlurCommandsDir"}  	
+  	]
+  },
+  
+  "parameters": [
+    
+    {
+      "name":"blur_cluster_name",
+      "label":"Blur Cluster Name",
+      "description": "Name of Blur Cluster",
+      "configName":"blur.cluster.name",
+      "required":"true",
+      "type":"string",
+      "default":"default",
+      "configurableInWizard":true
+    },
+    {
+      "name":"blur_zookeeper_root",
+      "label":"Zookeeper Root",
+      "description": "Advanced: Root ZK connection to alternate path.",
+      "configName":"blur.zookeeper.root",
+      "required":"false",
+      "type":"string",
+      "default":"",
+      "configurableInWizard":true
+    },    
+   
+|||General-Server-Properties|||
+  ],
+  
+  "roles" : [
+    {
+      "name" : "BLUR_CONTROLLER",
+      "label" : "Blur Controller Server",
+      "pluralLabel" : "Blur Controller Servers",
+      "startRunner" : {
+        "program" : "scripts/control.sh",
+        "args" : [ "start-controller" ],
+        "environmentVariables" : {
+            "BLUR_ZK_ROOT": "${blur_zookeeper_root}",
+            "BLUR_DEFAULT_TABLE_PATH": "/user/${user}/${blur_cluster_name}/tables",
+            "BLUR_COMMAND_PATH":"/user/${user}/${blur_cluster_name}/commands",
+            "BLUR_CLUSTER_NAME":"${blur_cluster_name}",
+            "BLUR_CONTROLLER_JVM_OPTIONS":"${blur_controller_jvm_options}"
+        }
+      },
+      "externalLink" : {
+      	"name":"blur_controller_ui",
+      	"label":"Blur Controller Status UI",
+      	"url":"http://${host}:${blur_gui_controller_port}"
+      },
+      "logging": {
+    	  "dir":"/var/log/blur",
+    	  "filename": "blur-controller-server-${host}.log",
+    	  "loggingType":"log4j"
+      },
+      "configWriter" : {
+      	"generators" : [
+      		{
+      			"filename" : "blur-site.properties",
+            	"configFormat" : "properties",
+            	"excludedParams": ["blur_controller_jvm_options"]
+      		}
+      	 ]
+      },
+	  "parameters": [
+	    {
+          "name":"blur_controller_jvm_options",
+          "label":"JVM Options for Controllers",
+          "description": "JAVA JVM OPTIONS for the controller servers, jvm tuning parameters are placed here.",
+          "configName":"blur.controller.jvm.options",
+	      "required":"false",
+	      "type":"string",
+	      "default":"-Xmx1024m -Djava.net.preferIPv4Stack=true",
+	      "configurableInWizard":true
+      },
+|||Controller-Server-Properties|||
+                 ]
+   },
+   {
+	   "name" : "BLUR_SHARD",
+	   "label" : "Blur Shard Server",
+	   "pluralLabel" : "Blur Shard Servers",
+	   "startRunner" : {
+	     "program" : "scripts/control.sh",
+	     "args" : [ "start-shard" ],
+	     "environmentVariables" : {
+            "BLUR_ZK_ROOT": "${blur_zookeeper_root}",
+            "BLUR_DEFAULT_TABLE_PATH": "/user/${user}/${blur_cluster_name}/tables",
+            "BLUR_COMMAND_PATH":"/user/${user}/${blur_cluster_name}/commands",
+            "BLUR_CLUSTER_NAME":"${blur_cluster_name}",
+            "BLUR_SHARD_JVM_OPTIONS":"${blur_shard_jvm_options}"
+          }
+	    },
+      "additionalExternalLinks" : [{
+      	"name":"blur_shard_ui",
+      	"label":"Blur Shard Status UI",
+      	"url":"http://${host}:${blur_gui_shard_port}"
+      }],
+	     "logging": {
+	    	  "dir":"/var/log/blur",
+	    	  "filename": "blur-shard-server-${host}.log",
+	    	  "loggingType":"log4j"
+	     },
+      "configWriter" : {
+      	"generators" : [
+      		{
+      			"filename" : "blur-site.properties",
+            	"configFormat" : "properties",
+            	"excludedParams": ["blur_shard_jvm_options"]
+      		}
+      	 ]
+      },
+	     "parameters": [
+		    {
+	          "name":"blur_shard_jvm_options",
+	          "label":"JVM OPTIONS for Shards",
+	          "description": "JAVA JVM OPTIONS for the shard servers, jvm tuning parameters are placed here.",
+	          "configName":"blur.shard.jvm.options",
+		      "required":"false",
+		      "type":"string",
+		      "default":"-Xmx1024m -Djava.net.preferIPv4Stack=true -XX:MaxDirectMemorySize=256m",
+		      "configurableInWizard":true
+	      	},
+|||Shard-Server-Properties|||
+                 ]
+	}   
+  ],
+  "parcel" : {
+  	"requiredTags": ["blurcontroller"],
+  	"optionalTags": ["blurcontroller", "blurshard", "blurconsole"]
+  },
+  "serviceDependencies" : [
+        {"name":"HDFS", "required":"true"},
+        {"name":"ZOOKEEPER", "required":"true"}
+   ]
+  	
+  
+}
diff --git a/distribution/src/assemble/cdh/csd/scripts/control.sh b/distribution/src/assemble/cdh/csd/scripts/control.sh
new file mode 100644
index 0000000..b5c18e6
--- /dev/null
+++ b/distribution/src/assemble/cdh/csd/scripts/control.sh
@@ -0,0 +1,128 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+: <<DOCUMENTATION
+ --------------------------------------------------------------------------
+|                 control.sh 
+ --------------------------------------------------------------------------
+Script used by CM to control services of Blur. This should mostly be 
+bridge
+ --------------------------------------------------------------------------
+DOCUMENTATION
+
+this="${BASH_SOURCE-$0}"
+bin=$(cd -P -- "$(dirname -- "$this")" && pwd -P)
+script="$(basename -- "$this")"
+this="$bin/$script"
+
+set -e
+set -u
+set -o pipefail
+
+IFS=$'\n\t'
+
+scratch=$(mktemp -d -t scratch.tmp.XXXXXXXXXX)
+
+function finish {
+  rm -rf "${scratch}"
+  # Your cleanup code here
+}
+trap finish EXIT
+
+#__args
+declare -A OPT_ARGS
+usage() { echo "Usage: $0 <action>" 1>&2; exit 1; }
+
+#__functions
+
+write_to_blur_site_props() {
+  prop="$1=$2"
+  echo -n "Adding property[$prop] to blur-site.properties..."
+  #For now, rely on last one in 
+  echo $prop >> $BLUR_SITE
+  echo " done."
+}
+
+setup_environment() {
+	blur_tmp_path="${CONF_DIR}/tmp"
+	blur_conf_dir="${CONF_DIR}"
+	
+	mkdir -p $blur_tmp_path
+	mkdir -p $blur_conf_dir
+	
+	#Wacky, yo!
+	chown blur:blur $blur_tmp_path
+	
+	BLUR_SITE=${blur_conf_dir}/blur-site.properties
+	
+#	cp ${BLUR_HOME}/conf/log* ${blur_conf_dir}/
+	
+	if [ -z "$BLUR_ZK_ROOT" ]; then
+	  echo "Rooting zookeeper at [${BLUR_ZK_ROOT}]"
+	fi
+	
+	write_to_blur_site_props blur.zookeeper.connection "$ZK_QUORUM/$BLUR_ZK_ROOT"
+		
+	DFS_PATH=$(hdfs getconf -confKey fs.defaultFS)
+	
+	#TODO: Should allow BLUR_DEFAULT_TABLE_PATH to be absolute to another cluster too.
+	write_to_blur_site_props "blur.cluster.${BLUR_CLUSTER_NAME}.table.uri" "$DFS_PATH/$BLUR_DEFAULT_TABLE_PATH"
+	write_to_blur_site_props blur.command.lib.path "$DFS_PATH/$BLUR_COMMAND_PATH"
+	
+	export BLUR_CONF_DIR=$blur_conf_dir
+	export BLUR_LOGS="/var/log/blur"
+	export HADOOP_CLASSPATH=$(hadoop classpath)
+}
+
+start_controller() {
+	setup_environment
+	exec $BLUR_HOME/bin/start-supervised-controller-server.sh
+}
+
+start_shard() {
+	setup_environment
+	exec $BLUR_HOME/bin/start-supervised-shard-server.sh
+}
+
+#__main
+action="$1"
+
+if [ "${action}" == "" ] ;then
+  usage
+fi
+
+echo "Executing [$action] with BLUR_HOME [$BLUR_HOME]"
+
+export BLUR_LOGS=${CONF_DIR}/logs
+
+case ${action} in
+  (start-controller)
+  	start_controller
+    ;;
+  (start-shard)
+  	start_shard
+    ;;    
+  (*)
+    echo "Unknown command[${action}]"
+    ;;
+esac
+
+
+
+
+
+
diff --git a/distribution/src/assemble/cdh/parcel/meta/blur_parcel_env.sh b/distribution/src/assemble/cdh/parcel/meta/blur_parcel_env.sh
new file mode 100644
index 0000000..ff839e7
--- /dev/null
+++ b/distribution/src/assemble/cdh/parcel/meta/blur_parcel_env.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+export HADOOP_HOME=$CDH_HADOOP_HOME
+export BLUR_HOME=$PARCELS_ROOT/$PARCEL_DIRNAME
+
+source $COMMON_SCRIPT
+set_hadoop_classpath
+HCP=$(hadoop classpath)
+export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HCP
+echo "***** PREFIX:"
+env
+echo "**** DONE."
+
diff --git a/distribution/src/assemble/cdh/parcel/meta/parcel.json.template b/distribution/src/assemble/cdh/parcel/meta/parcel.json.template
new file mode 100644
index 0000000..67ae8f2
--- /dev/null
+++ b/distribution/src/assemble/cdh/parcel/meta/parcel.json.template
@@ -0,0 +1,42 @@
+{
+	"schema_version": 1,
+	"name": "blur",
+	"version" : "|||BLUR-VERSION|||",
+	"setActiveSymlink": true,
+	
+	"depends": "",
+	"replaces":"blur",
+	"conflicts":"",
+	
+	"provides": [
+		"blurcontroller",
+		"blurshard",
+		"blurconsole"
+	],
+	
+	"scripts": {
+		"defines":"blur_parcel_env.sh"
+	},
+	
+	"components": [
+		{
+			"name" : "blur",
+			"version" : "|||BLUR-VERSION|||",
+			"pkg_version": "|||BLUR-VERSION|||"
+		}
+	],
+	
+	"packages" : [],
+	
+	"users":  {
+		"blur": {
+			"longname" : "Blur",
+			"home" : "/var/lib/blur",
+			"shell"	: "/bin/bash",
+			"extra_groups": []
+			
+		}	
+	},
+	"groups": []
+	
+}
diff --git a/distribution/src/assemble/csd-hadoop2.xml b/distribution/src/assemble/csd-hadoop2.xml
new file mode 100644
index 0000000..13e638e
--- /dev/null
+++ b/distribution/src/assemble/csd-hadoop2.xml
@@ -0,0 +1,55 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+  <id>csd</id>
+  <formats>
+    <format>jar</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+
+  <fileSets>
+    <fileSet>
+      <directory>${project.build.scriptSourceDirectory}/../../assemble/cdh/csd/scripts</directory>
+      <outputDirectory>scripts</outputDirectory>
+      <excludes>
+        <exclude>**/.empty</exclude>
+      </excludes>
+    </fileSet>
+  </fileSets>
+
+  <files>
+    <file>
+      <source>${project.build.directory}/service.sdl</source>
+      <outputDirectory>descriptor</outputDirectory>
+      <destName>service.sdl</destName>
+    </file>  
+    <file>
+      <source>${project.build.scriptSourceDirectory}/../resources-hadoop2/NOTICE-bin.txt</source>
+      <outputDirectory></outputDirectory>
+      <destName>NOTICE</destName>
+    </file>
+    <file>
+      <source>${project.build.scriptSourceDirectory}/../resources-hadoop2/LICENSE-bin.txt</source>
+      <outputDirectory></outputDirectory>
+      <destName>LICENSE</destName>
+    </file>
+  </files>
+</assembly>
diff --git a/distribution/src/assemble/parcel-hadoop2.xml b/distribution/src/assemble/parcel-hadoop2.xml
new file mode 100644
index 0000000..50a290b
--- /dev/null
+++ b/distribution/src/assemble/parcel-hadoop2.xml
@@ -0,0 +1,103 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+  <id>parcel</id>
+  <formats>
+    <format>tar.gz</format>
+  </formats>
+  <includeBaseDirectory>false</includeBaseDirectory>
+  
+  <dependencySets>
+    <dependencySet>
+      <useProjectArtifact>false</useProjectArtifact>
+      <outputDirectory>blur-${project.version}/lib</outputDirectory>
+      <unpack>false</unpack>
+      <includes>
+        <include>org.apache.blur:*</include>
+
+        <include>org.json:json</include>
+        <include>com.yammer.metrics:*</include>
+        <include>com.google.guava:guava</include>
+        <include>org.apache.httpcomponents:*</include>
+        <include>org.apache.lucene:*</include>
+        <include>com.spatial4j:spatial4j</include>
+        <include>commons-cli:commons-cli</include>
+        <include>org.eclipse.jetty:*</include>
+        <include>com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru</include>
+        <include>jline:jline</include>
+        <include>com.fasterxml.jackson.core:*</include>
+        <include>javax.servlet:*</include>        
+      </includes>
+    </dependencySet>
+  </dependencySets>
+
+  <fileSets>
+    <fileSet>
+      <directory>${project.build.scriptSourceDirectory}/conf</directory>
+      <outputDirectory>blur-${project.version}/conf</outputDirectory>
+      <excludes>
+        <exclude>**/.empty</exclude>
+        <exclude>**/log4j*.xml</exclude>
+      </excludes>
+    </fileSet> 
+    <fileSet>
+      <directory>${project.build.scriptSourceDirectory}/bin</directory>
+      <outputDirectory>blur-${project.version}/bin</outputDirectory>
+      <excludes>
+        <exclude>**/.empty</exclude>
+      </excludes>
+    </fileSet>       
+    <fileSet>
+      <directory>${project.build.scriptSourceDirectory}/../../assemble/cdh/parcel/meta</directory>
+      <outputDirectory>blur-${project.version}/meta</outputDirectory>
+      <excludes>
+        <exclude>**/.empty</exclude>
+        <exclude>**/parcel.json.template</exclude>
+      </excludes>
+    </fileSet>
+    <fileSet>
+      <directory>${project.build.scriptSourceDirectory}/../../../../</directory>
+      <outputDirectory>blur-${project.version}/</outputDirectory>
+      <includes>
+        <include>DISCLAIMER</include>
+        <include>README</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+
+  <files>
+    <file>
+      <source>${project.build.directory}/parcel.json</source>
+      <outputDirectory>blur-${project.version}/meta</outputDirectory>
+      <destName>parcel.json</destName>
+    </file>
+    <file>
+      <source>${project.build.scriptSourceDirectory}/../resources-hadoop2/NOTICE-bin.txt</source>
+      <outputDirectory>blur-${project.version}</outputDirectory>
+      <destName>NOTICE</destName>
+    </file>
+    <file>
+      <source>${project.build.scriptSourceDirectory}/../resources-hadoop2/LICENSE-bin.txt</source>
+      <outputDirectory>blur-${project.version}</outputDirectory>
+      <destName>LICENSE</destName>
+    </file>
+  </files>
+</assembly>
diff --git a/distribution/src/main/scripts/bin/blur-supervised-config.sh b/distribution/src/main/scripts/bin/blur-supervised-config.sh
new file mode 100755
index 0000000..f6e594b
--- /dev/null
+++ b/distribution/src/main/scripts/bin/blur-supervised-config.sh
@@ -0,0 +1,101 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+bin=`dirname "$0"`
+bin=`cd "$bin"; pwd`
+
+export BLUR_HOME="$bin"/..
+export BLUR_HOME_CONF=$BLUR_HOME/conf
+
+#. $BLUR_HOME/conf/blur-env.sh
+if [ -z "$JAVA_HOME" ]; then
+  if which java >/dev/null 2>&1 ; then
+    export JAVA_HOME=`java -cp $bin/../lib/blur-util-*.jar org.apache.blur.FindJavaHome` 
+  fi
+fi
+if [ -z "$JAVA_HOME" ]; then
+  cat 1>&2 <<EOF
++======================================================================+
+|      Error: JAVA_HOME is not set and Java could not be found         |
++----------------------------------------------------------------------+
+| Please download the latest Sun JDK from the Sun Java web site        |
+|       > http://java.sun.com/javase/downloads/ <                      |
+|                                                                      |
+| Hadoop and Blur requires Java 1.6 or later.                          |
+| NOTE: This script will find Sun Java whether you install using the   |
+|       binary or the RPM based installer.                             |
++======================================================================+
+EOF
+  exit 1
+fi
+
+export JAVA=$JAVA_HOME/bin/java
+
+if [ -z "$BLUR_CONF_DIR" ]; then
+  BLUR_CONF_DIR=$BLUR_HOME/conf
+fi
+
+if [[ -z "$BLUR_CLASSPATH" ]]; then
+  BLUR_CLASSPATH=$BLUR_CONF_DIR
+else
+  BLUR_CLASSPATH=$BLUR_CLASSPATH:$BLUR_CONF_DIR
+fi
+
+for f in $BLUR_HOME/lib/*.jar; do
+  BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+done
+
+for f in $BLUR_HOME/lib/*.war; do
+  BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+done
+
+BLUR_CORE_FILE=`ls -d1 $BLUR_HOME/lib/blur-core-*.jar | head -1`
+
+  BLUR_CLASSPATH=${BLUR_CLASSPATH}:$HADOOP_HOME/etc/hadoop
+  BLUR_CLASSPATH=${BLUR_CLASSPATH}:$HADOOP_CLASSPATH
+
+  for f in $HADOOP_HOME/*.jar; do
+    BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+  done
+
+  for f in $HADOOP_HOME/lib/*.jar; do
+    BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+  done
+
+  for f in $HADOOP_HOME/share/hadoop/yarn/*.jar; do
+    BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+  done
+
+  for f in $HADOOP_HOME/share/hadoop/yarn/lib/*.jar; do
+    BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+  done
+
+  for f in $HADOOP_HOME/share/hadoop/common/*.jar; do
+    BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+  done
+
+  for f in $HADOOP_HOME/share/hadoop/common/lib/*.jar; do
+    BLUR_CLASSPATH=${BLUR_CLASSPATH}:$f;
+  done
+
+
+
+export BLUR_CLASSPATH
+
+echo "BLUR_CLASSPATH: [$BLUR_CLASSPATH]"
+
+HOSTNAME=`hostname`
diff --git a/distribution/src/main/scripts/bin/start-blocking-controller-server.sh b/distribution/src/main/scripts/bin/start-blocking-controller-server.sh
new file mode 100755
index 0000000..f3df832
--- /dev/null
+++ b/distribution/src/main/scripts/bin/start-blocking-controller-server.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+bin=`dirname "$0"`
+bin=`cd "$bin"; pwd`
+
+. "$bin"/blur-config.sh
+
+INSTANCE=0
+while [  $INSTANCE -lt $BLUR_NUMBER_OF_CONTROLLER_SERVER_INSTANCES_PER_MACHINE ]; do
+  PID_FILE=$BLUR_HOME/pids/controller-$INSTANCE.pid
+
+  if [ -f $PID_FILE ]; then
+    if kill -0 `cat $PID_FILE` > /dev/null 2>&1; then
+      echo Controller server already running as process `cat $PID_FILE`.  Stop it first.
+      let INSTANCE=INSTANCE+1
+      continue
+    fi
+  fi
+
+  PROC_NAME=controller-server-$HOSTNAME-$INSTANCE
+  "$JAVA_HOME"/bin/java -Dblur.name=$PROC_NAME -Djava.library.path=$JAVA_LIBRARY_PATH -Dblur-controller-$INSTANCE $BLUR_CONTROLLER_JVM_OPTIONS -Dblur.logs.dir=$BLUR_LOGS -Dblur.log.file=blur-$USER-$PROC_NAME -cp $BLUR_CLASSPATH org.apache.blur.thrift.ThriftBlurControllerServer -s $INSTANCE > "$BLUR_LOGS/blur-$USER-$PROC_NAME.out" 2>&1 < /dev/null
+  echo $! > $PID_FILE
+  echo Controller [$INSTANCE] starting as process `cat $PID_FILE`.
+
+  let INSTANCE=INSTANCE+1 
+done
\ No newline at end of file
diff --git a/distribution/src/main/scripts/bin/start-supervised-controller-server.sh b/distribution/src/main/scripts/bin/start-supervised-controller-server.sh
new file mode 100755
index 0000000..7afac4c
--- /dev/null
+++ b/distribution/src/main/scripts/bin/start-supervised-controller-server.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+bin=`dirname "$0"`
+bin=`cd "$bin"; pwd`
+
+echo "Sourcing configs.."
+. $BLUR_HOME/bin/blur-supervised-config.sh
+
+PROC_NAME=controller-server-$HOSTNAME-0
+echo "Launching controller [$PROC_NAME] now..."
+echo "Using BLUR_CLASSPATH: ${BLUR_CLASSPATH}"
+exec "$JAVA_HOME"/bin/java -Dblur.name=$PROC_NAME -Dblur-controller -Dlog4j.configuration=log4j.properties $BLUR_CONTROLLER_JVM_OPTIONS -Djava.library.path=$JAVA_LIBRARY_PATH -cp "$BLUR_CLASSPATH" org.apache.blur.thrift.ThriftBlurControllerServer -s 0 
diff --git a/distribution/src/main/scripts/bin/start-supervised-shard-server.sh b/distribution/src/main/scripts/bin/start-supervised-shard-server.sh
new file mode 100755
index 0000000..88e5352
--- /dev/null
+++ b/distribution/src/main/scripts/bin/start-supervised-shard-server.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+bin=`dirname "$0"`
+bin=`cd "$bin"; pwd`
+
+echo "Sourcing configs.."
+. $BLUR_HOME/bin/blur-supervised-config.sh
+
+PROC_NAME=shard-server-$HOSTNAME-0
+echo "Launching shard [$PROC_NAME] now..."
+echo "Using BLUR_CLASSPATH: ${BLUR_CLASSPATH}"
+exec "$JAVA_HOME"/bin/java -Dblur.name=$PROC_NAME -Dblur-shard -Dlog4j.configuration=log4j.properties $BLUR_SHARD_JVM_OPTIONS -Djava.library.path=$JAVA_LIBRARY_PATH -cp "$BLUR_CLASSPATH" org.apache.blur.thrift.ThriftBlurShardServer -s 0 
diff --git a/pom.xml b/pom.xml
index 23e2479..54cf474 100644
--- a/pom.xml
+++ b/pom.xml
@@ -382,6 +382,10 @@
 
 						<!-- Used to create empty directories in git -->
                         <exclude>**/.empty</exclude>
+
+                        <exclude>**/test/**/prop.doc.base.html</exclude>
+                        <exclude>**/parcel.json.template</exclude>
+                        <exclude>**/service.sdl.template</exclude>
 					</excludes>
 				</configuration>
 				<executions>