anchor.diff:  %%                                   {stop, Reason, State}
   %% @endo
   %%--------------------------------------------------------------------
  -handle_info({ report, Type, Recipient, Arg, Probe, DataPoint, Interval }, St) ->
  +handle_info({ report, Type, Recipient, Probe, DataPoint, Interval }, St) ->
       case exometer_entry:get_value(Probe, [ DataPoint ]) of
  -	{ ok, Val } ->
  -	    %% Distribute probe value to pid subscriber, or module.
  -	    if Type =:= pid ->
  -		    Recipient ! { exometer_report, Probe, DataPoint, Val, Arg };
  -	       true ->
  -		    Recipient:exometer_update(Probe, DataPoint, Val, Arg)
  +	{ ok, [ { _, Val}] } ->
  +	    %% Distribute probe value to pid subscriber or module, depending on type.
  +	    %% Store indication if we should re-arm the timer, and the new module states
  +	    %% (for module reporting).
  +	    { ReArmTimer, NewModStates } = 
  +		if Type =:= pid ->
  +			%% Send a message to the recipient process
  +			%% FIXME: Monitor or exception handling for dead pids
  +			Recipient ! { exometer_report, Probe, DataPoint, Val },
  +			{ true, St#st.mod_states };
  +
  +		   true ->
  +			%% Invoke the module with probe, datapoint and current module state
  +			%% New state will be saved.
  +			{ value, { _, ModSt}, TmpModList } = lists:keytake(Recipient, 1, St#st.mod_states) ,
  +
  +			%% Check that the reporting went well. If not, remove from Mod State list
  +			case  Recipient:report(Probe, DataPoint, Val, ModSt) of
  +			    { ok, NewModSt } -> { true, [ { Recipient, NewModSt } | TmpModList ]};
  +			    _  -> { false, TmpModList }
  +			end
  +		end,
  +
  +	    %% If the reporting went well, re-arm the timer for next round
  +	    TRef = if ReArmTimer =:= true ->
  +		    {ok, T } = timer:send_after(Interval, self(), 
  +						   { report, Type, Recipient, Probe, DataPoint, Interval }),
  +			   T;
  +		    true -> undefined
   	    end,
   
  -	    %% Re-arm probe.
  -	    {ok, TRef } = timer:send_after(Interval, self(), 
  -					   { report, Type, Recipient, Probe, DataPoint, Interval }),
  -
   	    %% Replace the pid_subscriber info with a record having the new timer ref.
  -	    {noreply, St#st { subscribers = 
  +	    %% Replace mod states with the updates state returned by Recipient:report()
  +	    {noreply, St#st { mod_states = NewModStates,
  +			      subscribers = 
   			     lists:keyreplace({Type, Recipient, Probe, DataPoint}, 
  +					      #st.subscribers,
   					      St#st.subscribers,
   					      #subscriber {
  -						      key = {Type, Recipient, Probe, DataPoint},
  +						      key = { Type, Recipient, Probe, DataPoint},
   						      t_ref = TRef
   						     })}};
   	%% Entry removed while timer in progress.
   	_ ->
  +	    io:format("Probe(~p) Datapoint(~p) not found~n", [ Probe, DataPoint]),
   	    {noreply, St }
       end;
   
   handle_info(_Info, State) ->
  +    io:format("exometer_report:info(??): ~p~n", [ _Info ]),
       {noreply, State}.
   
   %%--------------------------------------------------------------------
  
positive.code: %% @end
  %%--------------------------------------------------------------------
  start_link() ->
      gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  
  %%%===================================================================
  %%% gen_server callbacks
  %%%===================================================================
  
negative.code: 
  
  handle_call(_Request, _From, State) ->
      io:format("exometer_report:handle_call(??): ~p~n", [ _Request ]),
      Reply = ok,
      {reply, Reply, State}.
  
  