anchor.diff:          match msg with
           | Worker.Run ->
             runtest test
  -          manager.Post(Manager.WorkerDone)
  +          manager.Post(Manager.WorkerDone(suite.Context, self))
             return ()
         }
       loop ())
   
   let newManager maxDOP : actor<Manager> =
     let sw = System.Diagnostics.Stopwatch.StartNew()
  +  let contexts = new HashSet<string>()
     actor.Start(fun self ->
  -    let rec loop workers maxWorkers doneWorkers replyChannel =
  +    let rec loop workers pendingWorkers replyChannel =
         async {
           let! msg = self.Receive ()
           match msg with
           | Manager.Initialize (suites) ->
             //build a worker per suite/test combo and give them their work
  -          let workers = suites |> List.map (fun suite -> suite.Tests |> List.map (fun test -> newWorker self test)) |> List.concat |> List.rev
  -          return! loop workers workers.Length 0 replyChannel
  +          let workers = suites |> List.map (fun suite -> suite.Tests |> List.map (fun test -> suite, newWorker self suite test)) |> List.concat |> List.rev
  +          return! loop workers pendingWorkers replyChannel
           | Manager.Start(replyChannel) ->
             //kick off the initial X workers
             self.Post(Manager.Run maxDOP)
  -          return! loop workers maxWorkers doneWorkers (Some replyChannel)
  +          return! loop workers pendingWorkers (Some replyChannel)
           | Manager.Run(count) ->
             if count = 0 then
  -            return! loop workers maxWorkers doneWorkers replyChannel
  +            return! loop workers [] replyChannel
             else
               match workers with
  -            | [] -> return! loop [] maxWorkers doneWorkers replyChannel
  -            | head :: tail ->
  +            | [] -> return! loop workers pendingWorkers replyChannel
  +            | (suite, head) :: tail ->
  +              if not <| contexts.Contains(suite.Context) then
  +                contexts.Add(suite.Context) |> ignore
  +                reporter.Post(Reporter.ContextStart suite.Context)
  +              let pendingWorkers = (suite,head)::pendingWorkers
                 head.Post(Worker.Run)
                 self.Post(Manager.Run(count - 1))
  -              return! loop tail maxWorkers doneWorkers replyChannel
  -        | Manager.WorkerDone ->
  +              return! loop tail pendingWorkers replyChannel
  +        | Manager.WorkerDone(suiteContext, doneWorker) ->
  +          let pendingWorkers = pendingWorkers |> List.filter (fun (_, pendingWorker) -> pendingWorker <> doneWorker)
             self.Post(Manager.Run(1))
  -          let doneWorkers = doneWorkers + 1
  -          if doneWorkers = maxWorkers then
  +          let remainingWorkersForSuite = workers |> List.filter (fun (suite,_) -> suiteContext = suite.Context)
  +          let pendingWorkersForSuite = pendingWorkers |> List.filter (fun (suite,_) -> suiteContext = suite.Context)
  +          if remainingWorkersForSuite.IsEmpty && pendingWorkersForSuite.IsEmpty then
  +            reporter.Post(Reporter.ContextEnd suiteContext)
  +          if pendingWorkers.IsEmpty && workers.IsEmpty then
               let failed = reporter.PostAndReply(fun replyChannel -> Reporter.RunOver(int sw.Elapsed.TotalMinutes, int sw.Elapsed.TotalSeconds, replyChannel))
               replyChannel.Value.Reply failed
               return ()
             else
  -            return! loop workers maxWorkers doneWorkers replyChannel
  +            return! loop workers pendingWorkers replyChannel
         }
  -    loop [] 0 0 None)
  +    loop [] [] None)
   
   let run maxDOP =
     // suites list is in reverse order and have to be reversed before running the tests
  
positive.code:   | Pass of id:Guid
    | Fail of id:Guid * ex:Exception
    | RunOver of minutes:int * seconds:int * AsyncReplyChannel<int>
  
  let colorWriteReset color message =
    Console.ForegroundColor <- color
  
negative.code:   | Run
  
  type Reporter =
    | ContextStart of description:string
    | ContextEnd of description:string
    | TestStart of description:string * id:Guid
    | Print of message:string * id:Guid
    | Skip of id:Guid
  