diff --git a/util/src/kvdb.rs b/util/src/kvdb.rs
new file mode 100644
index 000000000..a5691bcba
--- /dev/null
+++ b/util/src/kvdb.rs
@@ -0,0 +1,150 @@
+// Copyright 2015, 2016 Ethcore (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+//! Key-Value store abstraction with rocksb backend.
+
+use rocksdb::{DB, Writable, WriteBatch, IteratorMode, DBVector, DBIterator,
+ IndexType, Options, DBCompactionStyle, BlockBasedOptions, Direction};
+
+/// Write transaction. Batches a sequence of put/delete operations for efficiency.
+pub struct DBTransaction {
+ batch: WriteBatch,
+}
+
+impl DBTransaction {
+ /// Create new transaction.
+ pub fn new() -> DBTransaction {
+ DBTransaction { batch: WriteBatch::new() }
+ }
+
+ /// Insert a ket-value pair in the transaction. Any existing value value will be overwritten upon write.
+ pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> {
+ self.batch.put(key, value)
+ }
+
+ /// Delete value by key.
+ pub fn delete(&self, key: &[u8]) -> Result<(), String> {
+ self.batch.delete(key)
+ }
+}
+
+/// Database configuration
+pub struct DatabaseConfig {
+ /// Optional prefix size in bytes. Allows lookup by partial key.
+ pub prefix_size: Option
+}
+
+/// Database iterator
+pub struct DatabaseIterator<'a> {
+ iter: DBIterator<'a>,
+}
+
+impl<'a> Iterator for DatabaseIterator<'a> {
+ type Item = (Box<[u8]>, Box<[u8]>);
+
+ #[allow(type_complexity)]
+ fn next(&mut self) -> Option<(Box<[u8]>, Box<[u8]>)> {
+ self.iter.next()
+ }
+}
+
+/// Key-Value database.
+pub struct Database {
+ db: DB,
+}
+
+impl Database {
+ /// Open database with default settings.
+ pub fn open_default(path: &str) -> Result {
+ Database::open(DatabaseConfig { prefix_size: None }, path)
+ }
+
+ /// Open database file. Creates if it does not exist.
+ pub fn open(config: DatabaseConfig, path: &str) -> Result {
+ let mut opts = Options::new();
+ opts.set_max_open_files(256);
+ opts.create_if_missing(true);
+ opts.set_use_fsync(false);
+ opts.set_compaction_style(DBCompactionStyle::DBUniversalCompaction);
+ /*
+ opts.set_bytes_per_sync(8388608);
+ opts.set_disable_data_sync(false);
+ opts.set_block_cache_size_mb(1024);
+ opts.set_table_cache_num_shard_bits(6);
+ opts.set_max_write_buffer_number(32);
+ opts.set_write_buffer_size(536870912);
+ opts.set_target_file_size_base(1073741824);
+ opts.set_min_write_buffer_number_to_merge(4);
+ opts.set_level_zero_stop_writes_trigger(2000);
+ opts.set_level_zero_slowdown_writes_trigger(0);
+ opts.set_compaction_style(DBUniversalCompaction);
+ opts.set_max_background_compactions(4);
+ opts.set_max_background_flushes(4);
+ opts.set_filter_deletes(false);
+ opts.set_disable_auto_compactions(false);*/
+
+ if let Some(size) = config.prefix_size {
+ let mut block_opts = BlockBasedOptions::new();
+ block_opts.set_index_type(IndexType::HashSearch);
+ opts.set_block_based_table_factory(&block_opts);
+ opts.set_prefix_extractor_fixed_size(size);
+ }
+ let db = try!(DB::open(&opts, path));
+ Ok(Database { db: db })
+ }
+
+ /// Insert a ket-value pair in the transaction. Any existing value value will be overwritten.
+ pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> {
+ self.db.put(key, value)
+ }
+
+ /// Delete value by key.
+ pub fn delete(&self, key: &[u8]) -> Result<(), String> {
+ self.db.delete(key)
+ }
+
+ /// Commit transaction to database.
+ pub fn write(&self, tr: DBTransaction) -> Result<(), String> {
+ self.db.write(tr.batch)
+ }
+
+ /// Get value by key.
+ pub fn get(&self, key: &[u8]) -> Result