diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..dfe0770424b2a19faf507a501ebfc23be8f54e7b
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/cmd/utils/customflags.go b/cmd/utils/customflags.go
index e7efed4e3c635ec00f6f2321e631111052cd4577..4450065c14117cca1e1f72f73d03c3776a479842 100644
--- a/cmd/utils/customflags.go
+++ b/cmd/utils/customflags.go
@@ -21,7 +21,7 @@ import (
 	"fmt"
 	"os"
 	"os/user"
-	"path/filepath"
+	"path"
 	"strings"
 
 	"github.com/codegangsta/cli"
@@ -138,11 +138,8 @@ func (self *DirectoryFlag) Set(value string) {
 func expandPath(p string) string {
 	if strings.HasPrefix(p, "~/") || strings.HasPrefix(p, "~\\") {
 		if user, err := user.Current(); err == nil {
-			if err == nil {
-				p = strings.Replace(p, "~", user.HomeDir, 1)
-			}
+			p = user.HomeDir + p[1:]
 		}
 	}
-
-	return filepath.Clean(os.ExpandEnv(p))
+	return path.Clean(os.ExpandEnv(p))
 }
diff --git a/cmd/utils/customflags_test.go b/cmd/utils/customflags_test.go
index 0fb0af63b74e6e5b1b66393363d7320559d2c60e..de39ca36a116ca169c1f9f6d33bdfe960bad7d70 100644
--- a/cmd/utils/customflags_test.go
+++ b/cmd/utils/customflags_test.go
@@ -23,18 +23,15 @@ import (
 )
 
 func TestPathExpansion(t *testing.T) {
-
 	user, _ := user.Current()
-
 	tests := map[string]string{
 		"/home/someuser/tmp": "/home/someuser/tmp",
 		"~/tmp":              user.HomeDir + "/tmp",
+		"~thisOtherUser/b/":  "~thisOtherUser/b",
 		"$DDDXXX/a/b":        "/tmp/a/b",
 		"/a/b/":              "/a/b",
 	}
-
 	os.Setenv("DDDXXX", "/tmp")
-
 	for test, expected := range tests {
 		got := expandPath(test)
 		if got != expected {
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 815d4812449f8bf24a91bad6db32f1a701dbb897..cf969805da36a85bf402ba63e6c30eb26ca61783 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -478,7 +478,7 @@ func MakeAccountManager(ctx *cli.Context) *accounts.Manager {
 }
 
 func IpcSocketPath(ctx *cli.Context) (ipcpath string) {
-	if common.IsWindows() {
+	if runtime.GOOS == "windows" {
 		ipcpath = common.DefaultIpcPath()
 		if ctx.GlobalIsSet(IPCPathFlag.Name) {
 			ipcpath = ctx.GlobalString(IPCPathFlag.Name)
diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go
index 8255e8e2d9a796b2a4c6a8f361876d0f7ca3dfb8..3303bc15a1cde26e18dddacf22ca9fc68d54ea89 100644
--- a/common/compiler/solidity_test.go
+++ b/common/compiler/solidity_test.go
@@ -20,6 +20,7 @@ import (
 	"encoding/json"
 	"io/ioutil"
 	"os"
+	"path"
 	"testing"
 
 	"github.com/ethereum/go-ethereum/common"
@@ -94,7 +95,7 @@ func TestSaveInfo(t *testing.T) {
 	if err != nil {
 		t.Errorf("%v", err)
 	}
-	filename := "/tmp/solctest.info.json"
+	filename := path.Join(os.TempDir(), "solctest.info.json")
 	os.Remove(filename)
 	cinfohash, err := SaveInfo(&cinfo, filename)
 	if err != nil {
@@ -110,4 +111,4 @@ func TestSaveInfo(t *testing.T) {
 	if cinfohash != infohash {
 		t.Errorf("content hash for info is incorrect. expected %v, got %v", infohash.Hex(), cinfohash.Hex())
 	}
-}
+}
\ No newline at end of file
diff --git a/common/docserver/docserver.go b/common/docserver/docserver.go
index fa120fb380cafe7840735a23112a4efea1ddafc8..dac542ba7ee86f2eb27ad2037c02633d791f2945 100644
--- a/common/docserver/docserver.go
+++ b/common/docserver/docserver.go
@@ -38,7 +38,6 @@ func New(docRoot string) (self *DocServer) {
 		DocRoot:   docRoot,
 		schemes:   []string{"file"},
 	}
-	self.DocRoot = "/tmp/"
 	self.RegisterProtocol("file", http.NewFileTransport(http.Dir(self.DocRoot)))
 	return
 }
diff --git a/common/docserver/docserver_test.go b/common/docserver/docserver_test.go
index 92e39d167a20dc8ab435f19db47dfc6eb8ed711b..632603addbe8cc10531108c1fb6cef5d1a725cc3 100644
--- a/common/docserver/docserver_test.go
+++ b/common/docserver/docserver_test.go
@@ -20,6 +20,7 @@ import (
 	"io/ioutil"
 	"net/http"
 	"os"
+	"path"
 	"testing"
 
 	"github.com/ethereum/go-ethereum/common"
@@ -27,12 +28,18 @@ import (
 )
 
 func TestGetAuthContent(t *testing.T) {
-	text := "test"
-	hash := common.Hash{}
-	copy(hash[:], crypto.Sha3([]byte(text)))
-	ioutil.WriteFile("/tmp/test.content", []byte(text), os.ModePerm)
+	dir, err := ioutil.TempDir("", "docserver-test")
+	if err != nil {
+		t.Fatal("cannot create temporary directory:", err)
+	}
+	defer os.RemoveAll(dir)
+	ds := New(dir)
 
-	ds := New("/tmp/")
+	text := "test"
+	hash := crypto.Sha3Hash([]byte(text))
+	if err := ioutil.WriteFile(path.Join(dir, "test.content"), []byte(text), os.ModePerm); err != nil {
+		t.Fatal("could not write test file", err)
+	}
 	content, err := ds.GetAuthContent("file:///test.content", hash)
 	if err != nil {
 		t.Errorf("no error expected, got %v", err)
@@ -67,4 +74,4 @@ func TestRegisterScheme(t *testing.T) {
 	if !ds.HasScheme("scheme") {
 		t.Errorf("expected scheme to be registered")
 	}
-}
+}
\ No newline at end of file
diff --git a/common/path.go b/common/path.go
index 0d7adb961778537b39e6c7ec462e1256a7508758..8b3c7d14b86f488c17ac146e2e7578f49e67a3e3 100644
--- a/common/path.go
+++ b/common/path.go
@@ -116,14 +116,3 @@ func DefaultIpcPath() string {
 	}
 	return filepath.Join(DefaultDataDir(), "geth.ipc")
 }
-
-func IsWindows() bool {
-	return runtime.GOOS == "windows"
-}
-
-func WindonizePath(path string) string {
-	if string(path[0]) == "/" && IsWindows() {
-		path = path[1:]
-	}
-	return path
-}
diff --git a/common/path_test.go b/common/path_test.go
deleted file mode 100644
index 71ffd5fe1e3667309ef97dd96658243fadb449ec..0000000000000000000000000000000000000000
--- a/common/path_test.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-package common
-
-import (
-	"os"
-	// "testing"
-
-	checker "gopkg.in/check.v1"
-)
-
-type CommonSuite struct{}
-
-var _ = checker.Suite(&CommonSuite{})
-
-func (s *CommonSuite) TestOS(c *checker.C) {
-	expwin := (os.PathSeparator == '\\' && os.PathListSeparator == ';')
-	res := IsWindows()
-
-	if !expwin {
-		c.Assert(res, checker.Equals, expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator))
-	} else {
-		c.Assert(res, checker.Not(checker.Equals), expwin, checker.Commentf("IsWindows is", res, "but path is", os.PathSeparator))
-	}
-}
-
-func (s *CommonSuite) TestWindonziePath(c *checker.C) {
-	iswindowspath := os.PathSeparator == '\\'
-	path := "/opt/eth/test/file.ext"
-	res := WindonizePath(path)
-	ressep := string(res[0])
-
-	if !iswindowspath {
-		c.Assert(ressep, checker.Equals, "/")
-	} else {
-		c.Assert(ressep, checker.Not(checker.Equals), "/")
-	}
-}
diff --git a/common/size_test.go b/common/size_test.go
index 8709a02374904997eea13182192b71dd07426a43..ce19cab69ff01749e3bcff348298822f953ccd82 100644
--- a/common/size_test.go
+++ b/common/size_test.go
@@ -40,7 +40,7 @@ func (s *SizeSuite) TestStorageSizeString(c *checker.C) {
 	c.Assert(StorageSize(data3).String(), checker.Equals, exp3)
 }
 
-func (s *CommonSuite) TestCommon(c *checker.C) {
+func (s *SizeSuite) TestCommon(c *checker.C) {
 	ether := CurrencyToString(BigPow(10, 19))
 	finney := CurrencyToString(BigPow(10, 16))
 	szabo := CurrencyToString(BigPow(10, 13))
diff --git a/jsre/jsre_test.go b/jsre/jsre_test.go
index ad210932a0a6e20b3d351d7745f258679782d408..93dc7d1f9a87caa611609e4c1ed249ae2f702d88 100644
--- a/jsre/jsre_test.go
+++ b/jsre/jsre_test.go
@@ -19,6 +19,7 @@ package jsre
 import (
 	"io/ioutil"
 	"os"
+	"path"
 	"testing"
 	"time"
 
@@ -40,10 +41,23 @@ func (no *testNativeObjectBinding) TestMethod(call otto.FunctionCall) otto.Value
 	return v
 }
 
+func newWithTestJS(t *testing.T, testjs string) (*JSRE, string) {
+	dir, err := ioutil.TempDir("", "jsre-test")
+	if err != nil {
+		t.Fatal("cannot create temporary directory:", err)
+	}
+	if testjs != "" {
+		if err := ioutil.WriteFile(path.Join(dir, "test.js"), []byte(testjs), os.ModePerm); err != nil {
+			t.Fatal("cannot create test.js:", err)
+		}
+	}
+	return New(dir), dir
+}
+
 func TestExec(t *testing.T) {
-	jsre := New("/tmp")
+	jsre, dir := newWithTestJS(t, `msg = "testMsg"`)
+	defer os.RemoveAll(dir)
 
-	ioutil.WriteFile("/tmp/test.js", []byte(`msg = "testMsg"`), os.ModePerm)
 	err := jsre.Exec("test.js")
 	if err != nil {
 		t.Errorf("expected no error, got %v", err)
@@ -64,9 +78,9 @@ func TestExec(t *testing.T) {
 }
 
 func TestNatto(t *testing.T) {
-	jsre := New("/tmp")
+	jsre, dir := newWithTestJS(t, `setTimeout(function(){msg = "testMsg"}, 1);`)
+	defer os.RemoveAll(dir)
 
-	ioutil.WriteFile("/tmp/test.js", []byte(`setTimeout(function(){msg = "testMsg"}, 1);`), os.ModePerm)
 	err := jsre.Exec("test.js")
 	if err != nil {
 		t.Errorf("expected no error, got %v", err)
@@ -88,7 +102,7 @@ func TestNatto(t *testing.T) {
 }
 
 func TestBind(t *testing.T) {
-	jsre := New("/tmp")
+	jsre := New("")
 
 	jsre.Bind("no", &testNativeObjectBinding{})
 
@@ -105,9 +119,9 @@ func TestBind(t *testing.T) {
 }
 
 func TestLoadScript(t *testing.T) {
-	jsre := New("/tmp")
+	jsre, dir := newWithTestJS(t, `msg = "testMsg"`)
+	defer os.RemoveAll(dir)
 
-	ioutil.WriteFile("/tmp/test.js", []byte(`msg = "testMsg"`), os.ModePerm)
 	_, err := jsre.Run(`loadScript("test.js")`)
 	if err != nil {
 		t.Errorf("expected no error, got %v", err)
@@ -125,4 +139,4 @@ func TestLoadScript(t *testing.T) {
 		t.Errorf("expected '%v', got '%v'", exp, got)
 	}
 	jsre.Stop(false)
-}
+}
\ No newline at end of file
diff --git a/p2p/discover/table.go b/p2p/discover/table.go
index 48c47347574c4380aa17fd33f4c2cf7ca44699f9..67f7ec46fb7b6ee87ff0e5e10595b00c9754f39b 100644
--- a/p2p/discover/table.go
+++ b/p2p/discover/table.go
@@ -164,7 +164,9 @@ func randUint(max uint32) uint32 {
 
 // Close terminates the network listener and flushes the node database.
 func (tab *Table) Close() {
-	tab.net.close()
+	if tab.net != nil {
+		tab.net.close()
+	}
 	tab.db.close()
 }
 
diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go
index 310fe2b7bcde325be1eaa1ae746ae35e52397e41..d259177bf836d0c8b99ee75f77b582f4d331da4c 100644
--- a/p2p/discover/table_test.go
+++ b/p2p/discover/table_test.go
@@ -35,6 +35,7 @@ func TestTable_pingReplace(t *testing.T) {
 	doit := func(newNodeIsResponding, lastInBucketIsResponding bool) {
 		transport := newPingRecorder()
 		tab := newTable(transport, NodeID{}, &net.UDPAddr{}, "")
+		defer tab.Close()
 		pingSender := newNode(MustHexID("a502af0f59b2aab7746995408c79e9ca312d2793cc997e44fc55eda62f0150bbb8c59a6f9269ba3a081518b62699ee807c7c19c20125ddfccca872608af9e370"), net.IP{}, 99, 99)
 
 		// fill up the sender's bucket.
@@ -158,9 +159,7 @@ func newPingRecorder() *pingRecorder {
 func (t *pingRecorder) findnode(toid NodeID, toaddr *net.UDPAddr, target NodeID) ([]*Node, error) {
 	panic("findnode called on pingRecorder")
 }
-func (t *pingRecorder) close() {
-	panic("close called on pingRecorder")
-}
+func (t *pingRecorder) close() {}
 func (t *pingRecorder) waitping(from NodeID) error {
 	return nil // remote always pings
 }
@@ -180,6 +179,7 @@ func TestTable_closest(t *testing.T) {
 		// for any node table, Target and N
 		tab := newTable(nil, test.Self, &net.UDPAddr{}, "")
 		tab.add(test.All)
+		defer tab.Close()
 
 		// check that doClosest(Target, N) returns nodes
 		result := tab.closest(test.Target, test.N).entries
@@ -237,6 +237,7 @@ func TestTable_ReadRandomNodesGetAll(t *testing.T) {
 	}
 	test := func(buf []*Node) bool {
 		tab := newTable(nil, NodeID{}, &net.UDPAddr{}, "")
+		defer tab.Close()
 		for i := 0; i < len(buf); i++ {
 			ld := cfg.Rand.Intn(len(tab.buckets))
 			tab.add([]*Node{nodeAtDistance(tab.self.sha, ld)})
@@ -279,6 +280,7 @@ func (*closeTest) Generate(rand *rand.Rand, size int) reflect.Value {
 func TestTable_Lookup(t *testing.T) {
 	self := nodeAtDistance(common.Hash{}, 0)
 	tab := newTable(lookupTestnet, self.ID, &net.UDPAddr{}, "")
+	defer tab.Close()
 
 	// lookup on empty table returns no nodes
 	if results := tab.Lookup(lookupTestnet.target); len(results) > 0 {
diff --git a/p2p/nat/natupnp_test.go b/p2p/nat/natupnp_test.go
index c1e322af70294b8eea3b5a4f3aebe42edd0e89ca..79f6d25ae87f457d27ae32468b8da5a7a73c2a13 100644
--- a/p2p/nat/natupnp_test.go
+++ b/p2p/nat/natupnp_test.go
@@ -21,6 +21,7 @@ import (
 	"io"
 	"net"
 	"net/http"
+	"runtime"
 	"strings"
 	"testing"
 
@@ -28,6 +29,10 @@ import (
 )
 
 func TestUPNP_DDWRT(t *testing.T) {
+	if runtime.GOOS == "windows" {
+		t.Skipf("disabled to avoid firewall prompt")
+	}
+
 	dev := &fakeIGD{
 		t: t,
 		ssdpResp: "HTTP/1.1 200 OK\r\n" +