diff --git a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java
index 41a4d5625d1702392bdb157e340635c3695fec19..32dfb34d732d3dafef624c01c5d0acd017734b18 100644
--- a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java
+++ b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/bma/BlockchainBlock.java
@@ -52,7 +52,7 @@ public class BlockchainBlock implements Serializable {
     private String parameters;
     private String previousHash;
     private String previousIssuer;
-    private Integer dividend;
+    private BigInteger dividend;
     private String[] membersChanges;
     private Identity[] identities;
     private Joiner[] joiners;
@@ -162,10 +162,10 @@ public class BlockchainBlock implements Serializable {
     public void setPreviousIssuer(String previousIssuer) {
         this.previousIssuer = previousIssuer;
     }
-    public Integer getDividend() {
+    public BigInteger getDividend() {
         return dividend;
     }
-    public void setDividend(Integer dividend) {
+    public void setDividend(BigInteger dividend) {
         this.dividend = dividend;
     }
     public Identity[] getIdentities() {
diff --git a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java
index bc9a7c5f59731fb0df6530e38349c4571ed9640f..736d356f160fcca4ab1659aa93eedae3ed862ca5 100644
--- a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java
+++ b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Currency.java
@@ -33,6 +33,8 @@ import java.io.Serializable;
  */
 public class Currency implements Serializable {
 
+    public static final String PROPERTY_CURRENCY_NAME="currencyName";
+
     private String currencyName;
     private Integer membersCount;
     private String firstBlockSignature;
diff --git a/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Record.java b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Record.java
new file mode 100644
index 0000000000000000000000000000000000000000..dda9af3248c44e0172ea4cfbd977e27080f93571
--- /dev/null
+++ b/ucoinj-core-client/src/main/java/io/ucoin/ucoinj/core/client/model/elasticsearch/Record.java
@@ -0,0 +1,39 @@
+package io.ucoin.ucoinj.core.client.model.elasticsearch;
+
+/**
+ * Created by blavenie on 01/03/16.
+ */
+public class Record {
+
+    public static final String PROPERTY_ISSUER="issuer";
+    public static final String PROPERTY_HASH="hash";
+    public static final String PROPERTY_SIGNATURE="signature";
+
+    private String issuer;
+    private String hash;
+    private String signature;
+
+    public String getIssuer() {
+        return issuer;
+    }
+
+    public void setIssuer(String issuer) {
+        this.issuer = issuer;
+    }
+
+    public String getHash() {
+        return hash;
+    }
+
+    public void setHash(String hash) {
+        this.hash = hash;
+    }
+
+    public String getSignature() {
+        return signature;
+    }
+
+    public void setSignature(String signature) {
+        this.signature = signature;
+    }
+}
diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java
index af97463d16628aae8631bf3f140b145a7e2acd08..fa946fddf67a22d5bc39362edf9def8a84b5ee5c 100644
--- a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java
+++ b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/RestModule.java
@@ -1,7 +1,8 @@
 package io.ucoin.ucoinj.elasticsearch.action;
 
 import io.ucoin.ucoinj.elasticsearch.action.currency.RestCurrencyIndexAction;
-import io.ucoin.ucoinj.elasticsearch.action.product.RestRecordIndexAction;
+import io.ucoin.ucoinj.elasticsearch.action.market.RestMarketRecordIndexAction;
+import io.ucoin.ucoinj.elasticsearch.action.registry.RestRegistryRecordIndexAction;
 import io.ucoin.ucoinj.elasticsearch.action.security.RestSecurityAuthAction;
 import io.ucoin.ucoinj.elasticsearch.action.security.RestSecurityGetChallengeAction;
 import org.elasticsearch.common.inject.AbstractModule;
@@ -12,7 +13,9 @@ public class RestModule extends AbstractModule implements Module {
     @Override protected void configure() {
         bind(RestCurrencyIndexAction.class).asEagerSingleton();
 
-        bind(RestRecordIndexAction.class).asEagerSingleton();
+        bind(RestMarketRecordIndexAction.class).asEagerSingleton();
+
+        bind(RestRegistryRecordIndexAction.class).asEagerSingleton();
 
         bind(RestSecurityGetChallengeAction.class).asEagerSingleton();
         bind(RestSecurityAuthAction.class).asEagerSingleton();
diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/market/RestMarketRecordIndexAction.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/market/RestMarketRecordIndexAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f2addb0870c0a528d42b4c897f395135c06b5c2
--- /dev/null
+++ b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/market/RestMarketRecordIndexAction.java
@@ -0,0 +1,43 @@
+package io.ucoin.ucoinj.elasticsearch.action.market;
+
+import io.ucoin.ucoinj.core.exception.BusinessException;
+import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.inject.Inject;
+import org.elasticsearch.common.logging.ESLogger;
+import org.elasticsearch.common.logging.ESLoggerFactory;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.rest.*;
+
+import static org.elasticsearch.rest.RestRequest.Method.POST;
+import static org.elasticsearch.rest.RestStatus.BAD_REQUEST;
+import static org.elasticsearch.rest.RestStatus.OK;
+
+public class RestMarketRecordIndexAction extends BaseRestHandler {
+
+    private static final ESLogger log = ESLoggerFactory.getLogger(RestMarketRecordIndexAction.class.getName());
+
+    @Inject
+    public RestMarketRecordIndexAction(Settings settings, RestController controller, Client client) {
+        super(settings, controller, client);
+        controller.registerHandler(POST, "/market/record", this);
+    }
+
+    @Override
+    protected void handleRequest(final RestRequest request, RestChannel restChannel, Client client) throws Exception {
+
+        try {
+            String recordId = ServiceLocator.instance().getMarketRecordIndexerService().indexRecordFromJson(request.content().toUtf8());
+
+            restChannel.sendResponse(new BytesRestResponse(OK, recordId));
+        }
+        catch(BusinessException e) {
+            log.error(e.getMessage(), e);
+            restChannel.sendResponse(new BytesRestResponse(BAD_REQUEST, String.format("{error: {ucode: 'XXX', message:'%s'}}", e.getMessage())));
+        }
+        catch(Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/product/RestRecordIndexAction.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/product/RestRecordIndexAction.java
deleted file mode 100644
index ccb682c85416db4ddd72305faa9b22c8e949c8b5..0000000000000000000000000000000000000000
--- a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/product/RestRecordIndexAction.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package io.ucoin.ucoinj.elasticsearch.action.product;
-
-import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator;
-import org.elasticsearch.client.Client;
-import org.elasticsearch.common.inject.Inject;
-import org.elasticsearch.common.logging.ESLogger;
-import org.elasticsearch.common.logging.ESLoggerFactory;
-import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.rest.*;
-
-import static org.elasticsearch.rest.RestRequest.Method.POST;
-import static org.elasticsearch.rest.RestStatus.OK;
-
-public class RestRecordIndexAction extends BaseRestHandler {
-
-    private static final ESLogger log = ESLoggerFactory.getLogger(RestRecordIndexAction.class.getName());
-
-    @Inject
-    public RestRecordIndexAction(Settings settings, RestController controller, Client client) {
-        super(settings, controller, client);
-        controller.registerHandler(POST, "/store/record", this);
-    }
-
-    @Override
-    protected void handleRequest(final RestRequest request, RestChannel restChannel, Client client) throws Exception {
-
-        String productId = ServiceLocator.instance().getRecordIndexerService().indexRecordFromJson(request.content().toUtf8());
-
-        restChannel.sendResponse(new BytesRestResponse(OK, productId));
-    }
-
-}
\ No newline at end of file
diff --git a/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/registry/RestRegistryRecordIndexAction.java b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/registry/RestRegistryRecordIndexAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..5726e1b676ffc772feeb575aac752ec94ebe11cf
--- /dev/null
+++ b/ucoinj-elasticsearch-plugin/src/main/java/io/ucoin/ucoinj/elasticsearch/action/registry/RestRegistryRecordIndexAction.java
@@ -0,0 +1,43 @@
+package io.ucoin.ucoinj.elasticsearch.action.registry;
+
+import io.ucoin.ucoinj.core.exception.BusinessException;
+import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.inject.Inject;
+import org.elasticsearch.common.logging.ESLogger;
+import org.elasticsearch.common.logging.ESLoggerFactory;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.rest.*;
+
+import static org.elasticsearch.rest.RestRequest.Method.POST;
+import static org.elasticsearch.rest.RestStatus.BAD_REQUEST;
+import static org.elasticsearch.rest.RestStatus.OK;
+
+public class RestRegistryRecordIndexAction extends BaseRestHandler {
+
+    private static final ESLogger log = ESLoggerFactory.getLogger(RestRegistryRecordIndexAction.class.getName());
+
+    @Inject
+    public RestRegistryRecordIndexAction(Settings settings, RestController controller, Client client) {
+        super(settings, controller, client);
+        controller.registerHandler(POST, "/registry/record", this);
+    }
+
+    @Override
+    protected void handleRequest(final RestRequest request, RestChannel restChannel, Client client) throws Exception {
+
+        try {
+            String recordId = ServiceLocator.instance().getRegistryRecordIndexerService().indexRecordFromJson(request.content().toUtf8());
+
+            restChannel.sendResponse(new BytesRestResponse(OK, recordId));
+        }
+        catch(BusinessException e) {
+            log.error(e.getMessage(), e);
+            restChannel.sendResponse(new BytesRestResponse(BAD_REQUEST, String.format("{error: {ucode: 'XXX', message:'%s'}}", e.getMessage())));
+        }
+        catch(Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java
index 2da45cb323a7287195961d9d428b7b0b30ac3709..e37b532408ed37c41887f032bc2a74d6e6c8799b 100644
--- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/IndexerAction.java
@@ -31,9 +31,11 @@ import io.ucoin.ucoinj.core.client.service.bma.BlockchainRemoteService;
 import io.ucoin.ucoinj.core.util.websocket.WebsocketClientEndpoint;
 import io.ucoin.ucoinj.elasticsearch.config.Configuration;
 import io.ucoin.ucoinj.elasticsearch.service.BlockIndexerService;
-import io.ucoin.ucoinj.elasticsearch.service.CategoryIndexerService;
-import io.ucoin.ucoinj.elasticsearch.service.RecordIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService;
 import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator;
+import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryCategoryIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryRecordIndexerService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -80,7 +82,8 @@ public class IndexerAction {
 
     public void resetAllData() {
         resetDataBlocks();
-        resetDataRecords();
+        resetMarketRecords();
+        resetRegistryRecords();
     }
 
     public void resetDataBlocks() {
@@ -115,9 +118,9 @@ public class IndexerAction {
         }
     }
 
-    public void resetDataRecords() {
-        RecordIndexerService recordIndexerService = ServiceLocator.instance().getRecordIndexerService();
-        CategoryIndexerService categoryIndexerService = ServiceLocator.instance().getCategoryIndexerService();
+    public void resetMarketRecords() {
+        MarketRecordIndexerService recordIndexerService = ServiceLocator.instance().getMarketRecordIndexerService();
+        MarketCategoryIndexerService categoryIndexerService = ServiceLocator.instance().getMarketCategoryIndexerService();
 
         try {
             // Delete then create index on records
@@ -125,14 +128,35 @@ public class IndexerAction {
             if (indexExists) {
                 recordIndexerService.deleteIndex();
             }
-            log.info(String.format("Successfully reset products data"));
+            log.info(String.format("Successfully reset market records"));
 
             categoryIndexerService.createIndex();
             categoryIndexerService.initCategories();
-            log.info(String.format("Successfully re-initialized categories data"));
+            log.info(String.format("Successfully re-initialized market categories data"));
 
         } catch(Exception e) {
-            log.error("Error during reset products data: " + e.getMessage(), e);
+            log.error("Error during reset market records: " + e.getMessage(), e);
+        }
+    }
+
+    public void resetRegistryRecords() {
+        RegistryRecordIndexerService recordIndexerService = ServiceLocator.instance().getRegistryRecordIndexerService();
+        RegistryCategoryIndexerService categoryIndexerService = ServiceLocator.instance().getRegistryCategoryIndexerService();
+
+        try {
+            // Delete then create index on records
+            boolean indexExists = recordIndexerService.existsIndex();
+            if (indexExists) {
+                recordIndexerService.deleteIndex();
+            }
+            log.info(String.format("Successfully reset registry records"));
+
+            categoryIndexerService.createIndex();
+            categoryIndexerService.initCategories();
+            log.info(String.format("Successfully re-initialized market categories data"));
+
+        } catch(Exception e) {
+            log.error("Error during reset registry records: " + e.getMessage(), e);
         }
     }
 
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java
index 68746b7d66615de83ab8b9511bc045663aa6ae32..fad714952a9b59012c97ce9635c6c3d9e5b0febf 100644
--- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/action/NodeAction.java
@@ -26,6 +26,8 @@ package io.ucoin.ucoinj.elasticsearch.action;
 
 import io.ucoin.ucoinj.elasticsearch.config.Configuration;
 import io.ucoin.ucoinj.elasticsearch.service.*;
+import io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,11 +76,11 @@ public class NodeAction {
             currencyIndexerService.createIndexIfNotExists();
 
             // Product index
-            RecordIndexerService recordIndexerService = ServiceLocator.instance().getRecordIndexerService();
+            MarketRecordIndexerService recordIndexerService = ServiceLocator.instance().getMarketRecordIndexerService();
             recordIndexerService.createIndexIfNotExists();
 
             // Category index
-            CategoryIndexerService categoryIndexerService = ServiceLocator.instance().getCategoryIndexerService();
+            MarketCategoryIndexerService categoryIndexerService = ServiceLocator.instance().getMarketCategoryIndexerService();
             categoryIndexerService.createIndexIfNotExists();
         }
 	}
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java
index ee21bd1b4b17c84cb935a0184a2414278877cafd..a1e14c4ae605661a8c7c8bf4d03c2c6b1fa52ccc 100644
--- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/config/ConfigurationAction.java
@@ -39,10 +39,11 @@ public enum ConfigurationAction implements ConfigActionDef {
 
 	RESET_ALL_DATA(IndexerAction.class.getName() + "#resetAllData", "reset-data"),
 
-	RESET_BLOCKS(IndexerAction.class.getName() + "#resetDataBlocks", "reset-data-blocks"),
+	RESET_BLOCKS(IndexerAction.class.getName() + "#resetDataBlocks", "reset-blocks"),
 
-	RESET_RECORDS(IndexerAction.class.getName() + "#resetDataRecords", "reset-data-records");
+	RESET_MARKET(IndexerAction.class.getName() + "#resetMarketRecords", "reset-market"),
 
+	RESET_REGISTRY(IndexerAction.class.getName() + "#resetRegistryRecords", "reset-registry");
 
 	public String action;
 	public String[] aliases;
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java
index d094fe14dc9e3cfff36b59fd24af0f84588733c0..2b4d65ee535f30692fb25732393f928c7b7cbbfd 100644
--- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/ServiceLocator.java
@@ -23,6 +23,10 @@ package io.ucoin.ucoinj.elasticsearch.service;
  */
 
 
+import io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryCategoryIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.registry.RegistryRecordIndexerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,12 +67,20 @@ public class ServiceLocator extends io.ucoin.ucoinj.core.client.service.ServiceL
         return getBean(ExecutorService.class);
     }
 
-    public RecordIndexerService getRecordIndexerService() {
-        return getBean(RecordIndexerService.class);
+    public MarketRecordIndexerService getMarketRecordIndexerService() {
+        return getBean(MarketRecordIndexerService.class);
     }
 
-    public CategoryIndexerService getCategoryIndexerService() {
-        return getBean(CategoryIndexerService.class);
+    public MarketCategoryIndexerService getMarketCategoryIndexerService() {
+        return getBean(MarketCategoryIndexerService.class);
+    }
+
+    public RegistryRecordIndexerService getRegistryRecordIndexerService() {
+        return getBean(RegistryRecordIndexerService.class);
+    }
+
+    public RegistryCategoryIndexerService getRegistryCategoryIndexerService() {
+        return getBean(RegistryCategoryIndexerService.class);
     }
 
 }
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/exception/InvalidFormatException.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/exception/InvalidFormatException.java
new file mode 100644
index 0000000000000000000000000000000000000000..36966cde773a749708491e28c8615e3b97ecac4b
--- /dev/null
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/exception/InvalidFormatException.java
@@ -0,0 +1,24 @@
+package io.ucoin.ucoinj.elasticsearch.service.exception;
+
+import io.ucoin.ucoinj.core.exception.BusinessException;
+
+/**
+ * Created by blavenie on 01/03/16.
+ */
+public class InvalidFormatException extends BusinessException {
+    public InvalidFormatException() {
+        super();
+    }
+
+    public InvalidFormatException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public InvalidFormatException(String message) {
+        super(message);
+    }
+
+    public InvalidFormatException(Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/CategoryIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketCategoryIndexerService.java
similarity index 88%
rename from ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/CategoryIndexerService.java
rename to ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketCategoryIndexerService.java
index 68cac548ef6bcdc9c52bd51b50604c8101c0bf0e..e06009b6679879f706f09259c7b162a6e20850a2 100644
--- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/CategoryIndexerService.java
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketCategoryIndexerService.java
@@ -1,4 +1,4 @@
-package io.ucoin.ucoinj.elasticsearch.service;
+package io.ucoin.ucoinj.elasticsearch.service.market;
 
 /*
  * #%L
@@ -29,43 +29,38 @@ import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils;
 import io.ucoin.ucoinj.core.exception.TechnicalException;
 import io.ucoin.ucoinj.core.util.StringUtils;
 import io.ucoin.ucoinj.elasticsearch.config.Configuration;
-import org.apache.lucene.util.BytesRef;
+import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService;
 import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
 import org.elasticsearch.action.bulk.BulkRequest;
-import org.elasticsearch.action.bulk.BulkRequestBuilder;
 import org.elasticsearch.action.index.IndexRequestBuilder;
 import org.elasticsearch.action.index.IndexResponse;
-import org.elasticsearch.client.Client;
 import org.elasticsearch.client.Requests;
 import org.elasticsearch.common.bytes.BytesArray;
-import org.elasticsearch.common.bytes.BytesReference;
-import org.elasticsearch.common.io.stream.InputStreamStreamInput;
-import org.elasticsearch.common.io.stream.StreamInput;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentFactory;
-import org.jboss.netty.buffer.ChannelBuffer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
-import java.nio.channels.GatheringByteChannel;
 
 /**
  * Created by Benoit on 30/03/2015.
  */
-public class CategoryIndexerService extends BaseIndexerService {
+public class MarketCategoryIndexerService extends BaseIndexerService {
 
-    private static final Logger log = LoggerFactory.getLogger(CategoryIndexerService.class);
+    private static final Logger log = LoggerFactory.getLogger(MarketCategoryIndexerService.class);
+    private static final String CATEGORIES_BULK_CLASSPATH_FILE = "market-categories-bulk-insert.json";
 
-    public static final String INDEX_NAME = "store";
+
+    public static final String INDEX_NAME = "market";
     public static final String INDEX_TYPE = "category";
 
     private Gson gson;
 
     private Configuration config;
 
-    public CategoryIndexerService() {
+    public MarketCategoryIndexerService() {
         gson = GsonUtils.newBuilder().create();
     }
 
@@ -159,9 +154,9 @@ public class CategoryIndexerService extends BaseIndexerService {
 
         InputStream ris = null;
         try {
-            ris = getClass().getClassLoader().getResourceAsStream("categories-bulk-insert.json");
+            ris = getClass().getClassLoader().getResourceAsStream(CATEGORIES_BULK_CLASSPATH_FILE);
             if (ris == null) {
-                throw new TechnicalException(String.format("Could not retrieve data file [%s] need to fill index [%s]: ", "categories-bulk-insert.json", INDEX_NAME));
+                throw new TechnicalException(String.format("Could not retrieve data file [%s] need to fill index [%s]: ", CATEGORIES_BULK_CLASSPATH_FILE, INDEX_NAME));
             }
 
             StringBuilder builder = new StringBuilder();
@@ -169,8 +164,8 @@ public class CategoryIndexerService extends BaseIndexerService {
             String line = bf.readLine();
             while(line != null) {
                 if (StringUtils.isNotBlank(line)) {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Add to category bulk: " + line);
+                    if (log.isTraceEnabled()) {
+                        log.trace("Add to category bulk: " + line);
                     }
                     builder.append(line).append('\n');
                 }
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketRecordIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketRecordIndexerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f4020b2590e5f866def77724b9ca76ea5cd00b3
--- /dev/null
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/market/MarketRecordIndexerService.java
@@ -0,0 +1,249 @@
+package io.ucoin.ucoinj.elasticsearch.service.market;
+
+/*
+ * #%L
+ * UCoin Java Client :: Core API
+ * %%
+ * Copyright (C) 2014 - 2015 EIS
+ * %%
+ * This program 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.
+ * 
+ * This program 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 this program.  If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Sets;
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils;
+import io.ucoin.ucoinj.core.client.model.elasticsearch.Record;
+import io.ucoin.ucoinj.core.client.service.bma.WotRemoteService;
+import io.ucoin.ucoinj.core.exception.TechnicalException;
+import io.ucoin.ucoinj.core.service.CryptoService;
+import io.ucoin.ucoinj.elasticsearch.config.Configuration;
+import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator;
+import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidFormatException;
+import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidSignatureException;
+import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
+import org.elasticsearch.action.index.IndexRequestBuilder;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Set;
+
+/**
+ * Created by Benoit on 30/03/2015.
+ */
+public class MarketRecordIndexerService extends BaseIndexerService {
+
+    private static final Logger log = LoggerFactory.getLogger(MarketRecordIndexerService.class);
+
+    private static final String JSON_STRING_PROPERTY_REGEX = "[,]?[\"\\s\\n\\r]*%s[\"]?[\\s\\n\\r]*:[\\s\\n\\r]*\"[^\"]+\"";
+
+    public static final String INDEX_NAME = "market";
+    public static final String INDEX_TYPE = "record";
+
+    private Gson gson;
+
+    private Configuration config;
+
+    private WotRemoteService wotRemoteService;
+
+    private CryptoService cryptoService;
+
+    public MarketRecordIndexerService() {
+        gson = GsonUtils.newBuilder().create();
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        super.afterPropertiesSet();
+        wotRemoteService = ServiceLocator.instance().getWotRemoteService();
+        cryptoService = ServiceLocator.instance().getCryptoService();
+        config = Configuration.instance();
+    }
+
+    @Override
+    public void close() throws IOException {
+        super.close();
+        wotRemoteService = null;
+        config = null;
+        gson = null;
+    }
+
+    /**
+     * Delete currency index, and all data
+     * @throws JsonProcessingException
+     */
+    public void deleteIndex() throws JsonProcessingException {
+        deleteIndexIfExists(INDEX_NAME);
+    }
+
+
+    public boolean existsIndex() {
+        return super.existsIndex(INDEX_NAME);
+    }
+
+    /**
+     * Create index need for currency registry, if need
+     */
+    public void createIndexIfNotExists() {
+        try {
+            if (!existsIndex(INDEX_NAME)) {
+                createIndex();
+            }
+        }
+        catch(JsonProcessingException e) {
+            throw new TechnicalException(String.format("Error while creating index [%s]", INDEX_NAME));
+        }
+    }
+
+    /**
+     * Create index need for record registry
+     * @throws JsonProcessingException
+     */
+    public void createIndex() throws JsonProcessingException {
+        log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE));
+
+        CreateIndexRequestBuilder createIndexRequestBuilder = getClient().admin().indices().prepareCreate(INDEX_NAME);
+        Settings indexSettings = Settings.settingsBuilder()
+                .put("number_of_shards", 1)
+                .put("number_of_replicas", 1)
+                .put("analyzer", createDefaultAnalyzer())
+                .build();
+        createIndexRequestBuilder.setSettings(indexSettings);
+        createIndexRequestBuilder.addMapping(INDEX_TYPE, createIndexMapping());
+        createIndexRequestBuilder.execute().actionGet();
+    }
+
+    /**
+     *
+     * @param recordJson
+     * @return the record id
+     */
+    public String indexRecordFromJson(String recordJson) {
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode actualObj = mapper.readTree(recordJson);
+            Set<String> fieldNames = Sets.newHashSet(actualObj.fieldNames());
+            if (!fieldNames.contains(Record.PROPERTY_ISSUER)
+                    || !fieldNames.contains(Record.PROPERTY_SIGNATURE)) {
+                throw new InvalidFormatException("Invalid record JSON format. Required fields [issuer,signature]");
+            }
+            String issuer = actualObj.get(Record.PROPERTY_ISSUER).asText();
+            String signature = actualObj.get(Record.PROPERTY_SIGNATURE).asText();
+
+            String recordNoSign = recordJson.replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_SIGNATURE), "")
+                    .replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_HASH), "");
+
+            if (!cryptoService.verify(recordNoSign, signature, issuer)) {
+                throw new InvalidSignatureException("Invalid signature for JSON string: " + recordNoSign);
+            }
+
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Indexing a record from issuer [%s]", issuer.substring(0, 8)));
+            }
+
+        }
+        catch(IOException | JsonSyntaxException e) {
+            throw new InvalidFormatException("Invalid record JSON: " + e.getMessage(), e);
+        }
+
+        // Preparing indexBlocksFromNode
+        IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE)
+                .setSource(recordJson);
+
+        // Execute indexBlocksFromNode
+        IndexResponse response = indexRequest
+                .setRefresh(false)
+                .execute().actionGet();
+
+        return response.getId();
+    }
+
+    /* -- Internal methods -- */
+
+
+    public XContentBuilder createIndexMapping() {
+        try {
+            XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE)
+                    .startObject("properties")
+
+                    // title
+                    .startObject("title")
+                    .field("type", "string")
+                    .endObject()
+
+                    // description
+                    .startObject("description")
+                    .field("type", "string")
+                    .endObject()
+
+                    // time
+                    .startObject("time")
+                    .field("type", "integer")
+                    .endObject()
+
+                    // issuer
+                    .startObject("issuer")
+                    .field("type", "string")
+                    .endObject()
+
+                    // issuer
+                    .startObject("location")
+                    .field("type", "geo_point")
+                    .endObject()
+
+                    // categories
+                    .startObject("categories")
+                    .field("type", "nested")
+                    .startObject("properties")
+                    .startObject("cat1") // cat1
+                    .field("type", "string")
+                    .endObject()
+                    .startObject("cat2") // cat2
+                    .field("type", "string")
+                    .endObject()
+                    .endObject()
+                    .endObject()
+
+                    // tags
+                    .startObject("tags")
+                    .field("type", "completion")
+                    .field("search_analyzer", "simple")
+                    .field("analyzer", "simple")
+                    .field("preserve_separators", "false")
+                    .endObject()
+
+                    .endObject()
+                    .endObject().endObject();
+
+            return mapping;
+        }
+        catch(IOException ioe) {
+            throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE, ioe.getMessage()), ioe);
+        }
+    }
+
+}
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryCategoryIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryCategoryIndexerService.java
new file mode 100644
index 0000000000000000000000000000000000000000..64ca95053cbacf2c18db3663a6c26327111f4800
--- /dev/null
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryCategoryIndexerService.java
@@ -0,0 +1,244 @@
+package io.ucoin.ucoinj.elasticsearch.service.registry;
+
+/*
+ * #%L
+ * UCoin Java Client :: Core API
+ * %%
+ * Copyright (C) 2014 - 2015 EIS
+ * %%
+ * This program 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.
+ * 
+ * This program 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 this program.  If not, see
+ * <http://www.gnu.org/licenses/gpl-3.0.html>.
+ * #L%
+ */
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.google.gson.Gson;
+import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils;
+import io.ucoin.ucoinj.core.exception.TechnicalException;
+import io.ucoin.ucoinj.core.util.StringUtils;
+import io.ucoin.ucoinj.elasticsearch.config.Configuration;
+import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService;
+import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
+import org.elasticsearch.action.bulk.BulkRequest;
+import org.elasticsearch.action.index.IndexRequestBuilder;
+import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.client.Requests;
+import org.elasticsearch.common.bytes.BytesArray;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Created by Benoit on 30/03/2015.
+ */
+public class RegistryCategoryIndexerService extends BaseIndexerService {
+
+    private static final Logger log = LoggerFactory.getLogger(RegistryCategoryIndexerService.class);
+
+    private static final String CATEGORIES_BULK_CLASSPATH_FILE = "registry-categories-bulk-insert.json";
+
+    public static final String INDEX_NAME = "registry";
+    public static final String INDEX_TYPE = "category";
+
+
+    private Gson gson;
+
+    private Configuration config;
+
+    public RegistryCategoryIndexerService() {
+        gson = GsonUtils.newBuilder().create();
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        super.afterPropertiesSet();
+        config = Configuration.instance();
+    }
+
+    @Override
+    public void close() throws IOException {
+        super.close();
+        config = null;
+        gson = null;
+    }
+
+    /**
+     * Delete currency index, and all data
+     * @throws JsonProcessingException
+     */
+    public void deleteIndex() throws JsonProcessingException {
+        deleteIndexIfExists(INDEX_NAME);
+    }
+
+
+    public boolean existsIndex() {
+        return super.existsIndex(INDEX_NAME);
+    }
+
+    /**
+     * Create index need for currency registry, if need
+     */
+    public void createIndexIfNotExists() {
+        try {
+            if (!existsIndex(INDEX_NAME)) {
+                createIndex();
+            }
+        }
+        catch(JsonProcessingException e) {
+            throw new TechnicalException(String.format("Error while creating index [%s]", INDEX_NAME));
+        }
+    }
+
+    /**
+     * Create index need for category registry
+     * @throws JsonProcessingException
+     */
+    public void createIndex() throws JsonProcessingException {
+        log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE));
+
+        CreateIndexRequestBuilder createIndexRequestBuilder = getClient().admin().indices().prepareCreate(INDEX_NAME);
+        Settings indexSettings = Settings.settingsBuilder()
+                .put("number_of_shards", 1)
+                .put("number_of_replicas", 1)
+                .put("analyzer", createDefaultAnalyzer())
+                .build();
+        createIndexRequestBuilder.setSettings(indexSettings);
+        createIndexRequestBuilder.addMapping(INDEX_TYPE, createIndexMapping());
+        createIndexRequestBuilder.execute().actionGet();
+    }
+
+    /**
+     *
+     * @param jsonCategory
+     * @return the product id
+     */
+    public String indexCategoryFromJson(String jsonCategory) {
+        if (log.isDebugEnabled()) {
+            log.debug("Indexing a category");
+        }
+
+        // Preparing indexBlocksFromNode
+        IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE)
+                .setSource(jsonCategory);
+
+        // Execute indexBlocksFromNode
+        IndexResponse response = indexRequest
+                .setRefresh(false)
+                .execute().actionGet();
+
+        return response.getId();
+    }
+
+
+    public void initCategories() {
+        if (log.isDebugEnabled()) {
+            log.debug("Initializing all categories");
+        }
+
+        BulkRequest bulkRequest = Requests.bulkRequest();
+
+        InputStream ris = null;
+        try {
+            ris = getClass().getClassLoader().getResourceAsStream(CATEGORIES_BULK_CLASSPATH_FILE);
+            if (ris == null) {
+                throw new TechnicalException(String.format("Could not retrieve data file [%s] need to fill index [%s]: ", CATEGORIES_BULK_CLASSPATH_FILE, INDEX_NAME));
+            }
+
+            StringBuilder builder = new StringBuilder();
+            BufferedReader bf = new BufferedReader(new InputStreamReader(ris));
+            String line = bf.readLine();
+            while(line != null) {
+                if (StringUtils.isNotBlank(line)) {
+                    if (log.isTraceEnabled()) {
+                        log.trace("Add to category bulk: " + line);
+                    }
+                    builder.append(line).append('\n');
+                }
+                line = bf.readLine();
+            }
+
+            byte[] data = builder.toString().getBytes();
+            bulkRequest.add(new BytesArray(data), INDEX_NAME, INDEX_TYPE, false);
+
+        } catch(Exception e) {
+            throw new TechnicalException(String.format("Error while initializing data [%s]", INDEX_NAME), e);
+        }
+        finally {
+            if (ris != null) {
+                try  {
+                    ris.close();
+                }
+                catch(IOException e) {
+                    // Silent is gold
+                }
+            }
+        }
+
+        try {
+            getClient().bulk(bulkRequest).actionGet();
+        } catch(Exception e) {
+            throw new TechnicalException(String.format("Error while initializing data [%s]", INDEX_NAME), e);
+        }
+    }
+
+    /* -- Internal methods -- */
+
+
+    public XContentBuilder createIndexMapping() {
+        try {
+            XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE)
+                    .startObject("properties")
+
+                    // name
+                    .startObject("name")
+                    .field("type", "string")
+                    .endObject()
+
+                    // description
+                    /*.startObject("description")
+                    .field("type", "string")
+                    .endObject()*/
+
+                    // parent
+                    .startObject("parent")
+                    .field("type", "string")
+                    .endObject()
+
+                    // tags
+                    /*.startObject("tags")
+                    .field("type", "completion")
+                    .field("search_analyzer", "simple")
+                    .field("analyzer", "simple")
+                    .field("preserve_separators", "false")
+                    .endObject()*/
+
+                    .endObject()
+                    .endObject().endObject();
+
+            return mapping;
+        }
+        catch(IOException ioe) {
+            throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE, ioe.getMessage()), ioe);
+        }
+    }
+
+}
diff --git a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/RecordIndexerService.java b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryRecordIndexerService.java
similarity index 69%
rename from ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/RecordIndexerService.java
rename to ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryRecordIndexerService.java
index d68597c9740144a3ded4bd9f3421e8ac22c76f24..108e25696843b7f3f5f2bdb3ce581d7d1d4870b0 100644
--- a/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/RecordIndexerService.java
+++ b/ucoinj-elasticsearch/src/main/java/io/ucoin/ucoinj/elasticsearch/service/registry/RegistryRecordIndexerService.java
@@ -1,4 +1,4 @@
-package io.ucoin.ucoinj.elasticsearch.service;
+package io.ucoin.ucoinj.elasticsearch.service.registry;
 
 /*
  * #%L
@@ -24,11 +24,21 @@ package io.ucoin.ucoinj.elasticsearch.service;
 
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Sets;
 import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
 import io.ucoin.ucoinj.core.client.model.bma.gson.GsonUtils;
+import io.ucoin.ucoinj.core.client.model.elasticsearch.Record;
 import io.ucoin.ucoinj.core.client.service.bma.WotRemoteService;
 import io.ucoin.ucoinj.core.exception.TechnicalException;
+import io.ucoin.ucoinj.core.service.CryptoService;
 import io.ucoin.ucoinj.elasticsearch.config.Configuration;
+import io.ucoin.ucoinj.elasticsearch.service.BaseIndexerService;
+import io.ucoin.ucoinj.elasticsearch.service.ServiceLocator;
+import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidFormatException;
+import io.ucoin.ucoinj.elasticsearch.service.exception.InvalidSignatureException;
 import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
 import org.elasticsearch.action.index.IndexRequestBuilder;
 import org.elasticsearch.action.index.IndexResponse;
@@ -39,16 +49,19 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.util.Set;
 
 /**
  * Created by Benoit on 30/03/2015.
  */
-public class RecordIndexerService extends BaseIndexerService {
+public class RegistryRecordIndexerService extends BaseIndexerService {
 
-    private static final Logger log = LoggerFactory.getLogger(RecordIndexerService.class);
+    private static final Logger log = LoggerFactory.getLogger(RegistryRecordIndexerService.class);
 
-    public static final String INDEX_NAME = "store";
-    public static final String INDEX_TYPE_SIMPLE = "record";
+    private static final String JSON_STRING_PROPERTY_REGEX = "[,]?[\"\\s\\n\\r]*%s[\"]?[\\s\\n\\r]*:[\\s\\n\\r]*\"[^\"]+\"";
+
+    public static final String INDEX_NAME = "registry";
+    public static final String INDEX_TYPE = "record";
 
     private Gson gson;
 
@@ -56,7 +69,9 @@ public class RecordIndexerService extends BaseIndexerService {
 
     private WotRemoteService wotRemoteService;
 
-    public RecordIndexerService() {
+    private CryptoService cryptoService;
+
+    public RegistryRecordIndexerService() {
         gson = GsonUtils.newBuilder().create();
     }
 
@@ -64,6 +79,7 @@ public class RecordIndexerService extends BaseIndexerService {
     public void afterPropertiesSet() throws Exception {
         super.afterPropertiesSet();
         wotRemoteService = ServiceLocator.instance().getWotRemoteService();
+        cryptoService = ServiceLocator.instance().getCryptoService();
         config = Configuration.instance();
     }
 
@@ -107,7 +123,7 @@ public class RecordIndexerService extends BaseIndexerService {
      * @throws JsonProcessingException
      */
     public void createIndex() throws JsonProcessingException {
-        log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE_SIMPLE));
+        log.info(String.format("Creating index [%s/%s]", INDEX_NAME, INDEX_TYPE));
 
         CreateIndexRequestBuilder createIndexRequestBuilder = getClient().admin().indices().prepareCreate(INDEX_NAME);
         Settings indexSettings = Settings.settingsBuilder()
@@ -116,7 +132,7 @@ public class RecordIndexerService extends BaseIndexerService {
                 .put("analyzer", createDefaultAnalyzer())
                 .build();
         createIndexRequestBuilder.setSettings(indexSettings);
-        createIndexRequestBuilder.addMapping(INDEX_TYPE_SIMPLE, createIndexMapping());
+        createIndexRequestBuilder.addMapping(INDEX_TYPE, createIndexMapping());
         createIndexRequestBuilder.execute().actionGet();
     }
 
@@ -126,12 +142,36 @@ public class RecordIndexerService extends BaseIndexerService {
      * @return the record id
      */
     public String indexRecordFromJson(String recordJson) {
-        if (log.isDebugEnabled()) {
-            log.debug("Indexing a record");
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode actualObj = mapper.readTree(recordJson);
+            Set<String> fieldNames = Sets.newHashSet(actualObj.fieldNames());
+            if (!fieldNames.contains(Record.PROPERTY_ISSUER)
+                    || !fieldNames.contains(Record.PROPERTY_SIGNATURE)) {
+                throw new InvalidFormatException("Invalid record JSON format. Required fields [issuer,signature]");
+            }
+            String issuer = actualObj.get(Record.PROPERTY_ISSUER).asText();
+            String signature = actualObj.get(Record.PROPERTY_SIGNATURE).asText();
+
+            String recordNoSign = recordJson.replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_SIGNATURE), "")
+                    .replaceAll(String.format(JSON_STRING_PROPERTY_REGEX, Record.PROPERTY_HASH), "");
+
+            if (!cryptoService.verify(recordNoSign, signature, issuer)) {
+                throw new InvalidSignatureException("Invalid signature for JSON string: " + recordNoSign);
+            }
+
+            if (log.isDebugEnabled()) {
+                log.debug(String.format("Indexing a record from issuer [%s]", issuer.substring(0, 8)));
+            }
+
+        }
+        catch(IOException | JsonSyntaxException e) {
+            throw new InvalidFormatException("Invalid record JSON: " + e.getMessage(), e);
         }
 
         // Preparing indexBlocksFromNode
-        IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE_SIMPLE)
+        IndexRequestBuilder indexRequest = getClient().prepareIndex(INDEX_NAME, INDEX_TYPE)
                 .setSource(recordJson);
 
         // Execute indexBlocksFromNode
@@ -147,7 +187,7 @@ public class RecordIndexerService extends BaseIndexerService {
 
     public XContentBuilder createIndexMapping() {
         try {
-            XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE_SIMPLE)
+            XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject(INDEX_TYPE)
                     .startObject("properties")
 
                     // title
@@ -202,7 +242,7 @@ public class RecordIndexerService extends BaseIndexerService {
             return mapping;
         }
         catch(IOException ioe) {
-            throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE_SIMPLE, ioe.getMessage()), ioe);
+            throw new TechnicalException(String.format("Error while getting mapping for index [%s/%s]: %s", INDEX_NAME, INDEX_TYPE, ioe.getMessage()), ioe);
         }
     }
 
diff --git a/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean b/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean
index 3c97b16d92056f466d440d71cae4ced209543e5a..9a6eb45770eb580c14095cc89c35068a14570b18 100644
--- a/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean
+++ b/ucoinj-elasticsearch/src/main/resources/META-INF/services/io.ucoin.ucoinj.core.beans.Bean
@@ -12,8 +12,11 @@ io.ucoin.ucoinj.core.client.dao.mem.MemoryCurrencyDaoImpl
 io.ucoin.ucoinj.core.client.dao.mem.MemoryPeerDaoImpl
 io.ucoin.ucoinj.elasticsearch.service.ElasticSearchService
 io.ucoin.ucoinj.elasticsearch.service.CurrencyIndexerService
-io.ucoin.ucoinj.elasticsearch.service.RecordIndexerService
 io.ucoin.ucoinj.elasticsearch.service.BlockIndexerService
 io.ucoin.ucoinj.elasticsearch.service.ExecutorServiceImpl
-io.ucoin.ucoinj.elasticsearch.service.CategoryIndexerService
+io.ucoin.ucoinj.elasticsearch.service.market.MarketRecordIndexerService
+io.ucoin.ucoinj.elasticsearch.service.market.MarketCategoryIndexerService
+io.ucoin.ucoinj.elasticsearch.service.registry.RegistryRecordIndexerService
+io.ucoin.ucoinj.elasticsearch.service.registry.RegistryCategoryIndexerService
+
 
diff --git a/ucoinj-elasticsearch/src/main/resources/categories-bulk-insert.json b/ucoinj-elasticsearch/src/main/resources/market-categories-bulk-insert.json
similarity index 100%
rename from ucoinj-elasticsearch/src/main/resources/categories-bulk-insert.json
rename to ucoinj-elasticsearch/src/main/resources/market-categories-bulk-insert.json
diff --git a/ucoinj-elasticsearch/src/main/resources/registry-categories-bulk-insert.json b/ucoinj-elasticsearch/src/main/resources/registry-categories-bulk-insert.json
new file mode 100644
index 0000000000000000000000000000000000000000..c19ddf13f2d397fc4e0c5acc66115b04df3b44ea
--- /dev/null
+++ b/ucoinj-elasticsearch/src/main/resources/registry-categories-bulk-insert.json
@@ -0,0 +1,151 @@
+{ "index": { "_id": "cat71"}}
+{ "name": "EMPLOI" , "parent": null}
+{ "index": { "_id": "cat33"}}
+{ "name": "Offres d'emploi", "parent": "cat33" }
+
+{ "index": { "_id": "cat1" }}
+{ "name": "VEHICULES"  , "parent": null}
+{ "index": { "_id": "cat2" }}
+{ "name": "Voitures" , "parent": "cat2" }
+{ "index": { "_id": "cat3" }}
+{ "name": "Motos" , "parent": "cat3" }
+{ "index": { "_id": "cat4" }}
+{ "name": "Caravaning" , "parent": "cat3" }
+{ "index": { "_id": "cat5" }}
+{ "name": "Utilitaires" , "parent": "cat3" }
+{ "index": { "_id": "cat6" }}
+{ "name": "Equipement Auto" , "parent": "cat3" }
+{ "index": { "_id": "cat44" }}
+{ "name": "Equipement Moto" , "parent": "cat3" }
+{ "index": { "_id": "cat50" }}
+{ "name": "Equipement Caravaning" , "parent": "cat3" }
+{ "index": { "_id": "cat7" }}
+{ "name": "Nautisme" , "parent": "cat3" }
+{ "index": { "_id": "cat51" }}
+{ "name": "Equipement Nautisme" , "parent": "cat3" }
+
+{ "index": { "_id": "cat8" }}
+{ "name": "IMMOBILIER"  , "parent": null}
+{ "index": { "_id": "cat9" }}
+{ "name": "Ventes immobilières" , "parent": "cat8" }
+{ "index": { "_id": "cat10" }}
+{ "name": "Locations" , "parent": "cat8" }
+{ "index": { "_id": "cat11" }}
+{ "name": "Colocations" , "parent": "cat8" }
+{ "index": { "_id": "cat13" }}
+{ "name": "Bureaux &amp; Commerces" , "parent": "cat8" }
+
+{ "index": { "_id": "cat66" }}
+{ "name": "VACANCES"  , "parent": null}
+{ "index": { "_id": "cat12" }}
+{ "name": "Locations &amp; Gîtes" , "parent": "cat66" }
+{ "index": { "_id": "cat67" }}
+{ "name": "Chambres d'hôtes" , "parent": "cat66" }
+{ "index": { "_id": "cat68" }}
+{ "name": "Campings" , "parent": "cat66" }
+{ "index": { "_id": "cat69" }}
+{ "name": "Hôtels" , "parent": "cat66" }
+{ "index": { "_id": "cat70" }}
+{ "name": "Hébergements insolites" , "parent": "cat66" }
+
+{ "index": { "_id": "cat14" }}
+{ "name": "MULTIMEDIA"  , "parent": null}
+{ "index": { "_id": "cat15" }}
+{ "name": "Informatique" , "parent": "cat14" }
+{ "index": { "_id": "cat43" }}
+{ "name": "Consoles &amp; Jeux vidéo" , "parent": "cat14" }
+{ "index": { "_id": "cat16" }}
+{ "name": "Image &amp; Son" , "parent": "cat14" }
+{ "index": { "_id": "cat17" }}
+{ "name": "Téléphonie" , "parent": "cat14" }
+
+{ "index": { "_id": "cat18" }}
+{ "name": "MAISON"  , "parent": null}
+{ "index": { "_id": "cat19" }}
+{ "name": "Ameublement" , "parent": "cat18" }
+{ "index": { "_id": "cat20" }}
+{ "name": "Electroménager" , "parent": "cat18" }
+{ "index": { "_id": "cat45" }}
+{ "name": "Arts de la table" , "parent": "cat18" }
+{ "index": { "_id": "cat39" }}
+{ "name": "Décoration" , "parent": "cat18" }
+{ "index": { "_id": "cat46" }}
+{ "name": "Linge de maison" , "parent": "cat18" }
+{ "index": { "_id": "cat21" }}
+{ "name": "Bricolage" , "parent": "cat18" }
+{ "index": { "_id": "cat52" }}
+{ "name": "Jardinage" , "parent": "cat18" }
+{ "index": { "_id": "cat22" }}
+{ "name": "Vêtements" , "parent": "cat18" }
+{ "index": { "_id": "cat53" }}
+{ "name": "Chaussures" , "parent": "cat18" }
+{ "index": { "_id": "cat47" }}
+{ "name": "Accessoires &amp; Bagagerie" , "parent": "cat18" }
+{ "index": { "_id": "cat42" }}
+{ "name": "Montres &amp; Bijoux" , "parent": "cat18" }
+{ "index": { "_id": "cat23" }}
+{ "name": "Equipement bébé" , "parent": "cat18" }
+{ "index": { "_id": "cat54" }}
+{ "name": "Vêtements bébé" , "parent": "cat18" }
+
+{ "index": { "_id": "cat24" }}
+{ "name": "LOISIRS"  , "parent": null}
+{ "index": { "_id": "cat25" }}
+{ "name": "DVD / Films" , "parent": "cat24" }
+{ "index": { "_id": "cat26" }}
+{ "name": "CD / Musique" , "parent": "cat24" }
+{ "index": { "_id": "cat27" }}
+{ "name": "Livres" , "parent": "cat24" }
+{ "index": { "_id": "cat28" }}
+{ "name": "Animaux" , "parent": "cat24" }
+{ "index": { "_id": "cat55" }}
+{ "name": "Vélos" , "parent": "cat24" }
+{ "index": { "_id": "cat29" }}
+{ "name": "Sports &amp; Hobbies" }
+{ "index": { "_id": "cat30" }}
+{ "name": "Instruments de musique" , "parent": "cat24" }
+{ "index": { "_id": "cat40" }}
+{ "name": "Collection" , "parent": "cat24" }
+{ "index": { "_id": "cat41" }}
+{ "name": "Jeux &amp; Jouets" , "parent": "cat24" }
+{ "index": { "_id": "cat48" }}
+{ "name": "Vins &amp; Gastronomie" , "parent": "cat24" }
+
+{ "index": { "_id": "cat56" }}
+{ "name": "MATERIEL PROFESSIONNEL"  , "parent": null}
+{ "index": { "_id": "cat57" }}
+{ "name": "Matériel Agricole" , "parent": "cat56" }
+{ "index": { "_id": "cat58" }}
+{ "name": "Transport - Manutention" , "parent": "cat56" }
+{ "index": { "_id": "cat59" }}
+{ "name": "BTP - Chantier Gros-oeuvre" , "parent": "cat56" }
+{ "index": { "_id": "cat60" }}
+{ "name": "Outillage - Matériaux 2nd-oeuvre" , "parent": "cat56" }
+{ "index": { "_id": "cat32" }}
+{ "name": "Équipements Industriels" , "parent": "cat56" }
+{ "index": { "_id": "cat61" }}
+{ "name": "Restauration - Hôtellerie" , "parent": "cat56" }
+{ "index": { "_id": "cat62" }}
+{ "name": "Fournitures de Bureau" , "parent": "cat56" }
+{ "index": { "_id": "cat63" }}
+{ "name": "Commerces &amp; Marchés" , "parent": "cat56" }
+{ "index": { "_id": "cat64" }}
+{ "name": "Matériel Médical" , "parent": "cat56" }
+
+{ "index": { "_id": "cat31" }}
+{ "name": "SERVICES"  , "parent": null}
+{ "index": { "_id": "cat34" }}
+{ "name": "Prestations de services" , "parent": "cat31" }
+{ "index": { "_id": "cat35" }}
+{ "name": "Billetterie" , "parent": "cat31" }
+{ "index": { "_id": "cat49" }}
+{ "name": "Evénements" , "parent": "cat31" }
+{ "index": { "_id": "cat36" }}
+{ "name": "Cours particuliers" , "parent": "cat31" }
+{ "index": { "_id": "cat65" }}
+{ "name": "Covoiturage" , "parent": "cat31" }
+{ "index": { "_id": "cat37" }}
+
+{ "name": "DIVERS"  , "parent": null}
+{ "index": { "_id": "cat38" }}
+{ "name": "Autres" , "parent": "cat37" }