diff --git a/config.go b/config.go
index 3b7a7d5..29ed421 100644
--- a/config.go
+++ b/config.go
@@ -53,6 +53,9 @@ type config struct {
 	Username    string `short:"u" long:"username" description:"Username for btcd authorization"`
 	Password    string `short:"P" long:"password" description:"Password for btcd authorization"`
 	MainNet     bool   `long:"mainnet" description:"*DISABLED* Use the main Bitcoin network (default testnet3)"`
+	Proxy       string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"`
+	ProxyUser   string `long:"proxyuser" description:"Username for proxy server"`
+	ProxyPass   string `long:"proxypass" default-mask:"-" description:"Password for proxy server"`
 }
 
 // updateConfigWithActiveParams update the passed config with parameters
diff --git a/sockets.go b/sockets.go
index a27a189..2f38117 100644
--- a/sockets.go
+++ b/sockets.go
@@ -28,6 +28,7 @@ import (
 	"github.com/conformal/btcwallet/wallet"
 	"github.com/conformal/btcwire"
 	"github.com/conformal/btcws"
+	"github.com/conformal/go-socks"
 	"net"
 	"net/http"
 	"sync"
@@ -600,9 +601,28 @@ func BtcdConnect(certificates []byte, reply chan error) {
 	config.Header.Add("Authorization", auth)
 
 	// Attempt to connect to running btcd instance. Bail if it fails.
-	btcdws, err := websocket.DialConfig(config)
-	if err != nil {
-		log.Errorf("%s", err)
+	var btcdws *websocket.Conn
+	var cerr error
+	if cfg.Proxy != "" {
+		proxy := &socks.Proxy{
+			Addr:     cfg.Proxy,
+			Username: cfg.ProxyUser,
+			Password: cfg.ProxyPass,
+		}
+		conn, err := proxy.Dial("tcp", cfg.Connect)
+		if err != nil {
+			log.Warnf("Error connecting to proxy: %v", err)
+			reply <- ErrConnRefused
+			return
+		}
+
+		tlsConn := tls.Client(conn, config.TlsConfig)
+		btcdws, cerr = websocket.NewClient(config, tlsConn)
+	} else {
+		btcdws, cerr = websocket.DialConfig(config)
+	}
+	if cerr != nil {
+		log.Errorf("%s", cerr)
 		reply <- ErrConnRefused
 		return
 	}