diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go
index afaf06948c84bdd05055a3cee3dc2dda146b1802..7d5854230967419ed8d90abf4d698d28e6294b1a 100644
--- a/cmd/ethereum/main.go
+++ b/cmd/ethereum/main.go
@@ -251,7 +251,7 @@ func accountList(ctx *cli.Context) {
 		utils.Fatalf("Could not list accounts: %v", err)
 	}
 	for _, acct := range accts {
-		fmt.Printf("Address: %#x\n", acct)
+		fmt.Printf("Address: %x\n", acct)
 	}
 }
 
@@ -278,7 +278,7 @@ func accountCreate(ctx *cli.Context) {
 	if err != nil {
 		utils.Fatalf("Could not create the account: %v", err)
 	}
-	fmt.Printf("Address: %#x\n", acct.Address)
+	fmt.Printf("Address: %x\n", acct.Address)
 }
 
 func importchain(ctx *cli.Context) {
diff --git a/logger/log.go b/logger/log.go
index 2dbec86de853ceed9e0724da8ede91494ca9191a..fab004d0a15cb323b2e5fc15f600914987b843d2 100644
--- a/logger/log.go
+++ b/logger/log.go
@@ -30,6 +30,8 @@ func New(datadir string, logFile string, logLevel int, logFormat string) LogSyst
 	switch logFormat {
 	case "raw":
 		sys = NewRawLogSystem(writer, 0, LogLevel(logLevel))
+	case "json":
+		sys = NewJsonLogSystem(writer, 0, LogLevel(logLevel))
 	default:
 		sys = NewStdLogSystem(writer, log.LstdFlags, LogLevel(logLevel))
 	}
diff --git a/logger/logsystem.go b/logger/logsystem.go
index 8458b938f331b9f65a447930e0d9403e5a268543..1318a9f9609f3f1b97c6249178820706e171ef09 100644
--- a/logger/logsystem.go
+++ b/logger/logsystem.go
@@ -61,3 +61,27 @@ func (t *rawLogSystem) SetLogLevel(i LogLevel) {
 func (t *rawLogSystem) GetLogLevel() LogLevel {
 	return LogLevel(atomic.LoadUint32(&t.level))
 }
+
+// NewRawLogSystem creates a LogSystem that prints to the given writer without
+// adding extra information. Suitable for preformatted output
+func NewJsonLogSystem(writer io.Writer, flags int, level LogLevel) LogSystem {
+	logger := log.New(writer, "", 0)
+	return &jsonLogSystem{logger, uint32(level)}
+}
+
+type jsonLogSystem struct {
+	logger *log.Logger
+	level  uint32
+}
+
+func (t *jsonLogSystem) LogPrint(level LogLevel, msg string) {
+	t.logger.Print(msg)
+}
+
+func (t *jsonLogSystem) SetLogLevel(i LogLevel) {
+	atomic.StoreUint32(&t.level, uint32(i))
+}
+
+func (t *jsonLogSystem) GetLogLevel() LogLevel {
+	return LogLevel(atomic.LoadUint32(&t.level))
+}
diff --git a/logger/sys.go b/logger/sys.go
index bd826b587b4df468785a236d6d5ea44d5c7ec285..db4251a52e393eab86adbca7d7b31f8d61e5afc9 100644
--- a/logger/sys.go
+++ b/logger/sys.go
@@ -76,8 +76,7 @@ func dispatchLoop() {
 func sysLoop(sys LogSystem, in <-chan message, wg *sync.WaitGroup) {
 	for msg := range in {
 		switch sys.(type) {
-		case *rawLogSystem:
-			// This is a semantic hack since rawLogSystem has little to do with JsonLevel
+		case *jsonLogSystem:
 			if msg.level == JsonLevel {
 				sys.LogPrint(msg.level, msg.msg)
 			}
diff --git a/p2p/discover/node.go b/p2p/discover/node.go
index de25882585650afb12685ec839087460e823f74e..e1130e0b5853e536f42395447dfeb5eda12d5b53 100644
--- a/p2p/discover/node.go
+++ b/p2p/discover/node.go
@@ -143,12 +143,12 @@ type NodeID [nodeIDBits / 8]byte
 
 // NodeID prints as a long hexadecimal number.
 func (n NodeID) String() string {
-	return fmt.Sprintf("%#x", n[:])
+	return fmt.Sprintf("%x", n[:])
 }
 
 // The Go syntax representation of a NodeID is a call to HexID.
 func (n NodeID) GoString() string {
-	return fmt.Sprintf("discover.HexID(\"%#x\")", n[:])
+	return fmt.Sprintf("discover.HexID(\"%x\")", n[:])
 }
 
 // HexID converts a hex string to a NodeID.
diff --git a/p2p/message.go b/p2p/message.go
index ef3630a9062b33118f66726e2712bebfd9cff424..b42acbe3cf096aa6af7284338b76e274d3f064e4 100644
--- a/p2p/message.go
+++ b/p2p/message.go
@@ -33,7 +33,7 @@ type Msg struct {
 // For the decoding rules, please see package rlp.
 func (msg Msg) Decode(val interface{}) error {
 	if err := rlp.Decode(msg.Payload, val); err != nil {
-		return newPeerError(errInvalidMsg, "(code %#x) (size %d) %v", msg.Code, msg.Size, err)
+		return newPeerError(errInvalidMsg, "(code %x) (size %d) %v", msg.Code, msg.Size, err)
 	}
 	return nil
 }