Refactor identity secrets

Run CreateIdentity only once on init of the node
Have one seed and keys for the node
Remove create and list identity endpoints
diff --git a/cmd/service/commands.go b/cmd/service/commands.go
index 2f9167e..d3d16bd 100644
--- a/cmd/service/commands.go
+++ b/cmd/service/commands.go
@@ -28,6 +28,7 @@
 const (
 	envMilagroHome      = "MILAGRO_HOME"
 	milagroConfigFolder = ".milagro"
+	keysFile            = "keys"
 
 	cmdInit   = "init"
 	cmdDaemon = "daemon"
diff --git a/cmd/service/initnode.go b/cmd/service/initnode.go
index 2760e51..ecc3b57 100644
--- a/cmd/service/initnode.go
+++ b/cmd/service/initnode.go
@@ -26,14 +26,6 @@
 	"fmt"
 	"os"
 	"strings"
-
-	"github.com/apache/incubator-milagro-dta/libs/datastore"
-	"github.com/apache/incubator-milagro-dta/libs/documents"
-	"github.com/apache/incubator-milagro-dta/libs/ipfs"
-	"github.com/apache/incubator-milagro-dta/libs/logger"
-	"github.com/apache/incubator-milagro-dta/pkg/api"
-	"github.com/apache/incubator-milagro-dta/pkg/common"
-	"github.com/apache/incubator-milagro-dta/pkg/service"
 )
 
 type initOptions struct {
@@ -115,48 +107,6 @@
 	return nil
 }
 
-//checkForID - Setup a NodeID if not supplied in the config
-func checkForID(logger *logger.Logger, optNodeID, optNodeName string, ipfs ipfs.Connector, store *datastore.Store, service service.Service) (nodeID string, err error) {
-	if optNodeID != "" {
-		var idSecrets = &common.IdentitySecrets{}
-		if err := store.Get("id-doc", optNodeID, idSecrets); err == nil {
-			id := &documents.IDDoc{}
-			rawDocI, err := ipfs.Get(optNodeID)
-			if err == nil {
-				if err := documents.DecodeIDDocument(rawDocI, optNodeID, id); err != nil {
-					logger.Error("Invalid ID document")
-					return "", err
-				}
-				return optNodeID, nil
-			}
-			logger.Error("ID not found in IPFS: %v", optNodeID)
-		} else {
-			logger.Error("ID not found in the database: %v", optNodeID)
-		}
-	} else {
-		logger.Error("No ID found in flags or config")
-	}
-
-	if optNodeName == "" {
-		return "", errors.New("Please provide Node name")
-	}
-
-	return createNewID(optNodeName, service)
-}
-
-func createNewID(name string, service service.Service) (newID string, err error) {
-
-	req := &api.CreateIdentityRequest{
-		Name: strings.TrimSpace(name),
-	}
-
-	resp, err := service.CreateIdentity(req)
-	if err != nil {
-		return "", err
-	}
-	return resp.IDDocumentCID, nil
-}
-
 func generateRandomName() string {
 	b := make([]byte, 8)
 	rand.Read(b)
diff --git a/cmd/service/main.go b/cmd/service/main.go
index 3953a8b..7e6a8ef 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -30,6 +30,8 @@
 	"strings"
 	"syscall"
 
+	"github.com/apache/incubator-milagro-dta/libs/keystore"
+
 	"github.com/apache/incubator-milagro-dta/libs/datastore"
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
 	"github.com/apache/incubator-milagro-dta/libs/logger"
@@ -38,6 +40,7 @@
 	"github.com/apache/incubator-milagro-dta/pkg/config"
 	"github.com/apache/incubator-milagro-dta/pkg/defaultservice"
 	"github.com/apache/incubator-milagro-dta/pkg/endpoints"
+	"github.com/apache/incubator-milagro-dta/pkg/identity"
 	"github.com/apache/incubator-milagro-dta/plugins"
 	"github.com/go-kit/kit/metrics/prometheus"
 	"github.com/pkg/errors"
@@ -74,11 +77,6 @@
 	// Init the config folder
 	config.Init(configFolder(), cfg)
 
-	store, err := initDataStore(cfg.Node.Datastore)
-	if err != nil {
-		return errors.Wrap(err, "init datastore")
-	}
-
 	logger.Info("IPFS connector type: %s", cfg.IPFS.Connector)
 	var ipfsConnector ipfs.Connector
 	switch cfg.IPFS.Connector {
@@ -95,23 +93,15 @@
 		return errors.Wrap(err, "init IPFS connector")
 	}
 
-	svcPlugin := plugins.FindServicePlugin(cfg.Plugins.Service)
-	if svcPlugin == nil {
-		return errors.Errorf("Invalid service plugin: %v", initOptions.ServicePlugin)
+	keyStore, err := keystore.NewFileStore(filepath.Join(configFolder(), keysFile))
+	if err != nil {
+		return err
 	}
-
-	if err := svcPlugin.Init(
-		svcPlugin,
-		defaultservice.WithLogger(logger),
-		defaultservice.WithRng(rand.Reader),
-		defaultservice.WithStore(store),
-		defaultservice.WithIPFS(ipfsConnector),
-		defaultservice.WithConfig(cfg),
-	); err != nil {
-		return errors.Errorf("init service plugin %s", cfg.Plugins.Service)
+	_, rawDocID, secret, err := identity.CreateIdentity(cfg.Node.NodeName)
+	if err != nil {
+		return err
 	}
-
-	newID, err := createNewID(cfg.Node.NodeName, svcPlugin)
+	newID, err := identity.StoreIdentity(rawDocID, secret, ipfsConnector, keyStore)
 	if err != nil {
 		return err
 	}
@@ -175,6 +165,10 @@
 	if err != nil {
 		return errors.Wrap(err, "init IPFS connector")
 	}
+	keyStore, err := keystore.NewFileStore(filepath.Join(configFolder(), keysFile))
+	if err != nil {
+		return err
+	}
 
 	// Setup Endpoint authorizer
 	var authorizer transport.Authorizer
@@ -208,7 +202,8 @@
 		svcPlugin,
 		defaultservice.WithLogger(logger),
 		defaultservice.WithRng(rand.Reader),
-		defaultservice.WithStore(store),
+		defaultservice.WithDataStore(store),
+		defaultservice.WithKeyStore(keyStore),
 		defaultservice.WithIPFS(ipfsConnector),
 		defaultservice.WithMasterFiduciary(masterFiduciaryServer),
 		defaultservice.WithConfig(cfg),
@@ -217,20 +212,12 @@
 	}
 	logger.Info("Service plugin loaded: %s", svcPlugin.Name())
 
-	nodeID, err := checkForID(logger, cfg.Node.NodeID, cfg.Node.NodeName, ipfsConnector, store, svcPlugin)
-	if err != nil {
-		return err
-	}
-
-	if nodeID != cfg.Node.NodeID {
-		cfg.Node.NodeID = nodeID
-		if err := config.SaveConfig(configFolder(), cfg); err != nil {
-			return errors.Wrap(err, "cannot update config")
-		}
+	if err := identity.CheckIdentity(cfg.Node.NodeID, cfg.Node.NodeName, ipfsConnector, keyStore); err != nil {
+		return errors.Wrap(err, "Invalid node identity")
 	}
 
 	svcPlugin.SetMasterFiduciaryNodeID(cfg.Node.MasterFiduciaryNodeID)
-	svcPlugin.SetNodeID(nodeID)
+	svcPlugin.SetNodeID(cfg.Node.NodeID)
 
 	// Create metrics
 	duration := prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
diff --git a/cmd/servicetester/e2e_test.sh b/cmd/servicetester/e2e_test.sh
index 8ba4277..66c59df 100755
--- a/cmd/servicetester/e2e_test.sh
+++ b/cmd/servicetester/e2e_test.sh
@@ -95,63 +95,61 @@
 
 
    #make another BeneficiaryID
-   output5=$(curl -s -X POST "http://localhost:5556/$apiVersion/identity" -H "accept: */*" -H       "Content-Type: application/json" -d "{\"Name\":\"AA\"}")
-   benid=$(echo $output5 | jq -r .idDocumentCID)
+  #  output5=$(curl -s -X POST "http://localhost:5556/$apiVersion/identity" -H "accept: */*" -H       "Content-Type: application/json" -d "{\"Name\":\"AA\"}")
+  #  benid=$(echo $output5 | jq -r .idDocumentCID)
+
+  #  #Tests against the Bitcoin Extension - different befificary
+  #  output6=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
+  #  #echo $output6
+  #  op6=$(echo $output6 | jq .orderReference)
+  #  commitment6=$(echo $output6 | jq .commitment)
+  #  address6=$(echo $output6 | jq .extension.address)
+
+  #  output7=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op6,\"beneficiaryIDDocumentCID\":\"$benid\"}")
+  #  address7=$(echo $output7 | jq .extension.address)
+  #  commitment7=$(echo $output7 | jq .commitment)
+
+  #  echo "Committment5 $commitment6 $address6"
+  #  echo "Committment6 $commitment7 $address7"
+
+  #  if [ -z $commitment7 ]; then
+  #      echo "Failed Commitment is empty"
+  #      exit 1
+  #  fi
+
+  #  if [ $commitment6 == $commitment7 ]; then
+  #    echo "Pass - Id, Order & OrderSecret(Beneficiary)"
+  #  else
+  #    echo "Fail"
+  #    exit 1
+  #  fi
+
+  # output8=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"$benid\",\"extension\":{\"coin\":\"0\"}}")
+  # op8=$(echo $output8 | jq .orderReference)
+  # commitment8=$(echo $output8 | jq .commitment)
+  # address8=$(echo $output8 | jq .extension.address)
 
 
+  # output9=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op8}")
+  # commitment9=$(echo $output9 | jq .commitment)
+  # address9=$(echo $output9 | jq .extension.address)
+  # orderReference=$(echo $output9 | jq .orderReference)
+  # orderIndex=1
 
-   #Tests against the Bitcoin Extension - different befificary
-   output6=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
-   #echo $output6
-   op6=$(echo $output6 | jq .orderReference)
-   commitment6=$(echo $output6 | jq .commitment)
-   address6=$(echo $output6 | jq .extension.address)
+  # echo "Committment7 $commitment8 $address8"
+  # echo "Committment8 $commitment9 $address9"
 
-   output7=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op6,\"beneficiaryIDDocumentCID\":\"$benid\"}")
-   address7=$(echo $output7 | jq .extension.address)
-   commitment7=$(echo $output7 | jq .commitment)
+  # if [ -z $commitment9 ]; then
+  #     echo "Failed Commitment is empty"
+  #     exit 1
+  # fi
 
-   echo "Committment5 $commitment6 $address6"
-   echo "Committment6 $commitment7 $address7"
-
-   if [ -z $commitment7 ]; then
-       echo "Failed Commitment is empty"
-       exit 1
-   fi
-
-   if [ $commitment6 == $commitment7 ]; then
-     echo "Pass - Id, Order & OrderSecret(Beneficiary)"
-   else
-     echo "Fail"
-     exit 1
-   fi
-
-  output8=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"$benid\",\"extension\":{\"coin\":\"0\"}}")
-  op8=$(echo $output8 | jq .orderReference)
-  commitment8=$(echo $output8 | jq .commitment)
-  address8=$(echo $output8 | jq .extension.address)
-
-
-  output9=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op8}")
-  commitment9=$(echo $output9 | jq .commitment)
-  address9=$(echo $output9 | jq .extension.address)
-  orderReference=$(echo $output9 | jq .orderReference)
-  orderIndex=1
-
-  echo "Committment7 $commitment8 $address8"
-  echo "Committment8 $commitment9 $address9"
-
-  if [ -z $commitment9 ]; then
-      echo "Failed Commitment is empty"
-      exit 1
-  fi
-
-  if [ $commitment8 == $commitment9 ]; then
-    echo "Pass - Id, Order(Beneficiary) & OrderSecret"
-  else
-      echo "Fail"
-      exit 1
-  fi
+  # if [ $commitment8 == $commitment9 ]; then
+  #   echo "Pass - Id, Order(Beneficiary) & OrderSecret"
+  # else
+  #     echo "Fail"
+  #     exit 1
+  # fi
 
 }
 
diff --git a/go.sum b/go.sum
index aed6fea..dfb1954 100644
--- a/go.sum
+++ b/go.sum
@@ -13,6 +13,7 @@
 github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo=
 github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s=
 github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
 github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -28,13 +29,18 @@
 github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
 github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 h1:A/EVblehb75cUgXA5njHPn0kLAsykn6mJGz7rnmW5W0=
 github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
+github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
 github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
 github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
 github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng=
 github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
+github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw=
 github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
+github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd h1:qdGvebPBDuYDPGi1WCPjy1tGyMpmDK8IEapSsszn7HE=
 github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
+github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723 h1:ZA/jbKoGcVAnER6pCHPEkGdZOV7U1oLUedErBHCUMs0=
 github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
+github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc=
 github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
 github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
 github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY=
@@ -283,14 +289,17 @@
 github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
 github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10=
 github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
+github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0=
 github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI=
 github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
 github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE=
 github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
 github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
diff --git a/libs/keystore/filestore_test.go b/libs/keystore/filestore_test.go
index 7e946dd..52c5958 100644
--- a/libs/keystore/filestore_test.go
+++ b/libs/keystore/filestore_test.go
@@ -28,7 +28,7 @@
 )
 
 func TestFileStore(t *testing.T) {
-	keys := map[string][]byte{"key1": []byte{1}, "key2": []byte{1, 2}, "key3": []byte{1, 2, 3}}
+	keys := map[string][]byte{"key1": {1}, "key2": {1, 2}, "key3": {1, 2, 3}}
 
 	fn := tmpFileName()
 	defer func() {
diff --git a/libs/keystore/memorystore_test.go b/libs/keystore/memorystore_test.go
index 5dd92a2..bd2a2b8 100644
--- a/libs/keystore/memorystore_test.go
+++ b/libs/keystore/memorystore_test.go
@@ -23,7 +23,7 @@
 )
 
 func TestMemoryStore(t *testing.T) {
-	keys := map[string][]byte{"key1": []byte{1}, "key2": []byte{1, 2}, "key3": []byte{1, 2, 3}}
+	keys := map[string][]byte{"key1": {1}, "key2": {1, 2}, "key3": {1, 2, 3}}
 
 	ms, err := NewMemoryStore()
 	if err != nil {
diff --git a/pkg/common/common.go b/pkg/common/common.go
index 6fefee7..03f815a 100644
--- a/pkg/common/common.go
+++ b/pkg/common/common.go
@@ -25,22 +25,15 @@
 	"io"
 	"time"
 
-	"github.com/apache/incubator-milagro-dta/libs/cryptowallet"
 	"github.com/apache/incubator-milagro-dta/libs/datastore"
 	"github.com/apache/incubator-milagro-dta/libs/documents"
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
+	"github.com/apache/incubator-milagro-dta/libs/keystore"
+	"github.com/apache/incubator-milagro-dta/pkg/identity"
 	"github.com/google/uuid"
 	"github.com/pkg/errors"
 )
 
-//IdentitySecrets - keys required for decryption and signing
-type IdentitySecrets struct {
-	Name          string `json:"Name"`
-	Seed          string `json:"Seed"`
-	SikeSecretKey string `json:"SikeSecretKey"`
-	BLSSecretKey  string `json:"BlsSecretKey"`
-}
-
 // CreateNewDepositOrder - Generate an empty new Deposit Order with random reference
 func CreateNewDepositOrder(BeneficiaryIDDocumentCID string, nodeID string) (*documents.OrderDoc, error) {
 	//Create a reference for this order
@@ -108,7 +101,7 @@
 }
 
 // CreateAndStoreOrderPart2 -
-func CreateAndStoreOrderPart2(ipfs ipfs.Connector, store *datastore.Store, order *documents.OrderDoc, orderPart1CID, commitmentPublicKey, nodeID string, recipients map[string]*documents.IDDoc) (orderPart2CID string, err error) {
+func CreateAndStoreOrderPart2(ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, order *documents.OrderDoc, orderPart1CID, commitmentPublicKey, nodeID string, recipients map[string]*documents.IDDoc) (orderPart2CID string, err error) {
 	Part2 := documents.OrderPart2{
 		CommitmentPublicKey: commitmentPublicKey,
 		PreviousOrderCID:    orderPart1CID,
@@ -116,7 +109,7 @@
 	}
 	order.OrderPart2 = &Part2
 	//Write the updated doc back to IPFS
-	orderPart2CID, err = WriteOrderToIPFS(nodeID, ipfs, store, nodeID, order, recipients)
+	orderPart2CID, err = WriteOrderToIPFS(nodeID, ipfs, store, keyStore, nodeID, order, recipients)
 	if err != nil {
 		return "", err
 	}
@@ -124,7 +117,7 @@
 }
 
 // CreateAndStorePart3 adds part 3 "redemption request" to the order doc
-func CreateAndStorePart3(ipfs ipfs.Connector, store *datastore.Store, order *documents.OrderDoc, orderPart2CID, nodeID string, beneficiaryEncryptedData []byte, recipients map[string]*documents.IDDoc) (orderPart3CID string, err error) {
+func CreateAndStorePart3(ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, order *documents.OrderDoc, orderPart2CID, nodeID string, beneficiaryEncryptedData []byte, recipients map[string]*documents.IDDoc) (orderPart3CID string, err error) {
 	//Add part 3 "redemption request" to the order doc
 	redemptionRequest := documents.OrderPart3{
 		//TODO
@@ -135,7 +128,7 @@
 	}
 	order.OrderPart3 = &redemptionRequest
 	//Write the updated doc back to IPFS
-	orderPart3CID, err = WriteOrderToIPFS(nodeID, ipfs, store, nodeID, order, recipients)
+	orderPart3CID, err = WriteOrderToIPFS(nodeID, ipfs, store, keyStore, nodeID, order, recipients)
 	if err != nil {
 		return "", nil
 	}
@@ -143,7 +136,7 @@
 }
 
 // CreateAndStoreOrderPart4 -
-func CreateAndStoreOrderPart4(ipfs ipfs.Connector, store *datastore.Store, order *documents.OrderDoc, commitmentPrivateKey, orderPart3CID, nodeID string, recipients map[string]*documents.IDDoc) (orderPart4CID string, err error) {
+func CreateAndStoreOrderPart4(ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, order *documents.OrderDoc, commitmentPrivateKey, orderPart3CID, nodeID string, recipients map[string]*documents.IDDoc) (orderPart4CID string, err error) {
 	Part4 := documents.OrderPart4{
 		Secret:           commitmentPrivateKey,
 		PreviousOrderCID: orderPart3CID,
@@ -151,7 +144,7 @@
 	}
 	order.OrderPart4 = &Part4
 	//Write the updated doc back to IPFS
-	orderPart4CID, err = WriteOrderToIPFS(nodeID, ipfs, store, nodeID, order, recipients)
+	orderPart4CID, err = WriteOrderToIPFS(nodeID, ipfs, store, keyStore, nodeID, order, recipients)
 	if err != nil {
 		return "", nil
 	}
@@ -159,14 +152,14 @@
 }
 
 // WriteOrderToIPFS writes the order document to IPFS network
-func WriteOrderToIPFS(nodeID string, ipfs ipfs.Connector, store *datastore.Store, id string, order *documents.OrderDoc, recipients map[string]*documents.IDDoc) (ipfsAddress string, err error) { // Get the secret keys
-	secrets := &IdentitySecrets{}
-	if err := store.Get("id-doc", nodeID, secrets); err != nil {
-		return "", errors.New("load secrets from store")
-	}
-	blsSecretKey, err := hex.DecodeString(secrets.BLSSecretKey)
+func WriteOrderToIPFS(nodeID string, ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, id string, order *documents.OrderDoc, recipients map[string]*documents.IDDoc) (ipfsAddress string, err error) { // Get the secret keys
+	seed, err := keyStore.Get("seed")
 	if err != nil {
-		return "", errors.Wrap(err, "Decode identity secrets")
+		return "", errors.New("load secrets")
+	}
+	_, blsSecretKey, err := identity.GenerateBLSKeys(seed)
+	if err != nil {
+		return "", err
 	}
 
 	rawDoc, err := documents.EncodeOrderDocument(nodeID, *order, blsSecretKey, recipients)
@@ -184,41 +177,6 @@
 	return ipfsAddress, nil
 }
 
-//InitECKeys - generate EC keys using BIP44 HD Wallets (as bitcoin) from seed
-func InitECKeys(seed []byte) ([]byte, error) {
-	//EC ADD Keypair Protocol
-	_, pubKeyECADD, _, err := cryptowallet.Bip44Address(seed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
-	if err != nil {
-		return nil, errors.Wrap(err, "Failed to derive EC HD Wallet Key")
-	}
-	return pubKeyECADD.SerializeCompressed(), nil
-}
-
-// RetrieveIdentitySecrets gets the secrets for the node ID
-func RetrieveIdentitySecrets(store *datastore.Store, nodeID string) (name string, seed []byte, blsSK []byte, sikeSK []byte, err error) {
-
-	var idSecrets = &IdentitySecrets{}
-	if err := store.Get("id-doc", nodeID, idSecrets); err != nil {
-		return "", nil, nil, nil, err
-	}
-
-	seed, err = hex.DecodeString(idSecrets.Seed)
-	if err != nil {
-		return "", nil, nil, nil, err
-	}
-
-	blsSK, err = hex.DecodeString(idSecrets.BLSSecretKey)
-	if err != nil {
-		return "", nil, nil, nil, err
-	}
-
-	sikeSK, err = hex.DecodeString(idSecrets.SikeSecretKey)
-	if err != nil {
-		return "", nil, nil, nil, err
-	}
-	return idSecrets.Name, seed, blsSK, sikeSK, nil
-}
-
 // BuildRecipientList builds a list of recipients who are able to decrypt the encrypted envelope
 func BuildRecipientList(ipfs ipfs.Connector, localNodeDocCID, remoteNodeDocCID string) (map[string]*documents.IDDoc, error) {
 	remoteNodeDoc, err := RetrieveIDDocFromIPFS(ipfs, remoteNodeDocCID)
diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index a45eacb..ae6e21f 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -21,6 +21,7 @@
 	"github.com/apache/incubator-milagro-dta/libs/cryptowallet"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/common"
+	"github.com/apache/incubator-milagro-dta/pkg/identity"
 )
 
 // FulfillOrder -
@@ -28,7 +29,13 @@
 	orderPart1CID := req.OrderPart1CID
 	nodeID := s.NodeID()
 	remoteIDDocCID := req.DocumentCID
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+
+	// SIKE key
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return nil, err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
 	if err != nil {
 		return nil, err
 	}
@@ -62,7 +69,7 @@
 	}
 
 	//Create an order response in IPFS
-	orderPart2CID, err := common.CreateAndStoreOrderPart2(s.Ipfs, s.Store, order, orderPart1CID, commitmentPublicKey, nodeID, recipientList)
+	orderPart2CID, err := common.CreateAndStoreOrderPart2(s.Ipfs, s.Store, s.KeyStore, order, orderPart1CID, commitmentPublicKey, nodeID, recipientList)
 	if err != nil {
 		return nil, err
 	}
@@ -78,7 +85,13 @@
 	orderPart3CID := req.OrderPart3CID
 	nodeID := s.NodeID()
 	remoteIDDocCID := req.SenderDocumentCID
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+
+	// SIKE key
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return nil, err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
 	if err != nil {
 		return nil, err
 	}
@@ -112,7 +125,7 @@
 	}
 
 	//Create an order response in IPFS
-	orderPart4ID, err := common.CreateAndStoreOrderPart4(s.Ipfs, s.Store, order, commitmentPrivateKey, orderPart3CID, nodeID, recipientList)
+	orderPart4ID, err := common.CreateAndStoreOrderPart4(s.Ipfs, s.Store, s.KeyStore, order, commitmentPrivateKey, orderPart3CID, nodeID, recipientList)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/defaultservice/identity.go b/pkg/defaultservice/identity.go
deleted file mode 100644
index ae256e5..0000000
--- a/pkg/defaultservice/identity.go
+++ /dev/null
@@ -1,98 +0,0 @@
-// 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 defaultservice
-
-import (
-	"encoding/hex"
-
-	"github.com/apache/incubator-milagro-dta/libs/documents"
-	"github.com/apache/incubator-milagro-dta/pkg/api"
-	"github.com/apache/incubator-milagro-dta/pkg/common"
-	"github.com/apache/incubator-milagro-dta/pkg/identity"
-	"github.com/pkg/errors"
-)
-
-// CreateIdentity creates a new identity
-func (s *Service) CreateIdentity(req *api.CreateIdentityRequest) (*api.CreateIdentityResponse, error) {
-	idDocumentCID, err := identity.CreateIdentity(req.Name, s.Ipfs, s.Store)
-	if err != nil {
-		return nil, err
-	}
-
-	return &api.CreateIdentityResponse{
-		IDDocumentCID: idDocumentCID,
-	}, nil
-}
-
-// GetIdentity retrieves an identity
-func (s *Service) GetIdentity(req *api.GetIdentityRequest) (*api.GetIdentityResponse, error) {
-	idDocumentCID := req.IDDocumentCID
-	idDocument, err := common.RetrieveIDDocFromIPFS(s.Ipfs, idDocumentCID)
-	if err != nil {
-		return nil, err
-	}
-	return &api.GetIdentityResponse{
-		IDDocumentCID:           idDocumentCID,
-		AuthenticationReference: idDocument.AuthenticationReference,
-		BeneficiaryECPublicKey:  hex.EncodeToString(idDocument.BeneficiaryECPublicKey),
-		SikePublicKey:           hex.EncodeToString(idDocument.SikePublicKey),
-		BLSPublicKey:            hex.EncodeToString(idDocument.BLSPublicKey),
-		Timestamp:               idDocument.Timestamp,
-	}, nil
-}
-
-// IdentityList reutrns the list of identities
-func (s *Service) IdentityList(req *api.IdentityListRequest) (*api.IdentityListResponse, error) {
-	page := req.Page
-	perPage := req.PerPage
-	sortBy := req.SortBy
-
-	IDDocumentCIDes, err := s.Store.ListKeys("id-doc", "time", page*perPage, perPage, sortBy != "dateCreatedAsc")
-	if err != nil {
-		return nil, err
-	}
-
-	fullIDList := make([]api.GetIdentityResponse, len(IDDocumentCIDes))
-	for i, idAddress := range IDDocumentCIDes {
-
-		rawDocI, err := s.Ipfs.Get(idAddress)
-		if err != nil {
-			return nil, errors.Wrapf(err, "Read identity Doc")
-		}
-
-		idDocument := &documents.IDDoc{}
-		if err = documents.DecodeIDDocument(rawDocI, idAddress, idDocument); err != nil {
-			return nil, err
-		}
-		//Need to copy the whole object so I can append the idddocadderess
-		idWithAddress := api.GetIdentityResponse{
-			IDDocumentCID:           idAddress,
-			AuthenticationReference: idDocument.AuthenticationReference,
-			BeneficiaryECPublicKey:  hex.EncodeToString(idDocument.BeneficiaryECPublicKey),
-			SikePublicKey:           hex.EncodeToString(idDocument.SikePublicKey),
-			BLSPublicKey:            hex.EncodeToString(idDocument.BLSPublicKey),
-			Timestamp:               idDocument.Timestamp,
-		}
-
-		fullIDList[i] = idWithAddress
-	}
-
-	return &api.IdentityListResponse{
-		IDDocumentList: fullIDList,
-	}, nil
-}
diff --git a/pkg/defaultservice/init.go b/pkg/defaultservice/init.go
index a39697a..f0c0190 100644
--- a/pkg/defaultservice/init.go
+++ b/pkg/defaultservice/init.go
@@ -22,6 +22,7 @@
 
 	"github.com/apache/incubator-milagro-dta/libs/datastore"
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
+	"github.com/apache/incubator-milagro-dta/libs/keystore"
 	"github.com/apache/incubator-milagro-dta/libs/logger"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/config"
@@ -59,14 +60,22 @@
 	}
 }
 
-// WithStore adds store to the Service
-func WithStore(store *datastore.Store) ServiceOption {
+// WithDataStore adds store to the Service
+func WithDataStore(store *datastore.Store) ServiceOption {
 	return func(s *Service) error {
 		s.Store = store
 		return nil
 	}
 }
 
+// WithKeyStore adds store to the Service
+func WithKeyStore(store keystore.Store) ServiceOption {
+	return func(s *Service) error {
+		s.KeyStore = store
+		return nil
+	}
+}
+
 // WithIPFS adds ipfs connector to the Service
 func WithIPFS(ipfsConnector ipfs.Connector) ServiceOption {
 	return func(s *Service) error {
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 4326ba0..bafd24c 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -25,6 +25,7 @@
 	"github.com/apache/incubator-milagro-dta/libs/documents"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/common"
+	"github.com/apache/incubator-milagro-dta/pkg/identity"
 	"github.com/pkg/errors"
 )
 
@@ -42,7 +43,12 @@
 		return nil, err
 	}
 
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, s.NodeID())
+	// SIKE key
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return nil, err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
 	if err != nil {
 		return nil, err
 	}
@@ -116,6 +122,7 @@
 	//Initialise values from Request object
 	beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
 	iDDocID := s.NodeID()
+
 	recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, s.MasterFiduciaryNodeID())
 	if err != nil {
 		return nil, err
@@ -138,7 +145,7 @@
 	}
 
 	//Write Order to IPFS
-	orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, iDDocID, order, recipientList)
+	orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, s.KeyStore, iDDocID, order, recipientList)
 	if err != nil {
 		return nil, err
 	}
@@ -154,11 +161,16 @@
 		return nil, errors.Wrap(err, "Contacting Fiduciary")
 	}
 
-	//Get the updated order out of IPFS
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, iDDocID)
+	// SIKE key
+	keyseed, err := s.KeyStore.Get("seed")
 	if err != nil {
 		return nil, err
 	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+	if err != nil {
+		return nil, err
+	}
+
 	updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, response.OrderPart2CID, sikeSK, iDDocID, remoteIDDoc.BLSPublicKey)
 	if err != nil {
 		return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS")
@@ -208,7 +220,16 @@
 		return nil, err
 	}
 
-	_, _, blsSK, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	// SIKE and BLS keys
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return nil, err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+	if err != nil {
+		return nil, err
+	}
+	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
 	if err != nil {
 		return nil, err
 	}
@@ -219,19 +240,9 @@
 		return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS")
 	}
 
-	var beneficiariesSikeSK []byte
-	var beneficiaryCID string
-
-	if req.BeneficiaryIDDocumentCID != "" {
-		beneficiaryCID = req.BeneficiaryIDDocumentCID
-	} else {
-		beneficiaryCID = order.BeneficiaryCID
-	}
-
-	_, beneficiariesSeed, _, beneficiariesSikeSK, err := common.RetrieveIdentitySecrets(s.Store, beneficiaryCID)
-	if err != nil {
-		return nil, err
-	}
+	// TODO: Split Beneficiary and Principal
+	beneficiariesSeed := keyseed
+	beneficiariesSikeSK := sikeSK
 
 	if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil {
 		return nil, err
@@ -245,7 +256,7 @@
 	}
 
 	//Create a request Object in IPFS
-	orderPart3CID, err := common.CreateAndStorePart3(s.Ipfs, s.Store, order, orderPart2CID, nodeID, beneficiaryEncryptedData, recipientList)
+	orderPart3CID, err := common.CreateAndStorePart3(s.Ipfs, s.Store, s.KeyStore, order, orderPart2CID, nodeID, beneficiaryEncryptedData, recipientList)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/defaultservice/service.go b/pkg/defaultservice/service.go
index f03ef54..b1787a3 100644
--- a/pkg/defaultservice/service.go
+++ b/pkg/defaultservice/service.go
@@ -26,6 +26,7 @@
 
 	"github.com/apache/incubator-milagro-dta/libs/datastore"
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
+	"github.com/apache/incubator-milagro-dta/libs/keystore"
 	"github.com/apache/incubator-milagro-dta/libs/logger"
 	"github.com/apache/incubator-milagro-dta/libs/transport"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
@@ -43,6 +44,7 @@
 	Logger                *logger.Logger
 	Rng                   io.Reader
 	Store                 *datastore.Store
+	KeyStore              keystore.Store
 	Ipfs                  ipfs.Connector
 	MasterFiduciaryServer api.ClientService
 	nodeID                string
diff --git a/pkg/endpoints/endpoints.go b/pkg/endpoints/endpoints.go
index 1481e8f..b1f7d9d 100644
--- a/pkg/endpoints/endpoints.go
+++ b/pkg/endpoints/endpoints.go
@@ -46,48 +46,6 @@
 
 // Endpoints returns all the exported endpoints
 func Endpoints(svc service.Service, corsAllow string, authorizer transport.Authorizer, logger *logger.Logger, nodeType string, pluginEndpoints service.Endpoints) transport.HTTPEndpoints {
-	identityEndpoints := transport.HTTPEndpoints{
-		"CreateIdentity": {
-			Path:        "/" + apiVersion + "/identity",
-			Method:      http.MethodPost,
-			Endpoint:    MakeCreateIdentityEndpoint(svc),
-			NewRequest:  func() interface{} { return &api.CreateIdentityRequest{} },
-			NewResponse: func() interface{} { return &api.CreateIdentityResponse{} },
-			Options: transport.ServerOptions(
-				transport.SetCors(corsAllow),
-				transport.AuthorizeOIDC(authorizer, false),
-			),
-			ErrStatus: transport.ErrorStatus{
-				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
-			},
-		},
-		"GetIdentity": {
-			Path:        "/" + apiVersion + "/identity/{IDDocumentCID}",
-			Method:      http.MethodGet,
-			Endpoint:    MakeGetIdentityEndpoint(svc),
-			NewResponse: func() interface{} { return &api.GetIdentityResponse{} },
-			Options: transport.ServerOptions(
-				transport.SetCors(corsAllow),
-				transport.AuthorizeOIDC(authorizer, false),
-			),
-			ErrStatus: transport.ErrorStatus{
-				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
-			},
-		},
-		"IdentityList": {
-			Path:        "/" + apiVersion + "/identity",
-			Method:      http.MethodGet,
-			Endpoint:    MakeIdentityListEndpoint(svc),
-			NewResponse: func() interface{} { return &api.IdentityListResponse{} },
-			Options: transport.ServerOptions(
-				transport.SetCors(corsAllow),
-				transport.AuthorizeOIDC(authorizer, false),
-			),
-			ErrStatus: transport.ErrorStatus{
-				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
-			},
-		},
-	}
 	principalEndpoints := transport.HTTPEndpoints{
 		"Order": {
 			Path:        "/" + apiVersion + "/order",
@@ -198,11 +156,11 @@
 	endpoints := transport.HTTPEndpoints{}
 	switch strings.ToLower(nodeType) {
 	case "multi":
-		endpoints = concatEndpoints(masterFiduciaryEndpoints, identityEndpoints, principalEndpoints, statusEndPoints)
+		endpoints = concatEndpoints(masterFiduciaryEndpoints, principalEndpoints, statusEndPoints)
 	case "principal":
-		endpoints = concatEndpoints(identityEndpoints, principalEndpoints, statusEndPoints)
+		endpoints = concatEndpoints(principalEndpoints, statusEndPoints)
 	case "fiduciary", "masterfiduciary":
-		endpoints = concatEndpoints(masterFiduciaryEndpoints, identityEndpoints, statusEndPoints)
+		endpoints = concatEndpoints(masterFiduciaryEndpoints, statusEndPoints)
 	}
 
 	plugNamespace, plugEndpoints := pluginEndpoints.Endpoints()
@@ -232,59 +190,6 @@
 	return dst
 }
 
-//MakeCreateIdentityEndpoint -
-func MakeCreateIdentityEndpoint(m service.Service) endpoint.Endpoint {
-	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
-		req, ok := request.(*api.CreateIdentityRequest)
-		if !ok {
-			return nil, transport.ErrInvalidRequest
-		}
-		if err := validateRequest(req); err != nil {
-			return "", err
-		}
-		return m.CreateIdentity(req)
-	}
-}
-
-//MakeGetIdentityEndpoint -
-func MakeGetIdentityEndpoint(m service.Service) endpoint.Endpoint {
-	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
-		params := transport.GetURLParams(ctx)
-		req := &api.GetIdentityRequest{
-			IDDocumentCID: params.Get("IDDocumentCID"),
-		}
-		if err := validateRequest(req); err != nil {
-			return "", err
-		}
-		return m.GetIdentity(req)
-	}
-}
-
-//MakeIdentityListEndpoint -
-func MakeIdentityListEndpoint(m service.Service) endpoint.Endpoint {
-	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
-		params := transport.GetParams(ctx)
-		sortBy := params.Get("sortBy")
-		perPage, err := strconv.Atoi(params.Get("perPage"))
-		if err != nil {
-			return nil, transport.ErrInvalidRequest
-		}
-		page, err := strconv.Atoi(params.Get("page"))
-		if err != nil {
-			return nil, transport.ErrInvalidRequest
-		}
-		req := &api.IdentityListRequest{
-			Page:    page,
-			PerPage: perPage,
-			SortBy:  sortBy,
-		}
-		if err := validateRequest(req); err != nil {
-			return "", err
-		}
-		return m.IdentityList(req)
-	}
-}
-
 //MakeOrderListEndpoint -
 func MakeOrderListEndpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
diff --git a/pkg/identity/identity.go b/pkg/identity/identity.go
index edbba97..6e94c05 100644
--- a/pkg/identity/identity.go
+++ b/pkg/identity/identity.go
@@ -21,78 +21,101 @@
 package identity
 
 import (
-	"encoding/hex"
+	"bytes"
 	"time"
 
-	"github.com/apache/incubator-milagro-dta/libs/crypto"
 	"github.com/apache/incubator-milagro-dta/libs/cryptowallet"
-	"github.com/apache/incubator-milagro-dta/libs/datastore"
 	"github.com/apache/incubator-milagro-dta/libs/documents"
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
-	"github.com/apache/incubator-milagro-dta/pkg/common"
+	"github.com/apache/incubator-milagro-dta/libs/keystore"
 	"github.com/pkg/errors"
 )
 
 // CreateIdentity creates a new identity
-// returns Identity secrets and Identity document
-func CreateIdentity(name string, ipfsConn ipfs.Connector, store *datastore.Store) (idDocumentCID string, err error) {
+// returns Identity document and secret
+func CreateIdentity(name string) (idDocument *documents.IDDoc, rawIDDoc, seed []byte, err error) {
 	//generate crypto random seed
-	seed, err := cryptowallet.RandomBytes(48)
+	seed, err = cryptowallet.RandomBytes(48)
 	if err != nil {
 		err = errors.Wrap(err, "Failed to generate random seed")
 		return
 	}
 
-	//Generate SIKE keys
-	rc1, sikePublicKey, sikeSecretKey := crypto.SIKEKeys(seed)
-	if rc1 != 0 {
-		err = errors.New("Failed to generate SIKE keys")
-		return
-	}
-
-	//Generate BLS keys
-	rc1, blsPublicKey, blsSecretKey := crypto.BLSKeys(seed, nil)
-	if rc1 != 0 {
-		err = errors.New("Failed to generate BLS keys")
-		return
-	}
-
-	ecPubKey, err := common.InitECKeys(seed)
+	sikePublicKey, _, err := GenerateSIKEKeys(seed)
 	if err != nil {
-		err = errors.Wrap(err, "Failed to generate EC Public Key")
 		return
 	}
 
-	//build ID Doc
-	idDocument := documents.NewIDDoc()
+	blsPublicKey, blsSecretKey, err := GenerateBLSKeys(seed)
+	if err != nil {
+		return
+	}
+
+	ecPublicKey, err := GenerateECPublicKey(seed)
+	if err != nil {
+		return
+	}
+
+	// build ID Doc
+	idDocument = documents.NewIDDoc()
 	idDocument.AuthenticationReference = name
-	idDocument.BeneficiaryECPublicKey = ecPubKey
+	idDocument.BeneficiaryECPublicKey = ecPublicKey
 	idDocument.SikePublicKey = sikePublicKey
 	idDocument.BLSPublicKey = blsPublicKey
 	idDocument.Timestamp = time.Now().Unix()
 
-	rawIDDoc, err := documents.EncodeIDDocument(idDocument, blsSecretKey)
+	// encode ID Doc
+	rawIDDoc, err = documents.EncodeIDDocument(idDocument, blsSecretKey)
 	if err != nil {
 		err = errors.Wrap(err, "Failed to encode IDDocument")
 		return
 	}
 
+	return
+}
+
+// StoreIdentity writes IDDocument to IPFS and secret to keystore
+func StoreIdentity(rawIDDoc, secret []byte, ipfsConn ipfs.Connector, store keystore.Store) (idDocumentCID string, err error) {
+	// add ID Doc to IPFS
 	idDocumentCID, err = ipfsConn.Add(rawIDDoc)
+	if err != nil {
+		return
+	}
+	// store the seed
+	err = store.Set("seed", secret)
+	return
+}
 
-	secrets := common.IdentitySecrets{
-		Name:          name,
-		Seed:          hex.EncodeToString(seed),
-		BLSSecretKey:  hex.EncodeToString(blsSecretKey),
-		SikeSecretKey: hex.EncodeToString(sikeSecretKey),
+// CheckIdentity verifies the IDDocument
+func CheckIdentity(id, name string, ipfsConn ipfs.Connector, store keystore.Store) error {
+
+	rawIDDoc, err := ipfsConn.Get(id)
+	if err != nil {
+		return errors.Wrap(err, "ID Document not found")
 	}
 
-	if store != nil {
-		err = store.Set("id-doc", idDocumentCID, secrets, map[string]string{"time": time.Now().UTC().Format(time.RFC3339)})
-		if err != nil {
-			err = errors.Wrap(err, "Failed to store ID Document")
-			return
-		}
+	idDoc := &documents.IDDoc{}
+	if err := documents.DecodeIDDocument(rawIDDoc, id, idDoc); err != nil {
+		return errors.Wrap(err, "Decode ID document")
 	}
 
-	return idDocumentCID, nil
+	if idDoc.AuthenticationReference != name {
+		return errors.New("Name doesn't match the authentication reference")
+	}
+
+	seed, err := store.Get("seed")
+	if err != nil {
+		return errors.Wrap(err, "Seed not found")
+	}
+
+	sikePublic, _, err := GenerateSIKEKeys(seed)
+	if !bytes.Equal(idDoc.SikePublicKey, sikePublic) {
+		return errors.New("SIKE keys are different")
+	}
+	blsPublic, _, err := GenerateBLSKeys(seed)
+	if !bytes.Equal(idDoc.BLSPublicKey, blsPublic) {
+		return errors.New("BLS keys are different")
+	}
+
+	return nil
 }
diff --git a/pkg/identity/identity_test.go b/pkg/identity/identity_test.go
new file mode 100644
index 0000000..fdbed83
--- /dev/null
+++ b/pkg/identity/identity_test.go
@@ -0,0 +1,47 @@
+// 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 identity
+
+import (
+	"testing"
+
+	"github.com/apache/incubator-milagro-dta/libs/ipfs"
+	"github.com/apache/incubator-milagro-dta/libs/keystore"
+)
+
+func TestCreateIdentity(t *testing.T) {
+
+	ipfsNode, err := ipfs.NewMemoryConnector()
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	store, _ := keystore.NewMemoryStore()
+
+	_, rawIDDoc, secret, err := CreateIdentity("test")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	idDocID, err := StoreIdentity(rawIDDoc, secret, ipfsNode, store)
+
+	if err := CheckIdentity(idDocID, "test", ipfsNode, store); err != nil {
+		t.Fatal(err)
+	}
+
+}
diff --git a/pkg/identity/keys.go b/pkg/identity/keys.go
new file mode 100644
index 0000000..276b157
--- /dev/null
+++ b/pkg/identity/keys.go
@@ -0,0 +1,63 @@
+// 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 identity
+
+import (
+	"fmt"
+
+	"github.com/apache/incubator-milagro-dta/libs/crypto"
+	"github.com/apache/incubator-milagro-dta/libs/cryptowallet"
+	"github.com/pkg/errors"
+)
+
+// Secrets - keys required for decryption and signing
+type Secrets struct {
+	Seed          []byte
+	SikeSecretKey []byte
+	BLSSecretKey  []byte
+}
+
+// GenerateBLSKeys generate BLS keys from seed
+func GenerateBLSKeys(seed []byte) (blsPublic, blsSecret []byte, err error) {
+	rc1, blsPublic, blsSecret := crypto.BLSKeys(seed, nil)
+	if rc1 != 0 {
+		err = fmt.Errorf("Failed to generate BLS keys: %v", rc1)
+	}
+	return
+}
+
+// GenerateSIKEKeys generate SIKE keys from seed
+func GenerateSIKEKeys(seed []byte) (sikePublic, sikeSecret []byte, err error) {
+	rc1, sikePublic, sikeSecret := crypto.SIKEKeys(seed)
+	if rc1 != 0 {
+		err = fmt.Errorf("Failed to generate SIKE keys: %v", rc1)
+	}
+	return
+}
+
+// GenerateECPublicKey - generate EC keys using BIP44 HD Wallets (as bitcoin) from seed
+func GenerateECPublicKey(seed []byte) (ecPublic []byte, err error) {
+	//EC ADD Keypair Protocol
+	_, pubKeyECADD, _, err := cryptowallet.Bip44Address(seed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
+	if err != nil {
+		err = errors.Wrap(err, "Failed to derive EC HD Wallet Key")
+		return
+	}
+
+	return pubKeyECADD.SerializeCompressed(), nil
+}
diff --git a/pkg/service/service.go b/pkg/service/service.go
index 0121994..f0ed3d4 100644
--- a/pkg/service/service.go
+++ b/pkg/service/service.go
@@ -27,11 +27,6 @@
 
 // Service is the CustodyService interface
 type Service interface {
-	//Identity
-	CreateIdentity(req *api.CreateIdentityRequest) (*api.CreateIdentityResponse, error)
-	GetIdentity(req *api.GetIdentityRequest) (*api.GetIdentityResponse, error)
-	IdentityList(req *api.IdentityListRequest) (*api.IdentityListResponse, error)
-
 	//Order
 	GetOrder(req *api.GetOrderRequest) (*api.GetOrderResponse, error)
 	OrderList(req *api.OrderListRequest) (*api.OrderListResponse, error)