Donald Trump's personal lawyer, Michael Cohen, received a secret payment of at least $400,000 (£300,000) to fix talks between the Ukrainian president and President Trump, according to sources in Kiev close to those involved.
The payment was arranged by intermediaries acting for Ukraine's leader, Petro Poroshenko, the sources said, though Cohen was not registered as a representative of Ukraine as required by US law.
Cohen denies the allegation.
The meeting at the White House was last June. Shortly after the Ukrainian president returned home, his country's anti-corruption agency stopped its investigation into Trump's former campaign manager, Paul Manafort.
A high-ranking Ukrainian intelligence officer in Poroshenko's administration described what happened before the visit to the White House.
Cohen was brought in, he said, because Ukraine's registered lobbyists and embassy in Washington DC could get Poroshenko little more than a brief photo-op with Trump. Poroshenko needed something that could be portrayed as "talks".
This senior official's account is as follows - Poroshenko decided to establish a back channel to Trump. The task was given to a former aide, who asked a loyal Ukrainian MP for help.
He in turn used personal contacts in a Jewish charity in New York state, Chabad of Port Washington. This eventually led to Michael Cohen, the president's lawyer and trusted fixer. Cohen was paid $400,000.
There is no suggestion that Trump knew about the payment.
A second source in Kiev gave the same details, except that the total paid to Cohen was $600,000.
There was also support for the account from a lawyer in the US who has uncovered details of Cohen's finances, Michael Avenatti. He represents a porn actress, Stormy Daniels, in legal action against President Trump.
Avenatti said that Suspicious Activity Reports filed by Cohen's bank to the US Treasury showed he had received money from "Ukrainian interests".
As well as Cohen, the two Ukrainians said to have opened the backchannel for their president also denied the story.
The senior intelligence official in Kiev said Cohen had been helped by Felix Sater, a convicted former mobster who was once Trump's business partner. Sater's lawyer, too, denied the allegations.
The Ukrainian president's office initially refused to comment but, asked by a local journalist to respond, a statement was issued calling the story a "blatant lie, slander and fake".
As was widely reported last June, Poroshenko was still guessing at how much time he would have with Trump even as he flew to Washington.
The White House schedule said only that Poroshenko would "drop in" to the Oval Office while Trump was having staff meetings.
That had been agreed through official channels. Cohen's fee was for getting Poroshenko more than just an embarrassingly brief few minutes of small talk and a handshake, the senior official said. But negotiations continued until the early hours of the day of the visit.
The Ukrainian side were angry, the official went on, because Cohen had taken "hundreds of thousands" of dollars from them for something it seemed he could not deliver.
Right up until the last moment, the Ukrainian leader was uncertain if he would avoid humiliation.
"Poroshenko's inner circle were shocked by how dirty this whole arrangement [with Cohen] was."
Poroshenko was desperate to meet Trump because of what had happened in the US presidential election campaign.
In August 2016, the New York Times published a document that appeared to show Trump's campaign manager, Paul Manafort, getting millions of dollars from pro-Russian interests in Ukraine.
It was a page of the so-called "black ledger" belonging to the Party of the Regions, the pro-Russian party that employed Manafort when he ran a political consultancy in Ukraine.
The page appeared to have come from Ukraine's National Anti Corruption Bureau, which was investigating him. Manafort had to resign.