diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 97d358407616d877a3735190415f0b9bfa1ae777..ddbd1f129afba23498d20920ce6199a38b2bb388 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -24,8 +24,6 @@ import (
 	"bufio"
 	"fmt"
 	"io/ioutil"
-	"log"
-	"net/http"
 	"os"
 	"runtime"
 	"strconv"
@@ -237,6 +235,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
 		utils.RPCEnabledFlag,
 		utils.RPCListenAddrFlag,
 		utils.RPCPortFlag,
+		utils.WhisperEnabledFlag,
 		utils.VMDebugFlag,
 		utils.ProtocolVersionFlag,
 		utils.NetworkIdFlag,
@@ -247,6 +246,14 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
 		utils.LogVModuleFlag,
 		utils.LogFileFlag,
 		utils.LogJSONFlag,
+		utils.PProfEanbledFlag,
+		utils.PProfPortFlag,
+	}
+	app.Before = func(ctx *cli.Context) error {
+		if ctx.GlobalBool(utils.PProfEanbledFlag.Name) {
+			utils.StartPProf(ctx)
+		}
+		return nil
 	}
 
 	// missing:
@@ -261,11 +268,6 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
 }
 
 func main() {
-	// Start up the default http server for pprof
-	go func() {
-		log.Println(http.ListenAndServe("localhost:6060", nil))
-	}()
-
 	fmt.Printf("Welcome to the FRONTIER\n")
 	runtime.GOMAXPROCS(runtime.NumCPU())
 	defer logger.Flush()
@@ -337,6 +339,7 @@ func unlockAccount(ctx *cli.Context, am *accounts.Manager, account string) (pass
 }
 
 func startEth(ctx *cli.Context, eth *eth.Ethereum) {
+	// Start Ethereum itself
 	utils.StartEthereum(eth)
 	am := eth.AccountManager()
 
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index f70f4243e8e5551ecde894573abd66d58a7ac6ef..b8f3982e242fd654692fb9754a2a7adee08ac435 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -2,6 +2,9 @@ package utils
 
 import (
 	"crypto/ecdsa"
+	"fmt"
+	"log"
+	"net/http"
 	"os"
 	"path"
 	"runtime"
@@ -140,10 +143,33 @@ var (
 		Usage: "Send json structured log output to a file or '-' for standard output (default: no json output)",
 		Value: "",
 	}
+	LogToStdErrFlag = cli.BoolFlag{
+		Name:  "logtostderr",
+		Usage: "Logs are written to standard error instead of to files.",
+	}
+	LogVModuleFlag = cli.GenericFlag{
+		Name:  "vmodule",
+		Usage: "The syntax of the argument is a comma-separated list of pattern=N, where pattern is a literal file name (minus the \".go\" suffix) or \"glob\" pattern and N is a V level.",
+		Value: glog.GetVModule(),
+	}
 	VMDebugFlag = cli.BoolFlag{
 		Name:  "vmdebug",
 		Usage: "Virtual Machine debug output",
 	}
+	BacktraceAtFlag = cli.GenericFlag{
+		Name:  "backtrace_at",
+		Usage: "When set to a file and line number holding a logging statement a stack trace will be written to the Info log",
+		Value: glog.GetTraceLocation(),
+	}
+	PProfEanbledFlag = cli.BoolFlag{
+		Name:  "pprof",
+		Usage: "Whether the profiling server should be enabled",
+	}
+	PProfPortFlag = cli.IntFlag{
+		Name:  "pprofport",
+		Usage: "Port on which the profiler should listen",
+		Value: 6060,
+	}
 
 	// RPC settings
 	RPCEnabledFlag = cli.BoolFlag{
@@ -194,25 +220,15 @@ var (
 		Usage: "Port mapping mechanism (any|none|upnp|pmp|extip:<IP>)",
 		Value: "any",
 	}
+	WhisperEnabledFlag = cli.BoolFlag{
+		Name:  "shh",
+		Usage: "Whether the whisper sub-protocol is enabled",
+	}
 	JSpathFlag = cli.StringFlag{
 		Name:  "jspath",
 		Usage: "JS library path to be used with console and js subcommands",
 		Value: ".",
 	}
-	BacktraceAtFlag = cli.GenericFlag{
-		Name:  "backtrace_at",
-		Usage: "When set to a file and line number holding a logging statement a stack trace will be written to the Info log",
-		Value: glog.GetTraceLocation(),
-	}
-	LogToStdErrFlag = cli.BoolFlag{
-		Name:  "logtostderr",
-		Usage: "Logs are written to standard error instead of to files.",
-	}
-	LogVModuleFlag = cli.GenericFlag{
-		Name:  "vmodule",
-		Usage: "The syntax of the argument is a comma-separated list of pattern=N, where pattern is a literal file name (minus the \".go\" suffix) or \"glob\" pattern and N is a V level.",
-		Value: glog.GetVModule(),
-	}
 )
 
 func GetNAT(ctx *cli.Context) nat.Interface {
@@ -274,7 +290,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
 		NAT:                GetNAT(ctx),
 		NatSpec:            ctx.GlobalBool(NatspecEnabledFlag.Name),
 		NodeKey:            GetNodeKey(ctx),
-		Shh:                true,
+		Shh:                ctx.GlobalBool(WhisperEnabledFlag.Name),
 		Dial:               true,
 		BootNodes:          ctx.GlobalString(BootnodesFlag.Name),
 	}
@@ -324,3 +340,10 @@ func StartRPC(eth *eth.Ethereum, ctx *cli.Context) {
 	xeth := xeth.New(eth, nil)
 	_ = rpc.Start(xeth, config)
 }
+
+func StartPProf(ctx *cli.Context) {
+	address := fmt.Sprintf("localhost:%d", ctx.GlobalInt(PProfPortFlag.Name))
+	go func() {
+		log.Println(http.ListenAndServe(address, nil))
+	}()
+}