diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
index fdd93c3..6c06d1f 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
@@ -31,213 +31,215 @@
 
     /**
      * Returns a set of all tables names.
+     *
      * @return A completable future to be completed with the result once complete.
      */
     CompletableFuture<Set<String>> tableNames();
 
     /**
      * Returns a mapping from counter name to next value.
+     *
      * @return A completable future to be completed with the result once complete.
      */
     CompletableFuture<Map<String, Long>> counters();
 
-  /**
-   * Gets the table size.
-   *
-   * @param tableName table name
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Integer> size(String tableName);
+    /**
+     * Gets the table size.
+     *
+     * @param tableName table name
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Integer> size(String tableName);
 
-  /**
-   * Checks whether the table is empty.
-   *
-   * @param tableName table name
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Boolean> isEmpty(String tableName);
+    /**
+     * Checks whether the table is empty.
+     *
+     * @param tableName table name
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Boolean> isEmpty(String tableName);
 
-  /**
-   * Checks whether the table contains a key.
-   *
-   * @param tableName table name
-   * @param key The key to check.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Boolean> containsKey(String tableName, K key);
+    /**
+     * Checks whether the table contains a key.
+     *
+     * @param tableName table name
+     * @param key       The key to check.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Boolean> containsKey(String tableName, K key);
 
-  /**
-   * Checks whether the table contains a value.
-   *
-   * @param tableName table name
-   * @param value The value to check.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Boolean> containsValue(String tableName, V value);
+    /**
+     * Checks whether the table contains a value.
+     *
+     * @param tableName table name
+     * @param value     The value to check.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Boolean> containsValue(String tableName, V value);
 
-  /**
-   * Gets a value from the table.
-   *
-   * @param tableName table name
-   * @param key The key to get.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Versioned<V>> get(String tableName, K key);
+    /**
+     * Gets a value from the table.
+     *
+     * @param tableName table name
+     * @param key       The key to get.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Versioned<V>> get(String tableName, K key);
 
-  /**
-   * Puts a value in the table.
-   *
-   * @param tableName table name
-   * @param key The key to set.
-   * @param value The value to set.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Versioned<V>>> put(String tableName, K key, V value);
+    /**
+     * Puts a value in the table.
+     *
+     * @param tableName table name
+     * @param key       The key to set.
+     * @param value     The value to set.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Versioned<V>>> put(String tableName, K key, V value);
 
-  /**
-   * Removes a value from the table.
-   *
-   * @param tableName table name
-   * @param key The key to remove.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Versioned<V>>> remove(String tableName, K key);
+    /**
+     * Removes a value from the table.
+     *
+     * @param tableName table name
+     * @param key       The key to remove.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Versioned<V>>> remove(String tableName, K key);
 
-  /**
-   * Clears the table.
-   *
-   * @param tableName table name
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Void>> clear(String tableName);
+    /**
+     * Clears the table.
+     *
+     * @param tableName table name
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Void>> clear(String tableName);
 
-  /**
-   * Gets a set of keys in the table.
-   *
-   * @param tableName table name
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Set<K>> keySet(String tableName);
+    /**
+     * Gets a set of keys in the table.
+     *
+     * @param tableName table name
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Set<K>> keySet(String tableName);
 
-  /**
-   * Gets a collection of values in the table.
-   *
-   * @param tableName table name
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Collection<Versioned<V>>> values(String tableName);
+    /**
+     * Gets a collection of values in the table.
+     *
+     * @param tableName table name
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Collection<Versioned<V>>> values(String tableName);
 
-  /**
-   * Gets a set of entries in the table.
-   *
-   * @param tableName table name
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Set<Map.Entry<K, Versioned<V>>>> entrySet(String tableName);
+    /**
+     * Gets a set of entries in the table.
+     *
+     * @param tableName table name
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Set<Map.Entry<K, Versioned<V>>>> entrySet(String tableName);
 
-  /**
-   * Puts a value in the table if the given key does not exist.
-   *
-   * @param tableName table name
-   * @param key The key to set.
-   * @param value The value to set if the given key does not exist.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Versioned<V>>> putIfAbsent(String tableName, K key, V value);
+    /**
+     * Puts a value in the table if the given key does not exist.
+     *
+     * @param tableName table name
+     * @param key       The key to set.
+     * @param value     The value to set if the given key does not exist.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Versioned<V>>> putIfAbsent(String tableName, K key, V value);
 
-  /**
-   * Removes a key and if the existing value for that key matches the specified value.
-   *
-   * @param tableName table name
-   * @param key The key to remove.
-   * @param value The value to remove.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Boolean>> remove(String tableName, K key, V value);
+    /**
+     * Removes a key and if the existing value for that key matches the specified value.
+     *
+     * @param tableName table name
+     * @param key       The key to remove.
+     * @param value     The value to remove.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Boolean>> remove(String tableName, K key, V value);
 
-  /**
-   * Removes a key and if the existing version for that key matches the specified version.
-   *
-   * @param tableName table name
-   * @param key The key to remove.
-   * @param version The expected version.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Boolean>> remove(String tableName, K key, long version);
+    /**
+     * Removes a key and if the existing version for that key matches the specified version.
+     *
+     * @param tableName table name
+     * @param key       The key to remove.
+     * @param version   The expected version.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Boolean>> remove(String tableName, K key, long version);
 
-  /**
-   * Replaces the entry for the specified key only if currently mapped to the specified value.
-   *
-   * @param tableName table name
-   * @param key The key to replace.
-   * @param oldValue The value to replace.
-   * @param newValue The value with which to replace the given key and value.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Boolean>> replace(String tableName, K key, V oldValue, V newValue);
+    /**
+     * Replaces the entry for the specified key only if currently mapped to the specified value.
+     *
+     * @param tableName table name
+     * @param key       The key to replace.
+     * @param oldValue  The value to replace.
+     * @param newValue  The value with which to replace the given key and value.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Boolean>> replace(String tableName, K key, V oldValue, V newValue);
 
-  /**
-   * Replaces the entry for the specified key only if currently mapped to the specified version.
-   *
-   * @param tableName table name
-   * @param key The key to update
-   * @param oldVersion existing version in the map for this replace to succeed.
-   * @param newValue The value with which to replace the given key and version.
-   * @return A completable future to be completed with the result once complete.
-   */
-  CompletableFuture<Result<Boolean>> replace(String tableName, K key, long oldVersion, V newValue);
+    /**
+     * Replaces the entry for the specified key only if currently mapped to the specified version.
+     *
+     * @param tableName  table name
+     * @param key        The key to update
+     * @param oldVersion existing version in the map for this replace to succeed.
+     * @param newValue   The value with which to replace the given key and version.
+     * @return A completable future to be completed with the result once complete.
+     */
+    CompletableFuture<Result<Boolean>> replace(String tableName, K key, long oldVersion, V newValue);
 
-  /**
-   * Returns the next value for the specified atomic counter after
-   * incrementing the current value by one.
-   *
-   * @param counterName counter name
-   * @return next value for the specified counter
-   */
-  CompletableFuture<Long> nextValue(String counterName);
+    /**
+     * Returns the next value for the specified atomic counter after
+     * incrementing the current value by one.
+     *
+     * @param counterName counter name
+     * @return next value for the specified counter
+     */
+    CompletableFuture<Long> nextValue(String counterName);
 
-  /**
-   * Returns the current value for the specified atomic counter.
-   *
-   * @param counterName counter name
-   * @return current value for the specified counter
-   */
-  CompletableFuture<Long> currentValue(String counterName);
+    /**
+     * Returns the current value for the specified atomic counter.
+     *
+     * @param counterName counter name
+     * @return current value for the specified counter
+     */
+    CompletableFuture<Long> currentValue(String counterName);
 
-  /**
-   * Prepare and commit the specified transaction.
-   *
-   * @param transaction transaction to commit (after preparation)
-   * @return A completable future to be completed with the result once complete
-   */
-  CompletableFuture<Boolean> prepareAndCommit(Transaction transaction);
+    /**
+     * Prepare and commit the specified transaction.
+     *
+     * @param transaction transaction to commit (after preparation)
+     * @return A completable future to be completed with the result once complete
+     */
+    CompletableFuture<Boolean> prepareAndCommit(Transaction transaction);
 
-  /**
-   * Prepare the specified transaction for commit. A successful prepare implies
-   * all the affected resources are locked thus ensuring no concurrent updates can interfere.
-   *
-   * @param transaction transaction to prepare (for commit)
-   * @return A completable future to be completed with the result once complete. The future is completed
-   * with true if the transaction is successfully prepared i.e. all pre-conditions are met and
-   * applicable resources locked.
-   */
-  CompletableFuture<Boolean> prepare(Transaction transaction);
+    /**
+     * Prepare the specified transaction for commit. A successful prepare implies
+     * all the affected resources are locked thus ensuring no concurrent updates can interfere.
+     *
+     * @param transaction transaction to prepare (for commit)
+     * @return A completable future to be completed with the result once complete. The future is completed
+     * with true if the transaction is successfully prepared i.e. all pre-conditions are met and
+     * applicable resources locked.
+     */
+    CompletableFuture<Boolean> prepare(Transaction transaction);
 
-  /**
-   * Commit the specified transaction. A successful commit implies
-   * all the updates are applied, are now durable and are now visible externally.
-   *
-   * @param transaction transaction to commit
-   * @return A completable future to be completed with the result once complete
-   */
-  CompletableFuture<Boolean> commit(Transaction transaction);
+    /**
+     * Commit the specified transaction. A successful commit implies
+     * all the updates are applied, are now durable and are now visible externally.
+     *
+     * @param transaction transaction to commit
+     * @return A completable future to be completed with the result once complete
+     */
+    CompletableFuture<Boolean> commit(Transaction transaction);
 
-  /**
-   * Rollback the specified transaction. A successful rollback implies
-   * all previously acquired locks for the affected resources are released.
-   *
-   * @param transaction transaction to rollback
-   * @return A completable future to be completed with the result once complete
-   */
-  CompletableFuture<Boolean> rollback(Transaction transaction);
+    /**
+     * Rollback the specified transaction. A successful rollback implies
+     * all previously acquired locks for the affected resources are released.
+     *
+     * @param transaction transaction to rollback
+     * @return A completable future to be completed with the result once complete
+     */
+    CompletableFuture<Boolean> rollback(Transaction transaction);
 }
