diff --git a/client/cmd/eris-client.go b/client/cmd/eris-client.go
index 0c7585230a93199ff8d06b68039404340a21c38e..f073141998de883a7134df05199485f30b5e53e0 100644
--- a/client/cmd/eris-client.go
+++ b/client/cmd/eris-client.go
@@ -62,6 +62,10 @@ func AddGlobalFlags() {
 func AddClientCommands() {
 	ErisClientCmd.AddCommand(buildTransactionCommand())
 	ErisClientCmd.AddCommand(buildStatusCommand())
+
+	buildGenesisGenCommand()
+	ErisClientCmd.AddCommand(GenesisGenCmd)
+
 }
 
 //------------------------------------------------------------------------------
diff --git a/client/cmd/genesis.go b/client/cmd/genesis.go
new file mode 100644
index 0000000000000000000000000000000000000000..ad8d01216b3fdcbc1304c7e8787581e533a49403
--- /dev/null
+++ b/client/cmd/genesis.go
@@ -0,0 +1,39 @@
+package commands
+
+import (
+	"fmt"
+
+	"github.com/eris-ltd/eris-db/genesis"
+
+	"github.com/spf13/cobra"
+)
+
+// TODO refactor these vars into a struct?
+var (
+	AccountsPathFlag   string
+	ValidatorsPathFlag string
+)
+
+var GenesisGenCmd = &cobra.Command{
+	Use:   "make-genesis",
+	Short: "eris-client make-genesis creates a genesis.json with known inputs",
+	Long:  "eris-client make-genesis creates a genesis.json with known inputs",
+
+	Run: func(cmd *cobra.Command, args []string) {
+		// TODO refactor to not panic
+		genesisFile, err := genesis.GenerateKnown(args[0], AccountsPathFlag, ValidatorsPathFlag)
+		if err != nil {
+			panic(err)
+		}
+		fmt.Println(genesisFile) // may want to save somewhere instead
+	},
+}
+
+func buildGenesisGenCommand() {
+	addGenesisPersistentFlags()
+}
+
+func addGenesisPersistentFlags() {
+	GenesisGenCmd.Flags().StringVarP(&AccountsPathFlag, "accounts", "", "", "path to accounts.csv with the following params: (pubkey, starting balance, name, permissions, setbit")
+	GenesisGenCmd.Flags().StringVarP(&ValidatorsPathFlag, "validators", "", "", "path to validators.csv with the following params: (pubkey, starting balance, name, permissions, setbit")
+}
diff --git a/client/cmd/transaction.go b/client/cmd/transaction.go
index a527577481c7fec56dc87ac25383cbfef6b7f3f7..e020c0ac12cbee9d99d63c7e314b295fe91c2980 100644
--- a/client/cmd/transaction.go
+++ b/client/cmd/transaction.go
@@ -23,6 +23,8 @@ import (
 
 	"github.com/eris-ltd/eris-db/client/methods"
 	"github.com/eris-ltd/eris-db/util"
+
+	"github.com/eris-ltd/eris-db/client/transaction"
 )
 
 func buildTransactionCommand() *cobra.Command {
diff --git a/client/transaction/transaction.go b/client/transaction/transaction.go
new file mode 100644
index 0000000000000000000000000000000000000000..a004d5de327934dfa03eca93a9bcbcdf58c21c8a
--- /dev/null
+++ b/client/transaction/transaction.go
@@ -0,0 +1,96 @@
+// Copyright 2015, 2016 Eris Industries (UK) Ltd.
+// This file is part of Eris-RT
+
+// Eris-RT 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.
+
+// Eris-RT 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 Eris-RT.  If not, see <http://www.gnu.org/licenses/>.
+
+package transaction
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/eris-ltd/eris-cli/log"
+
+	"github.com/eris-ltd/eris-db/client"
+	"github.com/eris-ltd/eris-db/client/core"
+	"github.com/eris-ltd/eris-db/definitions"
+	"github.com/eris-ltd/eris-db/keys"
+)
+
+func Send(do *definitions.ClientDo) {
+	// construct two clients to call out to keys server and
+	// blockchain node.
+	erisKeyClient := keys.NewErisKeyClient(do.SignAddrFlag)
+	erisNodeClient := client.NewErisNodeClient(do.NodeAddrFlag)
+	// form the send transaction
+	sendTransaction, err := core.Send(erisNodeClient, erisKeyClient,
+		do.PubkeyFlag, do.AddrFlag, do.ToFlag, do.AmtFlag, do.NonceFlag)
+	if err != nil {
+		log.Fatalf("Failed on forming Send Transaction: %s", err)
+		return
+	}
+	// TODO: [ben] we carry over the sign bool, but always set it to true,
+	// as we move away from and deprecate the api that allows sending unsigned
+	// transactions and relying on (our) receiving node to sign it.
+	unpackSignAndBroadcast(
+		core.SignAndBroadcast(do.ChainidFlag, erisNodeClient,
+			erisKeyClient, sendTransaction, true, do.BroadcastFlag, do.WaitFlag))
+}
+
+func Call(do *definitions.ClientDo) {
+	// construct two clients to call out to keys server and
+	// blockchain node.
+	erisKeyClient := keys.NewErisKeyClient(do.SignAddrFlag)
+	erisNodeClient := client.NewErisNodeClient(do.NodeAddrFlag)
+	// form the call transaction
+	callTransaction, err := core.Call(erisNodeClient, erisKeyClient,
+		do.PubkeyFlag, do.AddrFlag, do.ToFlag, do.AmtFlag, do.NonceFlag,
+		do.GasFlag, do.FeeFlag, do.DataFlag)
+	if err != nil {
+		log.Fatalf("Failed on forming Call Transaction: %s", err)
+		return
+	}
+	// TODO: [ben] we carry over the sign bool, but always set it to true,
+	// as we move away from and deprecate the api that allows sending unsigned
+	// transactions and relying on (our) receiving node to sign it.
+	unpackSignAndBroadcast(
+		core.SignAndBroadcast(do.ChainidFlag, erisNodeClient,
+			erisKeyClient, callTransaction, true, do.BroadcastFlag, do.WaitFlag))
+}
+
+//----------------------------------------------------------------------
+// Helper functions
+
+func unpackSignAndBroadcast(result *core.TxResult, err error) {
+	if err != nil {
+		log.Fatalf("Failed on signing (and broadcasting) transaction: %s", err)
+		os.Exit(1)
+	}
+	if result == nil {
+		// if we don't provide --sign or --broadcast
+		return
+	}
+	printResult := log.Fields{
+		"transaction hash": fmt.Sprintf("%X", result.Hash),
+	}
+	if result.Address != nil {
+		printResult["Contract Address"] = fmt.Sprintf("%X", result.Address)
+	}
+	if result.Return != nil {
+		printResult["Block Hash"] = fmt.Sprintf("%X", result.BlockHash)
+		printResult["Return Value"] = fmt.Sprintf("%X", result.Return)
+		printResult["Exception"] = fmt.Sprintf("%s", result.Exception)
+	}
+	log.WithFields(printResult).Warn("Result")
+}
diff --git a/genesis/gen_test.go b/genesis/gen_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..30d5f9c511df7efbd372c6a44814b1c0d64070c8
--- /dev/null
+++ b/genesis/gen_test.go
@@ -0,0 +1,162 @@
+package genesis
+
+import (
+	"bytes"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"testing"
+)
+
+// set the chain ID
+var chainID string = "genesis-file-maker-test"
+
+var genesisFileExpected string = `{
+	"genesis_time": "0001-01-01T00:00:00.000Z",
+	"chain_id": "genesis-file-maker-test",
+	"params": null,
+	"accounts": [
+		{
+			"address": "74417C1BEFB3938B71B22B202050A4C6591FFCF6",
+			"amount": 9999999999,
+			"name": "genesis-file-maker-test_developer_000",
+			"permissions": {
+				"base": {
+					"perms": 14430,
+					"set": 16383
+				},
+				"roles": []
+			}
+		},
+		{
+			"address": "0C9DAEA4046491A661FCE0B41B0CAA2AD3415268",
+			"amount": 99999999999999,
+			"name": "genesis-file-maker-test_full_000",
+			"permissions": {
+				"base": {
+					"perms": 16383,
+					"set": 16383
+				},
+				"roles": []
+			}
+		},
+		{
+			"address": "E1BD50A1B90A15861F5CF0F182D291F556B21A86",
+			"amount": 9999999999,
+			"name": "genesis-file-maker-test_participant_000",
+			"permissions": {
+				"base": {
+					"perms": 2118,
+					"set": 16383
+				},
+				"roles": []
+			}
+		},
+		{
+			"address": "A6C8E2DE652DB8ADB4036293DC21F8FE389D77C2",
+			"amount": 9999999999,
+			"name": "genesis-file-maker-test_root_000",
+			"permissions": {
+				"base": {
+					"perms": 16383,
+					"set": 16383
+				},
+				"roles": []
+			}
+		},
+		{
+			"address": "E96CB7910001320B6F1E2266A8431D5E98FF0183",
+			"amount": 9999999999,
+			"name": "genesis-file-maker-test_validator_000",
+			"permissions": {
+				"base": {
+					"perms": 32,
+					"set": 16383
+				},
+				"roles": []
+			}
+		}
+	],
+	"validators": [
+		{
+			"pub_key": [
+				1,
+				"238E1A77CC7CDCD13F4D77841F1FE4A46A77DB691EC89718CD0D4CB3409F61D2"
+			],
+			"amount": 9999999999,
+			"name": "genesis-file-maker-test_full_000",
+			"unbond_to": [
+				{
+					"address": "0C9DAEA4046491A661FCE0B41B0CAA2AD3415268",
+					"amount": 9999999999
+				}
+			]
+		},
+		{
+			"pub_key": [
+				1,
+				"7F53D78C526F96C87ACBD0D2B9DB2E9FC176981623D26B1DB1CF59748EE9F4CF"
+			],
+			"amount": 9999999998,
+			"name": "genesis-file-maker-test_validator_000",
+			"unbond_to": [
+				{
+					"address": "E96CB7910001320B6F1E2266A8431D5E98FF0183",
+					"amount": 9999999998
+				}
+			]
+		}
+	]
+}`
+
+var accountsCSV string = `F0BD5CE45D306D61C9AB73CE5268C2B59D52CAF7127EF0E3B65523302254350A,9999999999,genesis-file-maker-test_developer_000,14430,16383
+238E1A77CC7CDCD13F4D77841F1FE4A46A77DB691EC89718CD0D4CB3409F61D2,99999999999999,genesis-file-maker-test_full_000,16383,16383
+E37A655E560D53721C9BB06BA742398323504DFE2EB2C67E71F8D16E71E0471B,9999999999,genesis-file-maker-test_participant_000,2118,16383
+EC0E38CC8308EC9E720EE839242A7BC5C781D1F852E962FAC5A8E0599CE5B224,9999999999,genesis-file-maker-test_root_000,16383,16383
+7F53D78C526F96C87ACBD0D2B9DB2E9FC176981623D26B1DB1CF59748EE9F4CF,9999999999,genesis-file-maker-test_validator_000,32,16383`
+
+var validatorsCSV string = `238E1A77CC7CDCD13F4D77841F1FE4A46A77DB691EC89718CD0D4CB3409F61D2,9999999999,genesis-file-maker-test_full_000,16383,16383
+7F53D78C526F96C87ACBD0D2B9DB2E9FC176981623D26B1DB1CF59748EE9F4CF,9999999998,genesis-file-maker-test_validator_000,32,16383`
+
+func TestKnownCSV(t *testing.T) {
+	// make temp dir
+	dir, err := ioutil.TempDir(os.TempDir(), "genesis-file-maker-test")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() {
+		//cleanup
+		os.RemoveAll(dir)
+		if err != nil {
+			t.Fatal(err)
+		}
+
+	}()
+
+	// set the filepaths to be written to
+	accountsCSVpath := filepath.Join(dir, "accounts.csv")
+	validatorsCSVpath := filepath.Join(dir, "validators.csv")
+
+	// write the accounts.csv
+	if err := ioutil.WriteFile(accountsCSVpath, []byte(accountsCSV), 0600); err != nil {
+		t.Fatal(err)
+	}
+
+	// write the validators.csv
+	if err := ioutil.WriteFile(validatorsCSVpath, []byte(validatorsCSV), 0600); err != nil {
+		t.Fatal(err)
+	}
+
+	// create the genesis file
+	genesisFileWritten, err := GenerateKnown(chainID, accountsCSVpath, validatorsCSVpath)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	// compare
+	if !bytes.Equal([]byte(genesisFileExpected), []byte(genesisFileWritten)) {
+		t.Fatalf("Bad genesis file: got (%s), expected (%s)", genesisFileWritten, genesisFileExpected)
+	}
+
+}
diff --git a/genesis/make_genesis_file.go b/genesis/make_genesis_file.go
new file mode 100644
index 0000000000000000000000000000000000000000..c4324366ccf4f1c6195684ce32c59592ddc37712
--- /dev/null
+++ b/genesis/make_genesis_file.go
@@ -0,0 +1,199 @@
+package genesis
+
+import (
+	"bytes"
+	"encoding/csv"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"os"
+	"strconv"
+
+	ptypes "github.com/eris-ltd/eris-db/permission/types"
+	"github.com/eris-ltd/eris-db/util"
+
+	"github.com/tendermint/go-crypto"
+	wire "github.com/tendermint/go-wire"
+)
+
+//------------------------------------------------------------------------------------
+// core functions
+
+func GenerateKnown(chainID, accountsPathCSV, validatorsPathCSV string) (string, error) {
+	var genDoc *GenesisDoc
+
+	// TODO [eb] eliminate reading priv_val ... [zr] where?
+	if accountsPathCSV == "" || validatorsPathCSV == "" {
+		return "", fmt.Errorf("both accounts.csv and validators.csv is required")
+	}
+
+	pubkeys, amts, names, perms, setbits, err := parseCsv(validatorsPathCSV)
+	if err != nil {
+		return "", err
+	}
+
+	pubkeysA, amtsA, namesA, permsA, setbitsA, err := parseCsv(accountsPathCSV)
+	if err != nil {
+		return "", err
+	}
+
+	genDoc = newGenDoc(chainID, len(pubkeys), len(pubkeysA))
+	for i, pk := range pubkeys {
+		genDocAddValidator(genDoc, pk, amts[i], names[i], perms[i], setbits[i], i)
+	}
+	for i, pk := range pubkeysA {
+		genDocAddAccount(genDoc, pk, amtsA[i], namesA[i], permsA[i], setbitsA[i], i)
+	}
+
+	buf, buf2, n := new(bytes.Buffer), new(bytes.Buffer), new(int)
+	wire.WriteJSON(genDoc, buf, n, &err)
+	if err != nil {
+		return "", err
+	}
+	if err := json.Indent(buf2, buf.Bytes(), "", "\t"); err != nil {
+		return "", err
+	}
+
+	return buf2.String(), nil
+}
+
+//-----------------------------------------------------------------------------
+// gendoc convenience functions
+
+func newGenDoc(chainID string, nVal, nAcc int) *GenesisDoc {
+	genDoc := GenesisDoc{
+		ChainID: chainID,
+		// GenesisTime: time.Now(),
+	}
+	genDoc.Accounts = make([]GenesisAccount, nAcc)
+	genDoc.Validators = make([]GenesisValidator, nVal)
+	return &genDoc
+}
+
+func genDocAddAccount(genDoc *GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) {
+	addr := pubKey.Address()
+	acc := GenesisAccount{
+		Address: addr,
+		Amount:  amt,
+		Name:    name,
+		Permissions: &ptypes.AccountPermissions{
+			Base: ptypes.BasePermissions{
+				Perms:  perm,
+				SetBit: setbit,
+			},
+		},
+	}
+	if index < 0 {
+		genDoc.Accounts = append(genDoc.Accounts, acc)
+	} else {
+		genDoc.Accounts[index] = acc
+	}
+}
+
+func genDocAddValidator(genDoc *GenesisDoc, pubKey crypto.PubKeyEd25519, amt int64, name string, perm, setbit ptypes.PermFlag, index int) {
+	addr := pubKey.Address()
+	genDoc.Validators[index] = GenesisValidator{
+		PubKey: pubKey,
+		Amount: amt,
+		Name:   name,
+		UnbondTo: []BasicAccount{
+			{
+				Address: addr,
+				Amount:  amt,
+			},
+		},
+	}
+	// [zr] why no index < 0 like in genDocAddAccount?
+}
+
+//-----------------------------------------------------------------------------
+// util functions
+
+// convert hex strings to ed25519 pubkeys
+func pubKeyStringsToPubKeys(pubkeys []string) ([]crypto.PubKeyEd25519, error) {
+	pubKeys := make([]crypto.PubKeyEd25519, len(pubkeys))
+	for i, k := range pubkeys {
+		pubBytes, err := hex.DecodeString(k)
+		if err != nil {
+			return pubKeys, err
+		}
+		copy(pubKeys[i][:], pubBytes)
+	}
+	return pubKeys, nil
+}
+
+// empty is over written
+func ifExistsElse(list []string, index int, defaultValue string) string {
+	if len(list) > index {
+		if list[index] != "" {
+			return list[index]
+		}
+	}
+	return defaultValue
+}
+
+// takes a csv in the following format: pubkey, starting balance, name, permissions, setbit
+func parseCsv(filePath string) (pubKeys []crypto.PubKeyEd25519, amts []int64, names []string, perms, setbits []ptypes.PermFlag, err error) {
+
+	csvFile, err := os.Open(filePath)
+	if err != nil {
+		util.Fatalf("Couldn't open file: %s: %v", filePath, err)
+	}
+	defer csvFile.Close()
+
+	r := csv.NewReader(csvFile)
+	//r.FieldsPerRecord = # of records expected
+	params, err := r.ReadAll()
+	if err != nil {
+		util.Fatalf("Couldn't read file: %v", err)
+
+	}
+
+	pubkeys := make([]string, len(params))
+	amtS := make([]string, len(params))
+	names = make([]string, len(params))
+	permsS := make([]string, len(params))
+	setbitS := make([]string, len(params))
+	for i, each := range params {
+		pubkeys[i] = each[0]
+		amtS[i] = ifExistsElse(each, 1, "1000")
+		names[i] = ifExistsElse(each, 2, "")
+		permsS[i] = ifExistsElse(each, 3, fmt.Sprintf("%d", ptypes.DefaultPermFlags))
+		setbitS[i] = ifExistsElse(each, 4, permsS[i])
+	}
+
+	//TODO convert int to uint64, see issue #25
+	perms = make([]ptypes.PermFlag, len(permsS))
+	for i, perm := range permsS {
+		pflag, err := strconv.Atoi(perm)
+		if err != nil {
+			util.Fatalf("Permissions (%v) must be an integer", perm)
+		}
+		perms[i] = ptypes.PermFlag(pflag)
+	}
+	setbits = make([]ptypes.PermFlag, len(setbitS))
+	for i, setbit := range setbitS {
+		setbitsFlag, err := strconv.Atoi(setbit)
+		if err != nil {
+			util.Fatalf("SetBits (%v) must be an integer", setbit)
+		}
+		setbits[i] = ptypes.PermFlag(setbitsFlag)
+	}
+
+	// convert amts to ints
+	amts = make([]int64, len(amtS))
+	for i, a := range amtS {
+		if amts[i], err = strconv.ParseInt(a, 10, 64); err != nil {
+			err = fmt.Errorf("Invalid amount: %v", err)
+			return
+		}
+	}
+
+	// convert pubkey hex strings to struct
+	pubKeys, err = pubKeyStringsToPubKeys(pubkeys)
+	if err != nil {
+		return
+	}
+
+	return pubKeys, amts, names, perms, setbits, nil
+}
diff --git a/genesis/types.go b/genesis/types.go
new file mode 100644
index 0000000000000000000000000000000000000000..d03e6197645b67ab9f306a9d71106a2ab0d7b338
--- /dev/null
+++ b/genesis/types.go
@@ -0,0 +1,67 @@
+package genesis
+
+import (
+	"fmt"
+	"os"
+	"time"
+
+	ptypes "github.com/eris-ltd/eris-db/permission/types"
+	"github.com/tendermint/go-crypto"
+	"github.com/tendermint/go-wire"
+)
+
+//------------------------------------------------------------
+// we store the GenesisDoc in the db under this key
+
+var GenDocKey = []byte("GenDocKey")
+
+//------------------------------------------------------------
+// core types for a genesis definition
+
+type BasicAccount struct {
+	Address []byte `json:"address"`
+	Amount  int64  `json:"amount"`
+}
+
+type GenesisAccount struct {
+	Address     []byte                     `json:"address"`
+	Amount      int64                      `json:"amount"`
+	Name        string                     `json:"name"`
+	Permissions *ptypes.AccountPermissions `json:"permissions"`
+}
+
+type GenesisValidator struct {
+	PubKey   crypto.PubKey  `json:"pub_key"`
+	Amount   int64          `json:"amount"`
+	Name     string         `json:"name"`
+	UnbondTo []BasicAccount `json:"unbond_to"`
+}
+
+type GenesisParams struct {
+	GlobalPermissions *ptypes.AccountPermissions `json:"global_permissions"`
+}
+
+//------------------------------------------------------------
+// GenesisDoc is stored in the state database
+
+type GenesisDoc struct {
+	GenesisTime time.Time          `json:"genesis_time"`
+	ChainID     string             `json:"chain_id"`
+	Params      *GenesisParams     `json:"params"`
+	Accounts    []GenesisAccount   `json:"accounts"`
+	Validators  []GenesisValidator `json:"validators"`
+}
+
+//------------------------------------------------------------
+// Make genesis state from file
+
+func GenesisDocFromJSON(jsonBlob []byte) (genState *GenesisDoc) {
+	var err error
+	wire.ReadJSONPtr(&genState, jsonBlob, &err)
+	if err != nil {
+		fmt.Printf("Couldn't read GenesisDoc: %v", err)
+		// TODO: on error return error, not exit
+		os.Exit(1)
+	}
+	return
+}
diff --git a/manager/eris-mint/eris-mint.go b/manager/eris-mint/eris-mint.go
index 6a79b82eacdaaa0c628c3ab2598c08155f2b2533..90f9af757bd1548845b1e304e7953a12289f6948 100644
--- a/manager/eris-mint/eris-mint.go
+++ b/manager/eris-mint/eris-mint.go
@@ -27,6 +27,7 @@ import (
 
 	"github.com/eris-ltd/eris-db/logging"
 	"github.com/eris-ltd/eris-db/logging/loggers"
+
 	sm "github.com/eris-ltd/eris-db/manager/eris-mint/state"
 	manager_types "github.com/eris-ltd/eris-db/manager/types"
 	"github.com/eris-ltd/eris-db/txs"
diff --git a/manager/eris-mint/pipe.go b/manager/eris-mint/pipe.go
index 121f9fa4387854697913d9d2be4df6a16b7aa3fd..014de66207a1c2b0f27de336016d15291f9c8de6 100644
--- a/manager/eris-mint/pipe.go
+++ b/manager/eris-mint/pipe.go
@@ -36,11 +36,11 @@ import (
 	core_types "github.com/eris-ltd/eris-db/core/types"
 	"github.com/eris-ltd/eris-db/definitions"
 	edb_event "github.com/eris-ltd/eris-db/event"
+	genesis "github.com/eris-ltd/eris-db/genesis"
 	"github.com/eris-ltd/eris-db/logging"
 	"github.com/eris-ltd/eris-db/logging/loggers"
 	vm "github.com/eris-ltd/eris-db/manager/eris-mint/evm"
 	"github.com/eris-ltd/eris-db/manager/eris-mint/state"
-	state_types "github.com/eris-ltd/eris-db/manager/eris-mint/state/types"
 	manager_types "github.com/eris-ltd/eris-db/manager/types"
 	rpc_tm_types "github.com/eris-ltd/eris-db/rpc/tendermint/core/types"
 	"github.com/eris-ltd/eris-db/txs"
@@ -57,7 +57,7 @@ type erisMintPipe struct {
 	namereg         *namereg
 	transactor      *transactor
 	// Genesis cache
-	genesisDoc   *state_types.GenesisDoc
+	genesisDoc   *genesis.GenesisDoc
 	genesisState *state.State
 	logger       loggers.InfoTraceLogger
 }
@@ -142,7 +142,7 @@ func NewErisMintPipe(moduleConfig *config.ModuleConfig,
 // If no state can be loaded, the JSON genesis file will be loaded into the
 // state database as the zero state.
 func startState(dataDir, backend, genesisFile, chainId string) (*state.State,
-	*state_types.GenesisDoc, error) {
+	*genesis.GenesisDoc, error) {
 	// avoid Tendermints PanicSanity and return a clean error
 	if backend != db.DBBackendMemDB &&
 		backend != db.DBBackendLevelDB {
@@ -152,18 +152,18 @@ func startState(dataDir, backend, genesisFile, chainId string) (*state.State,
 
 	stateDB := db.NewDB("erismint", backend, dataDir)
 	newState := state.LoadState(stateDB)
-	var genesisDoc *state_types.GenesisDoc
+	var genesisDoc *genesis.GenesisDoc
 	if newState == nil {
 		genesisDoc, newState = state.MakeGenesisStateFromFile(stateDB, genesisFile)
 		newState.Save()
 		buf, n, err := new(bytes.Buffer), new(int), new(error)
 		wire.WriteJSON(genesisDoc, buf, n, err)
-		stateDB.Set(state_types.GenDocKey, buf.Bytes())
+		stateDB.Set(genesis.GenDocKey, buf.Bytes())
 		if *err != nil {
 			return nil, nil, fmt.Errorf("Unable to write genesisDoc to db: %v", err)
 		}
 	} else {
-		loadedGenesisDocBytes := stateDB.Get(state_types.GenDocKey)
+		loadedGenesisDocBytes := stateDB.Get(genesis.GenDocKey)
 		err := new(error)
 		wire.ReadJSONPtr(&genesisDoc, loadedGenesisDocBytes, err)
 		if *err != nil {
diff --git a/manager/eris-mint/state/genesis_test.go b/manager/eris-mint/state/genesis_test.go
index 73e7f92f4d4ad04f135f1270f6173dc5cae61832..3bc2fdf005fc50686e698ef061a1340def5e8619 100644
--- a/manager/eris-mint/state/genesis_test.go
+++ b/manager/eris-mint/state/genesis_test.go
@@ -9,7 +9,7 @@ import (
 	"time"
 
 	acm "github.com/eris-ltd/eris-db/account"
-	. "github.com/eris-ltd/eris-db/manager/eris-mint/state/types"
+	genesis "github.com/eris-ltd/eris-db/genesis"
 	ptypes "github.com/eris-ltd/eris-db/permission/types"
 
 	. "github.com/tendermint/go-common"
@@ -60,7 +60,7 @@ var g1 = fmt.Sprintf(`
 `, chain_id, addr1, amt1, accName, perms, setbit, roles1[0], roles1[1])
 
 func TestGenesisReadable(t *testing.T) {
-	genDoc := GenesisDocFromJSON([]byte(g1))
+	genDoc := genesis.GenesisDocFromJSON([]byte(g1))
 	if genDoc.ChainID != chain_id {
 		t.Fatalf("Incorrect chain id. Got %d, expected %d\n", genDoc.ChainID, chain_id)
 	}
@@ -82,7 +82,7 @@ func TestGenesisReadable(t *testing.T) {
 }
 
 func TestGenesisMakeState(t *testing.T) {
-	genDoc := GenesisDocFromJSON([]byte(g1))
+	genDoc := genesis.GenesisDocFromJSON([]byte(g1))
 	db := tdb.NewMemDB()
 	st := MakeGenesisState(db, genDoc)
 	acc := st.GetAccount(addr1)
@@ -118,27 +118,27 @@ func RandAccount(randBalance bool, minBalance int64) (*acm.Account, *acm.PrivAcc
 	return acc, privAccount
 }
 
-func RandGenesisDoc(numAccounts int, randBalance bool, minBalance int64, numValidators int, randBonded bool, minBonded int64) (*GenesisDoc, []*acm.PrivAccount, []*types.PrivValidator) {
-	accounts := make([]GenesisAccount, numAccounts)
+func RandGenesisDoc(numAccounts int, randBalance bool, minBalance int64, numValidators int, randBonded bool, minBonded int64) (*genesis.GenesisDoc, []*acm.PrivAccount, []*types.PrivValidator) {
+	accounts := make([]genesis.GenesisAccount, numAccounts)
 	privAccounts := make([]*acm.PrivAccount, numAccounts)
 	defaultPerms := ptypes.DefaultAccountPermissions
 	for i := 0; i < numAccounts; i++ {
 		account, privAccount := RandAccount(randBalance, minBalance)
-		accounts[i] = GenesisAccount{
+		accounts[i] = genesis.GenesisAccount{
 			Address:     account.Address,
 			Amount:      account.Balance,
 			Permissions: &defaultPerms, // This will get copied into each state.Account.
 		}
 		privAccounts[i] = privAccount
 	}
-	validators := make([]GenesisValidator, numValidators)
+	validators := make([]genesis.GenesisValidator, numValidators)
 	privValidators := make([]*types.PrivValidator, numValidators)
 	for i := 0; i < numValidators; i++ {
 		valInfo, privVal := types.RandValidator(randBonded, minBonded)
-		validators[i] = GenesisValidator{
+		validators[i] = genesis.GenesisValidator{
 			PubKey: valInfo.PubKey,
 			Amount: valInfo.VotingPower,
-			UnbondTo: []BasicAccount{
+			UnbondTo: []genesis.BasicAccount{
 				{
 					Address: valInfo.PubKey.Address(),
 					Amount:  valInfo.VotingPower,
@@ -148,7 +148,7 @@ func RandGenesisDoc(numAccounts int, randBalance bool, minBalance int64, numVali
 		privValidators[i] = privVal
 	}
 	sort.Sort(types.PrivValidatorsByAddress(privValidators))
-	return &GenesisDoc{
+	return &genesis.GenesisDoc{
 		GenesisTime: time.Now(),
 		ChainID:     "tendermint_test",
 		Accounts:    accounts,
diff --git a/manager/eris-mint/state/permissions_test.go b/manager/eris-mint/state/permissions_test.go
index 523a5ffc8b2a75a13749c8ba924d4c6ded2e824a..b57a4fbc475116f33beddfa7493ea7fc5d7170b3 100644
--- a/manager/eris-mint/state/permissions_test.go
+++ b/manager/eris-mint/state/permissions_test.go
@@ -10,7 +10,7 @@ import (
 
 	acm "github.com/eris-ltd/eris-db/account"
 	"github.com/eris-ltd/eris-db/manager/eris-mint/evm"
-	. "github.com/eris-ltd/eris-db/manager/eris-mint/state/types"
+	genesis "github.com/eris-ltd/eris-db/genesis"
 	ptypes "github.com/eris-ltd/eris-db/permission/types"
 	"github.com/eris-ltd/eris-db/txs"
 
@@ -111,30 +111,30 @@ var (
 	PermsAllFalse = ptypes.ZeroAccountPermissions
 )
 
-func newBaseGenDoc(globalPerm, accountPerm ptypes.AccountPermissions) GenesisDoc {
-	genAccounts := []GenesisAccount{}
+func newBaseGenDoc(globalPerm, accountPerm ptypes.AccountPermissions) genesis.GenesisDoc {
+	genAccounts := []genesis.GenesisAccount{}
 	for _, u := range user[:5] {
 		accountPermCopy := accountPerm // Create new instance for custom overridability.
-		genAccounts = append(genAccounts, GenesisAccount{
+		genAccounts = append(genAccounts, genesis.GenesisAccount{
 			Address:     u.Address,
 			Amount:      1000000,
 			Permissions: &accountPermCopy,
 		})
 	}
 
-	return GenesisDoc{
+	return genesis.GenesisDoc{
 		GenesisTime: time.Now(),
 		ChainID:     chainID,
-		Params: &GenesisParams{
+		Params: &genesis.GenesisParams{
 			GlobalPermissions: &globalPerm,
 		},
 		Accounts: genAccounts,
-		Validators: []GenesisValidator{
-			GenesisValidator{
+		Validators: []genesis.GenesisValidator{
+			genesis.GenesisValidator{
 				PubKey: user[0].PubKey.(crypto.PubKeyEd25519),
 				Amount: 10,
-				UnbondTo: []BasicAccount{
-					BasicAccount{
+				UnbondTo: []genesis.BasicAccount{
+					genesis.BasicAccount{
 						Address: user[0].Address,
 					},
 				},
diff --git a/manager/eris-mint/state/state.go b/manager/eris-mint/state/state.go
index 20106e3386d7818d681ebebaa8e8a2c24379b1e1..09e9a8d87cbe0f467b47713d0f177806134c99f5 100644
--- a/manager/eris-mint/state/state.go
+++ b/manager/eris-mint/state/state.go
@@ -8,7 +8,7 @@ import (
 	"time"
 
 	acm "github.com/eris-ltd/eris-db/account"
-	. "github.com/eris-ltd/eris-db/manager/eris-mint/state/types"
+	genesis "github.com/eris-ltd/eris-db/genesis"
 	ptypes "github.com/eris-ltd/eris-db/permission/types"
 	"github.com/eris-ltd/eris-db/txs"
 
@@ -156,9 +156,9 @@ func (s *State) ComputeBlockStateHash(block *types.Block) error {
 }
 */
 
-func (s *State) GetGenesisDoc() (*GenesisDoc, error) {
-	var genesisDoc *GenesisDoc
-	loadedGenesisDocBytes := s.DB.Get(GenDocKey)
+func (s *State) GetGenesisDoc() (*genesis.GenesisDoc, error) {
+	var genesisDoc *genesis.GenesisDoc
+	loadedGenesisDocBytes := s.DB.Get(genesis.GenDocKey)
 	err := new(error)
 	wire.ReadJSONPtr(&genesisDoc, loadedGenesisDocBytes, err)
 	if *err != nil {
@@ -401,16 +401,16 @@ func (s *State) SetFireable(evc events.Fireable) {
 //-----------------------------------------------------------------------------
 // Genesis
 
-func MakeGenesisStateFromFile(db dbm.DB, genDocFile string) (*GenesisDoc, *State) {
+func MakeGenesisStateFromFile(db dbm.DB, genDocFile string) (*genesis.GenesisDoc, *State) {
 	jsonBlob, err := ioutil.ReadFile(genDocFile)
 	if err != nil {
 		util.Fatalf("Couldn't read GenesisDoc file: %v", err)
 	}
-	genDoc := GenesisDocFromJSON(jsonBlob)
+	genDoc := genesis.GenesisDocFromJSON(jsonBlob)
 	return genDoc, MakeGenesisState(db, genDoc)
 }
 
-func MakeGenesisState(db dbm.DB, genDoc *GenesisDoc) *State {
+func MakeGenesisState(db dbm.DB, genDoc *genesis.GenesisDoc) *State {
 	if len(genDoc.Validators) == 0 {
 		util.Fatalf("The genesis file has no validators")
 	}
diff --git a/rpc/tendermint/core/types/responses.go b/rpc/tendermint/core/types/responses.go
index c6494d919f3868507d562eeb3c0f0c30aa831f2e..98b72fbbd200d120c46c834a02d5cc237ff6b5a4 100644
--- a/rpc/tendermint/core/types/responses.go
+++ b/rpc/tendermint/core/types/responses.go
@@ -3,7 +3,7 @@ package types
 import (
 	acm "github.com/eris-ltd/eris-db/account"
 	core_types "github.com/eris-ltd/eris-db/core/types"
-	stypes "github.com/eris-ltd/eris-db/manager/eris-mint/state/types"
+	genesis "github.com/eris-ltd/eris-db/genesis"
 	"github.com/eris-ltd/eris-db/txs"
 	tendermint_types "github.com/tendermint/tendermint/types"
 
@@ -126,7 +126,7 @@ type ResultGetName struct {
 }
 
 type ResultGenesis struct {
-	Genesis *stypes.GenesisDoc `json:"genesis"`
+	Genesis *genesis.GenesisDoc `json:"genesis"`
 }
 
 type ResultSignTx struct {