Put the fish heads in a pot with the two liters of water, along with the garlic, chopped onion, a sprig of parsley, the celery, salt and pepper. Cook for 30 minutes over medium-low heat, at a bare simmer rather than a hard boil: boiling breaks down the fat and makes the broth taste strongly fishy.
Strain and reserve the broth. Pick the meat off the heads by hand and set it aside, discarding the bones carefully: they are small and numerous.
Blend the tomatoes with a little hot water, strain, and set aside.
In a pot, heat the oil and cook the blended tomato for about 4 minutes, until it darkens and thickens. Add the broth, the vegetables and the bay leaf.
When it comes to a boil, add the pieces of fish.
Cook for 15 minutes more, then taste and adjust the salt.
Serve in deep bowls with a little parsley or cilantro on top.
If you prefer, blend the whole soup to get a smooth fish cream, which is how the author serves it. Check for bones first.