Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 23240)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 23241)
@@ -1,3 +1,3 @@
-AM_CPPFLAGS = @NEOPZINCL@ @DAKOTAINCL@ @SHAPELIBINCL@ @PETSCINCL@ @SLEPCINCL@ @AMPIINCL@ @MPIINCL@ @METISINCL@ @CHACOINCL@ @SCOTCHINCL@ @PLAPACKINCL@ @BLASLAPACKINCL@ @MKLINCL@ @MUMPSINCL@ @TRIANGLEINCL@ @SPAIINCL@ @HYPREINCL@ @PROMETHEUSINCL@ @SUPERLUINCL@ @SPOOLESINCL@ @PASTIXINCL@ @MLINCL@ @TAOINCL@ @ADIC2INCL@ @ADOLCINCL@ @GSLINCL@ @BOOSTINCL@ @ANDROID_NDKINCL@ @METEOIOINCL@ @SNOWPACKINCL@ @PROJ4INCL@
+AM_CPPFLAGS = @NEOPZINCL@ @DAKOTAINCL@ @SHAPELIBINCL@ @PETSCINCL@ @SLEPCINCL@ @AMPIINCL@ @ADJOINTMPIINCL@ @MPIINCL@ @METISINCL@ @CHACOINCL@ @SCOTCHINCL@ @PLAPACKINCL@ @BLASLAPACKINCL@ @MKLINCL@ @MUMPSINCL@ @TRIANGLEINCL@ @SPAIINCL@ @HYPREINCL@ @PROMETHEUSINCL@ @SUPERLUINCL@ @SPOOLESINCL@ @PASTIXINCL@ @MLINCL@ @TAOINCL@ @ADIC2INCL@ @ADOLCINCL@ @CODIPACKINCL@ @GSLINCL@ @BOOSTINCL@ @ANDROID_NDKINCL@ @METEOIOINCL@ @SNOWPACKINCL@ @PROJ4INCL@
 
 AUTOMAKE_OPTIONS = subdir-objects
@@ -320,4 +320,9 @@
 					./classes/Inputs/TetraInput.cpp
 #}}}
+# ADJOINTMPI sources {{{
+if ADJOINTMPI
+issm_sources += ./toolkits/codipack/ampi_interface.cpp
+endif
+# }}}
 #DAKOTA sources  {{{
 if DAKOTA
@@ -632,5 +637,5 @@
 if !WINDOWS
 if !STANDALONE_LIBRARIES
-libISSMCore_la_LIBADD = $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB)   $(ADOLCLIB) $(AMPILIB) $(METEOIOLIB) $(SNOWPACKLIB)
+libISSMCore_la_LIBADD = $(PETSCLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB) $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB)   $(ADOLCLIB) $(AMPILIB) $(ADJOINTMPILIB) $(METEOIOLIB) $(SNOWPACKLIB)
 if FORTRAN
 libISSMCore_la_LIBADD += $(FLIBS) $(FORTRANLIB)
@@ -714,5 +719,5 @@
 
 #External packages
-LDADD +=  $(NEOPZLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(PETSCLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJ4LIB)
+LDADD +=  $(NEOPZLIB) $(TAOLIB) $(M1QN3LIB) $(PLAPACKLIB) $(MUMPSLIB) $(SUPERLULIB) $(SPOOLESLIB) $(SCALAPACKLIB) $(BLACSLIB) $(PETSCLIB) $(HYPRELIB) $(SPAILIB) $(PROMETHEUSLIB) $(PASTIXLIB) $(MLLIB) $(DAKOTALIB) $(METISLIB) $(CHACOLIB) $(SCOTCHLIB) $(BLASLAPACKLIB) $(MKLLIB) $(MPILIB)  $(MATHLIB) $(GRAPHICSLIB) $(MULTITHREADINGLIB) $(OSLIBS) $(GSLLIB) $(AMPILIB) $(ADJOINTMPILIB) $(ADOLCLIB) $(MPILIB) $(METEOIOLIB) $(SNOWPACKLIB) $(PROJ4LIB)
 
 if FORTRAN
Index: /issm/trunk-jpl/src/c/toolkits/codipack/CoDiPackCommon.hpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/codipack/CoDiPackCommon.hpp	(revision 23241)
+++ /issm/trunk-jpl/src/c/toolkits/codipack/CoDiPackCommon.hpp	(revision 23241)
@@ -0,0 +1,90 @@
+/*
+ * CoDiPackCommon.hpp
+ *
+ *  Created on: Mai 30, 2016
+ *      Author: sagebaum
+ */
+
+#ifndef _CODIPACK_COMMON_HPP_
+#define _CODIPACK_COMMON_HPP_
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile without HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#if defined(_HAVE_CODIPACK_)
+#include "codi.hpp"
+
+template<typename Real, typename Passive>
+inline void getVectorPrimal(const Real* vec, Passive* pasVec, int n) {
+  for(int i = 0; i < n; ++i) {
+    pasVec[i]=vec[i].getValue();
+  }
+}
+
+template<typename Real, typename Passive>
+inline void setVectorPrimal(Real* vec, const Passive* pasVec, int n) {
+  for(int i = 0; i < n; ++i) {
+    vec[i].value() = pasVec[i];
+  }
+}
+
+template<typename Real, typename Data>
+inline void getVectorGradData(const Real* vec, Data* dataVec, int n) {
+  for(int i = 0; i < n; ++i) {
+    dataVec[i]=vec[i].getGradientData();
+  }
+}
+
+template<typename Real, typename Passive, typename Data>
+inline void getVectorPrimalAndGradData(const Real* vec, Passive* pasVec, Data* dataVec, int n) {
+  for(int i = 0; i < n; ++i) {
+    pasVec[i]=vec[i].getValue();
+    dataVec[i]=vec[i].getGradientData();
+  }
+}
+
+template<typename Real, typename Passive, typename Data>
+inline void getPrimalAndGradData(const Real& value, Passive& pas, Data& data) {
+  pas=value.getValue();
+  data=value.getGradientData();
+}
+
+template<typename Real, typename Data>
+inline void registerVector(Real* vec, Data* dataVec, int n) {
+  typename Real::TapeType& tape = Real::getGlobalTape();
+
+  for(int i = 0; i < n; ++i) {
+    tape.registerInput(vec[i]);
+    dataVec[i]=vec[i].getGradientData();
+  }
+}
+
+template<typename Tape, typename Data, typename Adjoint>
+inline void getVectorAdjoint(Tape& tape, const Data* dataVec, Adjoint* adjVec, int n) {
+  for(int i = 0; i < n; ++i) {
+    Data index = dataVec[i];
+    adjVec[i] = tape.getGradient(index);
+    tape.gradient(index) = 0.0;
+  }
+}
+
+template<typename Tape, typename Data, typename Adjoint>
+inline void updateVectorAdjoint(Tape& tape, const Data* dataVec, const Adjoint* adjVec, int n) {
+  for(int i = 0; i < n; ++i) {
+    Data index = dataVec[i];
+    tape.gradient(index) += adjVec[i];
+  }
+}
+
+template<typename Tape, typename Data, typename Adjoint>
+inline void updateAdjoint(Tape& tape, const Data& data, const Adjoint& adj) {
+  Data index = data;
+  tape.gradient(index) += adj;
+}
+
+#endif
+
+#endif
Index: /issm/trunk-jpl/src/c/toolkits/codipack/CoDiPackGlobal.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/codipack/CoDiPackGlobal.h	(revision 23241)
+++ /issm/trunk-jpl/src/c/toolkits/codipack/CoDiPackGlobal.h	(revision 23241)
@@ -0,0 +1,40 @@
+/*
+ * CoDiPackGlobal.h
+ *
+ *  Created on: Jul 20, 2016
+ *      Author: a_h_ck
+ */
+
+#ifndef SRC_C_TOOLKITS_CODIPACK_CODIPACKGLOBAL_H_
+#define SRC_C_TOOLKITS_CODIPACK_CODIPACKGLOBAL_H_
+
+#ifdef HAVE_CONFIG_H
+    #include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#if defined(_HAVE_CODIPACK_)
+
+#include <iostream>
+#include <vector>
+
+struct CoDi_global {
+    std::vector<int> input_indices;
+    std::vector<int> output_indices;
+
+    void print(std::ostream& out) const {
+        out << "-------------------------------------\nCoDi_global:\n  in = [ ";
+        for(auto& in_index : input_indices) {
+            out << in_index << " ";
+        }
+        out << "]\n  out = [ ";
+        for(auto& out_index : output_indices) {
+            out << out_index << " ";
+        }
+        out << "]\n-------------------------------------\n";
+    }
+};
+
+#endif /* _HAVE_CODIPACK_ */
+#endif /* SRC_C_TOOLKITS_CODIPACK_CODIPACKGLOBAL_H_ */
Index: /issm/trunk-jpl/src/c/toolkits/codipack/ampi_interface.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/codipack/ampi_interface.cpp	(revision 23241)
+++ /issm/trunk-jpl/src/c/toolkits/codipack/ampi_interface.cpp	(revision 23241)
@@ -0,0 +1,1 @@
+#include "externals/ampi_interface_realreverse.cpp"
Index: /issm/trunk-jpl/src/c/toolkits/codipack/codipackincludes.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/codipack/codipackincludes.h	(revision 23241)
+++ /issm/trunk-jpl/src/c/toolkits/codipack/codipackincludes.h	(revision 23241)
@@ -0,0 +1,11 @@
+/* \file codipackincludes.h
+ * \brief all includes for CoDiPack layer
+ */
+
+#ifndef _COIDPACK_INCLUDES_H_
+#define _COIDPACK_INCLUDES_H_
+
+#include "./CoDiPackCommon.hpp"
+#include "./CoDiPackGlobal.h"
+
+#endif
Index: /issm/trunk-jpl/src/c/toolkits/toolkits.h
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/toolkits.h	(revision 23240)
+++ /issm/trunk-jpl/src/c/toolkits/toolkits.h	(revision 23241)
@@ -30,4 +30,8 @@
 #endif
 
+#ifdef _HAVE_CODIPACK_
+#include "./codipack/codipackincludes.h"
+#endif
+
 #ifdef _HAVE_TRIANGLE_
 #include "./triangle/triangleincludes.h"
