diff --git a/ethereum/repl.go b/ethereum/repl.go
index 0208459ad28b0b58a4d55ed8986020769918d2b1..dd8d081793da1581d68050819f9276e4756f10cb 100644
--- a/ethereum/repl.go
+++ b/ethereum/repl.go
@@ -1,10 +1,15 @@
 package main
 
 import (
+	"bufio"
 	"fmt"
 	"github.com/ethereum/eth-go"
 	"github.com/ethereum/eth-go/ethpub"
+	"github.com/ethereum/eth-go/ethutil"
 	"github.com/obscuren/otto"
+	"io"
+	"os"
+	"path"
 )
 
 type Repl interface {
@@ -16,18 +21,38 @@ type JSRepl struct {
 	re *JSRE
 
 	prompt string
+
+	history *os.File
 }
 
 func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
-	return &JSRepl{re: NewJSRE(ethereum), prompt: "> "}
+	hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
+	if err != nil {
+		panic(err)
+	}
+
+	return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
 }
 
 func (self *JSRepl) Start() {
+	reader := bufio.NewReader(self.history)
+	for {
+		line, err := reader.ReadString('\n')
+		if err != nil && err == io.EOF {
+			break
+		} else if err != nil {
+			fmt.Println("error reading history", err)
+			break
+		}
+
+		addHistory(line[:len(line)-1])
+	}
 	self.read()
 }
 
 func (self *JSRepl) Stop() {
 	self.re.Stop()
+	self.history.Close()
 }
 
 func (self *JSRepl) parseInput(code string) {
diff --git a/ethereum/repl_darwin.go b/ethereum/repl_darwin.go
index b61d4edd7eaa5133bef798067db2f12ed3ab211f..62b40059acbe50b31b06c0b83b24ed57c345ec3a 100644
--- a/ethereum/repl_darwin.go
+++ b/ethereum/repl_darwin.go
@@ -102,7 +102,9 @@ L:
 					break L
 				}
 
-				addHistory(str[:len(str)-1]) //allow user to recall this line
+				hist := str[:len(str)-1]
+				addHistory(hist) //allow user to recall this line
+				self.history.WriteString(str)
 
 				self.parseInput(str)