diff --git a/cmd/bzzd/main.go b/cmd/bzzd/main.go
index a3e87dc8a17f16e11ce0f5f81f39b1d6add5bd86..4bb2ca04a6c897a9ffa5f004f454e2741b2483fe 100644
--- a/cmd/bzzd/main.go
+++ b/cmd/bzzd/main.go
@@ -23,6 +23,7 @@ import (
 	"os"
 	"runtime"
 	"strconv"
+	"strings"
 
 	"github.com/ethereum/go-ethereum/accounts"
 	"github.com/ethereum/go-ethereum/cmd/utils"
@@ -38,6 +39,7 @@ import (
 	"github.com/ethereum/go-ethereum/p2p/discover"
 	"github.com/ethereum/go-ethereum/swarm"
 	bzzapi "github.com/ethereum/go-ethereum/swarm/api"
+	"github.com/ethereum/go-ethereum/swarm/network"
 	"gopkg.in/urfave/cli.v1"
 )
 
@@ -61,17 +63,22 @@ var (
 		Name:  "bzzport",
 		Usage: "Swarm local http api port",
 	}
+	SwarmNetworkIdFlag = cli.IntFlag{
+		Name:  "bzznetworkid",
+		Usage: "Network identifier (integer, default 322=swarm testnet)",
+		Value: network.NetworkId,
+	}
 	SwarmConfigPathFlag = cli.StringFlag{
 		Name:  "bzzconfig",
 		Usage: "Swarm config file path (datadir/bzz)",
 	}
-	SwarmSwapDisabled = cli.BoolFlag{
-		Name:  "bzznoswap",
-		Usage: "Swarm SWAP disabled (default false)",
+	SwarmSwapEnabled = cli.BoolFlag{
+		Name:  "swap",
+		Usage: "Swarm SWAP enabled (default false)",
 	}
-	SwarmSyncDisabled = cli.BoolFlag{
-		Name:  "bzznosync",
-		Usage: "Swarm Syncing disabled (default false)",
+	SwarmSyncEnabled = cli.BoolTFlag{
+		Name:  "sync",
+		Usage: "Swarm Syncing enabled (default true)",
 	}
 	EthAPI = cli.StringFlag{
 		Name:  "ethapi",
@@ -86,6 +93,7 @@ func init() {
 	// Override flag defaults so bzzd can run alongside geth.
 	utils.ListenPortFlag.Value = 30399
 	utils.IPCPathFlag.Value = utils.DirectoryString{Value: "bzzd.ipc"}
+	utils.IPCApiFlag.Value = "admin, bzz, chequebook, debug, rpc, web3"
 
 	// Set up the cli app.
 	app.Commands = nil
@@ -96,21 +104,24 @@ func init() {
 		utils.BootnodesFlag,
 		utils.KeyStoreDirFlag,
 		utils.ListenPortFlag,
+		utils.NoDiscoverFlag,
+		utils.DiscoveryV5Flag,
 		utils.NetrestrictFlag,
-		utils.MaxPeersFlag,
-		utils.NATFlag,
 		utils.NodeKeyFileFlag,
 		utils.NodeKeyHexFlag,
+		utils.MaxPeersFlag,
+		utils.NATFlag,
 		utils.IPCDisabledFlag,
 		utils.IPCApiFlag,
 		utils.IPCPathFlag,
 		// bzzd-specific flags
 		EthAPI,
 		SwarmConfigPathFlag,
-		SwarmSwapDisabled,
-		SwarmSyncDisabled,
+		SwarmSwapEnabled,
+		SwarmSyncEnabled,
 		SwarmPortFlag,
 		SwarmAccountFlag,
+		SwarmNetworkIdFlag,
 		ChequebookAddrFlag,
 	}
 	app.Flags = append(app.Flags, debug.Flags...)
@@ -138,7 +149,8 @@ func bzzd(ctx *cli.Context) error {
 
 	// Add bootnodes as initial peers.
 	if ctx.GlobalIsSet(utils.BootnodesFlag.Name) {
-		injectBootnodes(stack.Server(), ctx.GlobalStringSlice(utils.BootnodesFlag.Name))
+		bootnodes := strings.Split(ctx.GlobalString(utils.BootnodesFlag.Name), ",")
+		injectBootnodes(stack.Server(), bootnodes)
 	} else {
 		injectBootnodes(stack.Server(), defaultBootnodes)
 	}
@@ -155,7 +167,7 @@ func registerBzzService(ctx *cli.Context, stack *node.Node) {
 	if bzzdir == "" {
 		bzzdir = stack.InstanceDir()
 	}
-	bzzconfig, err := bzzapi.NewConfig(bzzdir, chbookaddr, prvkey)
+	bzzconfig, err := bzzapi.NewConfig(bzzdir, chbookaddr, prvkey, ctx.GlobalUint64(SwarmNetworkIdFlag.Name))
 	if err != nil {
 		utils.Fatalf("unable to configure swarm: %v", err)
 	}
@@ -163,16 +175,18 @@ func registerBzzService(ctx *cli.Context, stack *node.Node) {
 	if len(bzzport) > 0 {
 		bzzconfig.Port = bzzport
 	}
-	swapEnabled := !ctx.GlobalBool(SwarmSwapDisabled.Name)
-	syncEnabled := !ctx.GlobalBool(SwarmSyncDisabled.Name)
+	swapEnabled := ctx.GlobalBool(SwarmSwapEnabled.Name)
+	syncEnabled := ctx.GlobalBoolT(SwarmSyncEnabled.Name)
 
 	ethapi := ctx.GlobalString(EthAPI.Name)
-	if ethapi == "" {
-		utils.Fatalf("Option %q must not be empty", EthAPI.Name)
-	}
 
 	boot := func(ctx *node.ServiceContext) (node.Service, error) {
-		client, err := ethclient.Dial(ethapi)
+		var client *ethclient.Client
+		if ethapi == "" {
+			err = fmt.Errorf("use ethapi flag to connect to a an eth client and talk to the blockchain")
+		} else {
+			client, err = ethclient.Dial(ethapi)
+		}
 		if err != nil {
 			utils.Fatalf("Can't connect: %v", err)
 		}
@@ -241,6 +255,7 @@ func injectBootnodes(srv *p2p.Server, nodes []string) {
 		n, err := discover.ParseNode(url)
 		if err != nil {
 			glog.Errorf("invalid bootnode %q", err)
+			continue
 		}
 		srv.AddPeer(n)
 	}
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index cb91f4539099dea4423499a43f9565f54cd051b9..abd344df016baad03a3f99bf46bfcbb24d957bb3 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -116,7 +116,7 @@ var (
 	}
 	NetworkIdFlag = cli.IntFlag{
 		Name:  "networkid",
-		Usage: "Network identifier (integer, 0=Olympic, 1=Frontier, 2=Morden)",
+		Usage: "Network identifier (integer, 0=Olympic (disused), 1=Frontier, 2=Morden (disused), 3=Ropsten)",
 		Value: eth.NetworkId,
 	}
 	OlympicFlag = cli.BoolFlag{
diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go
index adf2366793c847375f9e654ee043e36705ed256d..ce50d3634c3aa71c4958827147342d5e02f854fc 100644
--- a/internal/web3ext/web3ext.go
+++ b/internal/web3ext/web3ext.go
@@ -37,12 +37,6 @@ web3._extend({
 	property: 'bzz',
 	methods:
 	[
-		new web3._extend.Method({
-			name: 'blockNetworkRead',
-			call: 'bzz_blockNetworkRead',
-			params: 1,
-			inputFormatter: [null]
-		}),
 		new web3._extend.Method({
 			name: 'syncEnabled',
 			call: 'bzz_syncEnabled',
@@ -68,17 +62,11 @@ web3._extend({
 			inputFormatter: [null, null]
 		}),
 		new web3._extend.Method({
-			name: 'retrieve',
-			call: 'bzz_retrieve',
+			name: 'resolve',
+			call: 'bzz_resolve',
 			params: 1,
 			inputFormatter: [null]
 		}),
-		new web3._extend.Method({
-			name: 'store',
-			call: 'bzz_store',
-			params: 2,
-			inputFormatter: [null]
-		}),
 		new web3._extend.Method({
 			name: 'get',
 			call: 'bzz_get',
diff --git a/swarm/api/config.go b/swarm/api/config.go
index c04a015efa34082ec53946a5967fc4f4efcafa88..f9d3575f7ff6a05271dbdd0940f37d87ecaa9719 100644
--- a/swarm/api/config.go
+++ b/swarm/api/config.go
@@ -54,11 +54,12 @@ type Config struct {
 	PublicKey string
 	BzzKey    string
 	EnsRoot   common.Address
+	NetworkId uint64
 }
 
 // config is agnostic to where private key is coming from
 // so managing accounts is outside swarm and left to wrappers
-func NewConfig(path string, contract common.Address, prvKey *ecdsa.PrivateKey) (self *Config, err error) {
+func NewConfig(path string, contract common.Address, prvKey *ecdsa.PrivateKey, networkId uint64) (self *Config, err error) {
 	address := crypto.PubkeyToAddress(prvKey.PublicKey) // default beneficiary address
 	dirpath := filepath.Join(path, "bzz-"+common.Bytes2Hex(address.Bytes()))
 	err = os.MkdirAll(dirpath, os.ModePerm)
@@ -82,6 +83,7 @@ func NewConfig(path string, contract common.Address, prvKey *ecdsa.PrivateKey) (
 		PublicKey:     pubkeyhex,
 		BzzKey:        keyhex,
 		EnsRoot:       toyNetEnsRoot,
+		NetworkId:     networkId,
 	}
 	data, err = ioutil.ReadFile(confpath)
 	if err != nil {
diff --git a/swarm/api/config_test.go b/swarm/api/config_test.go
index 8fe3ddacc28b25d467486b68dac6199f54271d98..39ac2d0677a4289c473adc57e19c02c91c2c6040 100644
--- a/swarm/api/config_test.go
+++ b/swarm/api/config_test.go
@@ -83,7 +83,8 @@ var (
     "Port": "8500",
     "PublicKey": "0x045f5cfd26692e48d0017d380349bcf50982488bc11b5145f3ddf88b24924299048450542d43527fbe29a5cb32f38d62755393ac002e6bfdd71b8d7ba725ecd7a3",
     "BzzKey": "0xe861964402c0b78e2d44098329b8545726f215afa737d803714a4338552fcb81",
-    "EnsRoot": "0xd344889e0be3e9ef6c26b0f60ef66a32e83c1b69"
+    "EnsRoot": "0xd344889e0be3e9ef6c26b0f60ef66a32e83c1b69",
+    "NetworkId": 323
 }`
 )
 
@@ -95,7 +96,7 @@ func TestConfigWriteRead(t *testing.T) {
 	defer os.RemoveAll(tmp)
 
 	prvkey := crypto.ToECDSA(common.Hex2Bytes(hexprvkey))
-	orig, err := NewConfig(tmp, common.Address{}, prvkey)
+	orig, err := NewConfig(tmp, common.Address{}, prvkey, 323)
 	if err != nil {
 		t.Fatalf("expected no error, got %v", err)
 	}
@@ -109,7 +110,7 @@ func TestConfigWriteRead(t *testing.T) {
 		t.Fatalf("default config mismatch:\nexpected: %v\ngot: %v", exp, string(data))
 	}
 
-	conf, err := NewConfig(tmp, common.Address{}, prvkey)
+	conf, err := NewConfig(tmp, common.Address{}, prvkey, 323)
 	if err != nil {
 		t.Fatalf("expected no error, got %v", err)
 	}
diff --git a/swarm/network/protocol.go b/swarm/network/protocol.go
index 5e65108d6ba5e912df6964facd05c05c87801fb2..a3ffd338f0e102660eb1f921bce9ae7f97f820b9 100644
--- a/swarm/network/protocol.go
+++ b/swarm/network/protocol.go
@@ -95,6 +95,7 @@ type bzz struct {
 	errors     *errs.Errors         // errors table
 	backend    chequebook.Backend
 	lastActive time.Time
+	NetworkId  uint64
 
 	swap        *swap.Swap          // swap instance for the peer connection
 	swapParams  *bzzswap.SwapParams // swap settings both local and remote
@@ -126,7 +127,7 @@ on each peer connection
 The Run function of the Bzz protocol class creates a bzz instance
 which will represent the peer for the swarm hive and all peer-aware components
 */
-func Bzz(cloud StorageHandler, backend chequebook.Backend, hive *Hive, dbaccess *DbAccess, sp *bzzswap.SwapParams, sy *SyncParams) (p2p.Protocol, error) {
+func Bzz(cloud StorageHandler, backend chequebook.Backend, hive *Hive, dbaccess *DbAccess, sp *bzzswap.SwapParams, sy *SyncParams, networkId uint64) (p2p.Protocol, error) {
 
 	// a single global request db is created for all peer connections
 	// this is to persist delivery backlog and aid syncronisation
@@ -134,13 +135,15 @@ func Bzz(cloud StorageHandler, backend chequebook.Backend, hive *Hive, dbaccess
 	if err != nil {
 		return p2p.Protocol{}, fmt.Errorf("error setting up request db: %v", err)
 	}
-
+	if networkId == 0 {
+		networkId = NetworkId
+	}
 	return p2p.Protocol{
 		Name:    "bzz",
 		Version: Version,
 		Length:  ProtocolLength,
 		Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
-			return run(requestDb, cloud, backend, hive, dbaccess, sp, sy, p, rw)
+			return run(requestDb, cloud, backend, hive, dbaccess, sp, sy, networkId, p, rw)
 		},
 	}, nil
 }
@@ -157,7 +160,7 @@ the main protocol loop that
  * whenever the loop terminates, the peer will disconnect with Subprotocol error
  * whenever handlers return an error the loop terminates
 */
-func run(requestDb *storage.LDBDatabase, depo StorageHandler, backend chequebook.Backend, hive *Hive, dbaccess *DbAccess, sp *bzzswap.SwapParams, sy *SyncParams, p *p2p.Peer, rw p2p.MsgReadWriter) (err error) {
+func run(requestDb *storage.LDBDatabase, depo StorageHandler, backend chequebook.Backend, hive *Hive, dbaccess *DbAccess, sp *bzzswap.SwapParams, sy *SyncParams, networkId uint64, p *p2p.Peer, rw p2p.MsgReadWriter) (err error) {
 
 	self := &bzz{
 		storage:   depo,
@@ -175,6 +178,7 @@ func run(requestDb *storage.LDBDatabase, depo StorageHandler, backend chequebook
 		syncParams:  sy,
 		swapEnabled: hive.swapEnabled,
 		syncEnabled: true,
+		NetworkId:   networkId,
 	}
 
 	// handle handshake
@@ -340,7 +344,7 @@ func (self *bzz) handleStatus() (err error) {
 		Version:   uint64(Version),
 		ID:        "honey",
 		Addr:      self.selfAddr(),
-		NetworkId: uint64(NetworkId),
+		NetworkId: uint64(self.NetworkId),
 		Swap: &bzzswap.SwapProfile{
 			Profile:    self.swapParams.Profile,
 			PayProfile: self.swapParams.PayProfile,
@@ -372,8 +376,8 @@ func (self *bzz) handleStatus() (err error) {
 		return self.protoError(ErrDecode, " %v: %v", msg, err)
 	}
 
-	if status.NetworkId != NetworkId {
-		return self.protoError(ErrNetworkIdMismatch, "%d (!= %d)", status.NetworkId, NetworkId)
+	if status.NetworkId != self.NetworkId {
+		return self.protoError(ErrNetworkIdMismatch, "%d (!= %d)", status.NetworkId, self.NetworkId)
 	}
 
 	if Version != status.Version {
diff --git a/swarm/swarm.go b/swarm/swarm.go
index 1dce8cafd1327f3d0c999259697543c53b452e2e..7e38944de0c07f9e9ecff2ab1c6b967f71755760 100644
--- a/swarm/swarm.go
+++ b/swarm/swarm.go
@@ -209,7 +209,7 @@ func (self *Swarm) Stop() error {
 
 // implements the node.Service interface
 func (self *Swarm) Protocols() []p2p.Protocol {
-	proto, err := network.Bzz(self.depo, self.backend, self.hive, self.dbAccess, self.config.Swap, self.config.SyncParams)
+	proto, err := network.Bzz(self.depo, self.backend, self.hive, self.dbAccess, self.config.Swap, self.config.SyncParams, self.config.NetworkId)
 	if err != nil {
 		return nil
 	}
@@ -279,7 +279,7 @@ func NewLocalSwarm(datadir, port string) (self *Swarm, err error) {
 		return
 	}
 
-	config, err := api.NewConfig(datadir, common.Address{}, prvKey)
+	config, err := api.NewConfig(datadir, common.Address{}, prvKey, network.NetworkId)
 	if err != nil {
 		return
 	}