diff --git a/accounts/account_manager.go b/accounts/account_manager.go
index c174eef1ea52514462df3684f14a349d375070b4..56499672edf480352de6b4d4bd9c2d0d5a2a3113 100644
--- a/accounts/account_manager.go
+++ b/accounts/account_manager.go
@@ -164,14 +164,15 @@ func (am *Manager) Lock(addr common.Address) error {
 	return nil
 }
 
-// TimedUnlock unlocks the given account with. The account
+// TimedUnlock unlocks the given account with the passphrase. The account
 // stays unlocked for the duration of timeout. A timeout of 0 unlocks the account
-// until the program exits. The account must match a unique key.
+// until the program exits. The account must match a unique key file.
 //
-// If the accout is already unlocked, TimedUnlock extends or shortens
-// the active unlock timeout.
-func (am *Manager) TimedUnlock(a Account, keyAuth string, timeout time.Duration) error {
-	_, key, err := am.getDecryptedKey(a, keyAuth)
+// If the account address is already unlocked for a duration, TimedUnlock extends or
+// shortens the active unlock timeout. If the address was previously unlocked
+// indefinitely the timeout is not altered.
+func (am *Manager) TimedUnlock(a Account, passphrase string, timeout time.Duration) error {
+	a, key, err := am.getDecryptedKey(a, passphrase)
 	if err != nil {
 		return err
 	}
@@ -180,8 +181,13 @@ func (am *Manager) TimedUnlock(a Account, keyAuth string, timeout time.Duration)
 	defer am.mu.Unlock()
 	u, found := am.unlocked[a.Address]
 	if found {
-		// terminate dropLater for this key to avoid unexpected drops.
-		if u.abort != nil {
+		if u.abort == nil {
+			// The address was unlocked indefinitely, so unlocking
+			// it with a timeout would be confusing.
+			zeroKey(key.PrivateKey)
+			return nil
+		} else {
+			// Terminate the expire goroutine and replace it below.
 			close(u.abort)
 		}
 	}
diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go
index 56d4040c37813a344140286ac7ce1f9c76884d6d..829cf39683c6dfe63447deeb92b7889e6b99e421 100644
--- a/accounts/accounts_test.go
+++ b/accounts/accounts_test.go
@@ -120,8 +120,8 @@ func TestOverrideUnlock(t *testing.T) {
 	pass := "foo"
 	a1, err := am.NewAccount(pass)
 
-	// Unlock indefinitely
-	if err = am.Unlock(a1, pass); err != nil {
+	// Unlock indefinitely.
+	if err = am.TimedUnlock(a1, pass, 5*time.Minute); err != nil {
 		t.Fatal(err)
 	}