anchor.diff:              | _ -> failwith ("Could not find expected system '" + systemName + "' of required type.")
           | _ -> failwith ("Could not find expected system '" + systemName + "'.")
   
  -    let getComponentCorrelated<'t, 'w when 't : struct and 't :> Component> systemName entityId ecs =
  -        match tryGetSystem systemName ecs with
  -        | Some system ->
  -            match system with
  -            | :? SystemCorrelated<'t, 'w> as systemCorr -> systemCorr.GetComponent entityId
  -            | _ -> failwith ("Could not find expected system '" + systemName + "' of required type.")
  -        | _ -> failwith ("Could not find expected system '" + systemName + "'.")
  -
  -    let addComponentCorrelated<'t, 'w when 't : struct and 't :> Component> systemName entityId (comp : 't) ecs =
  +    let inline getComponentCorrelated<'t, 'w when 't : struct and 't :> Component> systemName entityId ecs =
  +        let systemOpt = tryGetSystem systemName ecs
  +        if Option.isNone systemOpt then failwith ("Could not find expected system '" + systemName + "'.")
  +        let system = Option.get systemOpt
  +        if not (system :? SystemCorrelated<'t, 'w>) then failwith ("Could not find expected system '" + systemName + "' of required type.")
  +        let systemUnc = system :?> SystemCorrelated<'t, 'w>
  +        &systemUnc.GetComponent entityId
  +
  +    let registerEntity<'t, 'w when 't : struct and 't :> Component> systemName entityId ecs =
           match tryGetSystem systemName ecs with
           | Some system ->
               match system with
               | :? SystemCorrelated<'t, 'w> as systemCorr ->
  -                if systemCorr.AddComponent entityId comp then
  -                    match ecs.Correlations.TryGetValue entityId with
  -                    | (true, correlation) -> correlation.Add systemName
  -                    | (false, _) -> ecs.Correlations.Add (entityId, List [systemName])
  -                else ()
  +                let _ = systemCorr.Register entityId
  +                match ecs.Correlations.TryGetValue entityId with
  +                | (true, correlation) -> correlation.Add systemName
  +                | (false, _) -> ecs.Correlations.Add (entityId, List [systemName])
  +            | :? SystemIntersection<'t, 'w> as systemInter ->
  +                let _ = systemInter.Register entityId getSystem ecs
  +                match ecs.Correlations.TryGetValue entityId with
  +                | (true, correlation) -> correlation.Add systemName
  +                | (false, _) -> ecs.Correlations.Add (entityId, List [systemName])
               | _ -> failwith ("Could not find expected system '" + systemName + "' of required type.")
  -        | _ -> failwith ("Could not find expected system '" + systemName + "'.")
  -
  -    let removeComponentCorrelated<'t, 'w when 't : struct and 't :> Component> systemName entityId ecs =
  -        match tryGetSystem systemName ecs with
  -        | Some system ->
  -            match system with
  -            | :? SystemCorrelated<'t, 'w> as systemCorr ->
  -                if systemCorr.RemoveComponent entityId then
  -                    match ecs.Correlations.TryGetValue entityId with
  -                    | (true, correlation) -> correlation.Add systemName
  -                    | (false, _) -> ecs.Correlations.Add (entityId, List [systemName])
  -                else ()
  -            | _ -> failwith ("Could not find expected system '" + systemName + "' of required type.")
  -        | _ -> failwith ("Could not find expected system '" + systemName + "'.")
  -
  -    let correlateComponent entityId ecs =
  +        | None -> failwith ("Could not find expected system '" + systemName + "'.")
  +
  +    //let unregisterEntity systemName entityId ecs =
  +    //    match tryGetSystem systemName ecs with
  +    //    | Some system ->
  +    //        match system with
  +    //        | :? SystemCorrelated<'t, 'w> as systemCorr ->
  +    //            if systemCorr.Unregister entityId then
  +    //                match ecs.Correlations.TryGetValue entityId with
  +    //                | (true, correlation) -> correlation.Add systemName
  +    //                | (false, _) -> ecs.Correlations.Add (entityId, List [systemName])
  +    //            else ()
  +    //        | _ -> failwith ("Could not find expected system '" + systemName + "' of required type.")
  +    //    | _ -> failwith ("Could not find expected system '" + systemName + "'.")
  +
  +    let correlateEntity entityId ecs =
           ecs.Correlations.[entityId] |>
           Seq.map (fun systemName -> (systemName, getSystem systemName ecs)) |>
           dictPlus
  
positive.code:         tryGetSystem systemName ecs |> Option.get
  
      let getComponent<'t, 'w when 't : struct and 't :> Component> systemName index ecs =
          match tryGetSystem systemName ecs with
          | Some system ->
              match system with
              | :? SystemUncorrelated<'t, 'w> as systemUnc -> systemUnc.GetComponent index
              | _ -> failwith ("Could not find expected system '" + systemName + "' of required type.")
          | _ -> failwith ("Could not find expected system '" + systemName + "'.")
  
      let addComponent<'t, 'w when 't : struct and 't :> Component> systemName (comp : 't) ecs =
          match tryGetSystem systemName ecs with
  
negative.code: 
      member this.RemoveComponent index =
          if index <> freeIndex then
              components.[index].RefCount <- dec components.[index].RefCount
              freeList.Enqueue index
          else freeIndex <- dec freeIndex
  
  