diff --git a/cmd/ipfs/publish.go b/cmd/ipfs/publish.go
index 8e2aa7cc4b37811c2a0f87dc7c6b2828b430e74e..fe473107718bac6350b0adf3f7031dd2567f43b3 100644
--- a/cmd/ipfs/publish.go
+++ b/cmd/ipfs/publish.go
@@ -1,13 +1,9 @@
 package main
 
 import (
-	"os"
-
 	"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/gonuts/flag"
 	"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander"
 	"github.com/jbenet/go-ipfs/core/commands"
-	"github.com/jbenet/go-ipfs/daemon"
-	u "github.com/jbenet/go-ipfs/util"
 )
 
 var cmdIpfsPub = &commander.Command{
@@ -24,35 +20,10 @@ func init() {
 	cmdIpfsPub.Flag.String("k", "", "Specify key to use for publishing.")
 }
 
-func pubCmd(c *commander.Command, inp []string) error {
-	if len(inp) < 1 {
-		u.POut(c.Long)
-		return nil
-	}
-
-	conf, err := getConfigDir(c.Parent)
-	if err != nil {
-		return err
-	}
-
-	cmd := daemon.NewCommand()
-	cmd.Command = "publish"
-	cmd.Args = inp
-	cmd.Opts["k"] = c.Flag.Lookup("k").Value.Get()
-	err = daemon.SendCommand(cmd, conf)
-	if err != nil {
-		u.DOut("Executing command locally.\n")
-		// Do locally
-		conf, err := getConfigDir(c.Parent)
-		if err != nil {
-			return err
-		}
-		n, err := localNode(conf, true)
-		if err != nil {
-			return err
-		}
-
-		return commands.Publish(n, cmd.Args, cmd.Opts, os.Stdout)
-	}
-	return nil
-}
+var pubCmd = makeCommand(command{
+	name:   "publish",
+	args:   1,
+	flags:  []string{"k"},
+	online: true,
+	cmdFn:  commands.Publish,
+})
diff --git a/cmd/ipfs/resolve.go b/cmd/ipfs/resolve.go
index 3665f2a9177fac204665430e9b45427f1d9a4a67..75b9903b591b4de24cd9bd7c4083824f2a436d04 100644
--- a/cmd/ipfs/resolve.go
+++ b/cmd/ipfs/resolve.go
@@ -1,15 +1,9 @@
 package main
 
 import (
-	"fmt"
-	"os"
-	"time"
-
 	"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/gonuts/flag"
 	"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/commander"
 	"github.com/jbenet/go-ipfs/core/commands"
-	"github.com/jbenet/go-ipfs/daemon"
-	u "github.com/jbenet/go-ipfs/util"
 )
 
 var cmdIpfsResolve = &commander.Command{
@@ -22,32 +16,10 @@ var cmdIpfsResolve = &commander.Command{
 	Flag: *flag.NewFlagSet("ipfs-resolve", flag.ExitOnError),
 }
 
-func resolveCmd(c *commander.Command, inp []string) error {
-	if len(inp) < 1 {
-		u.POut(c.Long)
-		return nil
-	}
-	conf, err := getConfigDir(c.Parent)
-	if err != nil {
-		return err
-	}
-
-	cmd := daemon.NewCommand()
-	cmd.Command = "resolve"
-	cmd.Args = inp
-	err = daemon.SendCommand(cmd, conf)
-	if err != nil {
-		now := time.Now()
-		// Resolve requires working DHT
-		n, err := localNode(conf, true)
-		if err != nil {
-			return err
-		}
-
-		took := time.Now().Sub(now)
-		fmt.Printf("localNode creation took %s\n", took.String())
-
-		return commands.Resolve(n, cmd.Args, cmd.Opts, os.Stdout)
-	}
-	return nil
-}
+var resolveCmd = makeCommand(command{
+	name:   "resolve",
+	args:   1,
+	flags:  nil,
+	online: true,
+	cmdFn:  commands.Resolve,
+})