diff --git a/lntest/itest/list_on_test.go b/lntest/itest/list_on_test.go
index 56e76917b..42abe6a16 100644
--- a/lntest/itest/list_on_test.go
+++ b/lntest/itest/list_on_test.go
@@ -183,4 +183,8 @@ var allTestCasesTemp = []*lntemp.TestCase{
 		Name:     "list outgoing payments",
 		TestFunc: testListPayments,
 	},
+	{
+		Name:     "immediate payment after channel opened",
+		TestFunc: testPaymentFollowingChannelOpen,
+	},
 }
diff --git a/lntest/itest/lnd_payment_test.go b/lntest/itest/lnd_payment_test.go
index 337b21ff2..de275fa7b 100644
--- a/lntest/itest/lnd_payment_test.go
+++ b/lntest/itest/lnd_payment_test.go
@@ -100,81 +100,58 @@ func testListPayments(ht *lntemp.HarnessTest) {
 // subsystems trying to update the channel state in the db. We follow this
 // transition with a payment that updates the commitment state and verify that
 // the pending state is up to date.
-func testPaymentFollowingChannelOpen(net *lntest.NetworkHarness, t *harnessTest) {
-	ctxb := context.Background()
-
+func testPaymentFollowingChannelOpen(ht *lntemp.HarnessTest) {
 	const paymentAmt = btcutil.Amount(100)
 	channelCapacity := paymentAmt * 1000
 
 	// We first establish a channel between Alice and Bob.
-	pendingUpdate, err := net.OpenPendingChannel(
-		net.Alice, net.Bob, channelCapacity, 0,
-	)
-	if err != nil {
-		t.Fatalf("unable to open channel: %v", err)
+	alice, bob := ht.Alice, ht.Bob
+	p := lntemp.OpenChannelParams{
+		Amt: channelCapacity,
 	}
+	pendingUpdate := ht.OpenChannelAssertPending(alice, bob, p)
 
 	// At this point, the channel's funding transaction will have been
 	// broadcast, but not confirmed. Alice and Bob's nodes
 	// should reflect this when queried via RPC.
-	assertNumOpenChannelsPending(t, net.Alice, net.Bob, 1)
+	ht.AssertNodesNumPendingOpenChannels(alice, bob, 1)
 
 	// We are restarting Bob's node to let the link be created for the
 	// pending channel.
-	if err := net.RestartNode(net.Bob, nil); err != nil {
-		t.Fatalf("Bob restart failed: %v", err)
-	}
+	ht.RestartNode(bob)
 
 	// We ensure that Bob reconnects to Alice.
-	net.EnsureConnected(t.t, net.Bob, net.Alice)
+	ht.EnsureConnected(bob, alice)
 
-	// We mine one block for the channel to be confirmed.
-	_ = mineBlocks(t, net, 6, 1)[0]
+	// We mine six blocks for the channel to be confirmed.
+	ht.MineBlocksAndAssertNumTxes(6, 1)
 
 	// We verify that the channel is open from both nodes point of view.
-	assertNumOpenChannelsPending(t, net.Alice, net.Bob, 0)
+	chanPoint := lntemp.ChanPointFromPendingUpdate(pendingUpdate)
+	ht.AssertNodesNumPendingOpenChannels(alice, bob, 0)
+	ht.AssertChannelExists(alice, chanPoint)
+	ht.AssertChannelExists(bob, chanPoint)
 
 	// With the channel open, we'll create invoices for Bob that Alice will
 	// pay to in order to advance the state of the channel.
-	bobPayReqs, _, _, err := createPayReqs(
-		net.Bob, paymentAmt, 1,
-	)
-	if err != nil {
-		t.Fatalf("unable to create pay reqs: %v", err)
-	}
+	bobPayReqs, _, _ := ht.CreatePayReqs(bob, paymentAmt, 1)
 
 	// Send payment to Bob so that a channel update to disk will be
 	// executed.
-	sendAndAssertSuccess(
-		t, net.Alice, &routerrpc.SendPaymentRequest{
-			PaymentRequest: bobPayReqs[0],
-			TimeoutSeconds: 60,
-			FeeLimitSat:    1000000,
-		},
-	)
+	ht.CompletePaymentRequests(alice, []string{bobPayReqs[0]})
 
-	// At this point we want to make sure the channel is opened and not
-	// pending.
-	ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
-	defer cancel()
-	res, err := net.Bob.ListChannels(ctxt, &lnrpc.ListChannelsRequest{})
-	if err != nil {
-		t.Fatalf("unable to list bob channels: %v", err)
-	}
-	if len(res.Channels) == 0 {
-		t.Fatalf("bob list of channels is empty")
-	}
+	// TODO(yy): remove the sleep once the following bug is fixed.
+	// When the invoice is reported settled, the commitment dance is not
+	// yet finished, which can cause an error when closing the channel,
+	// saying there's active HTLCs. We need to investigate this issue and
+	// reverse the order to, first finish the commitment dance, then report
+	// the invoice as settled.
+	time.Sleep(2 * time.Second)
 
 	// Finally, immediately close the channel. This function will also
 	// block until the channel is closed and will additionally assert the
 	// relevant channel closing post conditions.
-	chanPoint := &lnrpc.ChannelPoint{
-		FundingTxid: &lnrpc.ChannelPoint_FundingTxidBytes{
-			FundingTxidBytes: pendingUpdate.Txid,
-		},
-		OutputIndex: pendingUpdate.OutputIndex,
-	}
-	closeChannelAndAssert(t, net, net.Alice, chanPoint, false)
+	ht.CloseChannel(alice, chanPoint)
 }
 
 // testAsyncPayments tests the performance of the async payments.
diff --git a/lntest/itest/lnd_test_list_on_test.go b/lntest/itest/lnd_test_list_on_test.go
index dcdd9cb83..f36729b01 100644
--- a/lntest/itest/lnd_test_list_on_test.go
+++ b/lntest/itest/lnd_test_list_on_test.go
@@ -170,10 +170,6 @@ var allTestCases = []*testCase{
 		name: "delete macaroon id",
 		test: testDeleteMacaroonID,
 	},
-	{
-		name: "immediate payment after channel opened",
-		test: testPaymentFollowingChannelOpen,
-	},
 	{
 		name: "psbt channel funding",
 		test: testPsbtChanFunding,