anchor.diff:              else
                   ctx.Options.ProjectRoot </> name |> File.make |> FileTarget
   
  -        let dryRun ctx options targetNames =
  -            let rec getDeps:Target -> DepState list =
  -                (getDepsImpl ctx (fun x -> getDeps x))
  -                |> memoize
  +        let dryRun ctx options (targetNames: string list) =
  +            let rec getDeps = getDepsImpl ctx (fun x -> getDeps x) |> memoize
   
               // getPlainDeps getDeps (getExecTime ctx)
               do ctx.Logger.Log Command "Running (dry) targets %A" targetNames
   
  -        let runTargets ctx options targetNames =
  -            // TODO wrap more elegantly
  -            let rec get_changed_deps = CommonLib.memoize (getDepsImpl ctx (fun x -> get_changed_deps x)) in
  -
  +            let rec showDepStatus targets =
  +                targets |>
  +                function
  +                | DepState.Other reason ->
  +                    printfn "Reason %s" reason
  +                | DepState.Depends (t, deps) ->
  +                    printfn "Depends on target %s" t.ShortName
  +                    deps |> List.iter showDepStatus
  +                | DepState.FilesChanged (file::_) ->
  +                    printfn "File(s) changed %s" file
  +                | reasons ->
  +                    printf "Some reason %A" reasons
  +                ()
  +            and showTargetStatus target =
  +                let deps = getDeps target
  +                if List.isEmpty deps then
  +                    ()
  +                else
  +                    printfn "Changed target '%s'" target.ShortName
  +                    deps |> List.iter showDepStatus
  +
  +            targetNames |> List.map (makeTarget ctx) |> List.iter showTargetStatus
  +
  +        let runTargets ctx options targets =
  +            let rec getDeps = getDepsImpl ctx (fun x -> getDeps x) |> memoize
  +            
               let check_rebuild (target: Target) =
  -                get_changed_deps >>
  +                getDeps >>
                   function
                   | [] -> false, ""
                   | DepState.Other reason::_            -> true, reason
  
positive.code:         /// Gets dependencies for specific target in a human friendly form
          /// </summary>
          /// <param name="ctx"></param>
          let getPlainDeps getDepStates getExecTime ptgt =
  
              // strips the filelists to only 5 items
              let rec stripReasons = function
  
negative.code:                     tt |> List.map (fun (s: string) -> s.Split(';', '|') |> List.ofArray)
              try
                  if options.DryRun then
                      targetLists |> List.iter (dryRun ctx options)
                  else
                      try
                          targetLists |> List.iter (List.map (makeTarget ctx) >> (runTargets ctx options))
                          logger.Log Message "\n\n\tBuild completed in %A\n" (System.DateTime.Now - start)
                      with
                          | exn ->
  