diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -833,6 +833,8 @@
 void CWallet::AddToSpends(const COutPoint &outpoint, const TxId &wtxid) {
     mapTxSpends.insert(std::make_pair(outpoint, wtxid));
 
+    setLockedCoins.erase(outpoint);
+
     std::pair<TxSpends::iterator, TxSpends::iterator> range;
     range = mapTxSpends.equal_range(outpoint);
     SyncMetaData(range);
diff --git a/test/functional/wallet_basic.py b/test/functional/wallet_basic.py
--- a/test/functional/wallet_basic.py
+++ b/test/functional/wallet_basic.py
@@ -140,6 +140,16 @@
         assert_raises_rpc_error(-8, "Invalid parameter, vout index out of bounds",
                                 self.nodes[2].lockunspent, False, [{"txid": unspent_0["txid"], "vout": 999}])
 
+        # An output should be unlocked when spent
+        unspent_0 = self.nodes[1].listunspent()[0]
+        self.nodes[1].lockunspent(False, [unspent_0])
+        tx = self.nodes[1].createrawtransaction(
+            [unspent_0], {self.nodes[1].getnewaddress(): 1})
+        tx = self.nodes[1].fundrawtransaction(tx)['hex']
+        tx = self.nodes[1].signrawtransactionwithwallet(tx)["hex"]
+        self.nodes[1].sendrawtransaction(tx)
+        assert_equal(len(self.nodes[1].listlockunspent()), 0)
+
         # Have node1 generate 100 blocks (so node0 can recover the fee)
         self.nodes[1].generate(100)
         self.sync_all(self.nodes[0:3])