                     ret[@escapeDot k] = helper v
                 ret
             else if value instanceof J.Model
-                value.toDoc denormalizeModels
+                value.toDoc()
             else if (
                 _.isNumber(value) or _.isBoolean(value) or _.isString(value) or
                     value instanceof Date or value instanceof RegExp or


        @_fields = J.Dict()

        for fieldName of @modelClass.fieldSpecs
            @_fields.setOrAdd fieldName, null
        for fieldName, value of nonIdInitFields
            @_fields.set fieldName, J.Var.wrap value, true

        if @_id? and @modelClass.idSpec is J.PropTypes.key
            keyReady = false
            try
                key = Tracker.nonreactive => @key()
                keyReady = true
            catch e
                throw e if e not instanceof J.VALUE_NOT_READY

            if keyReady and @_id isnt key
                console.warn "#{@modelClass.name}._id is #{@_id} but key() is #{key}"

        @reactives = {} # reactiveName: autoVar
        for reactiveName, reactiveSpec of @modelClass.reactiveSpecs

        null


    toDoc: ->
        # Reactive.
        # Returns an EJSON object with all the
        # user-defined types serialized into JSON, but
