diff --git a/examples/heat_simple_autodiff_grad.jl b/examples/heat_simple_autodiff_grad.jl
index 9bc97ad52d69df8ec396d7514cf475d0698b3261..e3716a22c451193cafd3e9e028e505faf4ec8852 100644
--- a/examples/heat_simple_autodiff_grad.jl
+++ b/examples/heat_simple_autodiff_grad.jl
@@ -8,6 +8,7 @@ using CryoGrid
 # Set up forcings and boundary conditions similarly to other examples:
 forcings = loadforcings(CryoGrid.Forcings.Samoylov_ERA_obs_fitted_1979_2014_spinup_extended_2044);
 soilprofile, tempprofile = CryoGrid.SamoylovDefault
+soilprofile = SoilProfile(0.0u"m" => SimpleSoil())
 grid = CryoGrid.DefaultGrid_5cm
 initT = initializer(:T, tempprofile)
 tile = CryoGrid.SoilHeatTile(
diff --git a/src/Numerics/caches.jl b/src/Numerics/caches.jl
index 5a1c2b0353b8c262332c8c966fa3256481aa8ffd..e848e005cc62b6a21cfda787c1149c36eb329427 100644
--- a/src/Numerics/caches.jl
+++ b/src/Numerics/caches.jl
@@ -21,12 +21,12 @@ Base.show(io::IO, mime::MIME{Symbol("text/plain")}, cache::DiffCache) = show(io,
 _retrieve(cache_var::AbstractArray{T}, ::AbstractArray{T}) where {T} = cache_var
 _retrieve(cache_var::AbstractArray{T}, u::AbstractArray{U}) where {T,U} = copyto!(similar(u, length(cache_var)), cache_var)
 retrieve(dc::DiffCache) = dc.cache.du
-retrieve(dc::DiffCache, u::AbstractArray{T}) where {T<:ForwardDiff.Dual} = Prealloc.get_tmp(dc.cache, u)
+retrieve(dc::DiffCache, u::AbstractArray{T}) where {T<:ForwardDiff.Dual} = copyto!(Prealloc.get_tmp(dc.cache, u), dc.cache.du)
 retrieve(dc::DiffCache, u::AbstractArray{T}) where {T} = _retrieve(dc.cache.du, u)
 retrieve(dc::DiffCache, u::AbstractArray{T}, t) where {T} = retrieve(dc, u)
 # these cover cases for Rosenbrock solvers where only t has differentiable type
-retrieve(dc::DiffCache, u::AbstractArray, t::T) where {T<:ForwardDiff.Dual} = Prealloc.get_tmp(dc.cache, t)
-retrieve(dc::DiffCache, u::AbstractArray{T}, t::T) where {T<:ForwardDiff.Dual} = Prealloc.get_tmp(dc.cache, u)
+retrieve(dc::DiffCache, u::AbstractArray, t::T) where {T<:ForwardDiff.Dual} = copyto!(Prealloc.get_tmp(dc.cache, t), dc.cache.du)
+retrieve(dc::DiffCache, u::AbstractArray{T}, t::T) where {T<:ForwardDiff.Dual} = copyto!(Prealloc.get_tmp(dc.cache, u), dc.cache.du)
 
 """
     ArrayCache{T,TA} <: StateVarCache
diff --git a/src/Numerics/grid.jl b/src/Numerics/grid.jl
index 1e3d817bdffbdedbedb5713fecb01b2cbf67c8a8..f4a18765b704eeae7650d59615e7700945f3d115 100644
--- a/src/Numerics/grid.jl
+++ b/src/Numerics/grid.jl
@@ -120,12 +120,12 @@ function updategrid!(grid::Grid{Edges}, z0, thick::AbstractVector)
     return grid
 end
 
-function currentgrid(statevars::NamedTuple, initialgrid::Grid, u, t)
+function currentgrid(state::NamedTuple, initialgrid::Grid, u, t)
     # retrieve grid data from StateVars
-    midpoints = retrieve(statevars.midpoints, u, t)
-    edges = retrieve(statevars.edges, u, t)
-    cellthick = retrieve(statevars.cellthick, u, t)
-    celldist = retrieve(statevars.celldist, u, t)
+    midpoints = retrieve(state.midpoints, u, t)
+    edges = retrieve(state.edges, u, t)
+    cellthick = retrieve(state.cellthick, u, t)
+    celldist = retrieve(state.celldist, u, t)
     return Grid(Edges, (edges=edges, cells=midpoints), (edges=cellthick, cells=celldist), initialgrid.geometry, initialgrid.bounds)
 end
 
diff --git a/src/Tiles/tile.jl b/src/Tiles/tile.jl
index 797db01d42502a88a8c9f17f8462c8ef6e6956eb..d68bdc7fc6d09013081b5ed527638d32c9492fc8 100644
--- a/src/Tiles/tile.jl
+++ b/src/Tiles/tile.jl
@@ -313,11 +313,11 @@ Returns a tuple of all variables defined in the tile.
 CryoGrid.variables(tile::Tile) = Tuple(unique(Flatten.flatten(tile.state.vars, Flatten.flattenable, Var)))
 
 """
-    parameters(tile::Tile; kwargs...)
+    parameters(tile::Tile; include_all=false, kwargs...)
 
 Extracts all parameters from `tile`.
 """
-parameters(tile::Tile; kwargs...) = CryoGridParams(tile; kwargs...)
+parameters(tile::Tile; include_all=true, kwargs...) = CryoGridParams(include_all ? tile : stripparams(FixedParam, tile); kwargs...)
 
 """
     withaxes(u::AbstractArray, ::Tile)