diff --git a/FD/src/FD.jl b/FD/src/FD.jl
index d5621fcb1b556f27d858ffe64d537fb79a011e25..794a1ad1867a253527992dd7d34e47a88cfade05 100644
--- a/FD/src/FD.jl
+++ b/FD/src/FD.jl
@@ -225,11 +225,19 @@ grid(f::GridFunction) = f.grid
 Base.view(f::AbstractGridFunction{G}, idx...) where G<:MetaGrid =
     GridFunction(GridView(f.grid, indices(f.grid, idx...)), view(f.data, indices(f.grid, idx...)..., :))
 
-Base.parent(f::AbstractGridFunction{<:GridView}) =
+function zero_continuation(f::GridFunction{<:GridView})
+  dst = GridFunction(parent(grid(f)), zeros(size(parent(grid(f)))..., rangedim(f)), Val(rangedim(f)))
+  dst.data[grid(f).indices..., :] .= f.data
+  dst
+end
+
+Base.parent(f::GridFunction{<:GridView,<:Any,<:Any,<:Any,<:SubArray}) =
     GridFunction(parent(grid(f)), parent(f.data))
 
 
 
+
+
 function _check_shape(a::GridFunction, b::GridFunction)
   #TODO: why does fv.grid == gv.grid fail?
   a.grid === b.grid || throw(ArgumentError("grids need to match"))
diff --git a/chambollefp_dd.jl b/chambollefp_dd.jl
index 10e73b0ce31eafe1d05747f2e77122e7ea1a827d..b622ff9c630d5140a8307159ebf32424b57c67aa 100644
--- a/chambollefp_dd.jl
+++ b/chambollefp_dd.jl
@@ -36,35 +36,14 @@ end
 
 # TODO: investigate matrix multiplication performance with GridFunctions
 function fpiter(grid, p, wg, A, α, β, τ)
-  ## local variant
-  #w = FD.GridFunction(grid, view(wg.data, grid.indices..., :))
-  #x = FD.GridFunction(grid, (A'*A + β*I) \ (FD.divergence(p) + w).data[:])
-  #q = FD.gradient(x)
-
-  ## global variant
-  x = FD.GridFunction(FD.parent(grid), (A'*A + β*I) \ (FD.divergence(p) + wg).data[:])
-  #FD.my_plot(FD.divergence(p) + wg)
-
+  x = FD.GridFunction(FD.parent(grid), (A'*A + β*I) \ (FD.divergence_z(FD.zero_continuation(p)) + wg).data[:])
   q = FD.GridFunction(grid, view(FD.gradient(x).data, grid.indices..., :))
-  q2 = FD.gradient(FD.GridFunction(grid, view(x.data, grid.indices..., :)))
-
-  #display(x.data[10:13,51:54,1])
-  #display(q.data[10:13,52:53,2])
-  #display(q2.data[10:13,52:53,2])
-  #sleep(0.1)
-
+  ## this misses out on the right boundary
   #q = FD.gradient(FD.GridFunction(grid, view(x.data, grid.indices..., :)))
 
-
-  #FD.my_plot(FD.pw_norm(q))
-  #FD.my_plot(x)
-  #FD.my_plot(α)
-
   p_new = FD.GridFunction(grid, FD.pwmul(FD.GridFunction(grid, α ./ (α .+ τ .* FD.pw_norm(q))),
                                          FD.GridFunction(grid, p .+ τ .* q)))
 
-
-
   reserr = maximum(sum((p_new .- p).^2, dims=ndims(p)))
   (p_new, reserr)
 end
@@ -72,113 +51,47 @@ end
 
 function fpalg(grid, w, A, p = FD.GridFunction(x -> 0, ndims(grid), grid);
                α, β, τ = 1/8, ϵ = 1e-4)
-  local uimg
   reserr = 1
   k = 0
   while reserr > ϵ && k < 10e1
     k += 1
     (p, reserr) = fpiter(grid, p, w, A, α, β, τ)
-
-    #u = p2u(grid, p, A, f, α=α, β=β)
-    #@show k
-    #FD.my_plot(u)
   end
   return p
 end
 
 
 function dditer(grid, p, A, f; α, β, τ, ϵ, ρ)
-  #pzero = FD.GridFunction(x -> 0, ndims(grid), grid)
-
   p̂ = (1-ρ) * p
 
   i = 0
   for part in FD.parts(grid)
     gridv = view(grid, Tuple(part)...)
+
     fv = view(f, Tuple(part)...)
-    #p.data .= 0
+
     p̂v = view(p̂, Tuple(part)...)
     pv = view(p, Tuple(part)...)
-    #pzerov = view(pzero, Tuple(part)...)
 
     θ = theta(grid, Tuple(part)...)
     θv = view(θ, Tuple(part)...)
 
-    #y = FD.divergence(FD.pwmul(FD.GridFunction(grid, 1 .- θ), p))
-    #FD.my_plot(y)
-    #sleep(1)
-
     w = FD.GridFunction(grid, A' * f.data[:]) + FD.divergence(FD.pwmul(FD.GridFunction(grid, 1 .- θ), p))
     wv = view(w, Tuple(part)...)
 
-    #FD.my_plot(w)
-    #sleep(1)
-
-    #wv = A' * fv
-
-    #u = p2u(grid, p̂, A, f, α=α, β=β)
-    #uv = view(u, Tuple(part)...)
-
-    #FD.my_plot(uv)
-
-    #sleep(1)
-
     p̂v .+= ρ .* fpalg(gridv, w, A, α=α*θv, β=β, τ=τ, ϵ=ϵ)
-    #p̂v .= fpalg(gridv, wv, A, α=α*θv, β=β, τ=τ, ϵ=ϵ)
-
-  #FD.my_plot(FD.pw_norm(p))
-  #sleep(1)
-  #FD.my_plot(FD.pw_norm(f))
-  #sleep(1)
-  #FD.my_plot(FD.pw_norm(p̂))
-  #display(p̂.data[10:13,52:54,:])
-    #break
-    #FD.my_plot(FD.pw_norm(p̂))
-    #sleep(1)
-    #FD.my_plot(θ)
-    #display(p̂v.data)
-    #break
-    #sleep(1)
-
-    #u = p2u(grid, p, A, f, α=α*θ, β=β)
-    u = p2u(grid, p̂, A, f, α=α, β=β)
-    uv = view(u, Tuple(part)...)
-
-    #FD.my_plot(θv)
-
-    #sleep(1)
-    #FD.my_plot(FD.pw_norm(p̂v))
-    #@show maximum(u), minimum(u)
-    #@show maximum(p̂v), minimum(p̂v)
-    #sleep(1)
-    #FD.my_plot(FD.pw_norm(p̂))
-    #FD.my_plot(u)
-    #FD.my_plot(p̂v)
-    #y = FD.GridFunction(gridv, FD.gradient(θv).data[:,:,1])
-    #display(y.data)
-    #display(θv.data)
-    #FD.my_plot(FD.GridFunction(gridv, FD.gradient(θv).data[:,:,2]))
-
-    #display(FD.gradient(θv).data)
-    #break
-
-    #@show size(θv.data), size(p̂v.data)
-
-    #FD.my_plot(FD.pw_norm(p̂))
 
     i += 1
-    #break
-    #i > 3 && break
   end
   p .= p̂
 
   u = p2u(grid, p, A, f, α=α, β=β)
-  #FD.my_plot(u)
-  FD.my_plot(FD.pw_norm(p))
+  FD.my_plot(u)
+  #FD.my_plot(FD.pw_norm(p))
 end
 
 
-grid = FD.MetaGrid((0:0.01:1, 0:0.01:1), (1, 2), 5)
+grid = FD.MetaGrid((0:0.01:1, 0:0.01:1), (2, 2), 5)
 
 A = I
 #A = spdiagm(0 => ones(length(grid)), 1 => ones(length(grid)-1) )
@@ -195,7 +108,7 @@ g = FD.GridFunction(x -> norm(x), 2, grid)
 
 p = FD.GridFunction(x -> 0, 2, grid)
 
-for n = 1:1
+for n = 1:10
   println("iteration $n")
   dditer(grid, p, A, f, α=α, β=β, τ=τ, ϵ=ϵ, ρ=ρ)
 end