anchor.diff:          let rectangle = Common.PolygonTools.CreateRectangle (endRadius * 0.75f, height * 0.5f, center, 0.0f) // scaled in the capsule's box by 0.75f to stop corner sticking
           let list = List<Common.Vertices> ()
           list.Add rectangle
  -        let bodyShapes = Factories.FixtureFactory.AttachCompoundPolygon (list, density, body, bodyShapeSource)
  -        let bodyShapeTop = Factories.FixtureFactory.AttachCircle (endRadius, density, body, Common.Vector2 (0.0f, height * 0.5f), bodyShapeSource)
  -        let bodyShapeBottom = Factories.FixtureFactory.AttachCircle (endRadius, density, body, Common.Vector2 (0.0f, 0.0f - height * 0.5f), bodyShapeSource)
  +        let bodyShapes = body.CreateCompoundPolygon (list, density)
  +        let bodyShapeTop = body.CreateCircle (endRadius, density, Common.Vector2 (0.0f, height * 0.5f))
  +        let bodyShapeBottom = body.CreateCircle (endRadius, density, Common.Vector2 (0.0f, 0.0f - height * 0.5f))
           bodyShapes.Add bodyShapeTop
           bodyShapes.Add bodyShapeBottom
           for bodyShape in bodyShapes do
  +            bodyShape.Tag <- 
  +                { Simulant = sourceSimulant
  +                  BodyId = bodyProperties.BodyId
  +                  ShapeId = match bodyCapsule.PropertiesOpt with Some p -> p.BodyShapeId | None -> Gen.idEmpty }
               FarseerPhysicsEngine.configureBodyShapeProperties bodyProperties bodyCapsule.PropertiesOpt bodyShape |> ignore
           Array.ofSeq bodyShapes
   
  -    static member private attachBodyPolygon sourceSimulant bodyProperties bodyPolygon body =
  -        let bodyShapeSource =
  -            { Simulant = sourceSimulant
  -              BodyId = bodyProperties.BodyId
  -              ShapeId = match bodyPolygon.PropertiesOpt with Some p -> p.BodyShapeId | None -> Gen.idEmpty }
  +    static member private attachBodyPolygon sourceSimulant bodyProperties bodyPolygon (body : Body) =
           let vertices =
               bodyPolygon.Vertices |>
               Array.map (fun vertex -> vertex + bodyPolygon.Center) |>
               Array.map FarseerPhysicsEngine.toPhysicsV2
  -        let bodyShape =
  -            Factories.FixtureFactory.AttachPolygon
  -                (FarseerPhysics.Common.Vertices vertices,
  -                 bodyProperties.Density,
  -                 body,
  -                 bodyShapeSource)
  +        let bodyShape = body.CreatePolygon (Common.Vertices vertices, bodyProperties.Density)
  +        bodyShape.Tag <-
  +            { Simulant = sourceSimulant
  +              BodyId = bodyProperties.BodyId
  +              ShapeId = match bodyPolygon.PropertiesOpt with Some p -> p.BodyShapeId | None -> Gen.idEmpty }
           FarseerPhysicsEngine.configureBodyShapeProperties bodyProperties bodyPolygon.PropertiesOpt bodyShape
   
       static member private attachBodyShapes sourceSimulant bodyProperties bodyShapes (body : Body) =
  
positive.code:         body.add_OnCollision (fun fn fn2 collision -> FarseerPhysicsEngine.handleCollision physicsEngine fn fn2 collision)
  
          // listen for separations
          body.add_OnSeparation (fun fn fn2 -> FarseerPhysicsEngine.handleSeparation physicsEngine fn fn2)
  
          // attempt to add the body
          if not (physicsEngine.Bodies.TryAdd ({ SourceId = createBodyMessage.SourceId; CorrelationId = bodyProperties.BodyId }, body)) then
  
negative.code:         body.Awake <- bodyProperties.Awake
          body.Enabled <- bodyProperties.Enabled
          body.Rotation <- bodyProperties.Rotation
          body.SetFriction bodyProperties.Friction
          body.SetRestitution bodyProperties.Restitution
          body.FixedRotation <- bodyProperties.FixedRotation
          body.AngularVelocity <- bodyProperties.AngularVelocity
          body.AngularDamping <- bodyProperties.AngularDamping
          body.LinearVelocity <- FarseerPhysicsEngine.toPhysicsV2 bodyProperties.LinearVelocity
          body.LinearDamping <- bodyProperties.LinearDamping
          // body.Inertia <- bodyProperties.Inertia TODO: P1: should we implement this? what does the value mean?
          // body.GravityScale <- bodyProperties.GravityScale TODO: P1: figure out how to deal with this missing functionality.
          body.SetCollisionCategories (enum<Category> bodyProperties.CollisionCategories)
          body.SetCollidesWith (enum<Category> bodyProperties.CollisionMask)
          body.BodyType <- FarseerPhysicsEngine.toPhysicsBodyType bodyProperties.BodyType
          body.IsBullet <- bodyProperties.IsBullet
          body.SetIsSensor bodyProperties.IsSensor
          body.SleepingAllowed <- true
  
      static member private attachBoxBody sourceSimulant (bodyProperties : BodyProperties) (bodyBox : BodyBox) (body : Body) =
          let bodyShape =
              body.CreateRectangle
                  (FarseerPhysicsEngine.toPhysicsPolygonDiameter (bodyBox.Extent.X * 2.0f),
                   FarseerPhysicsEngine.toPhysicsPolygonDiameter (bodyBox.Extent.Y * 2.0f),
                   bodyProperties.Density,
                   FarseerPhysicsEngine.toPhysicsV2 bodyBox.Center)
          bodyShape.Tag <-
              { Simulant = sourceSimulant
                BodyId = bodyProperties.BodyId
                ShapeId = match bodyBox.PropertiesOpt with Some p -> p.BodyShapeId | None -> Gen.idEmpty }
          FarseerPhysicsEngine.configureBodyShapeProperties bodyProperties bodyBox.PropertiesOpt bodyShape
  
      static member private attachBodyCircle sourceSimulant (bodyProperties : BodyProperties) (bodyCircle : BodyCircle) (body : Body) =
          let bodyShape =
              body.CreateCircle
                  (FarseerPhysicsEngine.toPhysicsPolygonRadius bodyCircle.Radius,
                   bodyProperties.Density,
                   FarseerPhysicsEngine.toPhysicsV2 bodyCircle.Center)
          bodyShape.Tag <-
              { Simulant = sourceSimulant
                BodyId = bodyProperties.BodyId
                ShapeId = match bodyCircle.PropertiesOpt with Some p -> p.BodyShapeId | None -> Gen.idEmpty }
          FarseerPhysicsEngine.configureBodyShapeProperties bodyProperties bodyCircle.PropertiesOpt bodyShape
  
      static member private attachBodyCapsule sourceSimulant (bodyProperties : BodyProperties) (bodyCapsule : BodyCapsule) (body : Body) =
          let height = FarseerPhysicsEngine.toPhysicsPolygonDiameter bodyCapsule.Height
          let endRadius = FarseerPhysicsEngine.toPhysicsPolygonRadius bodyCapsule.Radius
          let density = bodyProperties.Density
  