diff --git a/src/core/simulation.jl b/src/core/simulation.jl
index d6552a6d75cea2729f816dd99da2f9f655287752..7ec91bc95c3ad951f99d329745fbe8f35d2ec15d 100644
--- a/src/core/simulation.jl
+++ b/src/core/simulation.jl
@@ -173,7 +173,7 @@ function stepsimulation!(model::SimulationModel)
         end
         updatenature!(model)
         updateevents!(model)
-        #outputdata(model) #FIXME
+        outputdata(model)
         model.date += Day(1)
         model
     end
diff --git a/src/nature/ecologicaldata.jl b/src/nature/ecologicaldata.jl
index 449895f6d879bed6e1869a8a3650ef71e98febc5..78e85b7470a41e9e3cc0ddf777ee8afb56726fc0 100644
--- a/src/nature/ecologicaldata.jl
+++ b/src/nature/ecologicaldata.jl
@@ -24,14 +24,13 @@ daily, monthly, yearly, or at the end of a simulation, depending on the paramete
 `nature.popoutfreq`.
 """
 function savepopulationdata(model::SimulationModel)
-    #FIXME
     pops = Dict{String,Int}(s=>0 for s = @param(nature.targetspecies))
     for a in model.animals
         isnothing(a) && continue
-        pops[string(typeof(a))] += 1
+        pops[speciesof(a)] += 1
     end
     for m in model.migrants
-        pops[string(typeof(m.first))] += 1
+        pops[speciesof(m.first)] += 1
     end
     data = []
     for p in keys(pops)
@@ -53,7 +52,7 @@ function saveindividualdata(model::SimulationModel)
     data = []
     for a in model.animals
         isnothing(a) && continue
-        push!(data, [model.date,a.id,a.pos[1],a.pos[2],a.traits["name"],a.sex,a.age])
+        push!(data, [model.date,a.id,a.pos[1],a.pos[2],speciesof(a),a.sex,a.age])
     end
     data
 end
diff --git a/src/nature/macros.jl b/src/nature/macros.jl
index 5d6dcd61a8fcbb971daec8bd203455cecd9ecb8c..fd8242f50b5cf0ea9da4ba98653d15b948521d71 100644
--- a/src/nature/macros.jl
+++ b/src/nature/macros.jl
@@ -350,19 +350,7 @@ Return an iterator over all conspecific animals in the given radius around this
 excluding itself. This can only be used nested within [`@phase`](@ref).
 """
 macro neighbours(args...)
-    :(neighbours($(esc(:self)), $(esc(:model)); $(map(esc, args)...)))
-end
-
-"""
-    @countanimals(radius=0, species="")
-
-Count the number of animals of the given species in this location.
-This is a utility wrapper that can only be used nested within
-[`@phase`](@ref) or [`@habitat`](@ref).
-"""
-macro countanimals(args...)
-    #XXX do I want/need this?
-    :(countanimals($(esc(:pos)), $(esc(:model)); $(map(esc, args)...)))
+    :(neighbours($(esc(:self)), $(esc(:model)), $(map(esc, args)...)))
 end
 
 ##TODO test movement macros
diff --git a/src/nature/nature.jl b/src/nature/nature.jl
index 11975b60b136b72d00567675cd158e6c16fca958..2742a8d01b0dd57bd6829698b487c0e248a3325e 100644
--- a/src/nature/nature.jl
+++ b/src/nature/nature.jl
@@ -39,17 +39,20 @@ function speciesof(a::Animal)
 end
 
 """
-    speciestype(animal)
+    speciestype(name)
 
 Return the Type of this species.
 """
-function speciestype(species::String)
+function speciestype(name::String)
     # get the species Type from its namestring by looking in the module namespace
     speciestype = nothing
-    for name in names(Persefone, all=true)
-        string(name) == species && (speciestype = getfield(Persefone, name))
+    for var in names(Persefone, all=true)
+        if string(var) == name && getfield(Persefone, var) isa Type
+            speciestype = getfield(Persefone, var)
+            break
+        end
     end
-    isnothing(speciestype) && @error("Species $species is not defined.")
+    isnothing(speciestype) && @error("Species $name is not defined.")
     speciestype
 end
     
diff --git a/src/nature/populations.jl b/src/nature/populations.jl
index e7a8818b4080cf4004bdda6ab64367fac3fcd516..98cece638caffe4d7bcc150739e862dcc2128377 100644
--- a/src/nature/populations.jl
+++ b/src/nature/populations.jl
@@ -214,26 +214,15 @@ function nearby_animals(pos::Tuple{Int64,Int64}, model::SimulationModel;
 end
 
 """
-    neighbours(animal, model; radius=0)
+    neighbours(animal, model, radius=0)
 
 Return a list of conspecific animals in the given radius around this animal, excluding itself.
 """
-function neighbours(animal::Animal, model::SimulationModel; radius::Int64=0)
+function neighbours(animal::Animal, model::SimulationModel, radius::Int64=0)
     filter(a -> a.id != animal.id,
            nearby_animals(animal.pos, model, radius=radius, species=speciesof(animal)))
 end
 
-"""
-    countanimals(pos, model; radius= 0, species="")
-
-Count the number of animals in this location (optionally supplying a species name and radius).
-"""
-function countanimals(pos::Tuple{Int64,Int64}, model::SimulationModel;
-                      radius::Int64=0, species="")
-    #XXX do I want/need this?
-    length(nearby_animals(pos, model, radius=radius, species=species))
-end
-
 """
     followanimal!(follower, leader, model, distance=0)
 
diff --git a/src/nature/species/wolpertinger.jl b/src/nature/species/wolpertinger.jl
index 02ea9c43f4e940a4322cac67a08a356c9b7c26ed..cee2c3b08071feb3ba6641a9382bd44bbd508623 100644
--- a/src/nature/species/wolpertinger.jl
+++ b/src/nature/species/wolpertinger.jl
@@ -27,8 +27,7 @@ and occasionally reproduce by spontaneous parthenogenesis...
         #walk!(animal, direction, model; ifempty=false)
     end
     
-    if @rand() < self.fecundity &&
-        @countanimals(species="Wolpertinger") < self.crowding
+    if @rand() < self.fecundity && length(@neighbours(10)) < self.crowding
         @reproduce()
     end