You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluo.apache.org by kt...@apache.org on 2016/07/07 19:39:54 UTC

incubator-fluo git commit: fixes #695 removed commons config from public API

Repository: incubator-fluo
Updated Branches:
  refs/heads/master 31f1c1e6b -> 7f85e2827


fixes #695 removed commons config from public API


Project: http://git-wip-us.apache.org/repos/asf/incubator-fluo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-fluo/commit/7f85e282
Tree: http://git-wip-us.apache.org/repos/asf/incubator-fluo/tree/7f85e282
Diff: http://git-wip-us.apache.org/repos/asf/incubator-fluo/diff/7f85e282

Branch: refs/heads/master
Commit: 7f85e28270836054dd04f129dd01946ade975600
Parents: 31f1c1e
Author: Keith Turner <kt...@apache.org>
Authored: Fri Jul 1 20:25:15 2016 -0400
Committer: Keith Turner <kt...@apache.org>
Committed: Fri Jul 1 20:25:15 2016 -0400

----------------------------------------------------------------------
 modules/api/pom.xml                             |  28 ++-
 .../org/apache/fluo/api/client/FluoClient.java  |  11 +-
 .../org/apache/fluo/api/client/FluoFactory.java |  44 +---
 .../java/org/apache/fluo/api/client/Loader.java |   4 +-
 .../fluo/api/config/FluoConfiguration.java      |  80 ++-----
 .../fluo/api/config/SimpleConfiguration.java    | 212 +++++++++++++++++++
 .../java/org/apache/fluo/api/mini/MiniFluo.java |   4 +-
 .../org/apache/fluo/api/observer/Observer.java  |   6 +-
 .../org/apache/fluo/api/types/TypeLayer.java    |  92 ++++----
 .../fluo/api/types/TypedSnapshotBase.java       |   4 +-
 .../fluo/api/types/TypedTransactionBase.java    |   6 +-
 .../fluo/api/config/FluoConfigurationTest.java  |  16 --
 .../fluo/cluster/runnable/OracleRunnable.java   |   1 -
 .../fluo/cluster/runnable/WorkerRunnable.java   |   1 -
 .../apache/fluo/cluster/util/ClusterUtil.java   |   9 -
 .../apache/fluo/core/client/FluoAdminImpl.java  |   6 +-
 .../apache/fluo/core/client/FluoClientImpl.java |   4 +-
 .../core/client/LoaderExecutorAsyncImpl.java    |   4 +-
 .../org/apache/fluo/core/impl/Environment.java  |  24 +--
 .../fluo/core/metrics/ReporterStarter.java      |  10 +-
 .../apache/fluo/core/metrics/ReporterUtil.java  |   4 +-
 .../starters/ConsoleReporterStarter.java        |   4 +-
 .../metrics/starters/CsvReporterStarter.java    |   4 +-
 .../starters/GraphiteReporterStarter.java       |   4 +-
 .../metrics/starters/JmxReporterStarter.java    |   4 +-
 .../metrics/starters/Slf4jReporterStarter.java  |   4 +-
 .../core/worker/NotificationFinderFactory.java  |   4 +-
 .../fluo/core/worker/ObserverContext.java       |   8 +-
 .../org/apache/fluo/integration/ITBaseMini.java |   4 +-
 .../fluo/integration/impl/AppConfigIT.java      |   8 +-
 .../fluo/mapreduce/FluoEntryInputFormat.java    |  12 +-
 .../apache/fluo/mapreduce/FluoOutputFormat.java |  12 +-
 .../fluo/mapreduce/FluoRowInputFormat.java      |  12 +-
 .../java/org/apache/fluo/mini/MiniFluoImpl.java |   9 +-
 34 files changed, 392 insertions(+), 267 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/pom.xml
----------------------------------------------------------------------
diff --git a/modules/api/pom.xml b/modules/api/pom.xml
index 751b3de..3f984e5 100644
--- a/modules/api/pom.xml
+++ b/modules/api/pom.xml
@@ -15,21 +15,17 @@
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
-
   <parent>
     <groupId>org.apache.fluo</groupId>
     <artifactId>fluo-parent</artifactId>
     <version>1.0.0-beta-3-SNAPSHOT</version>
     <relativePath>../../pom.xml</relativePath>
   </parent>
-
   <artifactId>fluo-api</artifactId>
-
   <name>Fluo API</name>
   <description>This module contains all API code.  External dependencies should be limited.  Any changes to
     public methods should be avoided.  While the API module does not have compile time dependency
     on fluo-core, you must include fluo-core as a run-time dependency.</description>
-
   <!-- Avoid (if possible) adding new dependencies to the API jar -->
   <dependencies>
     <dependency>
@@ -64,4 +60,28 @@
       <scope>test</scope>
     </dependency>
   </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>net.revelc.code</groupId>
+        <artifactId>apilyzer-maven-plugin</artifactId>
+        <version>1.0.1</version>
+        <executions>
+          <execution>
+            <id>apilyzer</id>
+            <goals>
+              <goal>analyze</goal>
+            </goals>
+            <configuration>
+              <includes>
+                <include>org[.]apache[.]fluo[.]api[.].*</include>
+              </includes>
+              <excludes />
+              <allows />
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/client/FluoClient.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/client/FluoClient.java b/modules/api/src/main/java/org/apache/fluo/api/client/FluoClient.java
index 5088531..4f64a16 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/client/FluoClient.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/client/FluoClient.java
@@ -15,14 +15,13 @@
 
 package org.apache.fluo.api.client;
 
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.SubsetConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 
 /**
  * Client interface for Fluo. Fluo clients will have shared resources used by all objects created by
  * the client. Therefore, {@link FluoClient#close()} must called when you are finished using the
  * client.
- * 
+ *
  * @since 1.0.0
  */
 public interface FluoClient extends AutoCloseable {
@@ -56,8 +55,8 @@ public interface FluoClient extends AutoCloseable {
   /**
    * @return All properties w/ the prefix
    *         {@value org.apache.fluo.api.config.FluoConfiguration#APP_PREFIX} that were set at
-   *         initialization time. The configuration returned is a {@link SubsetConfiguration} using
-   *         the prefix {@value org.apache.fluo.api.config.FluoConfiguration#APP_PREFIX} The reason
+   *         initialization time. The configuration returned is a subset of configuration using the
+   *         prefix {@value org.apache.fluo.api.config.FluoConfiguration#APP_PREFIX} The reason
    *         these properties are stored and read from zookeeper is to offer a consistent view of
    *         application config across all nodes in the cluster. So there is no need to worry w/
    *         keeping config files consistent across a cluster. To update this configuration, use
@@ -65,7 +64,7 @@ public interface FluoClient extends AutoCloseable {
    *         not update Zookeeper.
    */
 
-  Configuration getAppConfiguration();
+  SimpleConfiguration getAppConfiguration();
 
   /**
    * Closes client resources

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/client/FluoFactory.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/client/FluoFactory.java b/modules/api/src/main/java/org/apache/fluo/api/client/FluoFactory.java
index f6416d2..cd9bd2f 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/client/FluoFactory.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/client/FluoFactory.java
@@ -19,8 +19,8 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.Objects;
 
 import com.google.common.base.Preconditions;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.exceptions.FluoException;
 import org.apache.fluo.api.mini.MiniFluo;
 import org.apache.fluo.api.service.FluoOracle;
@@ -60,7 +60,7 @@ public class FluoFactory {
    * no default: org.apache.fluo.client.accumulo.user, org.apache.fluo.client.accumulo.password,
    * org.apache.fluo.client.accumulo.instance
    */
-  public static FluoClient newClient(Configuration configuration) {
+  public static FluoClient newClient(SimpleConfiguration configuration) {
     return getAndBuildClassWithConfig(configuration, CLIENT_CLASS_PROP, CLIENT_CLASS_DEFAULT);
   }
 
@@ -72,7 +72,7 @@ public class FluoFactory {
    * org.apache.fluo.client.accumulo.password, org.apache.fluo.client.accumulo.instance,
    * org.apache.fluo.admin.accumulo.table, org.apache.fluo.admin.accumulo.classpath
    */
-  public static FluoAdmin newAdmin(Configuration configuration) {
+  public static FluoAdmin newAdmin(SimpleConfiguration configuration) {
     return getAndBuildClassWithConfig(configuration, ADMIN_CLASS_PROP, ADMIN_CLASS_DEFAULT);
   }
 
@@ -85,27 +85,26 @@ public class FluoFactory {
    * org.apache.fluo.client.accumulo.password, org.apache.fluo.client.accumulo.instance,
    * org.apache.fluo.admin.accumulo.table
    */
-  public static MiniFluo newMiniFluo(Configuration configuration) {
+  public static MiniFluo newMiniFluo(SimpleConfiguration configuration) {
     return getAndBuildClassWithConfig(configuration, MINI_CLASS_PROP, MINI_CLASS_DEFAULT);
   }
 
   /**
    * Creates a {@link FluoOracle} using the provided configuration.
    */
-  public static FluoOracle newOracle(Configuration configuration) {
+  public static FluoOracle newOracle(SimpleConfiguration configuration) {
     return getAndBuildClassWithConfig(configuration, ORACLE_CLASS_PROP, ORACLE_CLASS_DEFAULT);
   }
 
   /**
    * Creates a {@link FluoWorker} using the provided configuration.
    */
-  public static FluoWorker newWorker(Configuration configuration) {
+  public static FluoWorker newWorker(SimpleConfiguration configuration) {
     return getAndBuildClassWithConfig(configuration, WORKER_CLASS_PROP, WORKER_CLASS_DEFAULT);
   }
 
-  @SuppressWarnings("unchecked")
-  private static <T> T getAndBuildClassWithConfig(Configuration configuration, String classProp,
-      String classDefault) {
+  private static <T> T getAndBuildClassWithConfig(SimpleConfiguration configuration,
+      String classProp, String classDefault) {
     FluoConfiguration config = new FluoConfiguration(configuration);
     String clazz = config.getString(classProp, classDefault);
     Objects.requireNonNull(clazz, classProp + " cannot be null");
@@ -113,17 +112,8 @@ public class FluoFactory {
     return buildClassWithConfig(clazz, config);
   }
 
-  @SuppressWarnings({"unchecked", "unused"})
-  private static <T> T getAndBuildClass(Configuration configuration, String classProp,
-      String classDefault) {
-    String clazz = configuration.getString(classProp, classDefault);
-    Objects.requireNonNull(clazz, classProp + " cannot be null");
-    Preconditions.checkArgument(!clazz.isEmpty(), classProp + " cannot be empty");
-    return buildClass(clazz);
-  }
-
   @SuppressWarnings("unchecked")
-  private static <T> T buildClassWithConfig(String clazz, Configuration config) {
+  private static <T> T buildClassWithConfig(String clazz, FluoConfiguration config) {
     try {
       return (T) Class.forName(clazz).getDeclaredConstructor(FluoConfiguration.class)
           .newInstance(config);
@@ -142,20 +132,4 @@ public class FluoFactory {
       throw new FluoException(e);
     }
   }
-
-  @SuppressWarnings({"unchecked"})
-  private static <T> T buildClass(String clazz) {
-    try {
-      return (T) Class.forName(clazz).newInstance();
-    } catch (ClassNotFoundException e) {
-      String msg =
-          "Could not find " + clazz
-              + " class which could be caused by fluo-core jar not being on the classpath.";
-      log.error(msg);
-      throw new FluoException(msg, e);
-    } catch (Exception e) {
-      log.error("Could not instantiate class - " + clazz);
-      throw new FluoException(e);
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/client/Loader.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/client/Loader.java b/modules/api/src/main/java/org/apache/fluo/api/client/Loader.java
index f65b331..1557112 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/client/Loader.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/client/Loader.java
@@ -15,7 +15,7 @@
 
 package org.apache.fluo.api.client;
 
-import org.apache.commons.configuration.Configuration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 
 /**
  * Interface that is implemented by users to load data into Fluo. Loader classes are executed by a
@@ -33,7 +33,7 @@ public interface Loader {
      * @return A configuration object with application configuration like that returned by
      *         {@link FluoClient#getAppConfiguration()}
      */
-    Configuration getAppConfiguration();
+    SimpleConfiguration getAppConfiguration();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/config/FluoConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/config/FluoConfiguration.java b/modules/api/src/main/java/org/apache/fluo/api/config/FluoConfiguration.java
index f00dfca..b1630a4 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/config/FluoConfiguration.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/config/FluoConfiguration.java
@@ -16,6 +16,7 @@
 package org.apache.fluo.api.config;
 
 import java.io.File;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -25,22 +26,16 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.base.Preconditions;
-import org.apache.commons.configuration.AbstractConfiguration;
-import org.apache.commons.configuration.CompositeConfiguration;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.commons.configuration.SubsetConfiguration;
 import org.apache.fluo.api.client.FluoClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Configuration helper class for Fluo. FluoConfiguration extends {@link CompositeConfiguration}.
+ * Configuration helper class for Fluo
  *
  * @since 1.0.0
  */
-public class FluoConfiguration extends CompositeConfiguration {
+public class FluoConfiguration extends SimpleConfiguration {
 
   private static final Logger log = LoggerFactory.getLogger(FluoConfiguration.class);
 
@@ -80,9 +75,6 @@ public class FluoConfiguration extends CompositeConfiguration {
   public static final int LOADER_NUM_THREADS_DEFAULT = 10;
   public static final int LOADER_QUEUE_SIZE_DEFAULT = 10;
 
-  // Oracle
-  private static final String ORACLE_PREFIX = FLUO_PREFIX + ".oracle";
-
   // MiniFluo
   private static final String MINI_PREFIX = FLUO_PREFIX + ".mini";
   public static final String MINI_START_ACCUMULO_PROP = MINI_PREFIX + ".start.accumulo";
@@ -107,40 +99,18 @@ public class FluoConfiguration extends CompositeConfiguration {
 
   public FluoConfiguration() {
     super();
-    setThrowExceptionOnMissing(true);
-    setDelimiterParsingDisabled(true);
   }
 
-  public FluoConfiguration(FluoConfiguration other) {
-    this();
-    Iterator<String> iter = other.getKeys();
-    while (iter.hasNext()) {
-      String key = iter.next();
-      setProperty(key, other.getProperty(key));
-    }
+  public FluoConfiguration(SimpleConfiguration other) {
+    super(other);
   }
 
-  public FluoConfiguration(Configuration configuration) {
-    this();
-    if (configuration instanceof AbstractConfiguration) {
-      AbstractConfiguration aconf = (AbstractConfiguration) configuration;
-      aconf.setDelimiterParsingDisabled(true);
-    }
-
-    addConfiguration(configuration);
+  public FluoConfiguration(InputStream in) {
+    super(in);
   }
 
   public FluoConfiguration(File propertiesFile) {
-    this();
-    try {
-      PropertiesConfiguration config = new PropertiesConfiguration();
-      // disabled to prevent accumulo classpath value from being shortened
-      config.setDelimiterParsingDisabled(true);
-      config.load(propertiesFile);
-      addConfiguration(config);
-    } catch (ConfigurationException e) {
-      throw new IllegalArgumentException(e);
-    }
+    super(propertiesFile);
   }
 
   public void validate() {
@@ -440,22 +410,22 @@ public class FluoConfiguration extends CompositeConfiguration {
 
   /**
    * @param reporter The name of the reporter to get configuration for, i.e. console, jmx, graphite.
-   * @return A {@link SubsetConfiguration} using the prefix {@value #REPORTER_PREFIX} with the
+   * @return A subset of this configuration using the prefix {@value #REPORTER_PREFIX} with the
    *         reporter parameter appended. Any change made to subset will be reflected in this
    *         configuration, but with the prefix added.
    */
-  public Configuration getReporterConfiguration(String reporter) {
+  public SimpleConfiguration getReporterConfiguration(String reporter) {
     return subset(REPORTER_PREFIX + "." + reporter);
   }
 
   /**
-   * @return A {@link SubsetConfiguration} using the prefix {@value #APP_PREFIX}. Any change made to
-   *         subset will be reflected in this configuration, but with the prefix added. This method
-   *         is useful for setting application configuration before initialization. For reading
-   *         application configuration after initialization, see
+   * @return A subset of this configuration using the prefix {@value #APP_PREFIX}. Any change made
+   *         to subset will be reflected in this configuration, but with the prefix added. This
+   *         method is useful for setting application configuration before initialization. For
+   *         reading application configuration after initialization, see
    *         {@link FluoClient#getAppConfiguration()}
    */
-  public Configuration getAppConfiguration() {
+  public SimpleConfiguration getAppConfiguration() {
     return subset(APP_PREFIX);
   }
 
@@ -476,12 +446,6 @@ public class FluoConfiguration extends CompositeConfiguration {
     return getNonEmptyString(MINI_DATA_DIR_PROP, MINI_DATA_DIR_DEFAULT);
   }
 
-  protected void setDefault(String key, String val) {
-    if (getProperty(key) == null) {
-      setProperty(key, val);
-    }
-  }
-
   /**
    * Logs all properties
    */
@@ -489,7 +453,7 @@ public class FluoConfiguration extends CompositeConfiguration {
     Iterator<String> iter = getKeys();
     while (iter.hasNext()) {
       String key = iter.next();
-      log.info(key + " = " + getProperty(key));
+      log.info(key + " = " + getRawString(key));
     }
   }
 
@@ -575,13 +539,13 @@ public class FluoConfiguration extends CompositeConfiguration {
     return valid;
   }
 
-  public Configuration getClientConfiguration() {
-    Configuration clientConfig = new CompositeConfiguration();
+  public SimpleConfiguration getClientConfiguration() {
+    SimpleConfiguration clientConfig = new SimpleConfiguration();
     Iterator<String> iter = getKeys();
     while (iter.hasNext()) {
       String key = iter.next();
       if (key.startsWith(CLIENT_PREFIX)) {
-        clientConfig.setProperty(key, getProperty(key));
+        clientConfig.setProperty(key, getRawString(key));
       }
     }
     return clientConfig;
@@ -591,8 +555,8 @@ public class FluoConfiguration extends CompositeConfiguration {
    * Returns configuration with all Fluo properties set to their default. NOTE - some properties do
    * not have defaults and will not be set.
    */
-  public static Configuration getDefaultConfiguration() {
-    Configuration config = new CompositeConfiguration();
+  public static SimpleConfiguration getDefaultConfiguration() {
+    SimpleConfiguration config = new SimpleConfiguration();
     setDefaultConfiguration(config);
     return config;
   }
@@ -601,7 +565,7 @@ public class FluoConfiguration extends CompositeConfiguration {
    * Sets all Fluo properties to their default in the given configuration. NOTE - some properties do
    * not have defaults and will not be set.
    */
-  public static void setDefaultConfiguration(Configuration config) {
+  public static void setDefaultConfiguration(SimpleConfiguration config) {
     config.setProperty(CLIENT_ZOOKEEPER_CONNECT_PROP, CLIENT_ZOOKEEPER_CONNECT_DEFAULT);
     config.setProperty(CLIENT_ZOOKEEPER_TIMEOUT_PROP, CLIENT_ZOOKEEPER_TIMEOUT_DEFAULT);
     config.setProperty(CLIENT_ACCUMULO_ZOOKEEPERS_PROP, CLIENT_ACCUMULO_ZOOKEEPERS_DEFAULT);

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java b/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
new file mode 100644
index 0000000..86ff1b7
--- /dev/null
+++ b/modules/api/src/main/java/org/apache/fluo/api/config/SimpleConfiguration.java
@@ -0,0 +1,212 @@
+/*
+ * 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.fluo.api.config;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+
+import org.apache.commons.configuration.CompositeConfiguration;
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.ConfigurationUtils;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.fluo.api.exceptions.FluoException;
+
+/**
+ * A simple configuration wrapper for Apache Commons configuration. The implementation supports
+ * reading and writing properties style config and interpolation.
+ *
+ * <p>
+ * This simple wrapper was created to keep 3rd party APIs out of the Fluo API.
+ *
+ * @since 1.0.0
+ */
+
+public class SimpleConfiguration {
+
+  private Configuration internalConfig;
+
+  public SimpleConfiguration() {
+    CompositeConfiguration compositeConfig = new CompositeConfiguration();
+    compositeConfig.setThrowExceptionOnMissing(true);
+    compositeConfig.setDelimiterParsingDisabled(true);
+    internalConfig = compositeConfig;
+  }
+
+  private SimpleConfiguration(Configuration subset) {
+    this.internalConfig = subset;
+  }
+
+  /**
+   * Read a properties style config from given file.
+   */
+  public SimpleConfiguration(File propertiesFile) {
+    this();
+    try {
+      PropertiesConfiguration config = new PropertiesConfiguration();
+      // disabled to prevent accumulo classpath value from being shortened
+      config.setDelimiterParsingDisabled(true);
+      config.load(propertiesFile);
+      ((CompositeConfiguration) internalConfig).addConfiguration(config);
+    } catch (ConfigurationException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+
+  /**
+   * Read a properties style config from given input stream.
+   */
+  public SimpleConfiguration(InputStream in) {
+    this();
+    try {
+      PropertiesConfiguration config = new PropertiesConfiguration();
+      // disabled to prevent accumulo classpath value from being shortened
+      config.setDelimiterParsingDisabled(true);
+      config.load(in);
+      ((CompositeConfiguration) internalConfig).addConfiguration(config);
+    } catch (ConfigurationException e) {
+      throw new IllegalArgumentException(e);
+    }
+  }
+
+  /**
+   * Copy constructor.
+   */
+  public SimpleConfiguration(SimpleConfiguration other) {
+    this();
+    Iterator<String> iter = other.internalConfig.getKeys();
+    while (iter.hasNext()) {
+      String key = iter.next();
+      internalConfig.setProperty(key, other.internalConfig.getProperty(key));
+    }
+  }
+
+  public void clear() {
+    internalConfig.clear();
+  }
+
+  public void clearProperty(String key) {
+    internalConfig.clearProperty(key);
+  }
+
+  public boolean containsKey(String key) {
+    return internalConfig.containsKey(key);
+  }
+
+  public boolean getBoolean(String key) {
+    return internalConfig.getBoolean(key);
+  }
+
+  public boolean getBoolean(String key, boolean defaultValue) {
+    return internalConfig.getBoolean(key, defaultValue);
+  }
+
+  public int getInt(String key) {
+    return internalConfig.getInt(key);
+  }
+
+  public int getInt(String key, int defaultValue) {
+    return internalConfig.getInt(key, defaultValue);
+  }
+
+  public Iterator<String> getKeys() {
+    return internalConfig.getKeys();
+  }
+
+  public Iterator<String> getKeys(String key) {
+    return internalConfig.getKeys(key);
+  }
+
+  public long getLong(String key) {
+    return internalConfig.getLong(key);
+  }
+
+  public long getLong(String key, long defaultValue) {
+    return internalConfig.getLong(key, defaultValue);
+  }
+
+  /**
+   * @return raw property without interpolation or null if not set.
+   */
+  public String getRawString(String key) {
+    Object val = internalConfig.getProperty(key);
+    if (val == null) {
+      return null;
+    }
+    return val.toString();
+  }
+
+  public String getString(String key) {
+    return internalConfig.getString(key);
+  }
+
+  public String getString(String key, String defaultValue) {
+    return internalConfig.getString(key, defaultValue);
+  }
+
+  public void save(File file) {
+    PropertiesConfiguration pconf = new PropertiesConfiguration();
+    pconf.append(internalConfig);
+    try {
+      pconf.save(file);
+    } catch (ConfigurationException e) {
+      throw new FluoException(e);
+    }
+  }
+
+
+  public void save(OutputStream out) {
+    PropertiesConfiguration pconf = new PropertiesConfiguration();
+    pconf.append(internalConfig);
+    try {
+      pconf.save(out);
+    } catch (ConfigurationException e) {
+      throw new FluoException(e);
+    }
+  }
+
+  public void setProperty(String key, Boolean value) {
+    internalConfig.setProperty(key, value);
+  }
+
+  public void setProperty(String key, Integer value) {
+    internalConfig.setProperty(key, value);
+  }
+
+  public void setProperty(String key, Long value) {
+    internalConfig.setProperty(key, value);
+  }
+
+  public void setProperty(String key, String value) {
+    internalConfig.setProperty(key, value);
+  }
+
+  /**
+   * Returns a subset of config that start with given prefix. The prefix will not be present in keys
+   * of the returned config. Any changes made to the returned config will be made to this and visa
+   * versa.
+   */
+  public SimpleConfiguration subset(String prefix) {
+    return new SimpleConfiguration(internalConfig.subset(prefix));
+  }
+
+  @Override
+  public String toString() {
+    return ConfigurationUtils.toString(internalConfig);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/mini/MiniFluo.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/mini/MiniFluo.java b/modules/api/src/main/java/org/apache/fluo/api/mini/MiniFluo.java
index aaf3bfc..1c9b26b 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/mini/MiniFluo.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/mini/MiniFluo.java
@@ -15,7 +15,7 @@
 
 package org.apache.fluo.api.mini;
 
-import org.apache.commons.configuration.Configuration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 
 /**
  * A test and development instance of Fluo containing its own Oracle and Worker
@@ -27,7 +27,7 @@ public interface MiniFluo extends AutoCloseable {
   /**
    * Retrieves the configuration required to connect to MiniFluo instance.
    */
-  Configuration getClientConfiguration();
+  SimpleConfiguration getClientConfiguration();
 
   /**
    * Waits for all observers to finish. This method is usually called by test code before

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/observer/Observer.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/observer/Observer.java b/modules/api/src/main/java/org/apache/fluo/api/observer/Observer.java
index 138999b..21f6b50 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/observer/Observer.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/observer/Observer.java
@@ -17,9 +17,9 @@ package org.apache.fluo.api.observer;
 
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.client.TransactionBase;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Bytes;
 import org.apache.fluo.api.data.Column;
 
@@ -72,7 +72,7 @@ public interface Observer {
      * @return A configuration object with application configuration like that returned by
      *         {@link FluoClient#getAppConfiguration()}
      */
-    Configuration getAppConfiguration();
+    SimpleConfiguration getAppConfiguration();
 
     /**
      * @return The parameters configured for this observer
@@ -83,7 +83,7 @@ public interface Observer {
 
   /**
    * Implemented by user to initialize Observer.
-   * 
+   *
    * @param context Observer context
    */
   void init(Context context) throws Exception;

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/types/TypeLayer.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/types/TypeLayer.java b/modules/api/src/main/java/org/apache/fluo/api/types/TypeLayer.java
index d80ea76..ca20485 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/types/TypeLayer.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/types/TypeLayer.java
@@ -26,29 +26,29 @@ import org.apache.fluo.api.data.Column;
 /**
  * A simple convenience layer for Fluo. This layer attempts to make the following common operations
  * easier.
- * 
+ *
  * <UL>
  * <LI>Working with different types.
  * <LI>Supplying default values
  * <LI>Dealing with null return types.
  * <LI>Working with row/column and column maps
  * </UL>
- * 
+ *
  * <p>
  * This layer was intentionally loosely coupled with the basic API. This allows other convenience
  * layers for Fluo to build directly on the basic API w/o having to consider the particulars of this
  * layer. Also its expected that integration with other languages may only use the basic API.
  * </p>
- * 
+ *
  * <h3>Using</h3>
- * 
+ *
  * <p>
  * A TypeLayer is created with a certain encoder that is used for converting from bytes to
  * primitives and visa versa. In order to ensure that all of your code uses the same encoder, its
  * probably best to centralize the choice of an encoder within your project. There are many ways do
  * to this, below is an example of one way to centralize and use.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
@@ -57,34 +57,34 @@ import org.apache.fluo.api.data.Column;
  *       super(new MyEncoder());
  *     }
  *   }
- *   
+ * 
  *   public class MyObserver extends TypedObserver {
  *     MyObserver(){
  *       super(new MyTypeLayer());
  *     }
- *     
+ * 
  *     public abstract void process(TypedTransaction tx, Bytes row, Column col){
  *       //do something w/ typed transaction
  *     }
  *   }
- *   
+ * 
  *   public class MyUtil {
  *      //A little util to print out some stuff
  *      public void printStuff(Snapshot snap, byte[] row){
  *        TypedSnapshot tsnap = new MytTypeLayer().wrap(snap);
- *        
+ * 
  *        System.out.println(tsnap.get().row(row).fam("b90000").qual(137).toString("NP"));
- *      } 
+ *      }
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <h3>Working with different types</h3>
- * 
+ *
  * <p>
  * The following example code shows using the basic fluo API with different types.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
@@ -94,13 +94,13 @@ import org.apache.fluo.api.data.Column;
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <p>
  * Alternatively, the same thing can be written using a {@link TypedTransactionBase} in the
  * following way. Because row(), fam(), qual(), and set() each take many different types, this
  * enables many different permutations that would not be achievable with overloading.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
@@ -109,37 +109,37 @@ import org.apache.fluo.api.data.Column;
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <h3>Default values</h3>
- * 
+ *
  * <p>
  * The following example code shows using the basic fluo API to read a value and default to zero if
  * it does not exist.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
  *   void add(Transaction tx, byte[] row, Column col, long amount){
- *     
+ * 
  *     long balance = 0;
  *     Bytes bval = tx.get(Bytes.of(row), col);
  *     if(bval != null)
  *       balance = Long.parseLong(bval.toString());
- *     
+ * 
  *     balance += amount;
- *     
+ * 
  *     tx.set(Bytes.of(row), col, Bytes.of(Long.toString(amount)));
- *     
+ * 
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <p>
  * Alternatively, the same thing can be written using a {@link TypedTransactionBase} in the
  * following way. This code avoids the null check by supplying a default value of zero.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
@@ -150,11 +150,11 @@ import org.apache.fluo.api.data.Column;
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <p>
  * For this particular case, shorter code can be written by using the increment method.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
@@ -163,49 +163,49 @@ import org.apache.fluo.api.data.Column;
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <h3>Null return types</h3>
- * 
+ *
  * <p>
  * When using the basic API, you must ensure the return type is not null before converting a string
  * or long.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
  *   void process(Transaction tx, byte[] row, Column col, long amount) {
  *     Bytes val =  tx.get(Bytes.of(row), col);
  *     if(val == null)
- *       return;   
+ *       return;
  *     long balance = Long.parseLong(val.toString());
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <p>
  * With {@link TypedTransactionBase} if no default value is supplied, then the null is passed
  * through.
  * </p>
- * 
+ *
  * <pre>
  * <code>
  * 
  *   void process(TypedTransaction tx, byte[] r, Column c, long amount){
  *     Long balance =  tx.get().row(r).col(c).toLong();
  *     if(balance == null)
- *       return;   
+ *       return;
  *   }
  * </code>
  * </pre>
- * 
+ *
  * <h3>Defaulted maps</h3>
- * 
+ *
  * <p>
  * The operations that return maps, return defaulted maps which make it easy to specify defaults and
  * avoid null.
  * </p>
- * 
+ *
  * <pre>
  * {@code
  *   // pretend this method has curly braces.  javadoc has issues with less than.
@@ -213,23 +213,23 @@ import org.apache.fluo.api.data.Column;
  *   void process(TypedTransaction tx, byte[] r, Column c1, Column c2, Column c3, long amount)
  * 
  *     Map<Column, Value> columns = tx.get().row(r).columns(c1,c2,c3);
- *     
+ * 
  *     // If c1 does not exist in map, a Value that wraps null will be returned.
  *     // When c1 does not exist val1 will be set to null and no NPE will be thrown.
  *     String val1 = columns.get(c1).toString();
- *     
+ * 
  *     // If c2 does not exist in map, then val2 will be set to empty string.
  *     String val2 = columns.get(c2).toString("");
- *     
+ * 
  *     // If c3 does not exist in map, then val9 will be set to 9.
  *     Long val3 = columns.get(c3).toLong(9);
  * }
  * </pre>
- * 
+ *
  * <p>
  * This also applies to getting sets of rows.
  * </p>
- * 
+ *
  * <pre>
  * {@code
  *   // pretend this method has curly braces.  javadoc has issues with less than.
@@ -239,7 +239,7 @@ import org.apache.fluo.api.data.Column;
  * 
  *     Map<String,Map<Column,Value>> rowCols =
  *        tx.get().rowsString(rows).columns(c1,c2,c3).toStringMap();
- *     
+ * 
  *     // this will set val1 to null if row does not exist in map and/or column does not
  *     // exist in child map
  *     String val1 = rowCols.get("row1").get(c1).toString();
@@ -309,7 +309,7 @@ public class TypeLayer {
    */
   public abstract class SimpleFamilyMethods<R1> {
 
-    protected Data data;
+    Data data;
 
     SimpleFamilyMethods(Data data) {
       this.data = data;
@@ -367,7 +367,7 @@ public class TypeLayer {
    */
   public abstract class QualifierMethods<R> {
 
-    protected Data data;
+    private Data data;
 
     QualifierMethods(Data data) {
       this.data = data;
@@ -408,7 +408,7 @@ public class TypeLayer {
 
     private Data data;
 
-    public VisibilityMethods(Data data) {
+    VisibilityMethods(Data data) {
       this.data = data;
     }
 
@@ -467,7 +467,7 @@ public class TypeLayer {
 
   /**
    * Initiates the chain of calls needed to build a column.
-   * 
+   *
    * @return a column builder
    */
   public CFB bc() {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/types/TypedSnapshotBase.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/types/TypedSnapshotBase.java b/modules/api/src/main/java/org/apache/fluo/api/types/TypedSnapshotBase.java
index c8e30df..95c46a1 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/types/TypedSnapshotBase.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/types/TypedSnapshotBase.java
@@ -58,7 +58,7 @@ public class TypedSnapshotBase implements SnapshotBase {
    */
   public class VisibilityMethods extends Value {
 
-    public VisibilityMethods(Data data) {
+    VisibilityMethods(Data data) {
       super(data);
     }
 
@@ -89,7 +89,7 @@ public class TypedSnapshotBase implements SnapshotBase {
   public class Value {
     private Bytes bytes;
     private boolean gotBytes = false;
-    protected Data data;
+    Data data;
 
     public Bytes getBytes() {
       if (!gotBytes) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/main/java/org/apache/fluo/api/types/TypedTransactionBase.java
----------------------------------------------------------------------
diff --git a/modules/api/src/main/java/org/apache/fluo/api/types/TypedTransactionBase.java b/modules/api/src/main/java/org/apache/fluo/api/types/TypedTransactionBase.java
index 8c12a2f..a45bff1 100644
--- a/modules/api/src/main/java/org/apache/fluo/api/types/TypedTransactionBase.java
+++ b/modules/api/src/main/java/org/apache/fluo/api/types/TypedTransactionBase.java
@@ -44,9 +44,9 @@ public class TypedTransactionBase extends TypedSnapshotBase implements Transacti
   public class Mutator {
 
     private boolean set = false;
-    protected Data data;
+    Data data;
 
-    public Mutator(Data data) {
+    Mutator(Data data) {
       this.data = data;
     }
 
@@ -154,7 +154,7 @@ public class TypedTransactionBase extends TypedSnapshotBase implements Transacti
    */
   public class VisibilityMutator extends Mutator {
 
-    public VisibilityMutator(Data data) {
+    VisibilityMutator(Data data) {
       super(data);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java b/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
index f8fb0c5..8f708f5 100644
--- a/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
+++ b/modules/api/src/test/java/org/apache/fluo/api/config/FluoConfigurationTest.java
@@ -21,11 +21,9 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.NoSuchElementException;
-import java.util.Properties;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import org.apache.commons.configuration.ConfigurationConverter;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -206,20 +204,6 @@ public class FluoConfigurationTest {
     Assert.assertEquals("33", config.getReporterConfiguration("jmx").getString("frequency"));
   }
 
-  @Test
-  public void testMultipleZookeepers() {
-    Properties props = new Properties();
-    props.setProperty(FluoConfiguration.CLIENT_ACCUMULO_ZOOKEEPERS_PROP, "zk1,zk2,zk3");
-    props.setProperty(FluoConfiguration.CLIENT_ZOOKEEPER_CONNECT_PROP, "zk1,zk2,zk3/fluo");
-    props.setProperty(FluoConfiguration.CLIENT_APPLICATION_NAME_PROP, "myapp");
-
-    // ran into a bug where this particular constructor was truncating everything after zk1
-    FluoConfiguration config =
-        new FluoConfiguration(ConfigurationConverter.getConfiguration(props));
-    Assert.assertEquals("zk1,zk2,zk3", config.getAccumuloZookeepers());
-    Assert.assertEquals("zk1,zk2,zk3/fluo/myapp", config.getAppZookeepers());
-  }
-
   private void assertIAE(String value) {
     FluoConfiguration config = new FluoConfiguration();
     try {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/OracleRunnable.java
----------------------------------------------------------------------
diff --git a/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/OracleRunnable.java b/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/OracleRunnable.java
index 5080037..4bdc6d4 100644
--- a/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/OracleRunnable.java
+++ b/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/OracleRunnable.java
@@ -19,7 +19,6 @@ import java.io.File;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.service.FluoOracle;
 import org.apache.fluo.cluster.util.LogbackUtil;

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/WorkerRunnable.java
----------------------------------------------------------------------
diff --git a/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/WorkerRunnable.java b/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/WorkerRunnable.java
index 9b7e6b7..f50dd7a 100644
--- a/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/WorkerRunnable.java
+++ b/modules/cluster/src/main/java/org/apache/fluo/cluster/runnable/WorkerRunnable.java
@@ -19,7 +19,6 @@ import java.io.File;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.service.FluoWorker;
 import org.apache.fluo.cluster.util.LogbackUtil;

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/cluster/src/main/java/org/apache/fluo/cluster/util/ClusterUtil.java
----------------------------------------------------------------------
diff --git a/modules/cluster/src/main/java/org/apache/fluo/cluster/util/ClusterUtil.java b/modules/cluster/src/main/java/org/apache/fluo/cluster/util/ClusterUtil.java
index e182ca9..1d5c675 100644
--- a/modules/cluster/src/main/java/org/apache/fluo/cluster/util/ClusterUtil.java
+++ b/modules/cluster/src/main/java/org/apache/fluo/cluster/util/ClusterUtil.java
@@ -16,15 +16,6 @@
 package org.apache.fluo.cluster.util;
 
 import java.io.File;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.curator.framework.CuratorFramework;
-import org.apache.curator.framework.recipes.cache.ChildData;
-import org.apache.curator.framework.recipes.cache.NodeCache;
-import org.apache.curator.framework.recipes.cache.NodeCacheListener;
-import org.apache.fluo.accumulo.util.ZookeeperPath;
-import org.apache.fluo.core.impl.Environment;
-import org.apache.fluo.core.util.Halt;
 
 public class ClusterUtil {
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/client/FluoAdminImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/client/FluoAdminImpl.java b/modules/core/src/main/java/org/apache/fluo/core/client/FluoAdminImpl.java
index 8d8fa84..8952352 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/client/FluoAdminImpl.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/client/FluoAdminImpl.java
@@ -29,7 +29,6 @@ import com.google.common.base.Preconditions;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.iterators.IteratorUtil;
-import org.apache.commons.configuration.ConfigurationUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.fluo.accumulo.iterators.GarbageCollectionIterator;
 import org.apache.fluo.accumulo.iterators.NotificationIterator;
@@ -208,8 +207,7 @@ public class FluoAdminImpl implements FluoAdmin {
   @Override
   public void updateSharedConfig() {
 
-    logger.info("Setting up observers using app config: {}",
-        ConfigurationUtils.toString(config.subset(FluoConfiguration.APP_PREFIX)));
+    logger.info("Setting up observers using app config: {}", config.getAppConfiguration());
 
     Map<Column, ObserverConfiguration> colObservers = new HashMap<>();
     Map<Column, ObserverConfiguration> weakObservers = new HashMap<>();
@@ -253,7 +251,7 @@ public class FluoAdminImpl implements FluoAdmin {
       if (key.equals(FluoConfiguration.TRANSACTION_ROLLBACK_TIME_PROP)) {
         sharedProps.setProperty(key, Long.toString(config.getLong(key)));
       } else if (key.startsWith(FluoConfiguration.APP_PREFIX)) {
-        sharedProps.setProperty(key, config.getProperty(key).toString());
+        sharedProps.setProperty(key, config.getRawString(key));
       }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/client/FluoClientImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/client/FluoClientImpl.java b/modules/core/src/main/java/org/apache/fluo/core/client/FluoClientImpl.java
index ef676b2..662ef0d 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/client/FluoClientImpl.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/client/FluoClientImpl.java
@@ -17,12 +17,12 @@ package org.apache.fluo.core.client;
 
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.client.LoaderExecutor;
 import org.apache.fluo.api.client.Snapshot;
 import org.apache.fluo.api.client.Transaction;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.impl.Environment;
 import org.apache.fluo.core.impl.TransactionImpl;
 import org.apache.fluo.core.log.TracingTransaction;
@@ -100,7 +100,7 @@ public class FluoClientImpl implements FluoClient {
   }
 
   @Override
-  public Configuration getAppConfiguration() {
+  public SimpleConfiguration getAppConfiguration() {
     return env.getAppConfiguration();
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/client/LoaderExecutorAsyncImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/client/LoaderExecutorAsyncImpl.java b/modules/core/src/main/java/org/apache/fluo/core/client/LoaderExecutorAsyncImpl.java
index 686a6b2..d6f5187 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/client/LoaderExecutorAsyncImpl.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/client/LoaderExecutorAsyncImpl.java
@@ -23,10 +23,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 import com.google.common.util.concurrent.MoreExecutors;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.client.Loader;
 import org.apache.fluo.api.client.LoaderExecutor;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.async.AsyncCommitObserver;
 import org.apache.fluo.core.async.AsyncTransaction;
 import org.apache.fluo.core.impl.Environment;
@@ -109,7 +109,7 @@ public class LoaderExecutorAsyncImpl implements LoaderExecutor {
 
       Loader.Context context = new Loader.Context() {
         @Override
-        public Configuration getAppConfiguration() {
+        public SimpleConfiguration getAppConfiguration() {
           return env.getAppConfiguration();
         }
       };

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/impl/Environment.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/impl/Environment.java b/modules/core/src/main/java/org/apache/fluo/core/impl/Environment.java
index 7eeec2b..94dfcff 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/impl/Environment.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/impl/Environment.java
@@ -32,14 +32,11 @@ import com.google.common.annotations.VisibleForTesting;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.security.Authorizations;
-import org.apache.commons.configuration.BaseConfiguration;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.ConfigurationUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.fluo.accumulo.util.ZookeeperPath;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.config.ObserverConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Column;
 import org.apache.fluo.core.metrics.MetricNames;
 import org.apache.fluo.core.util.AccumuloUtil;
@@ -64,7 +61,7 @@ public class Environment implements AutoCloseable {
   private FluoConfiguration config;
   private SharedResources resources;
   private MetricNames metricNames;
-  private Configuration appConfig;
+  private SimpleConfiguration appConfig;
 
   /**
    * Constructs an environment from given FluoConfiguration
@@ -150,10 +147,15 @@ public class Environment implements AutoCloseable {
       bais = new ByteArrayInputStream(curator.getData().forPath(ZookeeperPath.CONFIG_SHARED));
       Properties sharedProps = new Properties();
       sharedProps.load(bais);
-      Configuration sharedConfig = ConfigurationConverter.getConfiguration(sharedProps);
+
+      FluoConfiguration tmpConfig = new FluoConfiguration();
+      for (String prop : sharedProps.stringPropertyNames()) {
+        config.setProperty(prop, sharedProps.getProperty(prop));
+        tmpConfig.setProperty(prop, sharedProps.getProperty(prop));
+      }
+
       // make sure not to include config passed to env, only want config from zookeeper
-      appConfig = sharedConfig.subset(FluoConfiguration.APP_PREFIX);
-      config.addConfiguration(ConfigurationConverter.getConfiguration(sharedProps));
+      appConfig = tmpConfig.getAppConfiguration();
     } catch (Exception e) {
       throw new IllegalStateException(e);
     }
@@ -260,11 +262,9 @@ public class Environment implements AutoCloseable {
     return metricNames;
   }
 
-  public Configuration getAppConfiguration() {
+  public SimpleConfiguration getAppConfiguration() {
     // TODO create immutable wrapper
-    BaseConfiguration config = new BaseConfiguration();
-    ConfigurationUtils.copy(appConfig, config);
-    return config;
+    return new SimpleConfiguration(appConfig);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterStarter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterStarter.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterStarter.java
index 53d3467..af5d4e6 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterStarter.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterStarter.java
@@ -18,19 +18,19 @@ package org.apache.fluo.core.metrics;
 import java.util.List;
 
 import com.codahale.metrics.MetricRegistry;
-import org.apache.commons.configuration.Configuration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 
 public interface ReporterStarter {
 
   interface Params {
     /**
-     * 
+     *
      * @return Fluo's configuration
      */
-    Configuration getConfiguration();
+    SimpleConfiguration getConfiguration();
 
     /**
-     * 
+     *
      * @return The metric registry used by Fluo
      */
     MetricRegistry getMetricRegistry();
@@ -41,7 +41,7 @@ public interface ReporterStarter {
   /**
    * A fluo extension point that allows configuration of metrics reporters. This method should
    * configure and start reporters.
-   * 
+   *
    * @param params Elements of Fluo environment needed to setup reporters.
    * @return A list of closeables which represent reporters.
    */

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterUtil.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterUtil.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterUtil.java
index 0345e27..8569f42 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterUtil.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/ReporterUtil.java
@@ -20,8 +20,8 @@ import java.util.List;
 import java.util.ServiceLoader;
 
 import com.codahale.metrics.MetricRegistry;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.impl.Environment;
 import org.apache.fluo.core.impl.FluoConfigurationImpl;
 import org.apache.fluo.core.metrics.ReporterStarter.Params;
@@ -46,7 +46,7 @@ public class ReporterUtil {
       List<AutoCloseable> reporters = rs.start(new Params() {
 
         @Override
-        public Configuration getConfiguration() {
+        public SimpleConfiguration getConfiguration() {
           return env.getConfiguration();
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/ConsoleReporterStarter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/ConsoleReporterStarter.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/ConsoleReporterStarter.java
index b3eca96..37c5398 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/ConsoleReporterStarter.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/ConsoleReporterStarter.java
@@ -21,8 +21,8 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.ConsoleReporter;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.metrics.ReporterStarter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,7 +33,7 @@ public class ConsoleReporterStarter implements ReporterStarter {
 
   @Override
   public List<AutoCloseable> start(Params params) {
-    Configuration config =
+    SimpleConfiguration config =
         new FluoConfiguration(params.getConfiguration()).getReporterConfiguration("console");
 
     if (!config.getBoolean("enable", false)) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/CsvReporterStarter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/CsvReporterStarter.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/CsvReporterStarter.java
index 1e49a8f..bd1c2f5 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/CsvReporterStarter.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/CsvReporterStarter.java
@@ -21,8 +21,8 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.CsvReporter;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.metrics.ReporterStarter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,7 +33,7 @@ public class CsvReporterStarter implements ReporterStarter {
 
   @Override
   public List<AutoCloseable> start(Params params) {
-    Configuration config =
+    SimpleConfiguration config =
         new FluoConfiguration(params.getConfiguration()).getReporterConfiguration("csv");
 
     String dir = config.getString("dir", "");

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/GraphiteReporterStarter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/GraphiteReporterStarter.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/GraphiteReporterStarter.java
index 0469f84..f1fb553 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/GraphiteReporterStarter.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/GraphiteReporterStarter.java
@@ -21,8 +21,8 @@ import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.graphite.Graphite;
 import com.codahale.metrics.graphite.GraphiteReporter;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.metrics.ReporterStarter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,7 +33,7 @@ public class GraphiteReporterStarter implements ReporterStarter {
 
   @Override
   public List<AutoCloseable> start(Params params) {
-    Configuration config =
+    SimpleConfiguration config =
         new FluoConfiguration(params.getConfiguration()).getReporterConfiguration("graphite");
 
     if (!config.getBoolean("enable", false)) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/JmxReporterStarter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/JmxReporterStarter.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/JmxReporterStarter.java
index be9a2a5..08ddbef 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/JmxReporterStarter.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/JmxReporterStarter.java
@@ -20,8 +20,8 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.JmxReporter;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.metrics.ReporterStarter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,7 @@ public class JmxReporterStarter implements ReporterStarter {
 
   @Override
   public List<AutoCloseable> start(Params params) {
-    Configuration config =
+    SimpleConfiguration config =
         new FluoConfiguration(params.getConfiguration()).getReporterConfiguration("jmx");
 
     if (!config.getBoolean("enable", false)) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/Slf4jReporterStarter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/Slf4jReporterStarter.java b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/Slf4jReporterStarter.java
index 3b083f3..e38f6b1 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/Slf4jReporterStarter.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/metrics/starters/Slf4jReporterStarter.java
@@ -20,8 +20,8 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.Slf4jReporter;
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.core.metrics.ReporterStarter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,7 @@ public class Slf4jReporterStarter implements ReporterStarter {
 
   @Override
   public List<AutoCloseable> start(Params params) {
-    Configuration config =
+    SimpleConfiguration config =
         new FluoConfiguration(params.getConfiguration()).getReporterConfiguration("slf4j");
 
     if (!config.getBoolean("enable", false)) {

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/worker/NotificationFinderFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/worker/NotificationFinderFactory.java b/modules/core/src/main/java/org/apache/fluo/core/worker/NotificationFinderFactory.java
index d9f4292..92b0382 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/worker/NotificationFinderFactory.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/worker/NotificationFinderFactory.java
@@ -15,12 +15,12 @@
 
 package org.apache.fluo.core.worker;
 
-import org.apache.commons.configuration.Configuration;
+import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.core.impl.FluoConfigurationImpl;
 import org.apache.fluo.core.worker.finder.hash.HashNotificationFinder;
 
 public class NotificationFinderFactory {
-  public static NotificationFinder newNotificationFinder(Configuration conf) {
+  public static NotificationFinder newNotificationFinder(FluoConfiguration conf) {
     String clazz =
         conf.getString(FluoConfigurationImpl.WORKER_FINDER_PROP,
             HashNotificationFinder.class.getName());

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/core/src/main/java/org/apache/fluo/core/worker/ObserverContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/fluo/core/worker/ObserverContext.java b/modules/core/src/main/java/org/apache/fluo/core/worker/ObserverContext.java
index d29f917..9d9c5a7 100644
--- a/modules/core/src/main/java/org/apache/fluo/core/worker/ObserverContext.java
+++ b/modules/core/src/main/java/org/apache/fluo/core/worker/ObserverContext.java
@@ -17,17 +17,17 @@ package org.apache.fluo.core.worker;
 
 import java.util.Map;
 
-import org.apache.commons.configuration.Configuration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.observer.Observer;
 import org.apache.fluo.core.impl.Environment;
 
 public class ObserverContext implements Observer.Context {
 
   private final Map<String, String> params;
-  private final Configuration appConfig;
+  private final SimpleConfiguration appConfig;
   private final Environment env;
 
-  public ObserverContext(Configuration appConfig, Map<String, String> params) {
+  public ObserverContext(SimpleConfiguration appConfig, Map<String, String> params) {
     this.appConfig = appConfig;
     this.params = params;
     this.env = null;
@@ -40,7 +40,7 @@ public class ObserverContext implements Observer.Context {
   }
 
   @Override
-  public Configuration getAppConfiguration() {
+  public SimpleConfiguration getAppConfiguration() {
     if (env == null) {
       return appConfig;
     }

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/integration/src/test/java/org/apache/fluo/integration/ITBaseMini.java
----------------------------------------------------------------------
diff --git a/modules/integration/src/test/java/org/apache/fluo/integration/ITBaseMini.java b/modules/integration/src/test/java/org/apache/fluo/integration/ITBaseMini.java
index ab84649..0721475 100644
--- a/modules/integration/src/test/java/org/apache/fluo/integration/ITBaseMini.java
+++ b/modules/integration/src/test/java/org/apache/fluo/integration/ITBaseMini.java
@@ -17,11 +17,11 @@ package org.apache.fluo.integration;
 
 import java.util.concurrent.TimeUnit;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.client.FluoAdmin;
 import org.apache.fluo.api.client.FluoAdmin.InitOpts;
 import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.mini.MiniFluo;
 import org.junit.After;
 import org.junit.Before;
@@ -33,7 +33,7 @@ public class ITBaseMini extends ITBase {
 
   protected static MiniFluo miniFluo;
 
-  protected void setAppConfig(Configuration config) {}
+  protected void setAppConfig(SimpleConfiguration config) {}
 
   protected void setConfig(FluoConfiguration config) {}
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/integration/src/test/java/org/apache/fluo/integration/impl/AppConfigIT.java
----------------------------------------------------------------------
diff --git a/modules/integration/src/test/java/org/apache/fluo/integration/impl/AppConfigIT.java b/modules/integration/src/test/java/org/apache/fluo/integration/impl/AppConfigIT.java
index b649664..fedacbf 100644
--- a/modules/integration/src/test/java/org/apache/fluo/integration/impl/AppConfigIT.java
+++ b/modules/integration/src/test/java/org/apache/fluo/integration/impl/AppConfigIT.java
@@ -18,12 +18,12 @@ package org.apache.fluo.integration.impl;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.commons.configuration.Configuration;
 import org.apache.fluo.api.client.FluoAdmin;
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.client.LoaderExecutor;
 import org.apache.fluo.api.config.ObserverConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Bytes;
 import org.apache.fluo.api.data.Column;
 import org.apache.fluo.api.types.StringEncoder;
@@ -39,7 +39,7 @@ import org.junit.Test;
 public class AppConfigIT extends ITBaseMini {
 
   @Override
-  protected void setAppConfig(Configuration config) {
+  protected void setAppConfig(SimpleConfiguration config) {
     config.setProperty("myapp.sizeLimit", 50000);
   }
 
@@ -50,14 +50,14 @@ public class AppConfigIT extends ITBaseMini {
 
   @Test
   public void testBasic() {
-    Configuration uc = client.getAppConfiguration();
+    SimpleConfiguration uc = client.getAppConfiguration();
     Assert.assertEquals(50000, uc.getInt("myapp.sizeLimit"));
     uc.setProperty("myapp.sizeLimit", 3);
     uc = client.getAppConfiguration();
     Assert.assertEquals(50000, uc.getInt("myapp.sizeLimit"));
 
     // update shared config
-    Configuration appConfig = config.getAppConfiguration();
+    SimpleConfiguration appConfig = config.getAppConfiguration();
     appConfig.clear();
     appConfig.setProperty("myapp.sizeLimit", 40000);
     appConfig.setProperty("myapp.timeLimit", 30000);

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoEntryInputFormat.java
----------------------------------------------------------------------
diff --git a/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoEntryInputFormat.java b/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoEntryInputFormat.java
index 8cef3e8..bdea299 100644
--- a/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoEntryInputFormat.java
+++ b/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoEntryInputFormat.java
@@ -25,11 +25,9 @@ import java.util.Map.Entry;
 import org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat;
 import org.apache.accumulo.core.client.mapreduce.RangeInputSplit;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.config.ScannerConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Bytes;
 import org.apache.fluo.api.data.Column;
 import org.apache.fluo.api.data.RowColumn;
@@ -103,10 +101,8 @@ public class FluoEntryInputFormat extends InputFormat<RowColumn, Bytes> {
           ByteArrayInputStream bais =
               new ByteArrayInputStream(context.getConfiguration().get(PROPS_CONF_KEY)
                   .getBytes(StandardCharsets.UTF_8));
-          PropertiesConfiguration props = new PropertiesConfiguration();
-          props.load(bais);
 
-          env = new Environment(new FluoConfiguration(props));
+          env = new Environment(new FluoConfiguration(bais));
 
           ti = new TransactionImpl(env, context.getConfiguration().getLong(TIMESTAMP_CONF_KEY, -1));
 
@@ -157,7 +153,7 @@ public class FluoEntryInputFormat extends InputFormat<RowColumn, Bytes> {
    * @param config use {@link FluoConfiguration} to configure programmatically
    */
   @SuppressWarnings("deprecation")
-  public static void configure(Job conf, Configuration config) {
+  public static void configure(Job conf, SimpleConfiguration config) {
     try {
       FluoConfiguration fconfig = new FluoConfiguration(config);
       try (Environment env = new Environment(fconfig)) {
@@ -166,7 +162,7 @@ public class FluoEntryInputFormat extends InputFormat<RowColumn, Bytes> {
         conf.getConfiguration().setLong(TIMESTAMP_CONF_KEY, ts);
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ConfigurationConverter.getProperties(config).store(baos, "");
+        config.save(baos);
         conf.getConfiguration().set(PROPS_CONF_KEY,
             new String(baos.toByteArray(), StandardCharsets.UTF_8));
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoOutputFormat.java
----------------------------------------------------------------------
diff --git a/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoOutputFormat.java b/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoOutputFormat.java
index 32a784d..a5b2b28 100644
--- a/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoOutputFormat.java
+++ b/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoOutputFormat.java
@@ -19,14 +19,13 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.Properties;
 
-import org.apache.commons.configuration.ConfigurationConverter;
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.client.Loader;
 import org.apache.fluo.api.client.LoaderExecutor;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.hadoop.io.NullWritable;
 import org.apache.hadoop.mapreduce.Job;
 import org.apache.hadoop.mapreduce.JobContext;
@@ -81,11 +80,8 @@ public class FluoOutputFormat extends OutputFormat<Loader, NullWritable> {
     ByteArrayInputStream bais =
         new ByteArrayInputStream(context.getConfiguration().get(PROPS_CONF_KEY)
             .getBytes(StandardCharsets.UTF_8));
-    Properties props = new Properties();
-    props.load(bais);
 
-    FluoConfiguration config =
-        new FluoConfiguration(ConfigurationConverter.getConfiguration(props));
+    FluoConfiguration config = new FluoConfiguration(bais);
 
     try {
       final FluoClient client = FluoFactory.newClient(config);
@@ -120,11 +116,11 @@ public class FluoOutputFormat extends OutputFormat<Loader, NullWritable> {
    * @param props Use {@link org.apache.fluo.api.config.FluoConfiguration} to set props
    *        programmatically
    */
-  public static void configure(Job conf, Properties props) {
+  public static void configure(Job conf, SimpleConfiguration props) {
     try {
 
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
-      props.store(baos, "");
+      props.save(baos);
 
       conf.getConfiguration().set(PROPS_CONF_KEY,
           new String(baos.toByteArray(), StandardCharsets.UTF_8));

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoRowInputFormat.java
----------------------------------------------------------------------
diff --git a/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoRowInputFormat.java b/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoRowInputFormat.java
index 962007f..c32b9fc 100644
--- a/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoRowInputFormat.java
+++ b/modules/mapreduce/src/main/java/org/apache/fluo/mapreduce/FluoRowInputFormat.java
@@ -25,11 +25,9 @@ import java.util.Map.Entry;
 import org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat;
 import org.apache.accumulo.core.client.mapreduce.RangeInputSplit;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.fluo.api.config.ScannerConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.data.Bytes;
 import org.apache.fluo.api.data.Span;
 import org.apache.fluo.api.iterator.ColumnIterator;
@@ -98,10 +96,8 @@ public class FluoRowInputFormat extends InputFormat<Bytes, ColumnIterator> {
           ByteArrayInputStream bais =
               new ByteArrayInputStream(context.getConfiguration().get(PROPS_CONF_KEY)
                   .getBytes(StandardCharsets.UTF_8));
-          PropertiesConfiguration props = new PropertiesConfiguration();
-          props.load(bais);
 
-          env = new Environment(new FluoConfiguration(props));
+          env = new Environment(new FluoConfiguration(bais));
 
           ti = new TransactionImpl(env, context.getConfiguration().getLong(TIMESTAMP_CONF_KEY, -1));
 
@@ -145,7 +141,7 @@ public class FluoRowInputFormat extends InputFormat<Bytes, ColumnIterator> {
    *        programmatically
    */
   @SuppressWarnings("deprecation")
-  public static void configure(Job conf, Configuration config) {
+  public static void configure(Job conf, SimpleConfiguration config) {
     try {
       FluoConfiguration fconfig = new FluoConfiguration(config);
       try (Environment env = new Environment(fconfig)) {
@@ -154,7 +150,7 @@ public class FluoRowInputFormat extends InputFormat<Bytes, ColumnIterator> {
         conf.getConfiguration().setLong(TIMESTAMP_CONF_KEY, ts);
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ConfigurationConverter.getProperties(config).store(baos, "");
+        config.save(baos);
         conf.getConfiguration().set(PROPS_CONF_KEY,
             new String(baos.toByteArray(), StandardCharsets.UTF_8));
 

http://git-wip-us.apache.org/repos/asf/incubator-fluo/blob/7f85e282/modules/mini/src/main/java/org/apache/fluo/mini/MiniFluoImpl.java
----------------------------------------------------------------------
diff --git a/modules/mini/src/main/java/org/apache/fluo/mini/MiniFluoImpl.java b/modules/mini/src/main/java/org/apache/fluo/mini/MiniFluoImpl.java
index 1c86a7e..6a6ff40 100644
--- a/modules/mini/src/main/java/org/apache/fluo/mini/MiniFluoImpl.java
+++ b/modules/mini/src/main/java/org/apache/fluo/mini/MiniFluoImpl.java
@@ -27,12 +27,11 @@ import com.google.common.util.concurrent.Uninterruptibles;
 import org.apache.accumulo.core.client.Scanner;
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
 import org.apache.accumulo.minicluster.MiniAccumuloConfig;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.fluo.api.client.FluoAdmin;
 import org.apache.fluo.api.client.FluoAdmin.InitOpts;
 import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
+import org.apache.fluo.api.config.SimpleConfiguration;
 import org.apache.fluo.api.mini.MiniFluo;
 import org.apache.fluo.core.client.FluoClientImpl;
 import org.apache.fluo.core.impl.Environment;
@@ -136,9 +135,7 @@ public class MiniFluoImpl implements MiniFluo {
       }
 
       File miniProps = new File(clientPropsPath(config));
-      PropertiesConfiguration connConfig = new PropertiesConfiguration();
-      connConfig.append(config.getClientConfiguration());
-      connConfig.save(miniProps);
+      config.getClientConfiguration().save(miniProps);
 
       log.debug("Wrote MiniFluo client properties to {}", miniProps.getAbsolutePath());
 
@@ -148,7 +145,7 @@ public class MiniFluoImpl implements MiniFluo {
   }
 
   @Override
-  public Configuration getClientConfiguration() {
+  public SimpleConfiguration getClientConfiguration() {
     return config.getClientConfiguration();
   }