diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go
index fc4563f4e9ab76580991e2c2452f7dbce5a7494a..697f9516d521b6a6c54c16dfb5492e8bb3af33fe 100644
--- a/cmd/ipfs/init.go
+++ b/cmd/ipfs/init.go
@@ -121,7 +121,7 @@ func doInit(configRoot string, dspathOverride string, force bool, nBitsForKeypai
 func addTheWelcomeFile(conf *config.Config) error {
 	// TODO extract this file creation operation into a function
 	ctx, cancel := context.WithCancel(context.Background())
-	nd, err := core.NewIpfsNode(ctx, conf, false)
+	nd, err := core.NewIPFSNode(ctx, core.Offline(conf))
 	if err != nil {
 		return err
 	}
diff --git a/cmd/ipfs/main.go b/cmd/ipfs/main.go
index 4d7f4350c54b0daa4413855faaab2b7c729d59de..b58b8bf07050a2a8874423d227e7428ab7c52c2b 100644
--- a/cmd/ipfs/main.go
+++ b/cmd/ipfs/main.go
@@ -188,7 +188,7 @@ func (i *cmdInvocation) constructNodeFunc(ctx context.Context) func() (*core.Ipf
 
 		// ok everything is good. set it on the invocation (for ownership)
 		// and return it.
-		i.node, err = core.NewIpfsNode(ctx, cfg, cmdctx.Online)
+		i.node, err = core.NewIPFSNode(ctx, core.Standard(cfg, cmdctx.Online))
 		return i.node, err
 	}
 }
diff --git a/core/core.go b/core/core.go
index d847411e436888bcb72eb219fe35b55658d1928d..c375872cf9d4dc2a5a46e43e40d7204c1cc8abfd 100644
--- a/core/core.go
+++ b/core/core.go
@@ -1,6 +1,7 @@
 package core
 
 import (
+	"errors"
 	"fmt"
 
 	context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
@@ -75,7 +76,37 @@ type Mounts struct {
 	Ipns mount.Mount
 }
 
+var errTODO = errors.New("TODO")
+
+type Configuration *IpfsNode // define a different type
+
+type ConfigOption func(ctx context.Context) (Configuration, error)
+
+func NewIPFSNode(ctx context.Context, option ConfigOption) (*IpfsNode, error) {
+	config, err := option(ctx)
+	if err != nil {
+		return nil, err
+	}
+	return config, nil
+}
+
+func Offline(cfg *config.Config) ConfigOption {
+	return Standard(cfg, false)
+}
+
+func Online(cfg *config.Config) ConfigOption {
+	return Standard(cfg, true)
+}
+
+// DEPRECATED: use Online, Offline functions
+func Standard(cfg *config.Config, online bool) ConfigOption {
+	return func(ctx context.Context) (Configuration, error) {
+		return NewIpfsNode(ctx, cfg, online)
+	}
+}
+
 // NewIpfsNode constructs a new IpfsNode based on the given config.
+// DEPRECATED: use `NewIPFSNode`
 func NewIpfsNode(ctx context.Context, cfg *config.Config, online bool) (n *IpfsNode, err error) {
 	success := false // flip to true after all sub-system inits succeed
 	defer func() {
diff --git a/core/core_test.go b/core/core_test.go
index 619adbb508b90cf33a71ecfd71e6b691ac926269..12c8e554f229f1d5660613530de81aeb5770d4c4 100644
--- a/core/core_test.go
+++ b/core/core_test.go
@@ -45,14 +45,14 @@ func TestInitialization(t *testing.T) {
 	}
 
 	for i, c := range good {
-		n, err := NewIpfsNode(ctx, c, false)
+		n, err := NewIPFSNode(ctx, Standard(c, false))
 		if n == nil || err != nil {
 			t.Error("Should have constructed.", i, err)
 		}
 	}
 
 	for i, c := range bad {
-		n, err := NewIpfsNode(ctx, c, false)
+		n, err := NewIPFSNode(ctx, Standard(c, false))
 		if n != nil || err == nil {
 			t.Error("Should have failed to construct.", i)
 		}