anchor.diff:              | (true, correlation) ->
                   correlation.Remove this.Name |> ignore<bool>
                   ecs.CorrelationChanges.[entityId] <- correlation
  +                ecs.Filter this.Name correlation entityId
               | (false, _) ->
  -                ecs.CorrelationChanges.[entityId] <- ecs.EmptyCorrelation
  +                let correlation = ecs.EmptyCorrelation
  +                ecs.CorrelationChanges.[entityId] <- correlation
  +                ecs.Filter this.Name correlation entityId
   
           // fin
           unregistered
   
           override this.UnregisterComponent entityId =
               this.UnregisterCorrelated entityId
  +
  +    type 'w EntityRef with
  +    
  +        member this.Index<'c when 'c : struct and 'c :> 'c Component> () =
  +            let system = this.EntityEcs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let correlated = system.IndexCorrelated this.EntityId : 'c ComponentRef
  +            &correlated.Index
  +    
  +        member this.IndexBuffered<'c when 'c : struct and 'c :> 'c Component> () =
  +            let system = this.EntityEcs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let correlated = system.IndexCorrelated this.EntityId : 'c ComponentRef
  +            correlated.IndexBuffered
  +
  +    type Query<'c, 'w when
  +                'c : struct and 'c :> 'c Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn (system.IndexCorrelated entityId)
  +
  +    type Query<'c, 'c2, 'w when
  +                'c : struct and 'c :> 'c Component and
  +                'c2 : struct and 'c2 :> 'c2 Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let system2 = this.Ecs.IndexSystem<'c2, SystemCorrelated<'c2, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn
  +                    (system.IndexCorrelated entityId)
  +                    (system2.IndexCorrelated entityId)
  +
  +    /// An ECS query.
  +    type Query<'c, 'c2, 'c3, 'w when
  +                'c : struct and 'c :> 'c Component and
  +                'c2 : struct and 'c2 :> 'c2 Component and
  +                'c3 : struct and 'c3 :> 'c3 Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let system2 = this.Ecs.IndexSystem<'c2, SystemCorrelated<'c2, 'w>> ()
  +            let system3 = this.Ecs.IndexSystem<'c3, SystemCorrelated<'c3, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn
  +                    (system.IndexCorrelated entityId)
  +                    (system2.IndexCorrelated entityId)
  +                    (system3.IndexCorrelated entityId)
  +
  +    /// An ECS query.
  +    type Query<'c, 'c2, 'c3, 'c4, 'w when
  +                'c : struct and 'c :> 'c Component and
  +                'c2 : struct and 'c2 :> 'c2 Component and
  +                'c3 : struct and 'c3 :> 'c3 Component and
  +                'c4 : struct and 'c4 :> 'c4 Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let system2 = this.Ecs.IndexSystem<'c2, SystemCorrelated<'c2, 'w>> ()
  +            let system3 = this.Ecs.IndexSystem<'c3, SystemCorrelated<'c3, 'w>> ()
  +            let system4 = this.Ecs.IndexSystem<'c4, SystemCorrelated<'c4, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn
  +                    (system.IndexCorrelated entityId)
  +                    (system2.IndexCorrelated entityId)
  +                    (system3.IndexCorrelated entityId)
  +                    (system4.IndexCorrelated entityId)
  +
  +    /// An ECS query.
  +    type Query<'c, 'c2, 'c3, 'c4, 'c5, 'w when
  +                'c : struct and 'c :> 'c Component and
  +                'c2 : struct and 'c2 :> 'c2 Component and
  +                'c3 : struct and 'c3 :> 'c3 Component and
  +                'c4 : struct and 'c4 :> 'c4 Component and
  +                'c5 : struct and 'c5 :> 'c5 Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let system2 = this.Ecs.IndexSystem<'c2, SystemCorrelated<'c2, 'w>> ()
  +            let system3 = this.Ecs.IndexSystem<'c3, SystemCorrelated<'c3, 'w>> ()
  +            let system4 = this.Ecs.IndexSystem<'c4, SystemCorrelated<'c4, 'w>> ()
  +            let system5 = this.Ecs.IndexSystem<'c5, SystemCorrelated<'c5, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn
  +                    (system.IndexCorrelated entityId)
  +                    (system2.IndexCorrelated entityId)
  +                    (system3.IndexCorrelated entityId)
  +                    (system4.IndexCorrelated entityId)
  +                    (system5.IndexCorrelated entityId)
  +
  +    /// An ECS query.
  +    type Query<'c, 'c2, 'c3, 'c4, 'c5, 'c6, 'w when
  +                'c : struct and 'c :> 'c Component and
  +                'c2 : struct and 'c2 :> 'c2 Component and
  +                'c3 : struct and 'c3 :> 'c3 Component and
  +                'c4 : struct and 'c4 :> 'c4 Component and
  +                'c5 : struct and 'c5 :> 'c5 Component and
  +                'c6 : struct and 'c6 :> 'c6 Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let system2 = this.Ecs.IndexSystem<'c2, SystemCorrelated<'c2, 'w>> ()
  +            let system3 = this.Ecs.IndexSystem<'c3, SystemCorrelated<'c3, 'w>> ()
  +            let system4 = this.Ecs.IndexSystem<'c4, SystemCorrelated<'c4, 'w>> ()
  +            let system5 = this.Ecs.IndexSystem<'c5, SystemCorrelated<'c5, 'w>> ()
  +            let system6 = this.Ecs.IndexSystem<'c6, SystemCorrelated<'c6, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn
  +                    (system.IndexCorrelated entityId)
  +                    (system2.IndexCorrelated entityId)
  +                    (system3.IndexCorrelated entityId)
  +                    (system4.IndexCorrelated entityId)
  +                    (system5.IndexCorrelated entityId)
  +                    (system6.IndexCorrelated entityId)
  +
  +    /// An ECS query.
  +    type Query<'c, 'c2, 'c3, 'c4, 'c5, 'c6, 'c7, 'w when
  +                'c : struct and 'c :> 'c Component and
  +                'c2 : struct and 'c2 :> 'c2 Component and
  +                'c3 : struct and 'c3 :> 'c3 Component and
  +                'c4 : struct and 'c4 :> 'c4 Component and
  +                'c5 : struct and 'c5 :> 'c5 Component and
  +                'c6 : struct and 'c6 :> 'c6 Component and
  +                'c7 : struct and 'c7 :> 'c7 Component> with
  +
  +        member this.Iter fn =
  +            let system = this.Ecs.IndexSystem<'c, SystemCorrelated<'c, 'w>> ()
  +            let system2 = this.Ecs.IndexSystem<'c2, SystemCorrelated<'c2, 'w>> ()
  +            let system3 = this.Ecs.IndexSystem<'c3, SystemCorrelated<'c3, 'w>> ()
  +            let system4 = this.Ecs.IndexSystem<'c4, SystemCorrelated<'c4, 'w>> ()
  +            let system5 = this.Ecs.IndexSystem<'c5, SystemCorrelated<'c5, 'w>> ()
  +            let system6 = this.Ecs.IndexSystem<'c6, SystemCorrelated<'c6, 'w>> ()
  +            let system7 = this.Ecs.IndexSystem<'c7, SystemCorrelated<'c7, 'w>> ()
  +            for kvp in this.Cache do
  +                let entityId = kvp.Key
  +                fn
  +                    (system.IndexCorrelated entityId)
  +                    (system2.IndexCorrelated entityId)
  +                    (system3.IndexCorrelated entityId)
  +                    (system4.IndexCorrelated entityId)
  +                    (system5.IndexCorrelated entityId)
  +                    (system6.IndexCorrelated entityId)
  +                    (system7.IndexCorrelated entityId)
   
       type 'w Ecs with
   
  
positive.code:         | (true, correlation) ->
              correlation.Add this.Name |> ignore<bool>
              ecs.CorrelationChanges.[entityId] <- correlation
          | (false, _) ->
              ecs.Correlations.Add (entityId, HashSet.singleton StringComparer.Ordinal this.Name)
              ecs.CorrelationChanges.[entityId] <- ecs.EmptyCorrelation
  
          // fin
          componentMultiplexed
  
negative.code:         result
  
      member this.QualifyHierarchical entityId =
          this.QualifyCorrelated entityId
  
      override this.UnregisterComponent entityId =
          this.UnregisterHierarchical entityId
  
      type 'w EntityRef with
      
          member this.IndexHierarchical<'c when 'c : struct and 'c :> 'c Component> () =
              let system = this.EntityEcs.IndexSystem<'c, SystemHierarchical<'c, 'w>> ()
              let hierarchical = system.IndexHierarchical this.EntityId : 'c ComponentRef
              &hierarchical.Index
      
          member this.IndexHierarchicalBuffered<'c when 'c : struct and 'c :> 'c Component> () =
              let system = this.EntityEcs.IndexSystem<'c, SystemHierarchical<'c, 'w>> ()
              let hierarchical = system.IndexHierarchical this.EntityId : 'c ComponentRef
              hierarchical.IndexBuffered
  
      type 'w Ecs with
  
  