diff --git a/ddecal/gain_solvers/DiagonalAntennaSolver.cc b/ddecal/gain_solvers/DiagonalAntennaSolver.cc
index c6af305f3a49bd0b2f7e8179a96ef73eae2bc913..2f74962d0317b0aeebaff9823bbacf5fe137c4b6 100644
--- a/ddecal/gain_solvers/DiagonalAntennaSolver.cc
+++ b/ddecal/gain_solvers/DiagonalAntennaSolver.cc
@@ -55,6 +55,20 @@ void AddSolution(gsl_vector* solutions, size_t solution_index,
                  added_term[1].imag() + gsl_vector_get(solutions, index + 3));
 }
 
+void AddSolutionToMatrix(gsl_matrix* matrix, size_t row, size_t col, const MC2x2& added_term) {
+  const size_t i = row * 4;
+  const size_t j = col * 4;
+  gsl_matrix_set(matrix, i, j,
+                 added_term[0].real() + gsl_matrix_get(matrix, i, j));
+  gsl_matrix_set(matrix, i, j+1,
+                 added_term[0].imag() + gsl_matrix_get(matrix, i, j+1));
+  gsl_matrix_set(matrix, i, j+2,
+                 added_term[1].real() + gsl_matrix_get(matrix, i, j+2));
+  gsl_matrix_set(matrix, i, j+3,
+                 added_term[1].imag() + gsl_matrix_get(matrix, i, j+3));
+  //TODO
+}
+
 }  // namespace
 
 DiagonalAntennaSolver::SolveResult DiagonalAntennaSolver::Solve(
@@ -394,7 +408,21 @@ void DiagonalAntennaSolver::PenaltyJTJ(const gsl_vector* x,
                                        SolverInfo& solver_info,
                                        gsl_matrix* jtj) {
   // - jtj has (n_antennas*4)^2 elements.
-  // TODO
+  gsl_matrix_set_all(jtj, 0.0);
+  const FullSolveData::ChannelBlockData& cb_data = solver_info.cb_data;
+  const size_t n_visibilities = cb_data.NVisibilities();
+  for (size_t vis_index = 0; vis_index != n_visibilities; ++vis_index) {
+    const uint32_t vis_solution_index =
+        cb_data.SolutionIndex(solver_info.direction_index, vis_index);
+    if (vis_solution_index == solver_info.solution_index) {
+      const size_t antenna_1 = cb_data.Antenna1Index(vis_index);
+      const size_t antenna_2 = cb_data.Antenna2Index(vis_index);
+      const MC2x2Diag solution_1 = GetSolution(x, antenna_1);
+      const MC2x2Diag solution_2 = GetSolution(x, antenna_2);
+      const MC2x2 model(
+          cb_data.ModelVisibility(solver_info.direction_index, vis_index));
+    }
+  }
 }
 
 int DiagonalAntennaSolver::PenaltyVV(const gsl_vector* x, const gsl_vector* v,