anchor.diff:              | Some env -> (Unit optOrigin, env)
               | None -> (Violation ([!!"InvalidDefinition"], "Definition '" + name + "' could not be created due to having the same name as another top-level binding.", optOrigin), env)
   
  -        and evalStreamToAddress name stream optOrigin env =
  +        and evalStreamToStream name stream optOrigin env =
               match stream with
               | VariableStream variableName ->
                   let context = Env.getContext env
                   let variableAddress = Address.makeFromNames [!!"Stream"; !!variableName] ->>- context.ParticipantAddress
  -                Right (variableAddress, env)
  +                let variableStream = Stream.stream variableAddress
  +                Right (variableStream, env)
               | EventStream eventAddress ->
                   let (eventAddressEvaled, env) = eval eventAddress env
                   match eventAddressEvaled with
                   | String (eventAddressStr, optOrigin)
                   | Keyword (eventAddressStr, optOrigin) ->
  -                    try let eventAddress = Address.makeFromString eventAddressStr in Right (eventAddress, env)
  +                    try let eventAddress = Address.makeFromString eventAddressStr
  +                        let eventStream = Stream.stream eventAddress
  +                        Right (eventStream, env)
                       with exn -> Left (Violation ([!!"InvalidVariableDeclaration"; !!"InvalidEventStreamAddress"], "Variable '" + name + "' could not be created due to invalid event stream address '" + eventAddressStr + "'.", optOrigin))
                   | _ -> Left (Violation ([!!"InvalidVariableDeclaration"; !!"InvalidEventStreamAddress"], "Variable '" + name + "' could not be created due to invalid event stream address. Address must be either a string or a keyword", optOrigin))
               | PropertyStream (propertyName, propertyRelation) ->
  
positive.code: 
          and evalProduct optOrigin name args env =
              match args with
              | [Stream (streamLeft, _); Stream (streamRight, optOriginRight)] ->
                  match evalStreamToAddress name streamLeft optOrigin env with
                  | Right (streamAddressLeft, env) ->
                      match evalStreamToStream name streamRight optOriginRight env with
                      | Right (streamRight, env) ->
                          let computedStream = Stream.product streamAddressLeft streamRight
                          (Stream (ComputedStream computedStream, optOrigin), env)
                      | Left violation -> (violation, env)
                  | Left violation -> (violation, env)
  
negative.code:                     try let context = Env.getContext env
                          let propertyRelation = Relation.makeFromString propertyRelationStr
                          let propertyAddress = Relation.resolve context.SimulantAddress propertyRelation -<<- Address.makeFromName !!propertyName
                          let propertyStream = Stream.stream propertyAddress
                          Right (propertyStream, env)
                      with exn -> Left (Violation ([!!"InvalidVariableDeclaration"; !!"InvalidPropertyStreamRelation"], "Variable '" + name + "' could not be created due to invalid property stream relation '" + propertyRelationStr + "'.", optOrigin))
                  | _ -> Left (Violation ([!!"InvalidVariableDeclaration"; !!"InvalidPropertyStreamRelation"], "Variable '" + name + "' could not be created due to invalid property stream relation. Relation must be either a string or a keyword", optOrigin))
              | PropertyStreamMany _ ->
                  // TODO: implement
                  Left (Violation ([!!"Unimplemented"], "Unimplemented feature.", optOrigin))
              | ComputedStream computedStream ->
                  Right (computedStream :?> Prime.Stream<obj, World>, env)
  
          and evalVariable name stream optOrigin env =
              match evalStreamToStream name stream optOrigin env with
  