diff --git a/apps/upi_core/lib/upi_core/application.ex b/apps/upi_core/lib/upi_core/application.ex
--- a/apps/upi_core/lib/upi_core/application.ex
+++ b/apps/upi_core/lib/upi_core/application.ex
@@ -6,7 +6,8 @@
   @impl true
   def start(_type, _args) do
     # [RespValQr Payee.Ac] ADDED: stop at startup (clear message, no error code) when the Indian settlement account is not configured
-    validate_settlement_account!()
+    # [RespValQr Payee.Ac] CHANGED (patch 09): startup check commented out - the app starts without PSP_SETTLEMENT_* (Payee/Ac now comes from the merchant's DB record)
+    # OLD:     validate_settlement_account!()
 
     # Initialize ETS cache for RespChkTxn ref_data
     unless :ets.whereis(:ref_data_cache) do
diff --git a/apps/upi_core/lib/upi_core/upi_xml_schema.ex b/apps/upi_core/lib/upi_core/upi_xml_schema.ex
--- a/apps/upi_core/lib/upi_core/upi_xml_schema.ex
+++ b/apps/upi_core/lib/upi_core/upi_xml_schema.ex
@@ -390,10 +390,32 @@
 
     # [RespValQr Payee.Ac] CHANGED: our Indian settlement account from config (:upi_core, :psp_settlement_account); dummy defaults removed
     # TSD Table 2: Payee Ac Details ACTYPE / ACNUM / IFSC are the PSP's Indian settlement account
+    # [RespValQr Payee.Ac] CHANGED (patch 09): Payee/Ac = the merchant's account from the DB (looked up by the QR "pa"), as in the earlier precert reports.
+    # PSP_SETTLEMENT_* (config :upi_core, :psp_settlement_account) wins when all three are set; when neither exists the old response_data values/defaults apply. Never raises.
+    # OLD:     settlement_ac = Map.new(Application.get_env(:upi_core, :psp_settlement_account, []))
+    # OLD:     ac_type = Map.get(settlement_ac, :ac_type)
+    # OLD:     ac_num = Map.get(settlement_ac, :ac_num)
+    # OLD:     ac_ifsc = Map.get(settlement_ac, :ifsc)
     settlement_ac = Map.new(Application.get_env(:upi_core, :psp_settlement_account, []))
-    ac_type = Map.get(settlement_ac, :ac_type)
-    ac_num = Map.get(settlement_ac, :ac_num)
-    ac_ifsc = Map.get(settlement_ac, :ifsc)
+    env_ac = [Map.get(settlement_ac, :ac_type), Map.get(settlement_ac, :ac_num), Map.get(settlement_ac, :ifsc)]
+
+    {ac_type, ac_num, ac_ifsc} =
+      if Enum.all?(env_ac, &(&1 not in [nil, ""])) do
+        List.to_tuple(env_ac)
+      else
+        db_ac = merchant_payee_ac(qr.("pa"))
+
+        pick = fn key, fallback ->
+          case Map.get(db_ac, key) do
+            v when v in [nil, ""] -> fallback
+            v -> v
+          end
+        end
+
+        {pick.(:ac_type, Map.get(response_data, :account_type, "SAVINGS")),
+         pick.(:ac_num, Map.get(response_data, :account_number, "1234567890")),
+         pick.(:ifsc, Map.get(response_data, :ifsc_code, "MERC0000001"))}
+      end
 
     # [RespValQr Payee.Ac] CHANGED: ACNUM / ACTYPE / IFSC are Mandatory (TSD Table 2, FAQ 10: the Indian settlement bank account of the IP) and are never sent empty.
     # UpiCore.Application refuses to start without them; this raise only guards a direct call when the config was removed at runtime.
@@ -402,10 +424,11 @@
     # OLD:         "[RespValQr Payee.Ac] :psp_settlement_account is not fully configured (PSP_SETTLEMENT_AC_TYPE / PSP_SETTLEMENT_AC_NUM / PSP_SETTLEMENT_IFSC) - sending empty Ac values"
     # OLD:       )
     # OLD:     end
-    if Enum.any?([ac_type, ac_num, ac_ifsc], &(&1 in [nil, ""])) do
-      raise ArgumentError,
-            "[RespValQr Payee.Ac] settlement account is not configured: set PSP_SETTLEMENT_AC_TYPE, PSP_SETTLEMENT_AC_NUM and PSP_SETTLEMENT_IFSC"
-    end
+    # [RespValQr Payee.Ac] CHANGED (patch 09): raise commented out - the app starts and answers without PSP_SETTLEMENT_*
+    # OLD:     if Enum.any?([ac_type, ac_num, ac_ifsc], &(&1 in [nil, ""])) do
+    # OLD:       raise ArgumentError,
+    # OLD:             "[RespValQr Payee.Ac] settlement account is not configured: set PSP_SETTLEMENT_AC_TYPE, PSP_SETTLEMENT_AC_NUM and PSP_SETTLEMENT_IFSC"
+    # OLD:     end
 
     # [RespValQr Merchant.Fx] REMOVED: <Fx> inside <Merchant> is not in TSD Table 2 (Fx is only under FxList)
     # OLD:     merchant_fx_tag =
@@ -460,6 +483,28 @@
     {:ok, xml}
   end
 
+  # [RespValQr Payee.Ac] ADDED (patch 09): merchant account for Payee/Ac, from the DB record found by the QR "pa" (the merchant VPA).
+  # Returns %{} when there is no pa / no merchant / the lookup fails - never raises.
+  defp merchant_payee_ac(pa) when is_binary(pa) and pa != "" do
+    case UpiCore.Merchants.get_merchant_by_vpa(pa) do
+      nil ->
+        %{}
+
+      merchant ->
+        %{
+          ac_type: merchant.settlement_account_type,
+          ac_num: merchant.settlement_account_number,
+          ifsc: merchant.settlement_account_ifsc
+        }
+    end
+  rescue
+    _ -> %{}
+  catch
+    _, _ -> %{}
+  end
+
+  defp merchant_payee_ac(_pa), do: %{}
+
   @doc """
   [RespValQr QM1] ADDED: validate the QR's mc (merchant category code) before answering ReqValQr.
   TSD Table 2: a QR whose mc is missing, not 4 digits, not the merchant's registered MCC or in the
diff --git a/apps/upi_core/test/upi_core/runtime_test.exs b/apps/upi_core/test/upi_core/runtime_test.exs
--- a/apps/upi_core/test/upi_core/runtime_test.exs
+++ b/apps/upi_core/test/upi_core/runtime_test.exs
@@ -34,11 +34,53 @@
       end)
     end
 
-    test "RespValQr is never built with empty Ac values" do
-      with_account([ac_type: "CURRENT", ac_num: nil, ifsc: "I1"], fn ->
-        assert_raise ArgumentError, ~r/PSP_SETTLEMENT_AC_NUM/, fn ->
-          UpiXmlSchema.generate_resp_val_qr(%{org_id: "MER101", result: "SUCCESS", initiation_mode: "16", qr_payload: @qr})
-        end
+    # [RespValQr Payee.Ac] CHANGED (patch 09): generate_resp_val_qr no longer raises; Payee/Ac comes from env (PSP_SETTLEMENT_*), else the merchant's DB record
+    # OLD:     test "RespValQr is never built with empty Ac values" do
+    # OLD:       with_account([ac_type: "CURRENT", ac_num: nil, ifsc: "I1"], fn ->
+    # OLD:         assert_raise ArgumentError, ~r/PSP_SETTLEMENT_AC_NUM/, fn ->
+    # OLD:           UpiXmlSchema.generate_resp_val_qr(%{org_id: "MER101", result: "SUCCESS", initiation_mode: "16", qr_payload: @qr})
+    # OLD:         end
+    # OLD:       end)
+    # OLD:     end
+
+    test "[RespValQr Payee.Ac] PSP_SETTLEMENT_* wins when all three are set" do
+      with_account([ac_type: "CURRENT", ac_num: "N1", ifsc: "I1"], fn ->
+        assert {:ok, xml} = UpiXmlSchema.generate_resp_val_qr(%{org_id: "MER101", result: "SUCCESS", initiation_mode: "16", qr_payload: @qr})
+        assert xml =~ ~s(name="ACNUM" value="N1")
+        assert xml =~ ~s(name="IFSC" value="I1")
+      end)
+    end
+
+    test "[RespValQr Payee.Ac] without PSP_SETTLEMENT_* and without a merchant it does not raise (old behaviour)" do
+      with_account([], fn ->
+        assert {:ok, xml} = UpiXmlSchema.generate_resp_val_qr(%{org_id: "MER101", result: "SUCCESS", initiation_mode: "16", qr_payload: @qr})
+        assert xml =~ ~s(name="ACTYPE" value="SAVINGS")
+      end)
+    end
+
+    test "[RespValQr Payee.Ac] without PSP_SETTLEMENT_* the merchant's DB account is used" do
+      pid = Ecto.Adapters.SQL.Sandbox.start_owner!(UpiCore.Repo, shared: true)
+      on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end)
+
+      {:ok, _} =
+        %UpiCore.Merchants.Merchant{}
+        |> UpiCore.Merchants.Merchant.changeset(%{
+          mid: "AEACTEST1",
+          merchant_vpa: "a@b",
+          brand_name: "Test Merchant",
+          tid: "ACT001",
+          country_code: "AE",
+          settlement_account_type: "CURRENT",
+          settlement_account_number: "AE123456789",
+          settlement_account_ifsc: "AEBK0001234"
+        })
+        |> UpiCore.Repo.insert()
+
+      with_account([], fn ->
+        assert {:ok, xml} = UpiXmlSchema.generate_resp_val_qr(%{org_id: "MER101", result: "SUCCESS", initiation_mode: "16", qr_payload: @qr})
+        assert xml =~ ~s(name="ACTYPE" value="CURRENT")
+        assert xml =~ ~s(name="ACNUM" value="AE123456789")
+        assert xml =~ ~s(name="IFSC" value="AEBK0001234")
       end)
     end
 
