diff --git a/sammy/src/amr/mamr.f90 b/sammy/src/amr/mamr.f90
index 4e1fd8be1d576852243f4a48a18f3b1eac51a10c..d4d594fb7e6ab254fd1e81c1c097a2321fefb5b6 100644
--- a/sammy/src/amr/mamr.f90
+++ b/sammy/src/amr/mamr.f90
@@ -111,7 +111,7 @@
 ! ***         PREVIOUS RUN, INCLUDING COVARIANCE MATRICES, PARAMETER
 ! ***         VALUES, ETC.
          CALL Rdcov (  A_Iprbrd , I_Iflbrd ,                       &
-            A_Iprdet , I_Ifldet , I_Iigrde , A_Iprext , I_Iflext , &
+            A_Iprdet , I_Ifldet , I_Iigrde ,                       &
             A_Ipolar , I_Iflpol ,                                  &
             A_Iprmsc , I_Iflmsc , I_Irdmsc , I_Ijkmsc , A_Ietaee , &
             A_Iprpmc , I_Iflpmc , I_Isopmc ,                       &
@@ -128,7 +128,6 @@
          Isingl = Idimen (Nsingl, 1, 'Nsingl, 1')
          Nsingl = Nsingl*2
          CALL Rdcovx ( A_Iprbrd , I_Iflbrd ,                       &
-            A_Iprext , I_Iflext ,                                  &
             A_Ipolar , I_Iflpol , A_Iprmsc , I_Iflmsc , I_Irdmsc , &
             A_Iprpmc , I_Iflpmc , I_Isopmc ,                       &
             A_Iprorr , I_Iflorr , A_Icrnch , A_Iedets ,            &
@@ -170,7 +169,7 @@
 !
 ! *** Write THE "COVARIANCE" FILE
       CALL Wrcov (  A_Iprbrd , I_Iflbrd , &
-         A_Iprdet , I_Ifldet , I_Iigrde , A_Iprext , I_Iflext , &
+         A_Iprdet , I_Ifldet , I_Iigrde , &
          A_Ipolar , I_Iflpol , &
          A_Iprmsc , I_Iflmsc , I_Irdmsc , I_Ijkmsc , A_Ietaee , &
          A_Iprpmc , I_Iflpmc , I_Isopmc , &
diff --git a/sammy/src/amr/mamr2.f90 b/sammy/src/amr/mamr2.f90
index 97b8a70d7900942e748ff253a63c464c38fd5dff..b79b570ab7d867a262f4f5e95dc22465c38abe9f 100644
--- a/sammy/src/amr/mamr2.f90
+++ b/sammy/src/amr/mamr2.f90
@@ -34,12 +34,6 @@ module amr2
          call make_I_Ifldet(Numdet)
          call make_I_Iigrde(Ngroup)
       END IF
-!
-      N = Nrext*Ntotc*Ngroup
-      IF (Numext.NE.0) THEN
-         call make_A_Iprext(N)
-         call make_I_Iflext(N)
-      END IF
 !
       IF (Nres.GT.0) THEN
 !
diff --git a/sammy/src/amx/mamx.f90 b/sammy/src/amx/mamx.f90
index 5accb8d377751b44c0ea86e6fd98cdbc6a2bbaff..410c1f4fb9255c781dd8eb1e7304d723c80a73a8 100644
--- a/sammy/src/amx/mamx.f90
+++ b/sammy/src/amx/mamx.f90
@@ -113,7 +113,7 @@
 ! ***         VALUES, ETC.
 ! &&&    from old/mold2.f
          CALL Rdcov (  A_Iprbrd , I_Iflbrd ,  &
-            A_Iprdet , I_Ifldet , I_Iigrde , A_Iprext , I_Iflext , &
+            A_Iprdet , I_Ifldet , I_Iigrde ,  &
             A_Ipolar , I_Iflpol , &
             A_Iprmsc , I_Iflmsc , I_Irdmsc , I_Ijkmsc , A_Ietaee , &
             A_Iprpmc , I_Iflpmc , I_Isopmc , &
@@ -132,7 +132,6 @@
          Nsingl = Nsingl*2
 ! &&&    from old/mold5.f
          CALL Rdcovx ( A_Iprbrd , I_Iflbrd ,  &
-            A_Iprext , I_Iflext , &
             A_Ipolar , I_Iflpol , A_Iprmsc , I_Iflmsc , I_Irdmsc , &
             A_Iprpmc , I_Iflpmc , I_Isopmc , &
             A_Iprorr , I_Iflorr , A_Icrnch , A_Iedets , &
@@ -176,7 +175,7 @@
 !
 ! *** Write THE "COVARIANCE" FILE
       CALL Wrcov (  A_Iprbrd , I_Iflbrd , &
-         A_Iprdet , I_Ifldet , I_Iigrde , A_Iprext , I_Iflext , &
+         A_Iprdet , I_Ifldet , I_Iigrde , &
          A_Ipolar , I_Iflpol , &
          A_Iprmsc , I_Iflmsc , I_Irdmsc , I_Ijkmsc , A_Ietaee , &
          A_Iprpmc , I_Iflpmc , I_Isopmc , &
diff --git a/sammy/src/avg/mavg0.f b/sammy/src/avg/mavg0.f
index 69a346acc3fbf273d52ef86812e710b32501b503..e5ee6449e5a85e7b5eb079dc7a9e6ec43e94dfa4 100755
--- a/sammy/src/avg/mavg0.f
+++ b/sammy/src/avg/mavg0.f
@@ -14,7 +14,7 @@ C
       use oopsch_common_m, only : Nowwww, Segmen
       use AllocateFunctions_m, only : allocate_real_data,
      *                                allocate_integer_data
-      use EndfData_common_m, only : expData, resParData
+      use EndfData_common_m, only : expData, resParData, radFitFlags
       use DerivativeHandler_M
       use GridData_M
       use sammy_ipq_common_m, only : resultData, derivStart, nimplict
@@ -96,7 +96,7 @@ C
 
       oldCalc%instance_ptr = calcData%instance_ptr
       call ourCalc%initialize()
-      call ourCalc%setUpList(resParData, 1)
+      call ourCalc%setUpList(resParData, radFitFlags, 1)
       call ourCalc%setNnsig(1)
       calcData%instance_ptr = ourCalc%instance_ptr
 C
@@ -222,6 +222,7 @@ C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
 C
 C  Copy theoretical data to auxillary grid
 C
+      call grid%reserve(resultData%getLength(), ipos)
       do i = 1, resultData%getLength()
           dd = resultData%getData(i, derivStart)
           call grid%addData(i, ipos, dd)
diff --git a/sammy/src/blk/Exploc_common.f90 b/sammy/src/blk/Exploc_common.f90
index 49ecf955a2152692a69ee60e67a8764a84dfc5e9..751db21d47a80e0614ec7003ef2cf37e75b92f68 100644
--- a/sammy/src/blk/Exploc_common.f90
+++ b/sammy/src/blk/Exploc_common.f90
@@ -36,8 +36,6 @@ module exploc_common_m
      ! old group 8
      real(kind=8),allocatable,dimension(:)::A_Idedet
      integer,allocatable,dimension(:)::I_Iigrde
-     real(kind=8),allocatable,dimension(:)::A_Iprext
-     integer,allocatable,dimension(:)::I_Iflext
      
      ! old group 9     
      real(kind=8),allocatable,dimension(:)::A_Ipolar 
@@ -256,24 +254,12 @@ module exploc_common_m
        integer::want
        call allocate_integer_data(I_Iigrde,want)
      end subroutine make_I_Iigrde
-     
-     subroutine make_A_Iprext(want)
-       integer::want
-       call allocate_real_data(A_Iprext,want)
-     end subroutine make_A_Iprext
-
-     subroutine make_I_Iflext(want)
-       integer::want
-       call allocate_integer_data(I_Iflext,want)
-     end subroutine make_I_Iflext
-
 
      subroutine make_A_Ipolar(want)
        integer::want
        call allocate_real_data(A_Ipolar,want)
      end subroutine make_A_Ipolar
 
-     
      subroutine make_I_Iflpol(want)
        integer::want
        call allocate_integer_data(I_Iflpol,want)
diff --git a/sammy/src/blk/Templc_common.f90 b/sammy/src/blk/Templc_common.f90
index 915f01db19993af1c118cee9083c5215e817ca9d..e1c7fa5225bdce414085a091ca416a45e61fed70 100644
--- a/sammy/src/blk/Templc_common.f90
+++ b/sammy/src/blk/Templc_common.f90
@@ -7,7 +7,6 @@ module templc_common_m
 !
       IMPLICIT NONE
       
-      integer,allocatable,dimension(:)::I_Inpxdr
       real(kind=8),allocatable,dimension(:,:)::A_Ibr
       real(kind=8),allocatable,dimension(:,:)::A_Ibi
       real(kind=8),allocatable,dimension(:,:)::A_Ipr
diff --git a/sammy/src/clq/mclq0.f b/sammy/src/clq/mclq0.f
index f09d19b81d3da87d049bba28f67a24e844a9e9f7..2bc390003b4147bbae09b2218f34ad8e91a0689c 100644
--- a/sammy/src/clq/mclq0.f
+++ b/sammy/src/clq/mclq0.f
@@ -17,7 +17,7 @@ C
       use templc_common_m
       use cbro_common_m
       use lbro_common_m
-      use EndfData_common_m, only : resParData
+      use EndfData_common_m, only : resParData,radFitFlags
       use rsl7_m
       use AuxGridHelper_M, only : setAuxGridOffset, setAuxGridRowMax
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
@@ -46,7 +46,7 @@ C *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMMY-CLQ
 C
 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
       CALL Set_Kws_Xct
-      call calcData%setUpList(resParData, Iq_Iso)
+      call calcData%setUpList(resParData, radFitFlags, Iq_Iso)
       CALL Work_Clq (A_Isigxx )
 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
 C
diff --git a/sammy/src/cro/mcro0.f b/sammy/src/cro/mcro0.f
index 1c07dabd6f01300096c3b271cf545147acb6794e..c3430c57d3b9d622cc93f6e55443c7b581c35453 100644
--- a/sammy/src/cro/mcro0.f
+++ b/sammy/src/cro/mcro0.f
@@ -72,14 +72,11 @@ C *** GUESSTIMATE SIZE OF ARRAY NEEDED FOR SAMMY-Cross section
 C
 C *** one ***
       CALL Set_Kws_Xct
-      call calcData%setUpList(resParData, Iq_Iso)
+      call calcData%setUpList(resParData, radFitFlags, Iq_Iso)
 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
 
-      call allocate_integer_data(I_Inpxdr, Ngroup)
       Krext = Nrext
       IF (Nrext.EQ.0) Krext = 1
-      IF (Ksolve.NE.2) CALL Ppar(I_Iflext, I_Inpxdr, Krext)
-C *** Sbroutine Ppar Sets  Npxdr
 C
 C *** two ***
       N = N2
diff --git a/sammy/src/cro/mcro2.f b/sammy/src/cro/mcro2.f
index 41c9d5b6b958f2ddfca96bf8b3e3b1044511d790..60957f758502659bb6c695909186aff6f2165bf5 100644
--- a/sammy/src/cro/mcro2.f
+++ b/sammy/src/cro/mcro2.f
@@ -25,7 +25,7 @@ C
      *   A_Idifma , I_Inot  , I_Inotu , A_Ixx )
 C
       CALL Parsh (
-     *   I_Inpxdr , A_Izke  ,
+     *   A_Izke  ,
      *   Ipoten, Pieces,
      *   A_Isigxx , A_Idasig , A_Idbsig )
 C
@@ -141,7 +141,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Setr_Cro (Ntot, Bound, Echan,
-     *   Parext, Iflext, Min,  igr, Alphar, Alphai, Not,
+     *   Min,  igr, Alphar, Alphai, Not,
      *   Z, Rmat, Sphr, Sphi, Phr, Phi, Zke, Krext, Lrmat)
 C
 C *** PURPOSE -- GENERATE Rmat = 1/(S-B+IP)
@@ -167,16 +167,19 @@ C
       type(RMatChannelParams)::channel
       type(SammyParticlePairInfo)::pairInfo
       type(RMatParticlePair)::pair
+      logical::hasRext
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
+      real(kind=8)::Parext(7)
       DIMENSION
-     *   Bound(Ntotc,*), Echan(Ntotc,*), Parext(Krext,Ntotc,*),
-     *   Iflext(Krext,Ntotc,*), Alphar(*), Alphai(*),
+     *   Bound(Ntotc,*), Echan(Ntotc,*),
+     *   Alphar(*), Alphai(*),
      *   Rmat(2,*), Sphr(*), Sphi(*), Phr(*), Phi(*), Not(*), Z(*),
      *   Zke(*)
 C
 C      DIMENSION Ishift(Ntotc,Ngroup), Lpent(Ntotc,Ngroup),
 C     *   Lspin(Ntotc,Ngroup), Bound(Ntotc,Ngroup),
-C     *   Echan(Ntotc,Ngroup), Parext(Nrext,Ntotc,Ngroup),
-C     *   Iflext(Nrext,Ntotc,Ngroup), 
+C     *   Echan(Ntotc,Ngroup),
 C     *   Alphar(Nres), Alphai(Nres), Rmat(2,NTriag),
 C     *   Sphr(Ntotc), Sphi(Ntotc), Phr(Ntotc), Phi(Ntotc),
 C     *   Not(Nres), Z(Ntotc)
@@ -192,20 +195,28 @@ C
       Aloge = Zero
       KL = 0
       DO K=1,Ntot
-         IF (Numext.NE.0 .AND. Iflext(1,K,igr).NE.-1) Aloge
-     *      = dLOG((Parext(2,K,igr)-Su)/ (Su-Parext(1,K,igr)))
+         hasRext = resParData%hasRexInfo(igr, K)
+         Parext = 0.0d0
+         IF (hasRext) then
+           call resparData%getRextInfoByGroup(rextInfo, igr, K)
+           call resparData%getRext(rext, rextInfo)
+           DO J = 1, rextInfo%getNrext()
+             Parext(J) = rext%getSammyValue(J)
+           end do
+           Aloge
+     *      = dLOG((Parext(2)-Su)/ (Su-Parext(1)))
+         end if
          DO L=1,K
             KL = KL + 1
             Rmat(1,KL) = Zero
             Rmat(2,KL) = Zero
-            IF (L.EQ.K .AND. Numext.NE.0 .AND.
-     *         Iflext(1,K,igr).NE.-1) THEN
-               Rmat(1,KL) = -(Parext(3,K,igr)+Parext(4,K,igr)*Su) +
-     *                        Parext(5,K,igr)*Aloge
+            IF (L.EQ.K .AND. hasRext) THEN
+               Rmat(1,KL) = -(Parext(3)+Parext(4)*Su) +
+     *                        Parext(5)*Aloge
                IF (Nrext.EQ.7) Rmat(1,KL) = Rmat(1,KL) -
-     *            Parext(7,K,igr)*Su**2 + Parext(6,K,igr)*
-     *            (Parext(2,K,igr)-Parext(1,K,igr)) +
-     *            Parext(6,K,igr)*Aloge*(Su)
+     *            Parext(7)*Su**2 + Parext(6)*
+     *            (Parext(2)-Parext(1)) +
+     *            Parext(6)*Aloge*(Su)
             END IF
          END DO
       END DO
diff --git a/sammy/src/cro/mcro2a.f b/sammy/src/cro/mcro2a.f
index 7b3095bfd3e3bf5055ba17d7363e5ad2d24da00f..2ce2c5da93a582f39e9a35f93b9dd753e5e9258f 100644
--- a/sammy/src/cro/mcro2a.f
+++ b/sammy/src/cro/mcro2a.f
@@ -156,7 +156,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Parsh (
-     *   Npxdr, Zke,
+     *   Zke,
      *   Ipoten, Pieces, Sigxxx, Dasigx, Dbsigx)
 C
 C
@@ -176,13 +176,13 @@ C
       use SammySpinGroupInfo_M
       use SammyRMatrixParameters_M
       use SammyResonanceInfo_M
+      use SammyRExternalInfo_M
       use templc_common_m
       use xxx6
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 C
 C
       DIMENSION
-     *   Npxdr(*),
      *   Zke(Ntotc,*),
      *   Pieces(Ngroup),
      *   Sigxxx(*), Dasigx(*), Dbsigx(*)
@@ -190,10 +190,10 @@ C
       type(SammyResonanceInfo)::resInfo
       type(SammySpinGroupInfo)::spinInfo
       type(RMatResonance)::resonance
+      type(SammyRExternalInfo)::rextInfo
       logical::ifcap
 C     
 C      DIMENSION
-C     *   npxdr(Ngroup),
 C     *   Zke(Ntotc,Ngroup),
 C     *   Pieces(Ngroup)
 C
@@ -228,7 +228,21 @@ C
             END IF
 C
             Nnnn = N
-            IF (Ksolve.NE.2) Npx = Npxdr(N)
+            Npx = 0
+            IF (Ksolve.NE.2) then
+               do I = 1, spinInfo%getNumChannels()
+                  if (resParData%hasRexInfo(N, I)) then
+                     call resparData%getRextInfoByGroup(rextInfo, N, I)
+                     do j = 1, rextInfo%getNrext()
+                       if(rextInfo%getIflSammyIndex(j).gt.0) then
+                         Npx = 1
+                         exit
+                       end if
+                     end do
+                  end if
+                  if (Npx.gt.0) exit
+               end do
+            end if
             Nnf1 = Nnf1 + Nn2
             ntot = spinInfo%getNumChannels()
             Nn2 = Ntot*(Ntot+1)
@@ -249,7 +263,7 @@ C
             Ntotnn = spinInfo%getNumChannels()
             Lrmat = 0
             CALL Setr_Cro (Ntotnn,
-     *         A_Ibound , A_Iechan , A_Iprext , I_Iflext , Min, n,
+     *         A_Ibound , A_Iechan , Min, n,
      *         A_Ialphr , A_Ialphi , I_Inot ,
      *         A_Iz , A_Irmat , A_Isphr , A_Isphi , A_Iphr , A_Iphi ,
      *         Zke(1,N), Krext, Lrmat)
@@ -277,7 +291,7 @@ C ***       TOTAL CROSS SECTIONS
             nent = spinInfo%getNumEntryChannels()
             next = spinInfo%getNumExitChannels()
             IF (Kcros.EQ.1) CALL Total (Agoj, nent, Ntotnn,
-     *         A_Iprext , I_Iflext , A_Ics, A_Isi,
+     *         A_Ics, A_Isi,
      *         A_Idphi , A_Iwr , A_Iwi , A_Ipwrr , A_Ipwri , A_Itr ,
      *         A_Iti , A_Iqr , A_Iqi , I_Inotu , Krext, Lrmat,
      *         min ,  N, Zke(1,N),
@@ -286,7 +300,7 @@ C ***       TOTAL CROSS SECTIONS
 C
 C ***       SCATTERING (ELASTIC) CROSS SECTION
             IF (Kcros.EQ.2) CALL Elastc (Agoj, Nent, Ntotnn,
-     *         A_Iprext , I_Iflext , A_Ics,
+     *         A_Ics,
      *         A_Isi, A_Idphi , A_Iwr , A_Iwi, A_Ipwrr , A_Ipwri ,
      *         A_Itr , A_Iti , A_Iqr , A_Iqi , I_Inotu, Krext, Lrmat,
      *         Min , N, Zke(1,N),
@@ -295,8 +309,8 @@ C ***       SCATTERING (ELASTIC) CROSS SECTION
 C
 C ***       REACTION (FISSION, INELASTIC SCATTERING, ETC.) CROSS SECTIONS
             IF (Kcros.EQ.3 .OR. Kcros.EQ.5 .OR. Kcros.EQ.6) CALL Reactn
-     *         ( Agoj, Nent, Next, Ntotnn, A_Iprext ,
-     *         I_Iflext , A_Iwr, A_Iwi, A_Ipwrr ,
+     *         ( Agoj, Nent, Next, Ntotnn,
+     *         A_Iwr, A_Iwi, A_Ipwrr ,
      *         A_Ipwri , A_Itr , A_Iti , A_Iqr , A_Iqi , I_Inotu,
      *         Krext, Lrmat, Min , N,
      *         Zke(1,N), iflAbund, Sigxxx, Dasigx,
@@ -304,8 +318,8 @@ C ***       REACTION (FISSION, INELASTIC SCATTERING, ETC.) CROSS SECTIONS
 C
 C ***       CAPTURE CROSS SECTION
             IF (Kcros.EQ.4 .OR. Kcros.EQ.5 .OR. Kcros.EQ.6) CALL Captur
-     *         ( Agoj, Nent, Next, Ntotnn, A_Iprext ,
-     *         I_Iflext , A_Iwr, A_Iwi, A_Ipwrr ,
+     *         ( Agoj, Nent, Next, Ntotnn,
+     *         A_Iwr, A_Iwi, A_Ipwrr ,
      *         A_Ipwri , A_Itr , A_Iti , A_Iqr , A_Iqi, I_Inotu,
      *         Krext, Lrmat,Min, N, 
      *         Zke(1,N), iflAbund, Sigxxx, Dasigx,
diff --git a/sammy/src/cro/mcro4.f b/sammy/src/cro/mcro4.f
index 63ab6cd44252356e1cb2c06d388aeaa62780c8f0..08a5e753735b48f1bd61263106fe63b6b5c1dcc5 100644
--- a/sammy/src/cro/mcro4.f
+++ b/sammy/src/cro/mcro4.f
@@ -201,7 +201,7 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Total (Agoj, Nent, Ntot, Parext, Iflext,
+      SUBROUTINE Total (Agoj, Nent, Ntot,
      *   Cs, Si, Dphi, Wr, Wi, Pwrhor, Pwrhoi, TR, TI, Qr, Qi,
      *   Notu, Krext, Lrmat, Minres, igr, Zke, If_Zke,
      *   Sigxxx, Dasigx, Dbsigx, iso)
@@ -221,18 +221,17 @@ C
       integer :: nent, ntot, Krext, Lrmat, Minres, igr, If_Zke, iso
 C
 C
-      real(kind=8) ::  Parext(Krext,Ntotc,*),
+      real(kind=8) ::
      *   Cs(*), Si(*), Dphi(*),
      *   Wr(*), Wi(*), Pwrhor(*), Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*),
      *   Qi(NN,*), Zke(*)
-      integer ::  Iflext(Krext,Ntotc,*),Notu(*)
+      integer ::  Notu(*)
 
 
       real(kind=8) :: Sigxxx(*), Dasigx(Nnnsig,*),
      *   Dbsigx(Nnnsig,Ndbsig,*)
 C
-C      DIMENSION Parext(Nrext,Ntotc,Ngroup),
-C     *     Iflext(Nrext,Ntotc,Ngroup),
+C      DIMENSION
 C     *     Cs(Ntotc), Si(Ntotc), Dphi(Ntotc), Wr(NN), Wi(NN),
 C     *     Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN),
 C     *     Qi(NN,NN), Zke(Ntotc)
@@ -344,7 +343,7 @@ C
      *   Tr, Ti, Notu, Minres, igr, Zke, Dasigx, Dbsigx,
      *   Iso)
 C
-      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, Parext, Iflext, TR,
+      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, TR,
      *   Zke, Dasigx, Iso)
 C
       RETURN
@@ -353,7 +352,7 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Elastc (Agoj, Nent, Ntot, Parext, Iflext,
+      SUBROUTINE Elastc (Agoj, Nent, Ntot,
      *   Cs, Si, Dphi, Wr, Wi, Pwrhor, Pwrhoi, Tr, Ti, Qr, Qi, Notu,
      *   Krext, Lrmat, Minres, igr, Zke, If_Zke,
      *   Sigxxx, Dasigx, Dbsigx, Iso)
@@ -372,16 +371,15 @@ C
       real(kind=8) :: agoj
       integer :: Nent, Ntot, Krext, Lrmat, Minres, igr, If_Zke,Iso
       
-      real(kind=8) :: Parext(Krext,Ntotc,*),
+      real(kind=8) ::
      *   Cs(*), Si(*), Dphi(*),
      *   Wr(*), Wi(*), Pwrhor(*), Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*),
      *   Qi(NN,*),  Zke(*)
-      integer :: Iflext(Krext,Ntotc,*), Notu(*)
+      integer :: Notu(*)
       real(kind=8) :: Sigxxx(*), Dasigx(Nnnsig,*),
      *                Dbsigx(Nnnsig,Ndbsig,*)
 C
-C      DIMENSION Parext(Nrext,Ntotc,Ngroup),
-C     *     Iflext(Nrext,Ntotc,Ngroup),
+C      DIMENSION
 C     *     Cs(Ntotc), Si(Ntotc), Dphi(Ntotc), Wr(NN), Wi(NN),
 C     *     Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN),
 C     *     Qi(NN,NN), Zke(Ntotc)
@@ -520,7 +518,7 @@ C
      *   TR, TI, Notu, Minres, igr, Zke, Dasigx, Dbsigx,
      *   Iso)
 C
-      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, Parext, Iflext, TR,
+      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, TR,
      *   Zke, Dasigx, Iso)
 C
       RETURN
@@ -529,7 +527,7 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Reactn (Agoj, Nent, Next, Ntot, Parext, Iflext,
+      SUBROUTINE Reactn (Agoj, Nent, Next, Ntot,
      *   Wr, Wi, Pwrhor, Pwrhoi, Tr, Ti, Qr, Qi, Notu, Krext, Lrmat,
      *   Minres, igr, Zke, If_Zke, Sigxxx,
      *   Dasigx, Dbsigx, Iso)
@@ -550,15 +548,14 @@ C
       integer :: Nent, Next, Ntot, Krext, Lrmat, Minres, igr
       integer :: If_Zke, Iso
       
-      real(kind=8) :: Parext(Krext,Ntotc,*),
+      real(kind=8) ::
      *   Wr(*), Wi(*), Pwrhor(*),
      *   Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*), Qi(NN,*), Zke(*)
-      integer :: Iflext(Krext,Ntotc,*), Notu(*)
+      integer :: Notu(*)
       real(kind=8) :: Sigxxx(*), Dasigx(Nnnsig,*),
      *   Dbsigx(Nnnsig,Ndbsig,*)
 C
-C      DIMENSION Parext(Nrext,Ntotc,Ngroup),
-C     *   Iflext(Nrext,Ntotc,Ngroup),
+C      DIMENSION
 C     *   Wr(NN), Wi(NN),
 C     *   Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN), Qi(NN,NN)
 C
@@ -692,7 +689,7 @@ C
      *   Tr, Ti, Notu, Minres, igr, Zke, Dasigx, Dbsigx,
      *   Iso)
 C
-      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, Parext, Iflext, Tr,
+      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot,  Tr,
      *   Zke, Dasigx, Iso)
 C
       RETURN
@@ -701,7 +698,7 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Captur (Agoj, Nent, Next, Ntot, Parext, Iflext,
+      SUBROUTINE Captur (Agoj, Nent, Next, Ntot,
      *   Wr, Wi, Pwrhor, Pwrhoi, Tr, Ti, Qr, Qi, Notu, Krext,
      *   Lrmat, Minres, igr,  Zke, If_Zke, Sigxxx,
      *   Dasigx, Dbsigx, Iso)
@@ -723,16 +720,15 @@ C
       integer :: Nent, Next, Ntot, Krext, Lrmat, 
      *           igr, If_zke, iso, minres
       
-      real(kind=8):: Parext(Krext,Ntotc,*), 
+      real(kind=8)::
      *   Wr(*), Wi(*),
      *   Pwrhor(*), Pwrhoi(*), Tr(*), Ti(*), Qr(NN,*),
      *   Qi(NN,*),  Zke(*)
-      integer:: Iflext(Krext,Ntotc,*), Notu(*)
+      integer:: Notu(*)
       real(kind=8):: Sigxxx(*), Dasigx(Nnnsig,*),
      *    Dbsigx(Nnnsig,Ndbsig,*)
 C
-C      DIMENSION Parext(Nrext,Ntotc,Ngroup),
-C     *   Iflext(Nrext,Ntotc,Ngroup),
+C      DIMENSION
 C     *   Cs(Ntotc), Si(Ntotc), Dphi(Ntotc), Wr(NN), Wi(NN),
 C     *   Pwrhor(NN), Pwrhoi(NN), Tr(NN), Ti(NN), Qr(NN,NN), Qi(NN,NN)
 C
@@ -867,7 +863,7 @@ C
      *   Tr, Ti, Notu, Minres, igr, Zke, Dasigx, Dbsigx,
      *   Iso)
 C
-      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, Parext, Iflext, Tr,
+      IF (Npx.NE.0) CALL Derext_Cro (Agoj, Ntot, Tr,
      *   Zke, Dasigx, Iso)
       RETURN
       END
@@ -939,89 +935,98 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Derext_Cro (Agoj, Ntot, Parext, Iflext, Tr, Zke,
+      SUBROUTINE Derext_Cro (Agoj, Ntot, Tr, Zke,
      *   Dasigx, Iso)
 C
       use fixedi_m
       use ifwrit_m
       use varyr_common_m
       use constn_common_m
+      use SammyRExternalInfo_M
+      use RMatResonanceParam_M
+      use EndfData_common_m, only : resParData
       IMPLICIT none
 C
       real(kind=8) :: Agoj
       integer :: Ntot, Iso
       
-      real(kind=8) :: Parext(Nrext,Ntotc,*),  Tr(*),Zke(*)
-      integer :: Iflext(Nrext,Ntotc,*)
+      real(kind=8) :: Tr(*),Zke(*)
       real(kind=8) :: Dasigx(Nnnsig,*)
-C      DIMENSION Parext(Nrext,Ntotc,Ngroup),
-C     *   Iflext(Nrext,Ntotc,Ngroup), Dasigx(Ngbout), Tr(NN)
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
+      real(kind=8)::Parext(7)
+C      DIMENSION Dasigx(Ngbout), Tr(NN)
 C
       real(kind=8) :: Two = 2.0d0
 C
       real(kind=8) :: B, C
-      integer :: I, Ifl, Ij
+      integer :: I, Ifl, Ij, J
       
       C = Fourpi*Agoj/Su
       Ij = 0
       DO I=1,Ntot
          B = C/Zke(I)**2
          Ij = Ij + I
-         Ifl = Iflext(1,I,Nnnn)
-         IF (Ifl.NE.-1) THEN
-            Ifl = Ifl
+         IF (resparData%hasRexInfo(Nnnn, I)) THEN
+            call resparData%getRextInfoByGroup(rextInfo, Nnnn, I)
+            call resparData%getRext(rext, rextInfo)
+            Parext = 0.0d0
+            DO J = 1, rextInfo%getNrext()
+              Parext(J) = rext%getSammyValue(J)
+            end do
+            Ifl = rextInfo%getIflSammyIndex(1)
             if( ifl.gt.ndasig) then
                 stop 'Out of range in Derext_Cro in mcro4 #1'
             end if
             IF (Ifl.GT.0) THEN
                IF (Nrext.EQ.5) Dasigx(1,Ifl) = Dasigx(1,Ifl)
-     *            - Tr(Ij)*B*Parext(5,I,Nnnn)/
-     *            (Su-Parext(1,I,Nnnn))
+     *            - Tr(Ij)*B*Parext(5)/
+     *            (Su-Parext(1))
                IF (Nrext.EQ.7) Dasigx(1,Ifl) = Dasigx(1,Ifl)
-     *            - Tr(Ij)*B* (Parext(5,I,Nnnn) +
-     *                         Parext(6,I,Nnnn)*Parext(1,I,Nnnn))/
-     *            (Su-Parext(1,I,Nnnn))
+     *            - Tr(Ij)*B* (Parext(5) +
+     *                         Parext(6)*Parext(1))/
+     *            (Su-Parext(1))
             END IF
-            Ifl = Iflext(2,I,Nnnn)
+            Ifl = rextInfo%getIflSammyIndex(2)
             if( ifl.gt.ndasig) then
                 stop 'Out of range in Derext_Cro in mcro4 #2'
             end if
             IF (Ifl.GT.0) THEN
                IF (Nrext.EQ.5) Dasigx(1,Ifl) =  Dasigx(1,Ifl)
-     *            - Tr(Ij)*B*Parext(5,I,Nnnn)/(Parext(2,I,Nnnn)-Su)
+     *            - Tr(Ij)*B*Parext(5)/(Parext(2)-Su)
                IF (Nrext.EQ.7) Dasigx(1,Ifl) = -Tr(Ij)*B*
-     *            (Parext(5,I,Nnnn)+Parext(6,I,Nnnn)*Parext(2,I,Nnnn))/
-     *            (Parext(2,I,Nnnn)-Su) + Dasigx(1,Ifl)
+     *            (Parext(5)+Parext(6)*Parext(2))/
+     *            (Parext(2)-Su) + Dasigx(1,Ifl)
             END IF
-            Ifl = Iflext(3,I,Nnnn)
+            Ifl = rextInfo%getIflSammyIndex(3)
             if( ifl.gt.ndasig) then
                 stop 'Out of range in Derext_Cro in mcro4 #3'
             end if
             IF (Ifl.GT.0) THEN
                Dasigx(1,Ifl) = Tr(Ij)*B + Dasigx(1,Ifl)
             END IF
-            Ifl = Iflext(4,I,Nnnn)
+            Ifl = rextInfo%getIflSammyIndex(4)
             if( ifl.gt.ndasig) then
                stop 'Out of range in Derext_Cro in mcro4 #4'
             end if
             IF (Ifl.GT.0) THEN
                Dasigx(1,Ifl) = Tr(Ij)*B*Su + Dasigx(1,Ifl)
             END IF
-            Ifl = Iflext(5,I,Nnnn)
+            Ifl = rextInfo%getIflSammyIndex(5)
             IF (Ifl.GT.0) THEN
-               Dasigx(1,Ifl) = -Two*Tr(Ij)*B * dSQRT(Parext(5,I,Nnnn))*
-     *            dLOG( (Parext(2,I,Nnnn)-Su)/(Su-Parext(1,I,Nnnn)) ) +
+               Dasigx(1,Ifl) = -Two*Tr(Ij)*B * dSQRT(Parext(5))*
+     *            dLOG( (Parext(2)-Su)/(Su-Parext(1)) ) +
      *            Dasigx(1,Ifl)
             END IF
-            IF (Nrext.GT.5) THEN
-               Ifl = Iflext(6,I,Nnnn)
+            IF (rextInfo%getNrext().GT.5) THEN
+               Ifl = rextInfo%getIflSammyIndex(6)
                IF (Ifl.GT.0) THEN
                   Dasigx(1,Ifl) = Dasigx(1,Ifl) - Tr(Ij)*B*
-     *               ( (Parext(2,I,Nnnn)-Parext(1,I,Nnnn))+
-     *               Su*dLOG((Parext(2,I,Nnnn)-Su)/
-     *                             (Su-Parext(1,I,Nnnn))) )
+     *               ( (Parext(2)-Parext(1))+
+     *               Su*dLOG((Parext(2)-Su)/
+     *                             (Su-Parext(1))) )
                END IF
-               Ifl = Iflext(7,I,Nnnn)
+               Ifl = rextInfo%getIflSammyIndex(7)
                IF (Ifl.GT.0) THEN
                   Dasigx(1,Ifl) = Tr(Ij)*B*Su**2 + Dasigx(1,Ifl)
                END IF
diff --git a/sammy/src/dat/mdat0.f90 b/sammy/src/dat/mdat0.f90
index b5a8d714bcfdb9e8e6b861c63df33c88932f6e51..bc26a117c0b502061a5f8fde39c4adc1bd2ea7d4 100644
--- a/sammy/src/dat/mdat0.f90
+++ b/sammy/src/dat/mdat0.f90
@@ -47,6 +47,7 @@ module Samdat_0_M
       type(EndfData)::reader
       type(GridData)::grid, auxGrid
       logical::hasAuxGrid
+      integer::maxRow, maxCol
 !
       Segmen(1) = 'D'
       Segmen(2) = 'A'
@@ -92,11 +93,11 @@ module Samdat_0_M
       IF (Nrext.EQ.0) Krext = 1
       call reader%initialize()
       CALL Read00 (A_Ibcf , A_Icf2 , A_Idpiso ,              &
-         A_Iprext , I_Iflext , A_Iprorr , A_Icrnch , A_Iedets ,        &
+         A_Iprorr , A_Icrnch , A_Iedets ,                    &
          A_Iseses , A_Iesese , A_Iprrpi , A_Iedrpi, A_Ixxrpi ,         &
          A_Iprudr , I_Inud_E , I_Inud_T , A_Iude , A_Iudr , A_Iudt ,   &
          A_J1 , A_J2, Krext, Iwhich, Mind, Mine, Maxe,      &
-         Maxd, Nmax, reader)
+         Maxd, Nmax, reader, I_Iflrpi)
       deallocate(A_Iedrpi)
       deallocate(A_Ixxrpi)
       deallocate(A_J1)
@@ -141,6 +142,12 @@ module Samdat_0_M
       if(Ktzero.NE.0) minDataIndex = minDataIndex + 1
       if(Numcro.gt.1) minDataIndex = minDataIndex + 1
       call grid%setDataIndex(minDataIndex)
+      maxRow = Ndat * Numcro
+      maxCol = 2
+      if (Numcro.gt.1) maxCol = 3
+      if (Ktzero.NE.0)  maxCol = maxCol + 1
+      call grid%reserve(maxRow, maxCol)
+
       do i = 1, Ndat
          ee = A_Ienerg(i)
          etzero = ee
@@ -333,6 +340,9 @@ module Samdat_0_M
             CALL Artificial_Energy (A_Ienerg, Ndat, Keveng)
             call expData%getGrid(grid, 1)
             ii = 1
+            maxRow = Ndat * Numcro
+            maxCol  = 1
+            call grid%reserve(maxRow, maxCol)
             do i = 1, Ndat
                do j = 1, Numcro
                   call grid%addData(ii, 1, A_Ienerg(i))
@@ -349,6 +359,9 @@ module Samdat_0_M
 
          if (hasAuxGrid) then
             call auxGrid%initialize()
+            maxRow = Ndatb * Numcro
+            maxCol  = 1
+            call auxGrid%reserve(maxRow, maxCol)
             ipos = 1
             do i = 1, Ndatb
               do ii = 1, numcro
diff --git a/sammy/src/dat/mdat1.f90 b/sammy/src/dat/mdat1.f90
index 5278fff49375ffc19f5273e14426752914edfb5d..7f628968e50a3eeba9b2aebc4a30e7a307f64157 100644
--- a/sammy/src/dat/mdat1.f90
+++ b/sammy/src/dat/mdat1.f90
@@ -4,9 +4,9 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Limits (Bcf, Cf2, Dopwid, Parext, Iflext, Parorr,          &
+      SUBROUTINE Limits (Bcf, Cf2, Dopwid, Parorr,                          &
          Ecrnch, Endets, Sesese, Eseses, Parrpi, Edxrpi, Xxxrpi, Parudr,    &
-         Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext)
+         Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext, Iflrpi)
 !
 ! *** Purpose -- Find energy limits for the various processes --
 ! ***      Emin , Emax  = limits for experimental data set
@@ -34,11 +34,12 @@ contains
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
       DIMENSION Bcf(*), Cf2(*), Dopwid(*),                                &
-         Parext(Krext,Ntotc,*), Iflext(Krext,Ntotc,*), Parorr(*),         &
+         Parorr(*),                                                       &
          Ecrnch(*), Endets(*), Sesese(*), Eseses(*), Parrpi(*),           &
          Edxrpi(Kxxrpi,*), Xxxrpi(Kmmrpi,*)                               
       DIMENSION Nud_E(*), Nud_t(*), UdE(Nudeng,*), UdR(Nudtim,Nudeng,*),  &
          UdT(Nudtim,Nudeng,*), UdR_E(*), UdT_E(*), Parudr(*)
+      integer::iflrpi(*)
 !
       DATA Zero /0.0d0/, Two /2.0d0/
       Brdlim = 5.0d0
@@ -127,9 +128,9 @@ contains
       ELSE IF (Numrpi.GT.0) THEN
 ! ***    Here for RPI version of resolution broadening
          Yresol = .TRUE.
-         CALL Gen_Rpi_E_Independent (Parrpi, Iflext, Edxrpi, Xxxrpi,    &
+         CALL Gen_Rpi_E_Independent (Parrpi,  Iflrpi, Edxrpi, Xxxrpi,    &
             Binpdx, 1)
-! ***    Note that Iflext is "Dummy" here, never used
+! ***    Note that Iflext is "Dummy" here, never use
          Itime = 0
          Mndets = 1
          Min = Nnnrpi + 1
@@ -232,7 +233,7 @@ contains
 !
       END IF
 !
-      IF (Numext.GT.0) CALL Testxt (Parext, Iflext, Krext)
+      IF (Numext.GT.0) CALL Testxt
       CALL Wwrite (Bcf, Cf2, Dopwid)
       RETURN
 !
@@ -380,7 +381,7 @@ contains
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Testxt (Parext, Iflext, Krext)
+      SUBROUTINE Testxt
 !
       use fixedi_m
       use fixedr_m
@@ -388,24 +389,32 @@ contains
       use RMatResonanceParam_M
       use EndfData_common_m
       use AuxGridHelper_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      IMPLICIT none
 !
       type(SammySpinGroupInfo)::spinInfo
-      DIMENSION Parext(Krext,Ntotc,*), Iflext(Krext,Ntotc,*)
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext      
+      integer::Ii, N, Ntotn, M
+      real(kind=8)::Elow, Eup
+
       Ii = 0
       DO N=1,resparData%getNumSpinGroups()
          call resparData%getSpinGroupInfo(spinInfo, N)
          Ntotn = spinInfo%getNumChannels()
          DO M=1,Ntotn
-            IF (Iflext(1,M,N).NE.-1) THEN
-                IF (Parext(1,M,N).GT.Emind) THEN
-                   WRITE ( 6,10000) N, M, Parext(1,M,N), Emind
-                   WRITE (21,10000) N, M, Parext(1,M,N), Emind
+            IF (resparData%hasRexInfo(N, M)) THEN
+                call resparData%getRextInfoByGroup(rextInfo, N, M)
+                call resparData%getRext(rext, rextInfo)
+                Elow = rext%getSingularityBelowErange()
+                EUp  = rext%getSingularityAboveErange()
+                IF (Elow.GT.Emind) THEN
+                   WRITE ( 6,10000) N, M, Elow, Emind
+                   WRITE (21,10000) N, M, Elow, Emind
                    II = 1
                 END IF
-                IF (Parext(2,M,N).LT.Emaxd) THEN
-                   WRITE ( 6,10100) N, M, Parext(2,M,N), Emaxd
-                   WRITE (21,10100) N, M, Parext(2,M,N), Emaxd
+                IF (EUp.LT.Emaxd) THEN
+                   WRITE ( 6,10100) N, M, EUp, Emaxd
+                   WRITE (21,10100) N, M, EUp, Emaxd
                    II = 1
                 END IF
             END IF
diff --git a/sammy/src/dat/mdat2.f90 b/sammy/src/dat/mdat2.f90
index a5554dd55998d5995dd5b1df6120469631d92fcf..f3725f33bf29e1b979bea3935860795d8a02fcc0 100644
--- a/sammy/src/dat/mdat2.f90
+++ b/sammy/src/dat/mdat2.f90
@@ -7,10 +7,10 @@ module mdat2_m
 !
 ! ______________________________________________________________
 !
-      SUBROUTINE Read00 (Bcf, Cf2, Dopwid, Parext, Jflext,          &
+      SUBROUTINE Read00 (Bcf, Cf2, Dopwid,                                &
          Parorr, Ecrnch, Endets, Sesese, Eseses, Parrpi, Edxrpi, Xxxrpi,  &
          Parudr, Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext,     &
-         Iwhich, Mind, Mine, Maxe, Maxd, Nmax, reader)
+         Iwhich, Mind, Mine, Maxe, Maxd, Nmax, reader, Iflrpi)
 !
 ! *** Purpose -- Read data file through once to learn dimensions and
 ! ***              positions of data in the file
@@ -28,12 +28,13 @@ module mdat2_m
       use AllocateFunctions_m
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
       type(EndfData)::reader
-      DIMENSION Bcf(*), Cf2(*), Dopwid(*),                    &
-         Parext(Krext,Ntotc,*), Jflext(Krext,Ntotc,*), Parorr(*),      &
+      DIMENSION Bcf(*), Cf2(*), Dopwid(*),                             &
+         Parorr(*),                                                    &
          Ecrnch(*), Endets(*), Sesese(*), Eseses(*), Parrpi(*),        &
          Edxrpi(*), Xxxrpi(*), Parudr(*)
       DIMENSION Nud_E(*), Nud_t(*), UdE(Nudeng,*), UdR(Nudtim,Nudeng,*),  &
          UdT(Nudtim,Nudeng,*), UdR_E(*), UdT_E(*)
+      integer::Iflrpi(*)
       DIMENSION  Ehkeep(4)
       real(kind=8),allocatable,dimension(:)::E
       Data Nodpoc /3/, Zero /0.0d0/
@@ -57,9 +58,9 @@ module mdat2_m
          IF (Kartgd.EQ.1) THEN
          ELSE
 ! ***       find energy limits for the various processes --
-            CALL Limits (Bcf, Cf2, Dopwid, Parext, Jflext, Parorr,  &
+            CALL Limits (Bcf, Cf2, Dopwid, Parorr,                        &
                Ecrnch, Endets, Sesese, Eseses, Parrpi, Edxrpi, Xxxrpi,    &
-               Parudr, Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext)
+               Parudr, Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext, Iflrpi)
          END IF
          RETURN
       END IF
@@ -243,9 +244,9 @@ module mdat2_m
       END IF
 !
 ! *** find Energy limits for the various processes --
-      CALL Limits (Bcf, Cf2, Dopwid, Parext, Jflext,Parorr,            &
+      CALL Limits (Bcf, Cf2, Dopwid, Parorr,                                 &
          Ecrnch, Endets, Sesese, Eseses, Parrpi, Edxrpi, Xxxrpi, Parudr,     &
-         Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext)
+         Nud_E, Nud_T, UdE, UdR, UdT, UdR_E, UdT_E, Krext, Iflrpi)
 !
 !
 ! *** check whether energies are redundant
diff --git a/sammy/src/dat/mdat3.f90 b/sammy/src/dat/mdat3.f90
index 08a4ddbf4f55c772e5046c506d83e8da17fb4620..cf8475618801f5774f7ca1e689de8969d7487bcd 100755
--- a/sammy/src/dat/mdat3.f90
+++ b/sammy/src/dat/mdat3.f90
@@ -323,6 +323,7 @@ module mdat3_M
         end do
         CALL Convert_To_Caps (keyword, 10, Kpound)
         IF (keyword.EQ.'PARTIAL DE') THEN
+           call derivs%reserve(ener%getLength(), Numidc)
            DO K=1,ener%getLength()
               READ (30,10200) (X(1, I),I=1,Numidc)
               Do I = 1, Numidc
diff --git a/sammy/src/dbd/mdbd3.f b/sammy/src/dbd/mdbd3.f
index ef7d74d5f6657b15d69f766ebecc778da5bc1a3c..4774baf9e111330775189445a967c6f9900d17ac 100644
--- a/sammy/src/dbd/mdbd3.f
+++ b/sammy/src/dbd/mdbd3.f
@@ -80,7 +80,7 @@ C
 C *** purpose -- COPY DATA AND DERIVATIVES, CUZ THERE ARE TOO FEW
 C ***            POINTS TO BROADEN
 C
-      use fixedi_m, only : Nnnsig, Ndasig
+      use fixedi_m, only : Nnnsig, Ndasig, Ndbsig
       use ifwrit_m, only : Kvtemp
       IMPLICIT None
 C
@@ -93,9 +93,11 @@ C
       Now = Now + 1
       IF (Kvtemp.GT.0) THEN
          K = Kvtemp - Ndasig
-         DO N=1,Nnnsig
-            Dbsigx(N,K) = Zero
-         END DO
+         if (k.gt.0.and.k.le.Ndbsig) then
+            DO N=1,Nnnsig
+               Dbsigx(N,K) = Zero
+            END DO
+         end if
       END IF
       RETURN
       END
diff --git a/sammy/src/dop/mdop0.f90 b/sammy/src/dop/mdop0.f90
index 7fcf7f8d77176b010d017436ccc58e7cec7db45d..740c0a48721198f42e11b9777ad82e6545719767 100644
--- a/sammy/src/dop/mdop0.f90
+++ b/sammy/src/dop/mdop0.f90
@@ -58,7 +58,7 @@ module dop_m
       Left  = Msize - Icoef - 2*I2pls1
       Ldatb = Ndatb
 
-      ! ensure we have an auxillary energy grid
+      ! ensure we have an auxillary energy grid     
       if ( expData%getLength().lt.2) then
          call expData%getGrid(grid, 1)
          ipos = 1
@@ -70,6 +70,7 @@ module dop_m
              end if
          end if
          call auxGrid%initialize()
+         call auxGrid%reserve(grid%getLength(),1)
          do i = 1, grid%getLength()
              call auxGrid%addData(i, 1, grid%getData(i, ipos))
          end do
diff --git a/sammy/src/dop/mdop1.f90 b/sammy/src/dop/mdop1.f90
index c2b58cada0ba78c95a5e71ff2a06ac181053d560..411b65d7119f671ce6bcdd4bafa11c3fd7f53e4c 100644
--- a/sammy/src/dop/mdop1.f90
+++ b/sammy/src/dop/mdop1.f90
@@ -263,12 +263,14 @@ module dop1_m
 !
          iposJJ = (Jj - 1) * numcro + 1    ! all energies for each numcro are the same
          ee = grid%getData(iposJJ, 1)
+         call grid%reserve(iposJJ + Numcro,1)
          do Jjnum = iposJJ, iposJJ + Numcro -1
             call grid%addData( Jjnum, 1, ee)
          end do
          J = J - 1
       END DO
       iposJJ = (Ngtvv - 1) * numcro + 1    ! all energies for each numcro are the same
+      call grid%reserve(iposJJ + Numcro,1)
       do Jjnum = iposJJ, iposJJ + Numcro -1
          call grid%addData( Jjnum, 1, 0.0d0)
       end do
diff --git a/sammy/src/dop/mdop2.f90 b/sammy/src/dop/mdop2.f90
index 5e3b6bdfdaec1ac3564073b490f7a5c70e14ec78..290e00f2d4ef8807015e91bdc949ea2ebd32d718 100755
--- a/sammy/src/dop/mdop2.f90
+++ b/sammy/src/dop/mdop2.f90
@@ -26,6 +26,7 @@ module dop2_m
       Mstopx = 0
       Np1 = N + 1
       Itimes = 0
+      call Coef%reserve(Np1, 1)
       DO I=1,Np1
          IF((I/1000)*1000.EQ.I) WRITE (6,66666) I, Coef%getData(I-1,1)
 66666    FORMAT (' I, Coef(I-1)=', i10, 1PG20.10)
@@ -102,6 +103,7 @@ module dop2_m
 ! *** rearrange storage of Coef ... 1 to m+1 now goes to m+1 to 2m+1
       C = Coef%getData(Np1, 1)
       Ii = Np1
+      call Coef%reserve(Ii+Mmmmmm,1)
       DO I=1,Mmmmmm
          tmp =  Coef%getData(I,1)
          call Coef%addData(Ii,1,tmp)
@@ -111,6 +113,7 @@ module dop2_m
 !
 ! *** now put M+2 to 2M+1 into [1 to M] in reverse order
       Ii = M2pls1
+      call Coef%reserve(Ii+Mmmmmm,1)
       DO I=1,Mmmmmm
          tmp = Coef%getData(Ii,1)
          call Coef%addData(I, 1, tmp)
diff --git a/sammy/src/end/mout.f b/sammy/src/end/mout.f
index 300fa10bd4037290c164b24ca3cd4632ca9424b4..45b7582be6ff1b3bfba273b7a5d4180206ba95fe 100644
--- a/sammy/src/end/mout.f
+++ b/sammy/src/end/mout.f
@@ -3,7 +3,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Outpar (Iftit , Nunit , Parbrd, Iflbrd,
-     *   Pardet, Ifldet, Igrdet,         Parext, Iflext,
+     *   Pardet, Ifldet, Igrdet,
      *   Polar , Iflpol, Parmsc, Iflmsc, Iradms, Ijkmsc,
      *   Etaeee, Parpmc, Iflpmc, Isopmc,
      *   Parorr, Iflorr, Ecrnch, Endets, Sesese, Eseses, Sigdts,
@@ -39,7 +39,6 @@ C
       type(ResonanceCovariance)::physCov
       DIMENSION Parbrd(*), Iflbrd(*),
      *   Pardet(*), Ifldet(*), Igrdet(*),
-     *   Parext(Nrext,Ntotc,*), Iflext(Nrext,Ntotc,*),
      *   Polar(2,*), Iflpol(2,*),  Parmsc(*),
      *   Iflmsc(*), Iradms(*), Ijkmsc(*), Etaeee(*),
      *   Parpmc(4,*), Iflpmc(4,*), Isopmc(*), Parorr(*), Iflorr(*),
@@ -55,7 +54,6 @@ C
 C
 C      DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd),
 c     *   Pardet(Numdet), Ifldet(Numdet), Igrdet(Ngroup),
-C     *   Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup),
 C     *   Polar(2,Nres), Iflpol(2,Nres),
 C     *   Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup), Ijkmsc(Nummsc),
 C     *   Etaeee(Mjetan),
@@ -399,10 +397,8 @@ C
 C
   140 CONTINUE
       Iunit = Nunit
-      IF (Numext.GT.0) THEN
-         CALL Outext (Parext, Iflext, Dump,  Iunit,
-     *      Ipar)
-      END IF
+
+      CALL Outext (Dump,  Iunit, Ipar)
 C
       CALL Outrad (Dump, Iunit, Ipar)
 C
diff --git a/sammy/src/end/mout2.f b/sammy/src/end/mout2.f
index e67cb5298f48578f4cb3d14419e1b3257e7e54a0..06f69e47847c912bd9c0b758c97d00a2cb4b9e81 100644
--- a/sammy/src/end/mout2.f
+++ b/sammy/src/end/mout2.f
@@ -2,67 +2,99 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Outext (Parext, Iflext, Dump,
-     *   Iunit, Ipar)
+      SUBROUTINE Outext (Dump, Iunit, Ipar)
 C
 C *** PURPOSE -- OUTPUT R-EXTERNAL PARAMETERS
 C
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use Gachmi_common_m
-      use titles_b32_common_m
-      use EndfData_common_m
+      use Gachmi_common_m, only : Draw
+      use EndfData_common_m, only : resParData
       use SammySpinGroupInfo_M
-      use RMatResonanceParam_M    
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use SammyRExternalInfo_M
+      use RMatResonanceParam_M
+      IMPLICIT None
 C
-      DIMENSION Parext(Nrext,Ntotc,*),
-     *   Iflext(Nrext,Ntotc,*), Dump(*)
-C      DIMENSION Ntot(Ngroup), Parext(Nrext,Ntotc,Ngroup),
-C     *   Iflext(Nrext,Ntotc,Ngroup), Dump(Nvpall)
+      real(kind=8)::Dump(*)
+C      DIMENSION Ntot(Ngroup), Dump(Nvpall)
 C
       type(SammySpinGroupInfo)::spinInfo
+      type(SammyRExternalInfo)::rextInfo
       type(RMatSpinGroup)::spinGroup
+      type(RExternalFunction)::rext
+      integer::Iunit, Ipar
+      logical::hasRext
+      integer::Js(7)
+      real(kind=8)::Zero
+      integer::I, J, JJ, K, Mmax, NrextO
       DATA Zero /0.0d0/
 C
-      WRITE (Iunit,99999)
-      IF (Nrext.EQ.5) WRITE (Iunit,99990)
-      IF (Nrext.EQ.7) WRITE (Iunit,99989)
+      if (resParData%getNumRext().eq.0) return  ! no external R-matrix
+
+      ! assume all channels have the same number R-ext pars
+      call resParData%getRextInfo(rextInfo, 1)
+      NrextO = rextInfo%getNrext()
+
+      WRITE (Iunit,99999)      
+      IF (NrextO.EQ.5) WRITE (Iunit,99990)
+      IF (NrextO.EQ.7) WRITE (Iunit,99989)
       DO I=1,resParData%getNumSpinGroups()
          call resParData%getSpinGroupInfo(spinInfo, I)
          call resParData%getSpinGroup(spinGroup, spinInfo) 
          Mmax = spinInfo%getNumChannels()
-         IF (Iflext(1,1,I).NE.-1) CALL Setflg (Iflext(1,1,I), 
-     *      Nrext)
-         IF (Iflext(1,1,I).NE.-1 .AND. Nrext.EQ.5) WRITE (Iunit,99988)
-     *        I, spinGroup%getJ(),
-     *        (Parext(K,1,I),(Draw(J,K),J=1,5),K=1,Nrext)
-         IF (Iflext(1,1,I).NE.-1 .AND. Nrext.EQ.7) WRITE (Iunit,99987)
-     *        I, spinGroup%getJ(),
-     *        (Parext(K,1,I),(Draw(J,K),J=1,5),K=1,Nrext)
-         IF (Iflext(1,1,I).EQ.-1) THEN            
-            WRITE (Iunit,99986) I,  spinGroup%getJ()
-         END IF
-         IF (Mmax.NE.1) THEN
-            DO J=2,Mmax
-               IF (Iflext(1,J,I).NE.-1) CALL Setflg(Iflext(1,J,I),
-     *            Nrext)
-               IF (Iflext(1,J,I).NE.-1 .AND. Nrext.EQ.5) WRITE
-     *            (Iunit,99985) J, (Parext(K,J,I),(Draw(JJ,K),
-     *            JJ=1,5),K=1,Nrext)
-               IF (Iflext(1,J,I).NE.-1 .AND. Nrext.EQ.7) WRITE
-     *            (Iunit,99984) J, (Parext(K,J,I),(Draw(JJ,K),
-     *            JJ=1,5),K=1,Nrext)
-            END DO
+
+         hasRext = resParData%hasRexInfo(I, 1)
+         if (hasRext) then
+            call resParData%getRextInfoByGroup(rextInfo, I, 1)
+            Js = 0
+            DO K = 1, rextInfo%getNrext()
+              Js(K) = rextInfo%getIflSammyIndex(K)
+            end do
+            call Setflg(Js, 7)
+            ! currently in the input R-external can have 5 or seven parameters
+            ! The output should reflect the user input
+            call resParData%getRext(rext, rextInfo)
+            if (NrextO.eq.5) then
+               WRITE (Iunit,99988) I, spinGroup%getJ(),
+     *            (rext%getSammyValue(K),
+     *            (Draw(J,K),J=1,5),K=1,5)
+            else
+              WRITE (Iunit,99987) I, spinGroup%getJ(),
+     *            (rext%getSammyValue(K),
+     *            (Draw(J,K),J=1,5),K=1,7)
+            end if
+         else
+             WRITE (Iunit,99986) I,  spinGroup%getJ()
          END IF
+         DO J=2,Mmax
+            hasRext = resParData%hasRexInfo(I, J)
+            if (hasRext) then
+               call resParData%getRextInfoByGroup(rextInfo,I, J)
+               call resParData%getRext(rext, rextInfo)
+               Js = 0
+               DO K = 1, rextInfo%getNrext()
+                 Js(K) = rextInfo%getIflSammyIndex(K)
+               end do
+               call Setflg(Js, 7)
+               ! currently in the input R-external can have 5 or seven parameters
+               ! The output should reflect the user input
+               if (NrextO.eq.5) Then
+                  WRITE  (Iunit,99985) J,
+     *                  (rext%getSammyValue(K),(Draw(JJ,K),
+     *                  JJ=1,5),K=1,5)
+               else
+                  WRITE  (Iunit,99984) J,
+     *            (rext%getSammyValue(K),(Draw(JJ,K),
+     *            JJ=1,5),K=1,7)
+               end if
+            end if
+         END DO
          DO J=1,Mmax
-            IF (Iflext(1,J,I).NE.-1) THEN
-               DO K=1,Nrext
-                  IF (Iflext(K,J,I).NE.0) THEN
+            IF (resParData%hasRexInfo(I, J)) THEN
+               call resParData%getRextInfoByGroup(rextInfo, I, J)
+               call resParData%getRext(rext, rextInfo)
+               DO K=1,rextInfo%getNrext()
+                  IF (rextInfo%getIflSammyIndex(K).NE.0) THEN
                      Ipar = Ipar + 1
-                     Dump(Ipar) = Parext(K,J,I)
+                     Dump(Ipar) = rext%getSammyValue(K)
                      IF (Dump(Ipar).LT.Zero) Dump(Ipar) =
      *                    -Dump(Ipar)
                   END IF
diff --git a/sammy/src/endf/CMakeLists.txt b/sammy/src/endf/CMakeLists.txt
index 704c23bbe9bc366d8286c80ab648e8d1fec09d72..25560403c0e34dd8bcfdf602de9ca29b53059f69 100644
--- a/sammy/src/endf/CMakeLists.txt
+++ b/sammy/src/endf/CMakeLists.txt
@@ -25,6 +25,7 @@ SET(HEADERS
         interface/cpp/CovarianceContainerInterface.h
         interface/cpp/EndfDataInterface.h
         interface/cpp/AdjustedRadiusDataInterface.h
+        interface/cpp/SammyRExternalInfoInterface.h
         CovarianceData.h
         EndfData.h
         EnumerationData.h
@@ -40,6 +41,7 @@ SET(HEADERS
         WriteOutputData.h
         WriteResonanceParameters.h
         AdjustedRadiusData.h
+        SammyRExternalInfo.h
 )
 
 APPEND_SET(ENDF_SOURCES
@@ -150,6 +152,9 @@ APPEND_SET(ENDF_SOURCES
         interface/fortran/AdjustedRadiusData_I.f90
         interface/fortran/AdjustedRadiusData_M.f90
 
+        interface/cpp/SammyRExternalInfoInterface.cpp
+        interface/fortran/SammyRExternalInfo_I.f90
+        interface/fortran/SammyRExternalInfo_M.f90
 )
 
 
diff --git a/sammy/src/endf/SammyRExternalInfo.h b/sammy/src/endf/SammyRExternalInfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..2e6a8cd638f316342d29249cb900464284288bdf
--- /dev/null
+++ b/sammy/src/endf/SammyRExternalInfo.h
@@ -0,0 +1,154 @@
+#ifndef SAMMYREXTERNALINFO_H
+#define SAMMYREXTERNALINFO_H
+
+#include <exception>
+#include <stdexcept>
+#include <string>
+
+namespace sammy{
+  class SammyRExternalInfo{
+     public:
+        SammyRExternalInfo():grp(-1),
+                             chan(-1),
+                             iflConstantRext(0),
+                             iflLinearRext(0),
+                             iflQuadraticRext(0),
+                             iflConstantCoeffLog(0),
+                             iflLinearCoeffLog(0),
+                             iflELowRange(0),
+                             iflEUpRange(0),
+                             iflPoleStrength(0),
+                             iflAvgRadWidth(0),
+                             nrext(0){}
+        SammyRExternalInfo(const SammyRExternalInfo & orig):grp(orig.grp),
+                                                            chan(orig.chan),
+                                                            iflConstantRext(orig.iflConstantRext),
+                                                            iflLinearRext(orig.iflLinearRext),
+                                                            iflQuadraticRext(orig.iflQuadraticRext),
+                                                            iflConstantCoeffLog(orig.iflConstantCoeffLog),
+                                                            iflLinearCoeffLog(orig.iflLinearCoeffLog),
+                                                            iflELowRange(orig.iflELowRange),
+                                                            iflEUpRange(orig.iflEUpRange),
+                                                            iflPoleStrength(orig.iflPoleStrength),
+                                                            iflAvgRadWidth(orig.iflAvgRadWidth),
+                                                            nrext(orig.nrext){}
+
+        virtual ~SammyRExternalInfo(){}
+
+
+        int getGrp() const{ return grp;} // Sping group to which this belongs
+        int getChannel() const { return chan;}; // the channel to which this belongs
+
+        // r-external parameters
+        int getIflConstantRext() const{ return iflConstantRext;}
+        int getIflLinearRext() const{ return iflLinearRext;}
+        int getIflQuadraticRext() const{ return iflQuadraticRext;}
+        int getIflConstantCoeffLog() const{ return iflConstantCoeffLog;}
+        int getIflLinearCoeffLog() const{ return iflLinearCoeffLog;}
+        int getIflELowRange() const{ return iflELowRange;}
+        int getIflEUpRange() const{ return iflEUpRange;}
+        int getIflPoleStrength() const{ return iflPoleStrength;}
+        int getIflAvgRadWidth() const{ return iflAvgRadWidth;}
+
+        int getNrext() const{ return nrext;}
+
+        void setGrp(int g) {  grp=g;} // Sping group to which this belongs
+        void setChannel(int c) { chan = c;}
+        // r-external parameters
+        void setIflConstantRext(int ifl) { iflConstantRext = ifl;}
+        void setIflLinearRext(int ifl)  { iflLinearRext = ifl;}
+        void setIflQuadraticRext(int ifl) { iflQuadraticRext = ifl;}
+        void setIflConstantCoeffLog(int ifl) { iflConstantCoeffLog = ifl;}
+        void setIflLinearCoeffLog(int ifl) { iflLinearCoeffLog = ifl;}
+        void setIflELowRange(int ifl) { iflELowRange = ifl;}
+        void setIflEUpRange(int ifl) { iflEUpRange = ifl;}
+        void setIflPoleStrength(int ifl) { iflPoleStrength = ifl;}
+        void setIflAvgRadWidth(int ifl) { iflAvgRadWidth = ifl;}
+
+        void setNrext(int n) { nrext = n;} // determine whether 5, 7 or 0 parameters are given
+
+        /**
+         * Helper function to match function names to SAMMY indexing
+         *
+         * @param i the SAMMY index to the parameters
+         * @return  the desired fit flag
+         */
+        int getIflSammyIndex(int i) const{
+            switch(i){
+               case 1:
+                 return getIflELowRange();
+               case 2:
+                 return getIflEUpRange();
+               case 3:
+                 return getIflConstantRext();
+               case 4:
+                 return getIflLinearRext();
+               case 5:
+                 return getIflConstantCoeffLog();
+               case 6:
+                 return getIflLinearCoeffLog();
+               case 7:
+                 return getIflQuadraticRext();
+               default:
+                 return 0;
+            }
+        }
+
+        /**
+         * Helper function to match function names to SAMMY indexing
+         *
+         * @param i the SAMMY index to the parameters
+         * @param flag  the desired fit flag
+         */
+        void setIflSammyIndex(int i, int flag) {
+            switch(i){
+               case 1:
+                 setIflELowRange(flag);
+                 break;
+               case 2:
+                 setIflEUpRange(flag);
+                 break;
+               case 3:
+                 setIflConstantRext(flag);
+                 break;
+               case 4:
+                 setIflLinearRext(flag);
+                 break;
+               case 5:
+                 setIflConstantCoeffLog(flag);
+                 break;
+               case 6:
+                 setIflLinearCoeffLog(flag);
+                 break;
+               case 7:
+                 setIflQuadraticRext(flag);
+                 break;
+               default:
+                 throw std::runtime_error("Invalid index " + std::to_string(i) + " to set R-external fit flags");
+            }
+        }
+
+     private:
+        int grp;  // Sping group to which this belongs
+
+        int chan; // the channel to which this belongs
+
+        // r-external parameters
+        // names are as in the R-External data object
+        // prefixed by ifl to indicate that it is the
+        // corresponding fit flag
+        int iflConstantRext;
+        int iflLinearRext;
+        int iflQuadraticRext;
+        int iflConstantCoeffLog;
+        int iflLinearCoeffLog;
+        int iflELowRange;
+        int iflEUpRange;
+        int iflPoleStrength;
+        int iflAvgRadWidth;
+
+        int nrext;
+  };
+}
+
+#endif // SAMMYREXTERNALINFO_H
diff --git a/sammy/src/endf/SammyRMatrixParameters.cpp b/sammy/src/endf/SammyRMatrixParameters.cpp
index 9ad64c39334646ac36f84514fafbf6c197229666..6f09790a1881e975ac0974a5793511a0d68880d6 100644
--- a/sammy/src/endf/SammyRMatrixParameters.cpp
+++ b/sammy/src/endf/SammyRMatrixParameters.cpp
@@ -104,6 +104,51 @@ namespace sammy{
 
         spinGroupData.push_back(spin);
     }
+
+
+    void SammyRMatrixParameters::addRext(int grp, int chan){
+        SammySpinGroupInfo * spinInfo = getSpinGroupInfo(grp);
+        SammyChannelInfo *channelInfo = spinInfo->getChannelInfo(chan);
+        endf::RMatChannelParams *channel = getChannel(channelInfo);
+        channel->getRExternalFuncAlter().setFormat(2); // make it SAMMY format by default
+
+        std::shared_ptr<SammyRExternalInfo> rext = std::make_shared<SammyRExternalInfo>();
+        rext->setGrp(grp);
+        rext->setChannel(chan);
+        rextInfo.push_back(rext);
+    }
+
+    SammyRExternalInfo * SammyRMatrixParameters::getRextInfo(int index){
+        if (index < 0 || index >= (int)rextInfo.size()){
+            throw std::runtime_error("Invalid index in getRextInfo");
+        }
+
+        return rextInfo[index].get();
+    }
+
+    endf::RExternalFunction * SammyRMatrixParameters::getRext(SammyRExternalInfo * info){
+        SammySpinGroupInfo * spinInfo = getSpinGroupInfo(info->getGrp());
+        SammyChannelInfo *channelInfo = spinInfo->getChannelInfo(info->getChannel());
+        endf::RMatChannelParams *channel = getChannel(channelInfo);
+        return &(channel->getRExternalFuncAlter());
+    }
+
+    SammyRExternalInfo * SammyRMatrixParameters::getRextInfoByGroup(int grp, int channel){
+        for (auto & info : rextInfo){
+            if (info->getGrp() == grp && info->getChannel() == channel){
+                return info.get();
+            }
+        }
+        return nullptr;
+    }
+    bool SammyRMatrixParameters::hasRexInfo(int grp, int channel) const{
+        for (auto & info : rextInfo){
+            if (info->getGrp() == grp && info->getChannel() == channel){
+                return true;
+            }
+        }
+        return false;
+    }
       
     void SammyRMatrixParameters::setAbundanceByIsotope(int iso, double abn){
         if (resonanceData == NULL || iso < 0 || iso >=  resonanceData->getNumIso()){
diff --git a/sammy/src/endf/SammyRMatrixParameters.h b/sammy/src/endf/SammyRMatrixParameters.h
index abe53bed07ce3ce899169e31241f07c4cf9d23a4..b3afecee3402d05020079f11d2229611af615872 100644
--- a/sammy/src/endf/SammyRMatrixParameters.h
+++ b/sammy/src/endf/SammyRMatrixParameters.h
@@ -9,6 +9,7 @@
 #include "SammyIsoInfo.h"
 #include "SammyParticlePairInfo.h"
 #include "SammyChannelInfo.h"
+#include "SammyRExternalInfo.h"
 #include <vector>
 
 namespace sammy{
@@ -145,6 +146,37 @@ namespace sammy{
          */
         void addSpinGroupData(int iso, endf::RMatSpinGroup * group, double abundance, double target);
 
+        /**
+         * Get the number of R-external information
+         * @return  the number of R-external information
+         */
+        int getNumRext() const { return (int)rextInfo.size();}
+
+        /**
+         * Add r-external data for the indicated spin group and channel
+         *
+         * @param grp the group to which to add the data
+         * @param chan the channel to which to add the data
+         */
+        void addRext(int grp, int chan);
+
+        /**
+         * Get the R-external info at the indicated position
+         *
+         * @param index the desired index
+         * @return the R-external info
+         */
+        SammyRExternalInfo * getRextInfo(int index);
+        SammyRExternalInfo * getRextInfoByGroup(int grp, int channel);
+        bool hasRexInfo(int grp, int channel) const;
+
+        /**
+         * Get the underlying R-external R-Matrix object
+         * @param info the info needed to retrieve the data
+         * @return the underlying R-external R-Matrix object
+         */
+        endf::RExternalFunction * getRext(SammyRExternalInfo * info);
+
                   
         /**
          * Get the resonance for the indicated Resonance information object
@@ -294,6 +326,8 @@ namespace sammy{
         std::vector< std::shared_ptr<SammyParticlePairInfo> > particlePairInfo;
         
         std::vector<std::shared_ptr<SammyIsoInfo> > isoInfo;
+
+        std::vector<std::shared_ptr<SammyRExternalInfo> > rextInfo;
         
 
         /** The resonances in reduced width. 
diff --git a/sammy/src/endf/interface/cix/RMatResonanceParam.cpp2f.xml b/sammy/src/endf/interface/cix/RMatResonanceParam.cpp2f.xml
index 610f364411806925c0a2272ba31e81560711adb6..8038f6db7077d70352c7d8ca4c9a5e68e2470356 100644
--- a/sammy/src/endf/interface/cix/RMatResonanceParam.cpp2f.xml
+++ b/sammy/src/endf/interface/cix/RMatResonanceParam.cpp2f.xml
@@ -29,6 +29,59 @@
        <method name="isReducedWidth"  return_type="bool"/>      
   </class>
 
+  <class name="RExternalFunction">
+      <method name="getConstantRext" return_type="double"/>
+      <method name="getLinearRext" return_type="double"/>
+      <method name="getQuadraticRext" return_type="double"/>
+      <method name="getConstantCoeffLogTerm" return_type="double"/>
+      <method name="getLinearCoeffLogTerm" return_type="double"/>
+      <method name="getSingularityBelowErange" return_type="double"/>
+      <method name="getSingularityAboveErange" return_type="double"/>
+      <method name="getPoleStrength" return_type="double"/>
+      <method name="getAvgRadiationWidth" return_type="double"/>
+      <method name="getRealTab1" return_type="Tab1"/>
+      <method name="getImagTab1" return_type="Tab1"/>
+
+      <method name="setConstantRext">
+          <param name="Rcon" type="double"/>
+      </method>
+      <method name="setLinearRext">
+        <param name="Rlin" type="double"/>
+      </method>
+      <method name="setQuadraticRext">
+         <param name="Rquad" type="double"/>
+      </method>
+      <method name="setConstantCoeffLogTerm">
+         <param name="scon" type="double"/>
+      </method>
+      <method name="setLinearCoeffLogTerm">
+        <param name="slin" type="double"/>
+      </method>
+      <method name="setSingularityBelowErange">
+         <param name="Edown" type="double"/>
+      </method>
+      <method name="setSingularityAboveErange">
+        <param name="Eup" type="double"/>
+      </method>
+      <method name="setPoleStrength">
+        <param name="ps" type="double"/>
+      </method>
+      <method name="setAvgRadiationWidth">
+         <param name="avgGg" type="double"/>
+      </method>
+
+      <method name="getFormat" return_type="int"/>
+      <method name="setFormat">
+         <param name="lbk" type="int"/>
+      </method>
+      <method name="setRealTab1">
+         <param name="tab1Val" type="Tab1"/>
+      </method>
+      <method name="setImagTab1">
+         <param name="tab1Val" type="Tab1"/>
+      </method>
+  </class>
+
   <class name="RMatChannelParams">
        <!-- we don't have a default constructor - edit after creation to make it no operational -->
        <constructor name="initialize_DEFAULT">
@@ -61,6 +114,8 @@
        </method>
 
        <method name="getPpi"  return_type="int"/>
+
+       <method name="getRExternalFunc" return_type="RExternalFunction"/>
   </class>
 
   <class name="RMatSpinGroup">
@@ -93,6 +148,8 @@
        <method name="getChannel" return_type="RMatChannelParams*">
           <param name="nc" type="int" offset="-1"/>
        </method>
+
+       <method name="doesRExternalFunctionExist" return_type="bool"/>
   </class>
 
 
@@ -149,8 +206,8 @@
             <param name="index" type="int" offset="-1"/>
 	</method>
 	<method name="setPa">
-            <param name="index" type="double" offset="-1"/>
-            <param name="pa" type="int"/>
+            <param name="index" type="int" offset="-1"/>
+            <param name="pa" type="double"/>
 	</method>
 
 	<method name="getCalcShift" return_type="bool"/>
diff --git a/sammy/src/endf/interface/cix/SammyRExternalInfo.cpp2f.xml b/sammy/src/endf/interface/cix/SammyRExternalInfo.cpp2f.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5ec4cbb335546bb7b0543f5efb057a1894ecef20
--- /dev/null
+++ b/sammy/src/endf/interface/cix/SammyRExternalInfo.cpp2f.xml
@@ -0,0 +1,68 @@
+<generate name="SammyRExternalInfo">
+  <include_relative name="../../SammyRExternalInfo.h"/>
+  <using_namespace name="sammy"/>
+
+  <class name="SammyRExternalInfo">
+     <method name="getGrp" return_type="int"/>
+     <method name="getChannel" return_type="int"/>
+
+     <method name="getIflConstantRext" return_type="int"/>
+     <method name="getIflLinearRext" return_type="int"/>
+     <method name="getIflQuadraticRext" return_type="int"/>
+     <method name="getIflConstantCoeffLog" return_type="int"/>
+     <method name="getIflLinearCoeffLog" return_type="int"/>
+     <method name="getIflELowRange" return_type="int"/>
+     <method name="getIflEUpRange" return_type="int"/>
+     <method name="getIflPoleStrength" return_type="int"/>
+     <method name="getIflAvgRadWidth" return_type="int"/>
+
+     <method name="getNrext" return_type="int"/>
+
+     <method name="setGrp">
+        <param name="index"   type="int"  offset="-1"/>
+     </method>
+     <method name="setChannel">
+        <param name="index"   type="int"  offset="-1"/>
+      </method>
+
+     <method name="setIflConstantRext">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflLinearRext">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflQuadraticRext">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflConstantCoeffLog">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflLinearCoeffLog">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflELowRange">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflEUpRange">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflPoleStrength">
+       <param name="ifl"   type="int"/>
+     </method>
+     <method name="setIflAvgRadWidth">
+       <param name="ifl"   type="int"/>
+     </method>
+
+     <method name="getIflSammyIndex"  return_type="int">
+         <param name="i"   type="int"/>
+     </method>
+     <method name="setIflSammyIndex">
+        <param name="i"   type="int"/>
+        <param name="ifl"   type="int"/>
+     </method>
+
+     <method name="setNrext">
+       <param name="ifl"   type="int"/>
+     </method>
+  </class>
+</generate>
diff --git a/sammy/src/endf/interface/cix/SammyRMatrixParameters.cpp2f.xml b/sammy/src/endf/interface/cix/SammyRMatrixParameters.cpp2f.xml
index e56b4821dfeeaec57016ab50b8457a2485ce0221..04d2dea37339de37420ebfc538330592f355ae36 100644
--- a/sammy/src/endf/interface/cix/SammyRMatrixParameters.cpp2f.xml
+++ b/sammy/src/endf/interface/cix/SammyRMatrixParameters.cpp2f.xml
@@ -117,7 +117,27 @@
           <param name="info"   type="SammyChannelInfo *"/>  
           <param name="channel"   type="RMatChannelParams *"/>  
        </method>
-            
+
+       <method name="getNumRext" return_type="int"/>
+       <method name="addRext" >
+           <param name="grp"   type="int" offset="-1"/>
+           <param name="chan"   type="int" offset="-1"/>
+        </method>
+        <method name="getRextInfo"  return_type="SammyRExternalInfo *">
+            <param name="index"  type="int" offset="-1"/>
+        </method>
+        <method name="getRext"  return_type="RExternalFunction *">
+            <param name="info"  type="SammyRExternalInfo *"/>
+        </method>
+        <method name="getRextInfoByGroup"  return_type="SammyRExternalInfo *">
+            <param name="grp"  type="int" offset="-1"/>
+            <param name="channel"  type="int" offset="-1"/>
+        </method>
+        <method name="hasRexInfo"  return_type="bool">
+            <param name="grp"  type="int" offset="-1"/>
+            <param name="channel"  type="int" offset="-1"/>
+        </method>
+
       <method name="orderByGroupAndEnergy" return_type="int"/>  
       <method name="orderByEnergy" return_type="int"/>  
   </class>
diff --git a/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.cpp b/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.cpp
index d408cdb04560409dd5b54fe275aed6032651077e..b1d77ec9d6eb3ac30b12d05cfff519f83d18ed50 100644
--- a/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.cpp
+++ b/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.cpp
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Mon Dec 17 09:52:53 EST 2018
+* Date Generated: Wed Jun 09 12:46:14 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -54,6 +54,138 @@ void RMatResonance_destroy(void * RMatResonance_ptr)
     delete (RMatResonance*)RMatResonance_ptr;
 }
 
+double RExternalFunction_getConstantRext(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getConstantRext();
+}
+
+double RExternalFunction_getLinearRext(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getLinearRext();
+}
+
+double RExternalFunction_getQuadraticRext(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getQuadraticRext();
+}
+
+double RExternalFunction_getConstantCoeffLogTerm(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getConstantCoeffLogTerm();
+}
+
+double RExternalFunction_getLinearCoeffLogTerm(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getLinearCoeffLogTerm();
+}
+
+double RExternalFunction_getSingularityBelowErange(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getSingularityBelowErange();
+}
+
+double RExternalFunction_getSingularityAboveErange(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getSingularityAboveErange();
+}
+
+double RExternalFunction_getPoleStrength(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getPoleStrength();
+}
+
+double RExternalFunction_getAvgRadiationWidth(void * RExternalFunction_ptr)
+{
+    return ((RExternalFunction*)RExternalFunction_ptr)->getAvgRadiationWidth();
+}
+
+void* RExternalFunction_getRealTab1(void * RExternalFunction_ptr)
+{
+    const endf::Tab1& tab1 =  ((RExternalFunction*)RExternalFunction_ptr)->getRealTab1();
+    return (void*)const_cast<endf::Tab1*>(&tab1);
+}
+
+void* RExternalFunction_getImagTab1(void * RExternalFunction_ptr)
+{
+    const endf::Tab1& tab1 =((RExternalFunction*)RExternalFunction_ptr)->getImagTab1();
+    return (void*)const_cast<endf::Tab1*>(&tab1);
+}
+
+void RExternalFunction_setConstantRext(void * RExternalFunction_ptr,double * Rcon)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setConstantRext(*Rcon);
+}
+
+void RExternalFunction_setLinearRext(void * RExternalFunction_ptr,double * Rlin)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setLinearRext(*Rlin);
+}
+
+void RExternalFunction_setQuadraticRext(void * RExternalFunction_ptr,double * Rquad)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setQuadraticRext(*Rquad);
+}
+
+void RExternalFunction_setConstantCoeffLogTerm(void * RExternalFunction_ptr,double * scon)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setConstantCoeffLogTerm(*scon);
+}
+
+void RExternalFunction_setLinearCoeffLogTerm(void * RExternalFunction_ptr,double * slin)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setLinearCoeffLogTerm(*slin);
+}
+
+void RExternalFunction_setSingularityBelowErange(void * RExternalFunction_ptr,double * Edown)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setSingularityBelowErange(*Edown);
+}
+
+void RExternalFunction_setSingularityAboveErange(void * RExternalFunction_ptr,double * Eup)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setSingularityAboveErange(*Eup);
+}
+
+void RExternalFunction_setPoleStrength(void * RExternalFunction_ptr,double * ps)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setPoleStrength(*ps);
+}
+
+void RExternalFunction_setAvgRadiationWidth(void * RExternalFunction_ptr,double * avgGg)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setAvgRadiationWidth(*avgGg);
+}
+
+int RExternalFunction_getFormat(void * RExternalFunction_ptr)
+{
+    return (int)((RExternalFunction*)RExternalFunction_ptr)->formatType;
+}
+
+void RExternalFunction_setFormat(void * RExternalFunction_ptr,int * lbk)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setFormat(*lbk);
+}
+
+void RExternalFunction_setRealTab1(void * RExternalFunction_ptr,Tab1 * tab1Val)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setRealTab1(*tab1Val);
+}
+
+void RExternalFunction_setImagTab1(void * RExternalFunction_ptr,Tab1 * tab1Val)
+{
+    ((RExternalFunction*)RExternalFunction_ptr)->setImagTab1(*tab1Val);
+}
+
+void* RExternalFunction_initialize()
+{
+    return new RExternalFunction();
+}
+
+void RExternalFunction_destroy(void * RExternalFunction_ptr)
+{
+    delete (RExternalFunction*)RExternalFunction_ptr;
+}
+
 void* RMatChannelParams_initialize_DEFAULT(int * ppi )
 {
     return new RMatChannelParams(*ppi);
@@ -114,6 +246,12 @@ int RMatChannelParams_getPpi(void * RMatChannelParams_ptr)
     return ((RMatChannelParams*)RMatChannelParams_ptr)->getPpi();
 }
 
+void* RMatChannelParams_getRExternalFunc(void * RMatChannelParams_ptr)
+{
+    RExternalFunction & func = ((RMatChannelParams*)RMatChannelParams_ptr)->getRExternalFuncAlter();
+    return (void*)&func;
+}
+
 void* RMatChannelParams_initialize()
 {
    throw std::runtime_error("Not implemented");
@@ -169,9 +307,14 @@ void* RMatSpinGroup_getChannel(void * RMatSpinGroup_ptr,int * nc)
     return (void*)((RMatSpinGroup*)RMatSpinGroup_ptr)->getChannel(*nc);
 }
 
+bool RMatSpinGroup_doesRExternalFunctionExist(void * RMatSpinGroup_ptr)
+{
+    return ((RMatSpinGroup*)RMatSpinGroup_ptr)->doesRExternalFunctionExist();
+}
+
 void* RMatSpinGroup_initialize()
 {
-     throw std::runtime_error("Not implemented");
+   throw std::runtime_error("Not implemented");
 }
 
 void RMatSpinGroup_destroy(void * RMatSpinGroup_ptr)
@@ -227,8 +370,8 @@ int RMatParticlePair_getPnt(void * RMatParticlePair_ptr)
      return 0;
 }
 
-void RMatParticlePair_setPnt(void * RMatParticlePair_ptr,int* p)
-{   
+void RMatParticlePair_setPnt(void * RMatParticlePair_ptr,int * p)
+{
     if ( (*p) == 2) {
         ((RMatParticlePair*)RMatParticlePair_ptr)->setPnt(endf::RMatParticlePair::PenetrabilityFlag::ASSIGN);
     }
@@ -265,7 +408,7 @@ double RMatParticlePair_getPa(void * RMatParticlePair_ptr,int * index)
     return ((RMatParticlePair*)RMatParticlePair_ptr)->getPa(*index);
 }
 
-void RMatParticlePair_setPa(void * RMatParticlePair_ptr,int * index,int * pa)
+void RMatParticlePair_setPa(void * RMatParticlePair_ptr,int * index,double * pa)
 {
     ((RMatParticlePair*)RMatParticlePair_ptr)->setPa(*index,*pa);
 }
@@ -282,7 +425,7 @@ void RMatParticlePair_setCalcShift(void * RMatParticlePair_ptr,bool * calc)
 
 void* RMatParticlePair_initialize()
 {
-     throw std::runtime_error("Not implemented");
+    throw std::runtime_error("Not implemented");
 }
 
 void RMatParticlePair_destroy(void * RMatParticlePair_ptr)
@@ -352,7 +495,7 @@ void RMatResonanceParam_setCovariances(void * RMatResonanceParam_ptr,ResonanceCo
 
 void* RMatResonanceParam_initialize()
 {
-     throw std::runtime_error("Not implemented");
+    throw std::runtime_error("Not implemented");
 }
 
 void RMatResonanceParam_destroy(void * RMatResonanceParam_ptr)
diff --git a/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.h b/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.h
index c85903bf6db795e331a0436c265e1bf7caeb0b4b..12214dd6a5c03b7803f6ab2c12a593ef5e14f8be 100644
--- a/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.h
+++ b/sammy/src/endf/interface/cpp/RMatResonanceParamInterface.h
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Mon Dec 17 09:52:53 EST 2018
+* Date Generated: Wed Jun 09 12:46:14 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -24,6 +24,32 @@ void RMatResonance_setWidth(void * RMatResonance_ptr,int * nc,double * x);
 bool RMatResonance_isReducedWidth(void * RMatResonance_ptr);
 void* RMatResonance_initialize();
 void RMatResonance_destroy(void * RMatResonance_ptr);
+double RExternalFunction_getConstantRext(void * RExternalFunction_ptr);
+double RExternalFunction_getLinearRext(void * RExternalFunction_ptr);
+double RExternalFunction_getQuadraticRext(void * RExternalFunction_ptr);
+double RExternalFunction_getConstantCoeffLogTerm(void * RExternalFunction_ptr);
+double RExternalFunction_getLinearCoeffLogTerm(void * RExternalFunction_ptr);
+double RExternalFunction_getSingularityBelowErange(void * RExternalFunction_ptr);
+double RExternalFunction_getSingularityAboveErange(void * RExternalFunction_ptr);
+double RExternalFunction_getPoleStrength(void * RExternalFunction_ptr);
+double RExternalFunction_getAvgRadiationWidth(void * RExternalFunction_ptr);
+void* RExternalFunction_getRealTab1(void * RExternalFunction_ptr);
+void* RExternalFunction_getImagTab1(void * RExternalFunction_ptr);
+void RExternalFunction_setConstantRext(void * RExternalFunction_ptr,double * Rcon);
+void RExternalFunction_setLinearRext(void * RExternalFunction_ptr,double * Rlin);
+void RExternalFunction_setQuadraticRext(void * RExternalFunction_ptr,double * Rquad);
+void RExternalFunction_setConstantCoeffLogTerm(void * RExternalFunction_ptr,double * scon);
+void RExternalFunction_setLinearCoeffLogTerm(void * RExternalFunction_ptr,double * slin);
+void RExternalFunction_setSingularityBelowErange(void * RExternalFunction_ptr,double * Edown);
+void RExternalFunction_setSingularityAboveErange(void * RExternalFunction_ptr,double * Eup);
+void RExternalFunction_setPoleStrength(void * RExternalFunction_ptr,double * ps);
+void RExternalFunction_setAvgRadiationWidth(void * RExternalFunction_ptr,double * avgGg);
+int RExternalFunction_getFormat(void * RExternalFunction_ptr);
+void RExternalFunction_setFormat(void * RExternalFunction_ptr,int * lbk);
+void RExternalFunction_setRealTab1(void * RExternalFunction_ptr,Tab1 * tab1Val);
+void RExternalFunction_setImagTab1(void * RExternalFunction_ptr,Tab1 * tab1Val);
+void* RExternalFunction_initialize();
+void RExternalFunction_destroy(void * RExternalFunction_ptr);
 void* RMatChannelParams_initialize_DEFAULT(int * ppi );
 int RMatChannelParams_getL(void * RMatChannelParams_ptr);
 void RMatChannelParams_setL(void * RMatChannelParams_ptr,int * l);
@@ -36,6 +62,7 @@ void RMatChannelParams_setApe(void * RMatChannelParams_ptr,double * s);
 double RMatChannelParams_getApt(void * RMatChannelParams_ptr);
 void RMatChannelParams_setApt(void * RMatChannelParams_ptr,double * s);
 int RMatChannelParams_getPpi(void * RMatChannelParams_ptr);
+void* RMatChannelParams_getRExternalFunc(void * RMatChannelParams_ptr);
 void* RMatChannelParams_initialize();
 void RMatChannelParams_destroy(void * RMatChannelParams_ptr);
 void* RMatSpinGroup_initialize_DEFAULT(double * j,double * pj );
@@ -47,6 +74,7 @@ void RMatSpinGroup_addChannel(void * RMatSpinGroup_ptr,RMatChannelParams* chan);
 void RMatSpinGroup_addResonance(void * RMatSpinGroup_ptr,RMatResonance* res);
 void* RMatSpinGroup_getResonance(void * RMatSpinGroup_ptr,int * nres);
 void* RMatSpinGroup_getChannel(void * RMatSpinGroup_ptr,int * nc);
+bool RMatSpinGroup_doesRExternalFunctionExist(void * RMatSpinGroup_ptr);
 void* RMatSpinGroup_initialize();
 void RMatSpinGroup_destroy(void * RMatSpinGroup_ptr);
 void* RMatParticlePair_initialize_DEFAULT(int * ppi );
@@ -64,7 +92,7 @@ void RMatParticlePair_setMt(void * RMatParticlePair_ptr,int * mt);
 double RMatParticlePair_getIa(void * RMatParticlePair_ptr,int * index);
 void RMatParticlePair_setIa(void * RMatParticlePair_ptr,int * index,double * ia);
 double RMatParticlePair_getPa(void * RMatParticlePair_ptr,int * index);
-void RMatParticlePair_setPa(void * RMatParticlePair_ptr,int * index,int * pa);
+void RMatParticlePair_setPa(void * RMatParticlePair_ptr,int * index,double * pa);
 bool RMatParticlePair_getCalcShift(void * RMatParticlePair_ptr);
 void RMatParticlePair_setCalcShift(void * RMatParticlePair_ptr,bool * calc);
 void* RMatParticlePair_initialize();
diff --git a/sammy/src/endf/interface/cpp/SammyRExternalInfoInterface.cpp b/sammy/src/endf/interface/cpp/SammyRExternalInfoInterface.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5b37a6cea8a097d7f75a5f3c7eadaebcb7d75d5f
--- /dev/null
+++ b/sammy/src/endf/interface/cpp/SammyRExternalInfoInterface.cpp
@@ -0,0 +1,151 @@
+/*!
+* This file has been dynamically generated by Class Interface Xml (CIX) 
+* DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
+* If changes need to occur, modify the appropriate CIX xml file
+* Date Generated: Thu Jun 10 11:48:13 EDT 2021
+* If any issues are experiences with this generated file that cannot be fixed
+* with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
+*/
+#include <string.h>
+#include "SammyRExternalInfoInterface.h"
+using namespace sammy;
+int SammyRExternalInfo_getGrp(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getGrp();
+}
+
+int SammyRExternalInfo_getChannel(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getChannel();
+}
+
+int SammyRExternalInfo_getIflConstantRext(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflConstantRext();
+}
+
+int SammyRExternalInfo_getIflLinearRext(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflLinearRext();
+}
+
+int SammyRExternalInfo_getIflQuadraticRext(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflQuadraticRext();
+}
+
+int SammyRExternalInfo_getIflConstantCoeffLog(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflConstantCoeffLog();
+}
+
+int SammyRExternalInfo_getIflLinearCoeffLog(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflLinearCoeffLog();
+}
+
+int SammyRExternalInfo_getIflELowRange(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflELowRange();
+}
+
+int SammyRExternalInfo_getIflEUpRange(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflEUpRange();
+}
+
+int SammyRExternalInfo_getIflPoleStrength(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflPoleStrength();
+}
+
+int SammyRExternalInfo_getIflAvgRadWidth(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflAvgRadWidth();
+}
+
+int SammyRExternalInfo_getNrext(void * SammyRExternalInfo_ptr)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getNrext();
+}
+
+void SammyRExternalInfo_setGrp(void * SammyRExternalInfo_ptr,int * index)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setGrp(*index);
+}
+
+void SammyRExternalInfo_setChannel(void * SammyRExternalInfo_ptr,int * index)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setChannel(*index);
+}
+
+void SammyRExternalInfo_setIflConstantRext(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflConstantRext(*ifl);
+}
+
+void SammyRExternalInfo_setIflLinearRext(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflLinearRext(*ifl);
+}
+
+void SammyRExternalInfo_setIflQuadraticRext(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflQuadraticRext(*ifl);
+}
+
+void SammyRExternalInfo_setIflConstantCoeffLog(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflConstantCoeffLog(*ifl);
+}
+
+void SammyRExternalInfo_setIflLinearCoeffLog(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflLinearCoeffLog(*ifl);
+}
+
+void SammyRExternalInfo_setIflELowRange(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflELowRange(*ifl);
+}
+
+void SammyRExternalInfo_setIflEUpRange(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflEUpRange(*ifl);
+}
+
+void SammyRExternalInfo_setIflPoleStrength(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflPoleStrength(*ifl);
+}
+
+void SammyRExternalInfo_setIflAvgRadWidth(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflAvgRadWidth(*ifl);
+}
+
+int SammyRExternalInfo_getIflSammyIndex(void * SammyRExternalInfo_ptr,int * i)
+{
+    return ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->getIflSammyIndex(*i);
+}
+
+void SammyRExternalInfo_setIflSammyIndex(void * SammyRExternalInfo_ptr,int * i,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setIflSammyIndex(*i,*ifl);
+}
+
+void SammyRExternalInfo_setNrext(void * SammyRExternalInfo_ptr,int * ifl)
+{
+    ((SammyRExternalInfo*)SammyRExternalInfo_ptr)->setNrext(*ifl);
+}
+
+void* SammyRExternalInfo_initialize()
+{
+    return new SammyRExternalInfo();
+}
+
+void SammyRExternalInfo_destroy(void * SammyRExternalInfo_ptr)
+{
+    delete (SammyRExternalInfo*)SammyRExternalInfo_ptr;
+}
+
diff --git a/sammy/src/endf/interface/cpp/SammyRExternalInfoInterface.h b/sammy/src/endf/interface/cpp/SammyRExternalInfoInterface.h
new file mode 100644
index 0000000000000000000000000000000000000000..c2142258a2a228b9b8ce762b60b39c204526cf53
--- /dev/null
+++ b/sammy/src/endf/interface/cpp/SammyRExternalInfoInterface.h
@@ -0,0 +1,47 @@
+/*!
+* This file has been dynamically generated by Class Interface Xml (CIX) 
+* DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
+* If changes need to occur, modify the appropriate CIX xml file
+* Date Generated: Thu Jun 10 11:48:13 EDT 2021
+* If any issues are experiences with this generated file that cannot be fixed
+* with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
+*/
+#ifndef SAMMYREXTERNALINFOINTERFACE_H
+#define SAMMYREXTERNALINFOINTERFACE_H
+#include "../../SammyRExternalInfo.h"
+using namespace sammy;
+#ifdef __cplusplus
+extern "C" {
+#endif
+int SammyRExternalInfo_getGrp(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getChannel(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflConstantRext(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflLinearRext(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflQuadraticRext(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflConstantCoeffLog(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflLinearCoeffLog(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflELowRange(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflEUpRange(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflPoleStrength(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getIflAvgRadWidth(void * SammyRExternalInfo_ptr);
+int SammyRExternalInfo_getNrext(void * SammyRExternalInfo_ptr);
+void SammyRExternalInfo_setGrp(void * SammyRExternalInfo_ptr,int * index);
+void SammyRExternalInfo_setChannel(void * SammyRExternalInfo_ptr,int * index);
+void SammyRExternalInfo_setIflConstantRext(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflLinearRext(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflQuadraticRext(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflConstantCoeffLog(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflLinearCoeffLog(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflELowRange(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflEUpRange(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflPoleStrength(void * SammyRExternalInfo_ptr,int * ifl);
+void SammyRExternalInfo_setIflAvgRadWidth(void * SammyRExternalInfo_ptr,int * ifl);
+int SammyRExternalInfo_getIflSammyIndex(void * SammyRExternalInfo_ptr,int * i);
+void SammyRExternalInfo_setIflSammyIndex(void * SammyRExternalInfo_ptr,int * i,int * ifl);
+void SammyRExternalInfo_setNrext(void * SammyRExternalInfo_ptr,int * ifl);
+void* SammyRExternalInfo_initialize();
+void SammyRExternalInfo_destroy(void * SammyRExternalInfo_ptr);
+#ifdef __cplusplus
+}
+#endif
+#endif /* SAMMYREXTERNALINFOINTERFACE_H */
diff --git a/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.cpp b/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.cpp
index 2aa76219687faced651baad030e9f6c414886729..261eaafdb47075c0b3baaffa183f57889bfa2e7a 100644
--- a/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.cpp
+++ b/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.cpp
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Wed Sep 18 17:36:12 EDT 2019
+* Date Generated: Thu Jun 10 11:51:58 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -164,6 +164,36 @@ void SammyRMatrixParameters_addChannelData(void * SammyRMatrixParameters_ptr,Sam
     ((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->addChannelData(info,channel);
 }
 
+int SammyRMatrixParameters_getNumRext(void * SammyRMatrixParameters_ptr)
+{
+    return ((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->getNumRext();
+}
+
+void SammyRMatrixParameters_addRext(void * SammyRMatrixParameters_ptr,int * grp,int * chan)
+{
+    ((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->addRext(*grp,*chan);
+}
+
+void* SammyRMatrixParameters_getRextInfo(void * SammyRMatrixParameters_ptr,int * index)
+{
+    return (void*)((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->getRextInfo(*index);
+}
+
+void* SammyRMatrixParameters_getRext(void * SammyRMatrixParameters_ptr,SammyRExternalInfo * info)
+{
+    return (void*)((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->getRext(info);
+}
+
+void* SammyRMatrixParameters_getRextInfoByGroup(void * SammyRMatrixParameters_ptr,int * grp,int * channel)
+{
+    return (void*)((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->getRextInfoByGroup(*grp,*channel);
+}
+
+bool SammyRMatrixParameters_hasRexInfo(void * SammyRMatrixParameters_ptr,int * grp,int * channel)
+{
+    return ((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->hasRexInfo(*grp,*channel);
+}
+
 int SammyRMatrixParameters_orderByGroupAndEnergy(void * SammyRMatrixParameters_ptr)
 {
     return ((SammyRMatrixParameters*)SammyRMatrixParameters_ptr)->orderByGroupAndEnergy();
diff --git a/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.h b/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.h
index c568754fa75a82d50dd092f0da24f94e96a21777..9dc5d2e94049cc32f08bb17f6db096acc00e1438 100644
--- a/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.h
+++ b/sammy/src/endf/interface/cpp/SammyRMatrixParametersInterface.h
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Wed Sep 18 17:36:12 EDT 2019
+* Date Generated: Thu Jun 10 11:51:58 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -47,6 +47,12 @@ int SammyRMatrixParameters_getNumParticlePair(void * SammyRMatrixParameters_ptr)
 void SammyRMatrixParameters_transferParticlePairData(void * SammyRMatrixParameters_ptr,SammyRMatrixParameters * data);
 void* SammyRMatrixParameters_getChannel(void * SammyRMatrixParameters_ptr,SammyChannelInfo* info);
 void SammyRMatrixParameters_addChannelData(void * SammyRMatrixParameters_ptr,SammyChannelInfo * info,endf::RMatChannelParams * channel);
+int SammyRMatrixParameters_getNumRext(void * SammyRMatrixParameters_ptr);
+void SammyRMatrixParameters_addRext(void * SammyRMatrixParameters_ptr,int * grp,int * chan);
+void* SammyRMatrixParameters_getRextInfo(void * SammyRMatrixParameters_ptr,int * index);
+void* SammyRMatrixParameters_getRext(void * SammyRMatrixParameters_ptr,SammyRExternalInfo * info);
+void* SammyRMatrixParameters_getRextInfoByGroup(void * SammyRMatrixParameters_ptr,int * grp,int * channel);
+bool SammyRMatrixParameters_hasRexInfo(void * SammyRMatrixParameters_ptr,int * grp,int * channel);
 int SammyRMatrixParameters_orderByGroupAndEnergy(void * SammyRMatrixParameters_ptr);
 int SammyRMatrixParameters_orderByEnergy(void * SammyRMatrixParameters_ptr);
 void* SammyRMatrixParameters_initialize();
diff --git a/sammy/src/endf/interface/fortran/RMatResonanceParam_I.f90 b/sammy/src/endf/interface/fortran/RMatResonanceParam_I.f90
index 8dfa3c8c435bf77fb14e488f10d658eb5d643d07..5cc65210f561aa9d2aa1b512c8284ba995f0700c 100644
--- a/sammy/src/endf/interface/fortran/RMatResonanceParam_I.f90
+++ b/sammy/src/endf/interface/fortran/RMatResonanceParam_I.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Mon Dec 17 09:52:53 EST 2018
+!! Date Generated: Wed Jun 09 12:46:14 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -61,6 +61,148 @@ subroutine f_RMatResonance_destroy(this) BIND(C,name="RMatResonance_destroy")
     implicit none
     type(C_PTR), value :: this;
 end subroutine
+real(C_DOUBLE) function f_RExternalFunction_getConstantRext(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getConstantRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getLinearRext(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getLinearRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getQuadraticRext(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getQuadraticRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getConstantCoeffLogTerm(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getConstantCoeffLogTerm")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getLinearCoeffLogTerm(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getLinearCoeffLogTerm")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getSingularityBelowErange(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getSingularityBelowErange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getSingularityAboveErange(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getSingularityAboveErange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getPoleStrength(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getPoleStrength")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+real(C_DOUBLE) function f_RExternalFunction_getAvgRadiationWidth(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getAvgRadiationWidth")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+type(C_PTR) function f_RExternalFunction_getRealTab1(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getRealTab1")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+type(C_PTR) function f_RExternalFunction_getImagTab1(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getImagTab1")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+subroutine f_RExternalFunction_setConstantRext(RExternalFunction_ptr, Rcon ) BIND(C,name="RExternalFunction_setConstantRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: Rcon;
+end subroutine
+subroutine f_RExternalFunction_setLinearRext(RExternalFunction_ptr, Rlin ) BIND(C,name="RExternalFunction_setLinearRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: Rlin;
+end subroutine
+subroutine f_RExternalFunction_setQuadraticRext(RExternalFunction_ptr, Rquad ) BIND(C,name="RExternalFunction_setQuadraticRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: Rquad;
+end subroutine
+subroutine f_RExternalFunction_setConstantCoeffLogTerm(RExternalFunction_ptr, scon ) BIND(C,name="RExternalFunction_setConstantCoeffLogTerm")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: scon;
+end subroutine
+subroutine f_RExternalFunction_setLinearCoeffLogTerm(RExternalFunction_ptr, slin ) BIND(C,name="RExternalFunction_setLinearCoeffLogTerm")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: slin;
+end subroutine
+subroutine f_RExternalFunction_setSingularityBelowErange(RExternalFunction_ptr, Edown ) BIND(C,name="RExternalFunction_setSingularityBelowErange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: Edown;
+end subroutine
+subroutine f_RExternalFunction_setSingularityAboveErange(RExternalFunction_ptr, Eup ) BIND(C,name="RExternalFunction_setSingularityAboveErange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: Eup;
+end subroutine
+subroutine f_RExternalFunction_setPoleStrength(RExternalFunction_ptr, ps ) BIND(C,name="RExternalFunction_setPoleStrength")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: ps;
+end subroutine
+subroutine f_RExternalFunction_setAvgRadiationWidth(RExternalFunction_ptr, avgGg ) BIND(C,name="RExternalFunction_setAvgRadiationWidth")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    real(C_DOUBLE) :: avgGg;
+end subroutine
+integer(C_INT) function f_RExternalFunction_getFormat(RExternalFunction_ptr ) BIND(C,name="RExternalFunction_getFormat")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+end function
+subroutine f_RExternalFunction_setFormat(RExternalFunction_ptr, lbk ) BIND(C,name="RExternalFunction_setFormat")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    integer(C_INT) :: lbk;
+end subroutine
+subroutine f_RExternalFunction_setRealTab1(RExternalFunction_ptr, tab1Val ) BIND(C,name="RExternalFunction_setRealTab1")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    type(C_PTR), value :: tab1Val;
+end subroutine
+subroutine f_RExternalFunction_setImagTab1(RExternalFunction_ptr, tab1Val ) BIND(C,name="RExternalFunction_setImagTab1")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RExternalFunction_ptr;
+    type(C_PTR), value :: tab1Val;
+end subroutine
+type(C_PTR) function f_RExternalFunction_initialize( )BIND(C,name="RExternalFunction_initialize")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR) :: RExternalFunction_ptr;
+end function
+subroutine f_RExternalFunction_destroy(this) BIND(C,name="RExternalFunction_destroy")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: this;
+end subroutine
 type(C_PTR) function f_RMatChannelParams_initialize_DEFAULT( ppi )BIND(C,name="RMatChannelParams_initialize_DEFAULT")
     use,intrinsic :: ISO_C_BINDING
     implicit none
@@ -127,6 +269,11 @@ integer(C_INT) function f_RMatChannelParams_getPpi(RMatChannelParams_ptr ) BIND(
     implicit none
     type(C_PTR), value :: RMatChannelParams_ptr;
 end function
+type(C_PTR) function f_RMatChannelParams_getRExternalFunc(RMatChannelParams_ptr ) BIND(C,name="RMatChannelParams_getRExternalFunc")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RMatChannelParams_ptr;
+end function
 type(C_PTR) function f_RMatChannelParams_initialize( )BIND(C,name="RMatChannelParams_initialize")
     use,intrinsic :: ISO_C_BINDING
     implicit none
@@ -188,6 +335,11 @@ type(C_PTR) function f_RMatSpinGroup_getChannel(RMatSpinGroup_ptr, nc ) BIND(C,n
     type(C_PTR), value :: RMatSpinGroup_ptr;
     integer(C_INT) :: nc;
 end function
+logical(C_BOOL) function f_RMatSpinGroup_doesRExternalFunctionExist(RMatSpinGroup_ptr ) BIND(C,name="RMatSpinGroup_doesRExternalFunctionExist")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: RMatSpinGroup_ptr;
+end function
 type(C_PTR) function f_RMatSpinGroup_initialize( )BIND(C,name="RMatSpinGroup_initialize")
     use,intrinsic :: ISO_C_BINDING
     implicit none
@@ -246,7 +398,7 @@ subroutine f_RMatParticlePair_setQ(RMatParticlePair_ptr, q ) BIND(C,name="RMatPa
     type(C_PTR), value :: RMatParticlePair_ptr;
     real(C_DOUBLE) :: q;
 end subroutine
-integer(C_INT) function f_RMatParticlePair_getPnt(RMatParticlePair_ptr) BIND(C,name="RMatParticlePair_getPnt")
+integer(C_INT) function f_RMatParticlePair_getPnt(RMatParticlePair_ptr ) BIND(C,name="RMatParticlePair_getPnt")
     use,intrinsic :: ISO_C_BINDING
     implicit none
     type(C_PTR), value :: RMatParticlePair_ptr;
@@ -292,7 +444,7 @@ subroutine f_RMatParticlePair_setPa(RMatParticlePair_ptr, index,pa ) BIND(C,name
     implicit none
     type(C_PTR), value :: RMatParticlePair_ptr;
     integer(C_INT) :: index;
-    integer(C_INT) :: pa;
+    real(C_DOUBLE) :: pa;
 end subroutine
 logical(C_BOOL) function f_RMatParticlePair_getCalcShift(RMatParticlePair_ptr ) BIND(C,name="RMatParticlePair_getCalcShift")
     use,intrinsic :: ISO_C_BINDING
diff --git a/sammy/src/endf/interface/fortran/RMatResonanceParam_M.f90 b/sammy/src/endf/interface/fortran/RMatResonanceParam_M.f90
index c9f938d2e705ea79af73c3a370717751fa16673d..f36833e490ae3f343fb64e56e00c0f6b50f9c6c2 100644
--- a/sammy/src/endf/interface/fortran/RMatResonanceParam_M.f90
+++ b/sammy/src/endf/interface/fortran/RMatResonanceParam_M.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Mon Dec 17 09:52:53 EST 2018
+!! Date Generated: Wed Jun 09 12:46:14 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -10,7 +10,7 @@ module RMatResonanceParam_M
 use, intrinsic :: ISO_C_BINDING
 use RMatResonanceParam_I
 use ResonanceCovariance_M
-use EnumerationData_M
+use Tab1_M
 type RMatResonance
     type(C_PTR) :: instance_ptr=C_NULL_PTR
     contains
@@ -24,6 +24,38 @@ type RMatResonance
     procedure, pass(this) :: initialize => RMatResonance_initialize
     procedure, pass(this) :: destroy => RMatResonance_destroy
 end type RMatResonance
+type RExternalFunction
+    type(C_PTR) :: instance_ptr=C_NULL_PTR
+    contains
+    procedure, pass(this) :: getConstantRext => RExternalFunction_getConstantRext
+    procedure, pass(this) :: getLinearRext => RExternalFunction_getLinearRext
+    procedure, pass(this) :: getQuadraticRext => RExternalFunction_getQuadraticRext
+    procedure, pass(this) :: getConstantCoeffLogTerm => RExternalFunction_getConstantCoeffLogTerm
+    procedure, pass(this) :: getLinearCoeffLogTerm => RExternalFunction_getLinearCoeffLogTerm
+    procedure, pass(this) :: getSingularityBelowErange => RExternalFunction_getSingularityBelowErange
+    procedure, pass(this) :: getSingularityAboveErange => RExternalFunction_getSingularityAboveErange
+    procedure, pass(this) :: getPoleStrength => RExternalFunction_getPoleStrength
+    procedure, pass(this) :: getAvgRadiationWidth => RExternalFunction_getAvgRadiationWidth
+    procedure, pass(this) :: getRealTab1 => RExternalFunction_getRealTab1
+    procedure, pass(this) :: getImagTab1 => RExternalFunction_getImagTab1
+    procedure, pass(this) :: setConstantRext => RExternalFunction_setConstantRext
+    procedure, pass(this) :: setLinearRext => RExternalFunction_setLinearRext
+    procedure, pass(this) :: setQuadraticRext => RExternalFunction_setQuadraticRext
+    procedure, pass(this) :: setConstantCoeffLogTerm => RExternalFunction_setConstantCoeffLogTerm
+    procedure, pass(this) :: setLinearCoeffLogTerm => RExternalFunction_setLinearCoeffLogTerm
+    procedure, pass(this) :: setSingularityBelowErange => RExternalFunction_setSingularityBelowErange
+    procedure, pass(this) :: setSingularityAboveErange => RExternalFunction_setSingularityAboveErange
+    procedure, pass(this) :: setPoleStrength => RExternalFunction_setPoleStrength
+    procedure, pass(this) :: setAvgRadiationWidth => RExternalFunction_setAvgRadiationWidth
+    procedure, pass(this) :: getFormat => RExternalFunction_getFormat
+    procedure, pass(this) :: setFormat => RExternalFunction_setFormat
+    procedure, pass(this) :: setRealTab1 => RExternalFunction_setRealTab1
+    procedure, pass(this) :: setImagTab1 => RExternalFunction_setImagTab1
+    procedure, pass(this) :: setSammyValue => RExternalFunction_setSammyValue
+    procedure, pass(this) :: getSammyValue => RExternalFunction_getSammyValue
+    procedure, pass(this) :: initialize => RExternalFunction_initialize
+    procedure, pass(this) :: destroy => RExternalFunction_destroy
+end type RExternalFunction
 type RMatChannelParams
     type(C_PTR) :: instance_ptr=C_NULL_PTR
     contains
@@ -39,6 +71,7 @@ type RMatChannelParams
     procedure, pass(this) :: getApt => RMatChannelParams_getApt
     procedure, pass(this) :: setApt => RMatChannelParams_setApt
     procedure, pass(this) :: getPpi => RMatChannelParams_getPpi
+    procedure, pass(this) :: getRExternalFunc => RMatChannelParams_getRExternalFunc
     procedure, pass(this) :: initialize => RMatChannelParams_initialize
     procedure, pass(this) :: destroy => RMatChannelParams_destroy
 end type RMatChannelParams
@@ -54,6 +87,7 @@ type RMatSpinGroup
     procedure, pass(this) :: addResonance => RMatSpinGroup_addResonance
     procedure, pass(this) :: getResonance => RMatSpinGroup_getResonance
     procedure, pass(this) :: getChannel => RMatSpinGroup_getChannel
+    procedure, pass(this) :: doesRExternalFunctionExist => RMatSpinGroup_doesRExternalFunctionExist
     procedure, pass(this) :: initialize => RMatSpinGroup_initialize
     procedure, pass(this) :: destroy => RMatSpinGroup_destroy
 end type RMatSpinGroup
@@ -157,6 +191,206 @@ subroutine RMatResonance_destroy(this)
     call f_RMatResonance_destroy(this%instance_ptr)
     this%instance_ptr = C_NULL_PTR
 end subroutine
+function RExternalFunction_getConstantRext(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getConstantRext(this%instance_ptr)
+end function
+function RExternalFunction_getLinearRext(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getLinearRext(this%instance_ptr)
+end function
+function RExternalFunction_getQuadraticRext(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getQuadraticRext(this%instance_ptr)
+end function
+function RExternalFunction_getConstantCoeffLogTerm(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getConstantCoeffLogTerm(this%instance_ptr)
+end function
+function RExternalFunction_getLinearCoeffLogTerm(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getLinearCoeffLogTerm(this%instance_ptr)
+end function
+function RExternalFunction_getSingularityBelowErange(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getSingularityBelowErange(this%instance_ptr)
+end function
+function RExternalFunction_getSingularityAboveErange(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getSingularityAboveErange(this%instance_ptr)
+end function
+function RExternalFunction_getPoleStrength(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getPoleStrength(this%instance_ptr)
+end function
+function RExternalFunction_getAvgRadiationWidth(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE):: result2Return
+    result2Return=f_RExternalFunction_getAvgRadiationWidth(this%instance_ptr)
+end function
+subroutine RExternalFunction_getRealTab1(this, object_ptr)
+    implicit none
+    class(RExternalFunction)::this
+    class(Tab1) :: object_ptr
+    object_ptr%instance_ptr = f_RExternalFunction_getRealTab1(this%instance_ptr)
+end subroutine
+subroutine RExternalFunction_getImagTab1(this, object_ptr)
+    implicit none
+    class(RExternalFunction)::this
+    class(Tab1) :: object_ptr
+    object_ptr%instance_ptr = f_RExternalFunction_getImagTab1(this%instance_ptr)
+end subroutine
+subroutine RExternalFunction_setConstantRext(this, Rcon)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::Rcon
+    call f_RExternalFunction_setConstantRext(this%instance_ptr, Rcon)
+end subroutine
+subroutine RExternalFunction_setLinearRext(this, Rlin)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::Rlin
+    call f_RExternalFunction_setLinearRext(this%instance_ptr, Rlin)
+end subroutine
+subroutine RExternalFunction_setQuadraticRext(this, Rquad)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::Rquad
+    call f_RExternalFunction_setQuadraticRext(this%instance_ptr, Rquad)
+end subroutine
+subroutine RExternalFunction_setConstantCoeffLogTerm(this, scon)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::scon
+    call f_RExternalFunction_setConstantCoeffLogTerm(this%instance_ptr, scon)
+end subroutine
+subroutine RExternalFunction_setLinearCoeffLogTerm(this, slin)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::slin
+    call f_RExternalFunction_setLinearCoeffLogTerm(this%instance_ptr, slin)
+end subroutine
+subroutine RExternalFunction_setSingularityBelowErange(this, Edown)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::Edown
+    call f_RExternalFunction_setSingularityBelowErange(this%instance_ptr, Edown)
+end subroutine
+subroutine RExternalFunction_setSingularityAboveErange(this, Eup)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::Eup
+    call f_RExternalFunction_setSingularityAboveErange(this%instance_ptr, Eup)
+end subroutine
+subroutine RExternalFunction_setPoleStrength(this, ps)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::ps
+    call f_RExternalFunction_setPoleStrength(this%instance_ptr, ps)
+end subroutine
+subroutine RExternalFunction_setAvgRadiationWidth(this, avgGg)
+    implicit none
+    class(RExternalFunction)::this
+    real(C_DOUBLE)::avgGg
+    call f_RExternalFunction_setAvgRadiationWidth(this%instance_ptr, avgGg)
+end subroutine
+function RExternalFunction_getFormat(this) result(result2Return)
+    implicit none
+    class(RExternalFunction)::this
+    integer(C_INT):: result2Return
+    result2Return=f_RExternalFunction_getFormat(this%instance_ptr)
+end function
+subroutine RExternalFunction_setFormat(this, lbk)
+    implicit none
+    class(RExternalFunction)::this
+    integer(C_INT)::lbk
+    call f_RExternalFunction_setFormat(this%instance_ptr, lbk)
+end subroutine
+subroutine RExternalFunction_setRealTab1(this, tab1Val)
+    implicit none
+    class(RExternalFunction)::this
+    class(Tab1)::tab1Val
+    call f_RExternalFunction_setRealTab1(this%instance_ptr, tab1Val%instance_ptr)
+end subroutine
+subroutine RExternalFunction_setImagTab1(this, tab1Val)
+    implicit none
+    class(RExternalFunction)::this
+    class(Tab1)::tab1Val
+    call f_RExternalFunction_setImagTab1(this%instance_ptr, tab1Val%instance_ptr)
+end subroutine
+subroutine RExternalFunction_setSammyValue(this, i, val)
+    implicit none
+    class(RExternalFunction)::this
+    integer::I
+    real(kind=8)::val
+    select case(i)
+       case(1)
+          call this%setSingularityBelowErange(val)
+       case(2)
+          call this%setSingularityAboveErange(val)
+       case(3)
+          call this%setConstantRext(val)
+       case(4)
+          call this%setLinearRext(val)
+       case(5)
+          call this%setConstantCoeffLogTerm(val)
+       case(6)
+          call this%setLinearCoeffLogTerm(val)
+       case(7)
+          call this%setQuadraticRext(val)
+     end select
+end subroutine
+real(kind=8) function RExternalFunction_getSammyValue(this, i) result(val)
+    implicit none
+    class(RExternalFunction)::this
+    integer::I
+
+    val = 0.0d0
+    select case(i)
+       case(1)
+          val = this%getSingularityBelowErange()
+       case(2)
+          val = this%getSingularityAboveErange()
+       case(3)
+          val = this%getConstantRext()
+       case(4)
+          val = this%getLinearRext()
+       case(5)
+          val = this%getConstantCoeffLogTerm()
+       case(6)
+          val = this%getLinearCoeffLogTerm()
+       case(7)
+          val = this%getQuadraticRext()
+     end select
+end function
+subroutine RExternalFunction_initialize(this)
+    implicit none
+    class(RExternalFunction) :: this
+    this%instance_ptr = f_RExternalFunction_initialize()
+end subroutine
+subroutine RExternalFunction_destroy(this)
+    implicit none
+    class(RExternalFunction) :: this
+    call f_RExternalFunction_destroy(this%instance_ptr)
+    this%instance_ptr = C_NULL_PTR
+end subroutine
 subroutine RMatChannelParams_initialize_DEFAULT(this, ppi)
     implicit none
     class(RMatChannelParams) :: this
@@ -229,6 +463,12 @@ function RMatChannelParams_getPpi(this) result(result2Return)
     integer(C_INT):: result2Return
     result2Return=f_RMatChannelParams_getPpi(this%instance_ptr)
 end function
+subroutine RMatChannelParams_getRExternalFunc(this, object_ptr)
+    implicit none
+    class(RMatChannelParams)::this
+    class(RExternalFunction) :: object_ptr
+    object_ptr%instance_ptr = f_RMatChannelParams_getRExternalFunc(this%instance_ptr)
+end subroutine
 subroutine RMatChannelParams_initialize(this)
     implicit none
     class(RMatChannelParams) :: this
@@ -297,6 +537,12 @@ subroutine RMatSpinGroup_getChannel(this, object_ptr, nc)
     integer(C_INT)::nc
     object_ptr%instance_ptr = f_RMatSpinGroup_getChannel(this%instance_ptr, nc-1)
 end subroutine
+function RMatSpinGroup_doesRExternalFunctionExist(this) result(result2Return)
+    implicit none
+    class(RMatSpinGroup)::this
+    logical(C_BOOL):: result2Return
+    result2Return=f_RMatSpinGroup_doesRExternalFunctionExist(this%instance_ptr)
+end function
 subroutine RMatSpinGroup_initialize(this)
     implicit none
     class(RMatSpinGroup) :: this
@@ -338,7 +584,7 @@ function RMatParticlePair_getZa(this, index) result(result2Return)
     implicit none
     class(RMatParticlePair)::this
     integer(C_INT)::index
-    integer(C_INT)::result2Return
+    integer(C_INT):: result2Return
     result2Return=f_RMatParticlePair_getZa(this%instance_ptr, index-1)
 end function
 subroutine RMatParticlePair_setZa(this, index, za)
@@ -362,8 +608,8 @@ subroutine RMatParticlePair_setQ(this, q)
 end subroutine
 function RMatParticlePair_getPnt(this) result(result2Return)
     implicit none
-    integer(C_INT)::result2Return  
-    class(RMatParticlePair)::this 
+    class(RMatParticlePair)::this
+    integer(C_INT):: result2Return
     result2Return=f_RMatParticlePair_getPnt(this%instance_ptr)
 end function
 subroutine RMatParticlePair_setPnt(this, p)
@@ -409,7 +655,7 @@ subroutine RMatParticlePair_setPa(this, index, pa)
     implicit none
     class(RMatParticlePair)::this
     integer(C_INT)::index
-    integer(C_INT)::pa
+    real(C_DOUBLE)::pa
     call f_RMatParticlePair_setPa(this%instance_ptr, index-1,pa)
 end subroutine
 function RMatParticlePair_getCalcShift(this) result(result2Return)
diff --git a/sammy/src/endf/interface/fortran/SammyRExternalInfo_I.f90 b/sammy/src/endf/interface/fortran/SammyRExternalInfo_I.f90
new file mode 100644
index 0000000000000000000000000000000000000000..32d3a51b647e6a47efd9e361fe9e42a522a639b3
--- /dev/null
+++ b/sammy/src/endf/interface/fortran/SammyRExternalInfo_I.f90
@@ -0,0 +1,168 @@
+!>
+!! This file has been dynamically generated by Class Interface Xml (CIX) 
+!! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
+!! If changes need to occur, modify the appropriate CIX xml file
+!! Date Generated: Thu Jun 10 11:48:13 EDT 2021
+!! If any issues are experiences with this generated file that cannot be fixed
+!! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
+!!/
+module SammyRExternalInfo_I
+use, intrinsic :: ISO_C_BINDING
+interface
+integer(C_INT) function f_SammyRExternalInfo_getGrp(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getGrp")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getChannel(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getChannel")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflConstantRext(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflConstantRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflLinearRext(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflLinearRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflQuadraticRext(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflQuadraticRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflConstantCoeffLog(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflConstantCoeffLog")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflLinearCoeffLog(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflLinearCoeffLog")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflELowRange(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflELowRange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflEUpRange(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflEUpRange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflPoleStrength(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflPoleStrength")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getIflAvgRadWidth(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getIflAvgRadWidth")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+integer(C_INT) function f_SammyRExternalInfo_getNrext(SammyRExternalInfo_ptr ) BIND(C,name="SammyRExternalInfo_getNrext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+end function
+subroutine f_SammyRExternalInfo_setGrp(SammyRExternalInfo_ptr, index ) BIND(C,name="SammyRExternalInfo_setGrp")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: index;
+end subroutine
+subroutine f_SammyRExternalInfo_setChannel(SammyRExternalInfo_ptr, index ) BIND(C,name="SammyRExternalInfo_setChannel")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: index;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflConstantRext(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflConstantRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflLinearRext(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflLinearRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflQuadraticRext(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflQuadraticRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflConstantCoeffLog(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflConstantCoeffLog")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflLinearCoeffLog(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflLinearCoeffLog")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflELowRange(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflELowRange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflEUpRange(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflEUpRange")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflPoleStrength(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflPoleStrength")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setIflAvgRadWidth(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setIflAvgRadWidth")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+integer(C_INT) function f_SammyRExternalInfo_getIflSammyIndex(SammyRExternalInfo_ptr, i ) BIND(C,name="SammyRExternalInfo_getIflSammyIndex")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: i;
+end function
+subroutine f_SammyRExternalInfo_setIflSammyIndex(SammyRExternalInfo_ptr, i,ifl ) BIND(C,name="SammyRExternalInfo_setIflSammyIndex")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: i;
+    integer(C_INT) :: ifl;
+end subroutine
+subroutine f_SammyRExternalInfo_setNrext(SammyRExternalInfo_ptr, ifl ) BIND(C,name="SammyRExternalInfo_setNrext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRExternalInfo_ptr;
+    integer(C_INT) :: ifl;
+end subroutine
+type(C_PTR) function f_SammyRExternalInfo_initialize( )BIND(C,name="SammyRExternalInfo_initialize")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR) :: SammyRExternalInfo_ptr;
+end function
+subroutine f_SammyRExternalInfo_destroy(this) BIND(C,name="SammyRExternalInfo_destroy")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: this;
+end subroutine
+end interface
+end module SammyRExternalInfo_I
diff --git a/sammy/src/endf/interface/fortran/SammyRExternalInfo_M.f90 b/sammy/src/endf/interface/fortran/SammyRExternalInfo_M.f90
new file mode 100644
index 0000000000000000000000000000000000000000..ad6150ad977c194510ac73511faf46b6b9eebdef
--- /dev/null
+++ b/sammy/src/endf/interface/fortran/SammyRExternalInfo_M.f90
@@ -0,0 +1,214 @@
+!>
+!! This file has been dynamically generated by Class Interface Xml (CIX) 
+!! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
+!! If changes need to occur, modify the appropriate CIX xml file
+!! Date Generated: Thu Jun 10 11:48:13 EDT 2021
+!! If any issues are experiences with this generated file that cannot be fixed
+!! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
+!!/
+module SammyRExternalInfo_M
+use, intrinsic :: ISO_C_BINDING
+use SammyRExternalInfo_I
+type SammyRExternalInfo
+    type(C_PTR) :: instance_ptr=C_NULL_PTR
+    contains
+    procedure, pass(this) :: getGrp => SammyRExternalInfo_getGrp
+    procedure, pass(this) :: getChannel => SammyRExternalInfo_getChannel
+    procedure, pass(this) :: getIflConstantRext => SammyRExternalInfo_getIflConstantRext
+    procedure, pass(this) :: getIflLinearRext => SammyRExternalInfo_getIflLinearRext
+    procedure, pass(this) :: getIflQuadraticRext => SammyRExternalInfo_getIflQuadraticRext
+    procedure, pass(this) :: getIflConstantCoeffLog => SammyRExternalInfo_getIflConstantCoeffLog
+    procedure, pass(this) :: getIflLinearCoeffLog => SammyRExternalInfo_getIflLinearCoeffLog
+    procedure, pass(this) :: getIflELowRange => SammyRExternalInfo_getIflELowRange
+    procedure, pass(this) :: getIflEUpRange => SammyRExternalInfo_getIflEUpRange
+    procedure, pass(this) :: getIflPoleStrength => SammyRExternalInfo_getIflPoleStrength
+    procedure, pass(this) :: getIflAvgRadWidth => SammyRExternalInfo_getIflAvgRadWidth
+    procedure, pass(this) :: getNrext => SammyRExternalInfo_getNrext
+    procedure, pass(this) :: setGrp => SammyRExternalInfo_setGrp
+    procedure, pass(this) :: setChannel => SammyRExternalInfo_setChannel
+    procedure, pass(this) :: setIflConstantRext => SammyRExternalInfo_setIflConstantRext
+    procedure, pass(this) :: setIflLinearRext => SammyRExternalInfo_setIflLinearRext
+    procedure, pass(this) :: setIflQuadraticRext => SammyRExternalInfo_setIflQuadraticRext
+    procedure, pass(this) :: setIflConstantCoeffLog => SammyRExternalInfo_setIflConstantCoeffLog
+    procedure, pass(this) :: setIflLinearCoeffLog => SammyRExternalInfo_setIflLinearCoeffLog
+    procedure, pass(this) :: setIflELowRange => SammyRExternalInfo_setIflELowRange
+    procedure, pass(this) :: setIflEUpRange => SammyRExternalInfo_setIflEUpRange
+    procedure, pass(this) :: setIflPoleStrength => SammyRExternalInfo_setIflPoleStrength
+    procedure, pass(this) :: setIflAvgRadWidth => SammyRExternalInfo_setIflAvgRadWidth
+    procedure, pass(this) :: getIflSammyIndex => SammyRExternalInfo_getIflSammyIndex
+    procedure, pass(this) :: setIflSammyIndex => SammyRExternalInfo_setIflSammyIndex
+    procedure, pass(this) :: setNrext => SammyRExternalInfo_setNrext
+    procedure, pass(this) :: initialize => SammyRExternalInfo_initialize
+    procedure, pass(this) :: destroy => SammyRExternalInfo_destroy
+end type SammyRExternalInfo
+contains
+function SammyRExternalInfo_getGrp(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getGrp(this%instance_ptr) + 1
+end function
+function SammyRExternalInfo_getChannel(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getChannel(this%instance_ptr) + 1
+end function
+function SammyRExternalInfo_getIflConstantRext(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflConstantRext(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflLinearRext(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflLinearRext(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflQuadraticRext(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflQuadraticRext(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflConstantCoeffLog(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflConstantCoeffLog(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflLinearCoeffLog(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflLinearCoeffLog(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflELowRange(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflELowRange(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflEUpRange(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflEUpRange(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflPoleStrength(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflPoleStrength(this%instance_ptr)
+end function
+function SammyRExternalInfo_getIflAvgRadWidth(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflAvgRadWidth(this%instance_ptr)
+end function
+function SammyRExternalInfo_getNrext(this) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getNrext(this%instance_ptr)
+end function
+subroutine SammyRExternalInfo_setGrp(this, index)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::index
+    call f_SammyRExternalInfo_setGrp(this%instance_ptr, index-1)
+end subroutine
+subroutine SammyRExternalInfo_setChannel(this, index)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::index
+    call f_SammyRExternalInfo_setChannel(this%instance_ptr, index-1)
+end subroutine
+subroutine SammyRExternalInfo_setIflConstantRext(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflConstantRext(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflLinearRext(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflLinearRext(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflQuadraticRext(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflQuadraticRext(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflConstantCoeffLog(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflConstantCoeffLog(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflLinearCoeffLog(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflLinearCoeffLog(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflELowRange(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflELowRange(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflEUpRange(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflEUpRange(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflPoleStrength(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflPoleStrength(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_setIflAvgRadWidth(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflAvgRadWidth(this%instance_ptr, ifl)
+end subroutine
+function SammyRExternalInfo_getIflSammyIndex(this, i) result(result2Return)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::i
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRExternalInfo_getIflSammyIndex(this%instance_ptr, i)
+end function
+subroutine SammyRExternalInfo_setIflSammyIndex(this, i, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::i
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setIflSammyIndex(this%instance_ptr, i,ifl)
+end subroutine
+subroutine SammyRExternalInfo_setNrext(this, ifl)
+    implicit none
+    class(SammyRExternalInfo)::this
+    integer(C_INT)::ifl
+    call f_SammyRExternalInfo_setNrext(this%instance_ptr, ifl)
+end subroutine
+subroutine SammyRExternalInfo_initialize(this)
+    implicit none
+    class(SammyRExternalInfo) :: this
+    this%instance_ptr = f_SammyRExternalInfo_initialize()
+end subroutine
+subroutine SammyRExternalInfo_destroy(this)
+    implicit none
+    class(SammyRExternalInfo) :: this
+    call f_SammyRExternalInfo_destroy(this%instance_ptr)
+    this%instance_ptr = C_NULL_PTR
+end subroutine
+end module SammyRExternalInfo_M
diff --git a/sammy/src/endf/interface/fortran/SammyRMatrixParameters_I.f90 b/sammy/src/endf/interface/fortran/SammyRMatrixParameters_I.f90
index c6115eb06ead6f271d4f40a64eb011a44ed467dd..9ad4fb52028feb6604df6a53d61991e2c91a9382 100644
--- a/sammy/src/endf/interface/fortran/SammyRMatrixParameters_I.f90
+++ b/sammy/src/endf/interface/fortran/SammyRMatrixParameters_I.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Wed Sep 18 17:36:12 EDT 2019
+!! Date Generated: Thu Jun 10 11:51:58 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -201,6 +201,44 @@ subroutine f_SammyRMatrixParameters_addChannelData(SammyRMatrixParameters_ptr, i
     type(C_PTR), value :: info;
     type(C_PTR), value :: channel;
 end subroutine
+integer(C_INT) function f_SammyRMatrixParameters_getNumRext(SammyRMatrixParameters_ptr ) BIND(C,name="SammyRMatrixParameters_getNumRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRMatrixParameters_ptr;
+end function
+subroutine f_SammyRMatrixParameters_addRext(SammyRMatrixParameters_ptr, grp,chan ) BIND(C,name="SammyRMatrixParameters_addRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRMatrixParameters_ptr;
+    integer(C_INT) :: grp;
+    integer(C_INT) :: chan;
+end subroutine
+type(C_PTR) function f_SammyRMatrixParameters_getRextInfo(SammyRMatrixParameters_ptr, index ) BIND(C,name="SammyRMatrixParameters_getRextInfo")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRMatrixParameters_ptr;
+    integer(C_INT) :: index;
+end function
+type(C_PTR) function f_SammyRMatrixParameters_getRext(SammyRMatrixParameters_ptr, info ) BIND(C,name="SammyRMatrixParameters_getRext")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRMatrixParameters_ptr;
+    type(C_PTR), value :: info;
+end function
+type(C_PTR) function f_SammyRMatrixParameters_getRextInfoByGroup(SammyRMatrixParameters_ptr, grp,channel ) BIND(C,name="SammyRMatrixParameters_getRextInfoByGroup")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRMatrixParameters_ptr;
+    integer(C_INT) :: grp;
+    integer(C_INT) :: channel;
+end function
+logical(C_BOOL) function f_SammyRMatrixParameters_hasRexInfo(SammyRMatrixParameters_ptr, grp,channel ) BIND(C,name="SammyRMatrixParameters_hasRexInfo")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: SammyRMatrixParameters_ptr;
+    integer(C_INT) :: grp;
+    integer(C_INT) :: channel;
+end function
 integer(C_INT) function f_SammyRMatrixParameters_orderByGroupAndEnergy(SammyRMatrixParameters_ptr ) BIND(C,name="SammyRMatrixParameters_orderByGroupAndEnergy")
     use,intrinsic :: ISO_C_BINDING
     implicit none
diff --git a/sammy/src/endf/interface/fortran/SammyRMatrixParameters_M.f90 b/sammy/src/endf/interface/fortran/SammyRMatrixParameters_M.f90
index b9c76b758ab87377495ee03c53066040b439d33b..db7c713548879796720434ad202929e9a811c7e9 100644
--- a/sammy/src/endf/interface/fortran/SammyRMatrixParameters_M.f90
+++ b/sammy/src/endf/interface/fortran/SammyRMatrixParameters_M.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Wed Sep 18 17:36:12 EDT 2019
+!! Date Generated: Thu Jun 10 11:51:58 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -14,6 +14,7 @@ use RMatResonanceParam_M
 use SammyChannelInfo_M
 use SammyIsoInfo_M
 use SammyParticlePairInfo_M
+use SammyRExternalInfo_M
 use SammyResonanceInfo_M
 use SammySpinGroupInfo_M
 type SammyRMatrixParameters
@@ -50,6 +51,12 @@ type SammyRMatrixParameters
     procedure, pass(this) :: transferParticlePairData => SammyRMatrixParameters_transferParticlePairData
     procedure, pass(this) :: getChannel => SammyRMatrixParameters_getChannel
     procedure, pass(this) :: addChannelData => SammyRMatrixParameters_addChannelData
+    procedure, pass(this) :: getNumRext => SammyRMatrixParameters_getNumRext
+    procedure, pass(this) :: addRext => SammyRMatrixParameters_addRext
+    procedure, pass(this) :: getRextInfo => SammyRMatrixParameters_getRextInfo
+    procedure, pass(this) :: getRext => SammyRMatrixParameters_getRext
+    procedure, pass(this) :: getRextInfoByGroup => SammyRMatrixParameters_getRextInfoByGroup
+    procedure, pass(this) :: hasRexInfo => SammyRMatrixParameters_hasRexInfo
     procedure, pass(this) :: orderByGroupAndEnergy => SammyRMatrixParameters_orderByGroupAndEnergy
     procedure, pass(this) :: orderByEnergy => SammyRMatrixParameters_orderByEnergy
     procedure, pass(this) :: initialize => SammyRMatrixParameters_initialize
@@ -180,7 +187,7 @@ subroutine SammyRMatrixParameters_getResonanceInfoByInput(this, object_ptr, ig,
     integer(C_INT)::ig
     integer(C_INT)::current
     object_ptr%instance_ptr = f_SammyRMatrixParameters_getResonanceInfoByInput(this%instance_ptr, ig-1,current)
-    current = current + 1    
+    current = current + 1
 end subroutine
 subroutine SammyRMatrixParameters_addResonanceData(this, info, res)
     implicit none
@@ -236,7 +243,7 @@ subroutine SammyRMatrixParameters_getParticlePairInfoByInput(this, object_ptr, i
     integer(C_INT)::ig
     integer(C_INT)::current
     object_ptr%instance_ptr = f_SammyRMatrixParameters_getParticlePairInfoByInput(this%instance_ptr, ig-1,current)
-    current = current + 1    
+    current = current + 1
 end subroutine
 subroutine SammyRMatrixParameters_getParticlePair(this, object_ptr, info)
     implicit none
@@ -271,6 +278,49 @@ subroutine SammyRMatrixParameters_addChannelData(this, info, channel)
     class(RMatChannelParams)::channel
     call f_SammyRMatrixParameters_addChannelData(this%instance_ptr, info%instance_ptr,channel%instance_ptr)
 end subroutine
+function SammyRMatrixParameters_getNumRext(this) result(result2Return)
+    implicit none
+    class(SammyRMatrixParameters)::this
+    integer(C_INT):: result2Return
+    result2Return=f_SammyRMatrixParameters_getNumRext(this%instance_ptr)
+end function
+subroutine SammyRMatrixParameters_addRext(this, grp, chan)
+    implicit none
+    class(SammyRMatrixParameters)::this
+    integer(C_INT)::grp
+    integer(C_INT)::chan
+    call f_SammyRMatrixParameters_addRext(this%instance_ptr, grp-1,chan-1)
+end subroutine
+subroutine SammyRMatrixParameters_getRextInfo(this, object_ptr, index)
+    implicit none
+    class(SammyRMatrixParameters)::this
+    class(SammyRExternalInfo) :: object_ptr
+    integer(C_INT)::index
+    object_ptr%instance_ptr = f_SammyRMatrixParameters_getRextInfo(this%instance_ptr, index-1)
+end subroutine
+subroutine SammyRMatrixParameters_getRext(this, object_ptr, info)
+    implicit none
+    class(SammyRMatrixParameters)::this
+    class(RExternalFunction) :: object_ptr
+    class(SammyRExternalInfo)::info
+    object_ptr%instance_ptr = f_SammyRMatrixParameters_getRext(this%instance_ptr, info%instance_ptr)
+end subroutine
+subroutine SammyRMatrixParameters_getRextInfoByGroup(this, object_ptr, grp, channel)
+    implicit none
+    class(SammyRMatrixParameters)::this
+    class(SammyRExternalInfo) :: object_ptr
+    integer(C_INT)::grp
+    integer(C_INT)::channel
+    object_ptr%instance_ptr = f_SammyRMatrixParameters_getRextInfoByGroup(this%instance_ptr, grp-1,channel-1)
+end subroutine
+function SammyRMatrixParameters_hasRexInfo(this, grp, channel) result(result2Return)
+    implicit none
+    class(SammyRMatrixParameters)::this
+    integer(C_INT)::grp
+    integer(C_INT)::channel
+    logical(C_BOOL):: result2Return
+    result2Return=f_SammyRMatrixParameters_hasRexInfo(this%instance_ptr, grp-1,channel-1)
+end function
 function SammyRMatrixParameters_orderByGroupAndEnergy(this) result(result2Return)
     implicit none
     class(SammyRMatrixParameters)::this
diff --git a/sammy/src/fin/mfin0.f90 b/sammy/src/fin/mfin0.f90
index 04db845bc5ae03d80820be9fa79234e0852ddf3d..006c2e75b57fcab63bd970fe9563c0fecbf9ebeb 100644
--- a/sammy/src/fin/mfin0.f90
+++ b/sammy/src/fin/mfin0.f90
@@ -96,7 +96,7 @@ module fin
          CALL Convrt ( A_Iprbrd , I_Iflbrd , A_Isiabn , &
             A_Iechan , &
                                              A_Idpiso , A_Idsiso , &
-            A_Iprdet , I_Ifldet ,            A_Iprext , I_Iflext , &
+            A_Iprdet , I_Ifldet ,                                  &
             A_Ipolar , A_Iprmsc , I_Iflmsc , I_Irdmsc , A_Iprpmc , &
             I_Iflpmc , A_Iprorr , I_Iflorr , A_Iprrpi , I_Iflrpi , &
             A_Iprudr , I_Ifludr , A_Iprnbk , I_Iflnbk , &
@@ -133,7 +133,6 @@ module fin
             Nowrt = 1
             CALL Wrcov   (A_Iprbrd , I_Iflbrd , &
                A_Iprdet , I_Ifldet , I_Iigrde , &
-               A_Iprext , I_Iflext , &
                A_Ipolar , I_Iflpol , &
                A_Iprmsc , I_Iflmsc , I_Irdmsc , I_Ijkmsc , A_Ietaee , &
                A_Iprpmc , I_Iflpmc , I_Isopmc , &
@@ -215,7 +214,6 @@ module fin
                CALL Oldord ( A_Iprbrd , I_Iflbrd , A_Idebrd ,  &
                   I_Ifexcl , &                  
                   A_Iprdet , I_Ifldet , A_Idedet , I_Iigrde , &
-                  A_Iprext , I_Iflext , &
                   I_Iflpol , &
                   A_Iprmsc , I_Iflmsc , A_Idemsc , I_Irdmsc , I_Ijkmsc , &
                              A_Ietaee , &
diff --git a/sammy/src/fin/mfin1.f90 b/sammy/src/fin/mfin1.f90
index 4511720e27902bfe64bd4bbcdd96448f7c3d518d..a38e246da141df323e75f89c0a44aa0229dc0b03 100644
--- a/sammy/src/fin/mfin1.f90
+++ b/sammy/src/fin/mfin1.f90
@@ -62,7 +62,7 @@ module fin1
 !
       SUBROUTINE Convrt (  Parbrd, Iflbrd, Siabnd, &
            Echan , Dopwid, Doswid, &
-           Pardet, Ifldet, Parext, Iflext, &
+           Pardet, Ifldet,         &
            Polar , Parmsc, Iflmsc, Iradms, Parpmc, Iflpmc, &
            Parorr, Iflorr, Parrpi, Iflrpi, Parudr, Ifludr, &
            Parnbk, Iflnbk, Parbgf, Iflbgf, Pardtp, Ifldtp, Parusd, &
@@ -83,7 +83,6 @@ module fin1
          Echan(Ntotc,*), &
          Dopwid(*), Doswid(*), &
          Pardet(*), Ifldet(*), &
-         Parext(Nrext,Ntotc,*), Iflext(Nrext,Ntotc,*), &
          Polar(2,*), Parmsc(*), Iflmsc(*), Iradms(*), &
          Parpmc(4,*), Iflpmc(4,*), &
          Parorr(*), Iflorr(*), Parrpi(*), Iflrpi(*), &
@@ -96,7 +95,6 @@ module fin1
 !     *   Echan(Ntotc,Ngroup),
 !     *   Dopwid(Numiso), Doswid(Numiso),
 !     *   Pardet(Numdet), Ifldet(Numdet),
-!     *   Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup),
 !     *   Polar(2,Nres), Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup),
 !     *   Parpmc(4,Numpmc), Iflpmc(4,Numpmc),
 !     *   Parorr(Numorr), Iflorr(Numorr), Parrpi(Numrpi), Iflrpi(Numrpi),
@@ -126,9 +124,7 @@ module fin1
       CALL Update (Ipar, Kpar, Nvp, Nfpres, Nvpres)
       IF (Nvp.EQ.Nvpall) RETURN
 !
-      IF (Nvpext.NE.0) THEN
-         CALL Cnvext(Parext, Iflext, Tempy, Ipar)
-      END IF
+      CALL Cnvext(Tempy, Ipar)
       CALL Update (Ipar, Kpar, Nvp, Nfpext, Nvpext)
       IF (Nvp.EQ.Nvpall) RETURN
 !
@@ -733,51 +729,50 @@ module fin1
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Cnvext (Parext, Iflext, Tempy, Ipar)
+      SUBROUTINE Cnvext (Tempy, Ipar)
 !
 ! *** PURPOSE --CONVERT FROM NEW U-PARAMETERS TO PHYSICAL
 ! ***           R-EXTERNAL PARAMETERS
 !
-      use fixedi_m
-      use ifwrit_m
-      use fixedr_m
-      use broad_common_m
-      use EndfData_common_m
-      use SammyResonanceInfo_M
+      use fixedi_m, only : Nrext, Ntotc
+      use EndfData_common_m, only : resparData, covData
       use RMatResonanceParam_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
+      use SammyRExternalInfo_M
+      IMPLICIT None
 !
-      type(SammySpinGroupInfo)::spinInfo
-      DIMENSION Parext(Nrext,Ntotc,*), &
-           Iflext(Nrext,Ntotc,*),  Tempy(*)
-!
-!      DIMENSION Parext(Nrext,Ntotc,Ngroup),
-!     *     Iflext(Nrext,Ntotc,Ngroup),  Tempy(Nvpall)
-!
-      DATA One /1.0d0/, Two /2.0d0/
-!
-!
-      DO Igrp=1,resParData%getNumSpinGroups()
-         call resparData%getSpinGroupInfo(spinInfo, Igrp)
-         Ntotn = spinInfo%getNumChannels()
-         DO I=1,Ntotn
-            IF (Iflext(1,I,Igrp).GE.0) THEN
-               DO J=1,Nrext
-                  IF (Iflext(J,I,Igrp).GT.0) THEN
-                     Ipar = Ipar + 1
-                     Keep = covData%getCovIndex(Ipar)
-                     IF (.not.covData%isPupedParameter(Ipar)) THEN
-                        val = covData%getUParamValue(Keep)
-                        Parext(J,I,Igrp) = val
-                        Tempy(Keep) = One
-                        IF (J.EQ.5) Parext(J,I,Igrp) = val**2
-                        IF (J.EQ.5) Tempy(Keep) = Two*val
-                     END IF
-                  END IF
-               END DO
-            END IF
-         END DO
-      END DO
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
+      real(kind=8)::Tempy(*)
+      integer::Ipar
+      real(kind=8)::Two, val
+      integer::Irext, I, Ifl, Keep
+!
+!      DIMENSION Tempy(Nvpall)
+!
+      DATA Two /2.0d0/
+!
+!
+      DO Irext=1,resparData%getNumRext()
+         call resParData%getRextInfo(rextInfo, Irext)
+         call resparData%getRext(rext, rextInfo)
+         do I = 1, rextInfo%getNrext()
+            ifl = rextInfo%getIflSammyIndex(I)
+            if (ifl.le.0) cycle  ! not adjusted
+            Ipar = Ipar + 1
+            if (covData%isPupedParameter(Ifl)) cycle ! don't need to update pup'ed parameters
+
+            Keep = covData%getCovIndex(Ifl)
+            val = covData%getUParamValue(Keep)
+
+            if (I.eq.5) then   ! special treatment for ConstantCoeffLogTerm
+               val = val * val
+               Tempy(Keep) = Two*val
+            end if
+
+            call rext%setSammyValue(I, val)
+         end do
+      end do
+
       RETURN
       END
 !
diff --git a/sammy/src/fin/mfin3.f90 b/sammy/src/fin/mfin3.f90
index b743f1c2b3acdabdc55d1602d6aa8be4c0f0fc02..42cd15c645f24f0d82e79a4c523ecbb66ff73918 100644
--- a/sammy/src/fin/mfin3.f90
+++ b/sammy/src/fin/mfin3.f90
@@ -6,7 +6,7 @@ module fin3
 !
       SUBROUTINE Oldord (Parbrd, Iflbrd, Delbrd, &
          If_Excl, &
-         Pardet, Ifldet, Deldet, Igrdet, Parext, Iflext, &
+         Pardet, Ifldet, Deldet, Igrdet,                 &
          Iflpol,  &
          Parmsc, Iflmsc, Delmsc, Iradms, Ijkmsc, Etaeee, &
          Parpmc, Iflpmc, Delpmc, Isopmc, &
@@ -37,8 +37,7 @@ module fin3
       DIMENSION Parbrd(*), Iflbrd(*), Delbrd(*),  &
          If_Excl(Ntotc,*), &
          Pardet(*), Ifldet(*), Deldet(*), Igrdet(*), &
-         Parext(Nrext,Ntotc,*), Iflext(Nrext,Ntotc,*), &
-                    Iflpol(2,*), &
+         Iflpol(2,*), &
          Parmsc(*), Iflmsc(*), Delmsc(*), Iradms(*), Ijkmsc(*), &
                     Etaeee(*), &
          Parpmc(4,*), Iflpmc(4,*), Delpmc(4,*), Isopmc(*), &
@@ -58,7 +57,6 @@ module fin3
 !     *   IFltru(Numrad),  
 !     *   Pardet(Numdet), Ifldet(Numdet),
 !     *                   Deldet(Numdet), Igrdet(Ngroup),
-!     *   Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup),
 !     *   Parmsc(Nummsc), Iflmsc(Nummsc), Delmsc(Nummsc), Iradms(Ngroup),
 !     *   Ijkmsc(Nummsc), Etaeee(Mjetan),
 !     *   Parpmc(4,Numpmc), Iflpmc(4,Numpmc), Delpmc(4,Numpmc),Isopmc(Numpmc),
@@ -100,7 +98,7 @@ module fin3
          END IF
       END IF
 !
-      IF (Numext.NE.0) CALL Ordext (Parext, Iflext)
+       CALL Ordext
 !
        CALL Ordrad
 !
@@ -598,67 +596,77 @@ module fin3
 !
 ! ----------------------------------------------------------------
 !
-      SUBROUTINE Ordext (Parext, Iflext)
-      use fixedi_m
-      use EndfData_common_m
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-      DIMENSION Parext(Nrext,Ntotc,*), Iflext(Nrext,Ntotc,*)
-!
-! *** Write external R-function parameters
-      IF (Nrext.EQ.5) WRITE (38,99995)
-      IF (Nrext.EQ.7) WRITE (38,99994)
-      IF (Nrext.EQ.5) WRITE (36,99995)
-      IF (Nrext.EQ.7) WRITE (36,99994)
+      SUBROUTINE Ordext
+      use fixedi_m, only : Ifrel
+      use EndfData_common_m, only : resParData, covData
+      use RMatResonanceParam_M
+      use SammyRExternalInfo_M
+      use SammySpinGroupInfo_M
+      IMPLICIT None
+      type(SammyRExternalInfo)::rextInfo
+      type(SammySpinGroupInfo)::spinInfo
+      type(RExternalFunction)::rext
+      integer::Js(7)
+      real(kind=8)::Val(7)
+      integer::NrextO, N, I, J
+
+      if (resParData%getNumRext().eq.0) return  ! no external R-matrix
+
+      ! assume all values for getNrext are the same
+      call resParData%getRextInfo(rextInfo, 1)
+      NrextO = rextInfo%getNrext()
+!
+! *** Write external R-function parameters      
+      IF (NrextO.EQ.5) WRITE (38,99995)
+      IF (NrextO.EQ.7) WRITE (38,99994)
+      IF (NrextO.EQ.5) WRITE (36,99995)
+      IF (NrextO.EQ.7) WRITE (36,99994)
 99995 FORMAT ('EXTERNAL R-FUNCTION PARAMETERS FOLLOW')
 99994 FORMAT ('R-EXTERNAL PARAMETERS FOLLOW')
       IF (Ifrel.EQ.1) THEN
-         IF (Nrext.EQ.5) WRITE (40,99995)
-         IF (Nrext.EQ.7) WRITE (40,99994)
+         IF (NrextO.EQ.5) WRITE (40,99995)
+         IF (NrextO.EQ.7) WRITE (40,99994)
       END IF
-      DO N=1,Ngroup
-         DO I=1,Ntotc
-            IF (Iflext(1,I,N).GE.0) THEN
-               DO J=1,Nrext
-                  Ifl = Iflext(J,I,N)
-                  IF (Ifl.GT.0) THEN
-                     IF (covData%isPupedParameter(Iflext(J,I,N))) then
-                        Iflext(J,I,N) = 3
-                     else   
-                        Iflext(J,I,N) = 1
-                     end if                        
-                  END IF
-               END DO
-            END IF
-         END DO
-         DO I=1,Ntotc
-            IF (Iflext(1,I,N).GE.0 .AND. Nrext.EQ.7) THEN
-               WRITE (38,99992) N, I, (Iflext(J,I,N),J=1,7), &
-                  (Parext(J,I,N),J=1,7)
-               WRITE (36,99992) N, I, (Iflext(J,I,N),J=1,7), &
-                  (Parext(J,I,N),J=1,7)
-            ELSE IF (Iflext(1,I,N).GE.0 .AND. Nrext.EQ.5) THEN
-               WRITE (38,99993) N, I, (Parext(J,I,N),J=1,Nrext), &
-                  (Iflext(J,I,N),J=1,Nrext)
-               WRITE (36,99993) N, I, (Parext(J,I,N),J=1,Nrext), &
-                  (Iflext(J,I,N),J=1,Nrext)
+
+      DO N=1,resParData%getNumSpinGroups()
+        call resParData%getSpinGroupInfo(spinInfo, N)
+
+        DO I=1,spinInfo%getNumChannels()
+            if (.not.resParData%hasRexInfo(N, I)) cycle
+            call resParData%getRextInfoByGroup(rextInfo, N, I)
+            call resParData%getRext(rext, rextInfo)
+            Js = 0
+            DO J = 1, rextInfo%getNrext()
+              Js(J) = rextInfo%getIflSammyIndex(J)
+              val(J) = rext%getSammyValue(J)
+              if (Js(J).gt.0) then
+                 IF (covData%isPupedParameter(Js(J))) then
+                     Js(J) = 3
+                 else
+                    Js(J) = 1
+                 end if
+               end if
+            end do
+            IF (NrextO.EQ.7) THEN
+               WRITE (38,99992) N, I, (Js(J),J=1,7), (val(J),J=1,7)
+               WRITE (36,99992) N, I, (Js(J),J=1,7), (val(J),J=1,7)
+               If (Ifrel.EQ.1) THEN
+                  WRITE (40,99992) N, I, (Js(J),J=1,7), (val(J),J=1,7)
+               end if
+            ELSE IF (NrextO.EQ.5) THEN
+               WRITE (38,99993) N, I, (val(J),J=1,5), (Js(J),J=1,5)
+               WRITE (36,99993) N, I, (val(J),J=1,5), (Js(J),J=1,5)
+               If (Ifrel.EQ.1) THEN
+                  WRITE (40,99993) N, I, (val(J),J=1,5), (Js(J),J=1,5)
+               end if
             END IF
 99992       FORMAT (I2, 8I1, 7(1PE10.3))
 99993       FORMAT (I3, I2, 5(1PE11.4), 5I2)
          END DO
       END DO
       WRITE (38,99996)
-99996 FORMAT (' ')
-      IF (Ifrel.EQ.1) THEN
-         DO N=1,Ngroup
-            DO I=1,Ntotc
-               IF (Iflext(1,I,N).GE.0 .AND. Nrext.EQ.7) WRITE &
-                  (40,99992) N, I, (Iflext(J,I,N),J=1,7), &
-                  (Parext(J,I,N),J=1,7)
-               IF (Iflext(1,I,N).GE.0 .AND. Nrext.EQ.5) WRITE &
-                  (40,99993) N, I, (Parext(J,I,N),J=1,Nrext), &
-                  (Iflext(J,I,N),J=1,Nrext)
-            END DO
-         END DO
+99996 FORMAT (' ')      
+      IF (Ifrel.EQ.1) THEN         
          WRITE (40,99996)
       END IF
       RETURN
diff --git a/sammy/src/fin/mfin4.f90 b/sammy/src/fin/mfin4.f90
index e3a58a8a3403cbc4fd608bdb733fde7c537b8997..caece63563545e8c3681aff2bf1d5b4e44965783 100644
--- a/sammy/src/fin/mfin4.f90
+++ b/sammy/src/fin/mfin4.f90
@@ -60,7 +60,6 @@ module fin4
 ! write partial width data (indicated by last .false. in the argument list)         
       CALL Outpar (   Iftit, Nunit    , A_Iprbrd , I_Iflbrd , &
                              A_Iprdet , I_Ifldet , I_Iigrde , &
-       A_Iprext , I_Iflext ,  &
        A_Ipolar , I_Iflpol , A_Iprmsc , I_Iflmsc , &
        I_Irdmsc , I_Ijkmsc , A_Ietaee , &
        A_Iprpmc , I_Iflpmc , I_Isopmc , A_Iprorr , &
@@ -77,7 +76,6 @@ module fin4
 ! write reduced width data (indicated by last .true. in the argument list)         
       CALL Outpar (   Iftit, Nunit    , A_Iprbrd , I_Iflbrd , &
                              A_Iprdet , I_Ifldet , I_Iigrde , &
-       A_Iprext , I_Iflext ,  &
        A_Ipolar , I_Iflpol , A_Iprmsc , I_Iflmsc , &
        I_Irdmsc , I_Ijkmsc , A_Ietaee , &
        A_Iprpmc , I_Iflpmc , I_Isopmc , A_Iprorr , &
diff --git a/sammy/src/fin/mfin5.f90 b/sammy/src/fin/mfin5.f90
index ce21e8d37895a2d0408115cf2bf19a5eb1b42d79..917642433e4ea09b18f292ac55168d5674938f0d 100644
--- a/sammy/src/fin/mfin5.f90
+++ b/sammy/src/fin/mfin5.f90
@@ -438,7 +438,7 @@ module fin5
 ! --------------------------------------------------------------
 !
       SUBROUTINE Wrcov ( Parbrd, Iflbrd, &
-         Pardet, Ifldet, Igrdet, Parext, Iflext, &
+         Pardet, Ifldet, Igrdet,         &
          Polar , Iflpol, Parmsc, Iflmsc, Iradms, Ijkmsc, Etaeee, &
          Parpmc, Iflpmc, Isopmc, &
          Parorr, Iflorr, Ecrnch, Endets, Sesese, Eseses, Sigdts, &
@@ -462,14 +462,14 @@ module fin5
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
       use ReadCovarianceInfo_m
-      use ResonanceCovariance_M   
+      use ResonanceCovariance_M
+      use SammyRExternalInfo_M
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
 !
       type(ResonanceCovariance)::physCov
       DIMENSION Parbrd(*), Iflbrd(*), &
          Pardet(*), Ifldet(*), Igrdet(*), &
-         Parext(Nrext,Ntotc,*), Iflext(Nrext,Ntotc,*), &
          Polar(2,*), Iflpol(2,*), &
          Parmsc(*), Iflmsc(*), Iradms(*), Ijkmsc(*), Etaeee(*), &
          Parpmc(4,*), Iflpmc(4,*), Isopmc(*), &
@@ -484,7 +484,6 @@ module fin5
 !
 !      DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd),
 !     *   Pardet(Numdet), Ifldet(Numdet), Igrdet(Ngroup),
-!     *   Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup),
 !     *   Polar(2,Nres), Iflpol(2,Nres),
 !     *   Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup), Ijkmsc(Nummsc),
 !     *   Parpmc(4,Numpmc), Iflpmc(4,Numpmc), Isopmc(Numpmc),
@@ -504,10 +503,14 @@ module fin5
       type(RMatResonance)::resonance
       type(SammyResonanceInfo)::resInfo
       type(ResonanceCovariance)::uCov
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
       real(kind=8),allocatable,dimension(:,:)::resTmpData
       integer,allocatable,dimension(:)::spinData
       integer,allocatable,dimension(:,:)::fitFlags
       integer,allocatable,dimension(:)::Ifliso
+      integer,allocatable,dimension(:,:,:)::Iflext
+      real(kind=8),allocatable,dimension(:,:,:)::Parext
       integer::nradInfo
       
       CHARACTER*3 Versn
@@ -682,13 +685,33 @@ module fin5
       END IF
 !
 ! *** WRITE R-EXTERNAL PARAMETERS
-      IF (Numext.NE.0) THEN
+      if (resParData%getNumRext().gt.0) then
+         allocate(Iflext(Nrext, Ntotc, resParData%getNumSpinGroups()))
+         allocate(Parext(Nrext, Ntotc, resParData%getNumSpinGroups()))
+         Iflext = 0
+         Parext = 0.0d0
+         do I = 1, resParData%getNumSpinGroups()
+           do j = 1, Ntotc
+              if (.not.resParData%hasRexInfo(I, J)) then
+                 Iflext(1, J, I) = -1
+              else
+                call resParData%getRextInfoByGroup(rextInfo, I, J)
+                call resParData%getRext(rext, rextInfo)
+                do K = 1,  Nrext
+                   Iflext(K, J, I) = rextInfo%getIflSammyIndex(k)
+                   Parext(K, J, I) = rext%getSammyValue(K)
+                end do
+              end if
+           end do
+         end do
 !#         WRITE (Iu64) 'Iflext', Nrext, Ntotc*Ngroup
          WRITE (Iu64) (((Iflext(K,J,I),K=1,Nrext),J=1,Ntotc),I=1, &
                resParData%getNumSpinGroups() )
 !#         WRITE (Iu64) 'Parext', Nrext, Ntotc*Ngroup
          WRITE (Iu64) (((Parext(K,J,I),K=1,Nrext),J=1,Ntotc),I=1, &
             resParData%getNumSpinGroups() )
+         deallocate(Iflext)
+         deallocate(Parext)
       END IF
 !
 ! *** RADIUS PARAMETERS
diff --git a/sammy/src/inp/minp01.f b/sammy/src/inp/minp01.f
index ba82206208b93d3a1a231d72366c7780a51838c7..93a1572433c4dbb9be5adbc062eb438e7214e5cc 100644
--- a/sammy/src/inp/minp01.f
+++ b/sammy/src/inp/minp01.f
@@ -369,17 +369,6 @@ C *** six.one
       END IF
 C
 C     *** seven
-      numparRpi = max(Medrpi + 25, 37)
-          ! number of parameters of RPI resolution function
-C         ! number was counted from use in function   Gen_Rpi_E_Independent
-      IF (Nrext.NE.0) THEN
-         N = Nrext*Ngroup*Ntotc + numparRpi
-         call make_A_Iprext(N)
-         call make_I_Iflext(N)
-      else  ! account for rpi resolution function data
-         call make_I_Iflext(numparRpi)
-      END IF
-      
 C
       IF (Nppair.EQ.0) Nppair = Ntotc*Ngroup
 C                               gross overestimate, most likely
@@ -454,8 +443,11 @@ C
 C ***    five PAR
          IF (Numrpi.NE.0) THEN
             M = Numrpi
+            numparRpi = max(Medrpi + 25, 37)
+            ! number of parameters of RPI resolution function
+            ! number was counted from use in function   Gen_Rpi_E_Independent
             call make_A_Iprrpi(M)
-            call make_I_Iflrpi(M)
+            call make_I_Iflrpi(max(M, numparRpi))
             call make_A_Iderpi(M)
          END IF
 C
diff --git a/sammy/src/int/mint1.f b/sammy/src/int/mint1.f
index 30461a1dce68db491a47d22c441ac993b662047e..2b4f65d186ecd7084e23d0076a1a6d3afb8e36c1 100644
--- a/sammy/src/int/mint1.f
+++ b/sammy/src/int/mint1.f
@@ -162,6 +162,12 @@ C
 C
       DO Iso=1,calcData%getNumberIsotopes()
          ! update cross section (ipar=0) as well as derivatives
+         DO N=1,calcData%getNnnsig()
+           call calcData%reserveColumnsNs(Idat,N, Ndasig+Ndbsig+1) ! derivs + cross
+         end do
+         if (Ksindi.ne.0) then
+            call calcDataSelf%reserveColumns(Idat,Ndasig+Ndbsig+1) ! derivs + cross
+         end if
          DO Ipar=0,Ndasig+Ndbsig           
             DO N=1,calcData%getNnnsig()
                val1 = calcData%getDataNs(Iw1, N, Ipar, Iso)
diff --git a/sammy/src/ipq/FillFitData_m.f90 b/sammy/src/ipq/FillFitData_m.f90
index 427c8076f2581835a7373d361b9f99c0f7d4fc87..bd2082ae31c84e9e3331c7b55722e28ace2756c5 100644
--- a/sammy/src/ipq/FillFitData_m.f90
+++ b/sammy/src/ipq/FillFitData_m.f90
@@ -117,8 +117,9 @@ contains
       ! copy the user supplied deriviatives as needed      
       call grid%getImplicitDerivs(implGrid) 
       if (C_ASSOCIATED(implGrid%instance_ptr)) then
+         call resultData%reserve(implGrid%getLength(), nimplgiven+npars+derivStart)
          do i = 1, implGrid%getLength()
-             do j = 1, nimplgiven
+             do j = 1, nimplgiven              
                call resultData%addData(i, j + npars + derivStart, implGrid%getData(i,j))
              end do
          end do
diff --git a/sammy/src/mlb/mmlb0.f b/sammy/src/mlb/mmlb0.f
index 16a102b3fb8ac2460e296e84d0ce57a4ec3e178a..a719821fe84b15719f68374ce974dc65964aabdb 100644
--- a/sammy/src/mlb/mmlb0.f
+++ b/sammy/src/mlb/mmlb0.f
@@ -22,7 +22,7 @@ C
       use rsl7_m
       use xct_m
       use mxct27_m
-      use EndfData_common_m, only : covData, resParData
+      use EndfData_common_m, only : covData, resParData, radFitFlags
       use AuxGridHelper_M, only : setAuxGridOffset, setAuxGridRowMax
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
       real(kind=8),allocatable,dimension(:)::A_Idum
@@ -74,7 +74,7 @@ C
 C ### one ###
       Ks_Res = Ksolve
       CALL Set_Kws_Xct
-      call calcData%setUpList(resParData, Iq_Iso)
+      call calcData%setUpList(resParData, radFitFlags, Iq_Iso)
 C - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
 C
 C ### three ###
diff --git a/sammy/src/mxw/mmxw5.f b/sammy/src/mxw/mmxw5.f
index ef60f8946c223cb3eac7004cefdb44fbacb9c2fe..44bb8d3c28821fefa8bde6557131aa642f788ecc 100644
--- a/sammy/src/mxw/mmxw5.f
+++ b/sammy/src/mxw/mmxw5.f
@@ -170,6 +170,7 @@ C
                Gj1 = Gj1 + Aa*val2
                val = calcData%getDataNs(J, 1, 0, 1)
                val = val + Aa*val2
+               call calcData%reserveColumnsNs(J, 1, Ndasig+Ndbsig+1) ! derivs + cross
                call calcData%addDataNs(J, 1, 0, 1, val)
                IF (Ksolve.NE.2) then
                   DO Ipar=1,Ndasig + Ndbsig                     
diff --git a/sammy/src/new/SetUExternalRMatrix_M.f90 b/sammy/src/new/SetUExternalRMatrix_M.f90
index 3c851e987b54c544848aca684da6317d6d77d879..dce1cbad02de632cd63a0a58bcf6c7c8d317b8c7 100644
--- a/sammy/src/new/SetUExternalRMatrix_M.f90
+++ b/sammy/src/new/SetUExternalRMatrix_M.f90
@@ -4,6 +4,7 @@ use SetCovData_M
 use CovarianceData_M
 use SammyRMatrixParameters_M
 use SammySpinGroupInfo_M
+use SammyRExternalInfo_M
 type , extends(SetCovData) :: SetUExternalRMatrix
     contains
     procedure, pass(this) :: setParameterNumber => SetUExternalRMatrix_setParameterNumber
@@ -15,75 +16,84 @@ type , extends(SetCovData) :: SetUExternalRMatrix
 end type SetUExternalRMatrix
 contains
   
-subroutine SetUExternalRMatrix_setParameterNumber(this, resData, covData, iflext, nrext, ntotc, nnrext, initial)
+subroutine SetUExternalRMatrix_setParameterNumber(this, resData, covData, initial)
     implicit none
     class(SetUExternalRMatrix)::this
     class(SammyRMatrixParameters)::resData
     class(CovarianceData)::covData
     logical(C_BOOL)::initial
-    integer::nrext, ntotc, nnrext
-    integer::Iflext(Nnrext,Ntotc,*)
-   
 
-    integer::isp, ich, k
+    integer::isp, ich, k, flag
     type(SammySpinGroupInfo)::spinInfo
+    type(SammyRExternalInfo)::rextInfo
     
+    if (resData%getNumRext().le.0) return ! nothing to do
+
     do isp = 1, resData%getNumSpinGroups()
        call resData%getSpinGroupInfo(spinInfo, isp)
 
        do ich = 1, spinInfo%getNumChannels()
-          if (nrext.eq.0) cycle
-          if ( iflext(1, ich, isp).lt.0) cycle
-          do k = 1, nrext
-              call this%updateNumbers(iflext(k, ich, isp), covData, initial);
+          call resData%getRextInfoByGroup(rextInfo, isp, ich)
+
+          if (.not.resData%hasRexInfo(isp, ich)) cycle
+          call resData%getRextInfoByGroup(rextInfo, isp, ich)
+
+          do k = 1, rextInfo%getNrext()
+              flag = rextInfo%getIflSammyIndex(k)
+              call this%updateNumbers(flag, covData, initial)
           end do
        end do       
     end do    
 end subroutine SetUExternalRMatrix_setParameterNumber
 
-subroutine SetUExternalRMatrix_updateFitFlags(this, resData, covData, iflext, nrext, ntotc, nnrext, indexVar, indexPup)
+subroutine SetUExternalRMatrix_updateFitFlags(this, resData, covData, indexVar, indexPup)
     implicit none
     class(SetUExternalRMatrix)::this
     class(SammyRMatrixParameters)::resData
     class(CovarianceData)::covData
     logical(C_BOOL)::initial
-    integer::nrext, ntotc, nnrext, indexVar,indexPup
-    integer::Iflext(Nnrext,Ntotc,nrext)
-   
+    integer:: indexVar,indexPup
 
     integer::isp, ich, k, flag, index
     type(SammySpinGroupInfo)::spinInfo
+    type(SammyRExternalInfo)::rextInfo
+
+    if (resData%getNumRext().le.0) return ! nothing to do
     
     index = this%getStartParam() - 1     
     do isp = 1, resData%getNumSpinGroups()
        call resData%getSpinGroupInfo(spinInfo, isp)
 
        do ich = 1, spinInfo%getNumChannels()
-          if (nrext.eq.0) cycle
-          if ( iflext(1, ich, isp).lt.0) cycle         
-          do k = 1, nrext
-              flag = this%getUpdatedFitFlag(iflext(k, ich, isp), covData, index, indexVar, indexPup)             
-              iflext(k, ich, isp) = flag             
+          if (.not.resData%hasRexInfo(isp, ich)) cycle
+          call resData%getRextInfoByGroup(rextInfo, isp, ich)
+
+          do k = 1, rextInfo%getNrext()
+              flag = rextInfo%getIflSammyIndex(k)
+              flag = this%getUpdatedFitFlag(flag, covData, index, indexVar, indexPup)
+              call rextInfo%setIflSammyIndex(k, flag)
           end do
        end do       
     end do      
 end subroutine SetUExternalRMatrix_updateFitFlags            
             
-integer function SetUExternalRMatrix_getCovIndex(this, resData, covData, iflext, nnrext, nrext, ntotc, &
+integer function SetUExternalRMatrix_getCovIndex(this, resData, covData, &
                                                  nn, mm) result(irow)
     implicit none
     class(SetUExternalRMatrix)::this
     class(SammyRMatrixParameters)::resData
     class(CovarianceData)::covData
-    integer::ntotc, nnrext, nrext, nn, mm
-    integer::Iflext(Nnrext,Ntotc,*)
+    integer::nn, mm
 
-    integer::igroup, flag, ich, mint
+    integer::igroup, flag, ich, mint, nrext
     type(SammySpinGroupInfo)::spinInfo
+    type(SammyRExternalInfo)::rextInfo
 
     irow = -1
     
-    if (nrext.eq.0) return ! no external R matrix data
+    if (resData%getNumRext().eq.0) return ! no external R matrix data
+    call resData%getRextInfo(rextInfo, 1)
+    nrext = rextInfo%getNrext()
     
     if (nn.le.1000.or.nn.ge.2000) return   ! out of range for R-External (see SAMMY manual Table VI b2) 
     igroup = nn - 1000
@@ -95,7 +105,10 @@ integer function SetUExternalRMatrix_getCovIndex(this, resData, covData, iflext,
     flag = -1
     do ich = 1, spinInfo%getNumChannels()
        if ( mint.le.nrext) then
-          flag = iflext(mint, ich, igroup)
+         if (resData%hasRexInfo(igroup, ich)) then
+            call resData%getRextInfoByGroup(rextInfo, igroup, ich)
+            flag = rextInfo%getIflSammyIndex(mint)
+         end if
        else
           mint = mint - nrext
        end if
@@ -106,39 +119,36 @@ integer function SetUExternalRMatrix_getCovIndex(this, resData, covData, iflext,
     end if    
 end function SetUExternalRMatrix_getCovIndex
 
-subroutine  SetUExternalRMatrix_setCovarianceDefault (this,  resData, covData, factor, iflext, nnrext, nrext, ntotc)
+subroutine  SetUExternalRMatrix_setCovarianceDefault (this,  resData, covData, factor)
     implicit none
     class(SetUExternalRMatrix)::this
     class(SammyRMatrixParameters)::resData
     class(CovarianceData)::covData
-    integer::ntotc, nnrext, nrext
     real(kind=8)::factor
-    integer::Iflext(Nnrext,Ntotc,*)
-
-    integer::isp, ich, k, flag, irow
+    type(SammyRExternalInfo)::rextInfo
+    integer::irext, ich, k, flag, irow
     real(kind=8)::val, have
-    type(SammySpinGroupInfo)::spinInfo
+
     type(ResonanceCovariance)::physCov
 
     call covData%getCovariance(physCov) 
-    do isp = 1, resData%getNumSpinGroups()
-       call resData%getSpinGroupInfo(spinInfo, isp)
+    do irext = 1, resData%getNumRext()
+      call resData%getRextInfo(rextInfo, irext)
+      do k = 1, rextInfo%getNrext()
+             flag = rextInfo%getIflSammyIndex(k)
+             if( flag.le.0) cycle
 
-       do ich = 1, spinInfo%getNumChannels()      
-          do k = 1, nrext
-             flag =  iflext(k, ich, isp)           
-         
-             if (k.ne.5) then   ! setDefault converts to flag to covariance index
+
+             if (k.ne.5) then   ! setDefault converts flag to covariance index
                 call this%setDefaultCovariance(covData, flag, factor)
-                cycle
-             end if
-             
-             if ( flag.gt.0) then   ! varied parameter and k == 5
+                irow = covData%getCovIndex(flag)
+                have = physCov%getCovariance(irow,irow)
+             else  ! different for k == 5 as value is treated differently
                 ! covariance index
                 irow = covData%getCovIndex(flag)
 
                 ! do not set if we already have a value
-                have = physCov%getCovariance(irow,irow)
+                have = physCov%getCovariance(irow,irow) 
                 if (have.ne.0.0d0) cycle
 
                
@@ -152,10 +162,8 @@ subroutine  SetUExternalRMatrix_setCovarianceDefault (this,  resData, covData, f
                 val = val * val
                 
                 ! set the diagonal
-                call physCov%setCovariance(irow,irow, val)               
+                call physCov%setCovariance(irow,irow, val)
              end if
-                        
-          end do
        end do       
     end do      
 end subroutine  SetUExternalRMatrix_setCovarianceDefault 
diff --git a/sammy/src/new/SetUParameters_M.f90 b/sammy/src/new/SetUParameters_M.f90
index 366d3b73bf9d848324b8681c38e24fa0962ab022..8cdab8b7911be20eb3cc6319bb1796891609097c 100644
--- a/sammy/src/new/SetUParameters_M.f90
+++ b/sammy/src/new/SetUParameters_M.f90
@@ -110,16 +110,15 @@ end  subroutine updateFitNumbers
 !!  in a different class
 subroutine  SetUParameters_countParameters(this,  nVaried, nPuped,   &
           Iflbrd,  Ifldet,                                           &
-          Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,            &
-          Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext)                         
+          Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,                    &
+          Iflnbk, Iflbgf, Ifldtp, Iflusd)
     use fixedi_m 
     use EndfData_common_m
     implicit none
     class(SetUParameters) :: this
     integer::nVaried, nPuped
-    integer::Nnrext
     integer::Iflbrd(*),                                                   &
-             Ifldet(*), Iflext(Nnrext,Ntotc,*),                           &
+             Ifldet(*),                                                   &
              Iflmsc(*), Iradms(*), Iflpmc(4,*), Iflorr(*), Iflrpi(*),     & 
              Iflnbk(*), Iflbgf(*), Ifldtp(*), Iflusd(*)
 
@@ -130,7 +129,7 @@ subroutine  SetUParameters_countParameters(this,  nVaried, nPuped,   &
     nPuped = 0
 
     call this%resData%setParameterNumber(resParData, covData, initial)   
-    call this%externalR%setParameterNumber(resParData, covData, iflext, nrext, ntotc, nnrext, initial)
+    call this%externalR%setParameterNumber(resParData, covData, initial)
     call this%channelRadii%setParameterNumber(radFitFlags, covData, initial)
     call this%abundances%setParameterNumber(resParData, covData, initial)
     call this%detector%updateNumbersFromArray(covData, initial, Numdet, Ifldet(1:NumDet))
@@ -169,15 +168,14 @@ end subroutine  SetUParameters_countParameters
 !! 
 subroutine  SetUParameters_updateFitParameters(this,                &
           Iflbrd, Ifldet,                                           &
-          Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,           &
-          Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext)                         
+          Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,                   &
+          Iflnbk, Iflbgf, Ifldtp, Iflusd)
     use fixedi_m 
     use EndfData_common_m
     implicit none
     class(SetUParameters) :: this   
-    integer::Nnrext
     integer::Iflbrd(*),                                                   &
-             Ifldet(*), Iflext(Nnrext,Ntotc,*),                           &
+             Ifldet(*),                                                   &
              Iflmsc(*), Iradms(*), Iflpmc(4,*), Iflorr(*), Iflrpi(*),     & 
              Iflnbk(*), Iflbgf(*), Ifldtp(*), Iflusd(*)
             
@@ -187,8 +185,8 @@ subroutine  SetUParameters_updateFitParameters(this,                &
     !  count the total number of varied parameters        
     call  this%countParameters(nVar, nPup,                           &
           Iflbrd, Ifldet,                                            &
-          Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,            &
-          Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext) 
+          Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,                    &
+          Iflnbk, Iflbgf, Ifldtp, Iflusd)
          
    
             
@@ -208,7 +206,7 @@ subroutine  SetUParameters_updateFitParameters(this,                &
     ! order matters here as that is how the parameters in the covariance
     ! will be accessed in SAMMY
     call this%resData%updateFitFlags(resParData, covData, nVar, nPup)        
-    call this%externalR%updateFitFlags(resParData, covData, iflext, nrext, ntotc, nnrext, nVar, nPup)
+    call this%externalR%updateFitFlags(resParData, covData, nVar, nPup)
     call this%channelRadii%updateFitFlags(covData, radFitFlags, nVar, nPup)
     call this%abundances%updateFitFlags(resParData, covData, nVar, nPup)
     call this%detector%updateFlagsFromArray(covData,  Numdet, Ifldet(1:NumDet), nVar, nPup)
@@ -231,7 +229,6 @@ end subroutine  SetUParameters_updateFitParameters
 !!
 !! @return the index into the covariance matrix
 integer function SetUParameters_getExplicitCovIndex(this,     &
-           Iflext, Nnrext,                                    &
            Ifldet,                                            &
            Iflbrd,                                            &
            Iflmsc,                                            &  
@@ -247,8 +244,7 @@ integer function SetUParameters_getExplicitCovIndex(this,     &
     use EndfData_common_m
     implicit none
     class(SetUParameters) :: this   
-    integer::Nnrext
-    integer::Iflext(Nnrext,Ntotc,*), Ifldet(*)
+    integer::Ifldet(*)
     integer::Iflbrd(*), Iflmsc(*), Iflpmc(4,*),Iflorr(*), Iflrpi(*), Ifludr(*)
     integer::Iflnbk(*), Iflbgf(*), Ifldtp(*)
     integer::nn, mm
@@ -278,7 +274,7 @@ integer function SetUParameters_getExplicitCovIndex(this,     &
     !     6000+i   130000+i     data-reduction parameters   
     irow = -1    
     if( irow.le.0) irow = this%resData%getCovIndex(resParData,covData,nn,mm)
-    if (irow.le.0) irow = this%externalR%getCovIndex(resParData, covData, iflext, nnrext, nrext, ntotc, nn, mm)
+    if (irow.le.0) irow = this%externalR%getCovIndex(resParData, covData, nn, mm)
     if (irow.le.0) irow = this%channelRadii%getCovIndex(covData, radFitFlags, nn, mm)
     if (irow.le.0) irow = this%abundances%getCovIndexNn(resParData, covData, nn)
     if (irow.le.0) irow = this%detector%getCovIndexFromNn(covData, ifldet(1:numdet), numdet,  nn, 4000, allFalse)       
@@ -303,7 +299,6 @@ end  function SetUParameters_getExplicitCovIndex
 !! by user input data.
 !!
 subroutine  SetUParameters_setCovarianceExplicit(this,               &
-          Iflext, Nnrext,                                            &
           Ifldet, Iflbrd,                                            &   
           Iflmsc,                                                    &       
           Iflpmc,                                                    &
@@ -318,8 +313,6 @@ subroutine  SetUParameters_setCovarianceExplicit(this,               &
     use EndfData_common_m
     implicit none
     class(SetUParameters) :: this   
-    integer::Nnrext
-    integer::Iflext(Nnrext,Ntotc,*)
     integer::Ifldet(*), Iflbrd(*), Iflmsc(*), Iflpmc(4,*)
     integer::Iflorr(*), Iflrpi(*), Ifludr(*)
     integer::Iflnbk(*), Iflbgf(*), Ifldtp(*)
@@ -342,7 +335,6 @@ subroutine  SetUParameters_setCovarianceExplicit(this,               &
        val = vv(i)* vv(i)
       
        irow = this%getExplicitCovIndex(     &
-                           Iflext, Nnrext,  &
                            Ifldet,          &
                            Iflbrd,          &
                            Iflmsc,          &
@@ -376,7 +368,6 @@ end subroutine SetUParameters_setCovarianceExplicit
 !! by user input data.
 !!            
 subroutine  SetUParameters_setCovarianceOffExplicit(this,            &
-          Iflext, Nnrext,                                            &
           Ifldet, Iflbrd,                                            &   
           Iflmsc,                                                    &       
           Iflpmc,                                                    &
@@ -391,8 +382,6 @@ subroutine  SetUParameters_setCovarianceOffExplicit(this,            &
     use EndfData_common_m
     implicit none
     class(SetUParameters) :: this   
-    integer::Nnrext
-    integer::Iflext(Nnrext,Ntotc,*)
     integer::Ifldet(*), Iflbrd(*), Iflmsc(*), Iflpmc(4,*)
     integer::Iflorr(*), Iflrpi(*), Ifludr(*)
     integer::Iflnbk(*), Iflbgf(*), Ifldtp(*)
@@ -413,7 +402,6 @@ subroutine  SetUParameters_setCovarianceOffExplicit(this,            &
        if ( ll(i).eq.0.or.ll(i).eq.mm(i)) cycle
       
        irow = this%getExplicitCovIndex(     &
-                           Iflext, Nnrext,  &
                            Ifldet,          &
                            Iflbrd,          &
                            Iflmsc,          &
@@ -428,7 +416,6 @@ subroutine  SetUParameters_setCovarianceOffExplicit(this,            &
        if(irow.le.0) cycle
                
        icol = this%getExplicitCovIndex(     &
-                           Iflext, Nnrext,  &
                            Ifldet,          &
                            Iflbrd,          &
                            Iflmsc,          &
@@ -463,7 +450,6 @@ end subroutine SetUParameters_setCovarianceOffExplicit
 !! this function as the last step to fill in missing covariance data
 !!
 subroutine  SetUParameters_setCovarianceDefault(this, factor,        &
-          Iflext, Nnrext,                                            &
           Ifldet, Deldet,                                            &
           Iflbrd, delbrd,                                            &
           Iflmsc, delmsc,                                            &
@@ -479,8 +465,7 @@ subroutine  SetUParameters_setCovarianceDefault(this, factor,        &
     use constn_common_m
     implicit none
     class(SetUParameters) :: this   
-    integer::Nnrext
-    integer::Iflext(Nnrext,Ntotc,*), Ifldet(*)
+    integer::Ifldet(*)
     integer::Iflbrd(*), iflmsc(*), iflpmc(4,*)
     integer::Iflorr(*), Iflrpi(*), Ifludr(*)
     integer::Iflnbk(*), Iflbgf(*), Ifldtp(*)
@@ -496,7 +481,7 @@ subroutine  SetUParameters_setCovarianceDefault(this, factor,        &
     
     
     call this%resData%setDefaultUncertainty(resParData, covData, factor, polarFission, pi)
-    call this%externalR%setCovarianceDefault(resParData, covData, factor, iflext, nnrext, nrext, ntotc)      
+    call this%externalR%setCovarianceDefault(resParData, covData, factor)
     call this%channelRadii%setCovarianceDefault(covData, radFitFlags, factor)
     call this%abundances%uncertUserDefault(resParData, covData, factor)
     call this%detector%setDiagonalFromUserDefault(covData, Ifldet(1:Numdet), Numdet, deldet(1:Numdet), factor)   
diff --git a/sammy/src/new/mnew0.f b/sammy/src/new/mnew0.f
index b20d717fef633978a518546ce1a10d8e648d530a..c95877b6222362aa37d4a6790869d86f57b1be78 100644
--- a/sammy/src/new/mnew0.f
+++ b/sammy/src/new/mnew0.f
@@ -58,7 +58,6 @@ C
       IF (Kkrext.EQ.0) Kkrext = 1
       CALL Betset ( A_Iprbrd , I_Iflbrd , A_Iechan ,
      *   A_Iprdet , I_Ifldet ,
-     *   A_Iprext , I_Iflext ,
      *   A_Ipolar , A_Iprmsc , I_Iflmsc , I_Irdmsc ,
      *   A_Iprpmc , I_Iflpmc , A_Iprorr , I_Iflorr ,
      *   A_Iprrpi , I_Iflrpi , A_Iprudr , I_Ifludr ,
@@ -167,7 +166,7 @@ C ***          information provided by the user
 C            
             CALL Rparfl ( I_Iflbrd , A_Idebrd , A_Ibcf   ,
      *         A_Icf2   ,
-     *         I_Ifldet , A_Idedet , I_Iflext ,
+     *         I_Ifldet , A_Idedet ,
      *         I_Iflmsc , A_Idemsc , I_Irdmsc , I_Iflpmc , A_Idepmc ,
      *         I_Iflorr , A_Ideorr , I_Iflrpi , A_Iderpi ,
      *         I_Ifludr , A_Ideudr ,
@@ -316,7 +315,6 @@ C *** Purpose -- Put quantum numbers into PARameter file
       type(SammyRMatrixParameters)::relevantData
       integer,allocatable,dimension(:)::I_Jflbrd
       integer,allocatable,dimension(:)::I_Jfldet
-      integer,allocatable,dimension(:)::I_Jflext
       integer,allocatable,dimension(:)::I_Jflmsc
       integer,allocatable,dimension(:)::I_Jflpmc
       integer,allocatable,dimension(:)::I_Jflorr
@@ -340,11 +338,7 @@ C
       call allocate_integer_data(I_Jflbrd, Numbrd)
       IF (Numdet.GT.0) then
          call allocate_integer_data(I_Jfldet, Numdet)
-      end if
-      N = Nrext*resParData%getNumSpinGroups()*Ntotc
-      if (N.GT.0) then
-         call allocate_integer_data(I_Jflext, N)
-      end if
+      end if      
       if (Nummsc.GT.0) then
           call allocate_integer_data(I_Jflmsc, Nummsc)
       end if
@@ -374,11 +368,11 @@ C
          call allocate_integer_data(I_Jflbag, Numbag)
       end if
       CALL Copy_Jfl (I_Iflbrd ,
-     *       I_Ifldet , I_Iflext , I_Iflmsc ,
+     *       I_Ifldet , I_Iflmsc ,
      *       I_Iflpmc , I_Iflorr , I_Iflrpi , I_Ifludr , I_Iflnbk ,
      *       I_Iflbgf , I_Ifldtp , I_Iflbag ,
      *                  I_Jflbrd ,
-     *       I_Jfldet , I_Jflext , I_flmsc  ,
+     *       I_Jfldet , I_flmsc  ,
      *       I_Jflpmc , I_Jflorr , I_Jflrpi , I_Jfludr , I_Jflnbk ,
      *       I_Jflbgf , I_Jfldtp , I_Jflbag  )
       Ifrex = Ifrel
@@ -390,7 +384,6 @@ C     write the par file but with the new fit values
       CALL Oldord (    A_Iprbrd , I_Jflbrd , A_Idebrd ,
      *      I_Ifexcl ,
      *      A_Iprdet , I_Jfldet , A_Idedet , I_Iigrde ,
-     *      A_Iprext , I_Jflext ,
      *                 I_Iflpol ,
      *      A_Iprmsc , I_Jflmsc , A_Idemsc , I_Irdmsc , I_Ijkmsc ,
      *                 A_Ietaee ,
@@ -413,7 +406,6 @@ C and remove temporary arrays
       Kquanx = 0
       if (allocated(I_Jflbrd)) deallocate(I_Jflbrd)
       if (allocated(I_Jfldet)) deallocate(I_Jfldet)
-      if (allocated(I_Jflext)) deallocate(I_Jflext)
       if (allocated(I_Jflmsc)) deallocate(I_Jflmsc)
       if (allocated(I_Jflpmc)) deallocate(I_Jflpmc)
       if (allocated(I_Jflorr)) deallocate(I_Jflorr)
diff --git a/sammy/src/new/mnew3.f90 b/sammy/src/new/mnew3.f90
index 511cfaadc02f1b8c19961c9fec07afdc5f70e456..811f68266fe191141647d280b8b01f6a321312b4 100644
--- a/sammy/src/new/mnew3.f90
+++ b/sammy/src/new/mnew3.f90
@@ -4,7 +4,6 @@
 !C
       SUBROUTINE Betset (Parbrd, Iflbrd, Echan ,   &
          Pardet, Ifldet,  &
-         Parext, Iflext,    &
          Polar , Parmsc, Iflmsc, Iradms, Parpmc, Iflpmc,  &
          Parorr, Iflorr, Parrpi, Iflrpi, Parudr, Ifludr, Parnbk, Iflnbk,  &
          Parbgf, Iflbgf, Pardtp, Ifldtp, Zke   , Zeta  ,  &
@@ -19,13 +18,14 @@
       use EndfData_common_m
       use RMatResonanceParam_M
       use SammyResonanceInfo_M
+      use SammyRExternalInfo_M
+
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !C
       EXTERNAL pf
       DIMENSION Parbrd(*), Iflbrd(*), &
          Echan(Ntotc,*),        &
          Pardet(*), Ifldet(*),  &
-         Parext(Kkrext,Ntotc,*), Iflext(Kkrext,Ntotc,*),  &
          Polar(2,*), Parmsc(*), Iflmsc(*), Iradms(*),  &
          Parpmc(4,*), Iflpmc(4,*), Parorr(*), Iflorr(*),  &
          Parrpi(*), Iflrpi(*), Parudr(*), Ifludr(*),  &
@@ -35,12 +35,13 @@
       type(SammyResonanceInfo)::resInfo
       type(RMatResonance)::resonance
       type(SammySpinGroupInfo)::spinInfo
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
       integer::iflFlag
 !C     
 !C      DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd),
 !C     *   Echan(Ntotc,Ngroup),
-!C     *   Pardet(Numdet), Ifldet(Numdet), Parext(Nrext,Ntotc,Ngroup),
-!C     *   Iflext(Nrext,Ntotc,Ngroup), 
+!C     *   Pardet(Numdet), Ifldet(Numdet),
 !C     *   Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup),
 !C     *   Parpmc(4,Numpmc), Iflpmc(4,Numpmc),
 !C     *   Parorr(Numorr), Iflorr(Numorr), Parrpi(Numrpi), Iflrpi(Numrpi),
@@ -176,38 +177,25 @@
          K1 = Nvpres
       END IF
 !C
-      IF (Nfpext.GT.0) THEN
 !C ***    REXTERNAL PARAMETERS
-         DO Kgroup=1,resParData%getNumSpinGroups()
-            call resparData%getSpinGroupInfo(spinInfo, Kgroup)
-            Mmaxc = spinInfo%getNumChannels()
-            DO J=1,Mmaxc
-               IF (Iflext(1,J,Kgroup).GE.0) THEN
-                  DO Kqq=1,Nrext
-                     IF (Iflext(Kqq,J,Kgroup).GT.0) THEN
-                        Knpar = Knpar + 1                      
-                        IF (covData%isPupedParameter(  &
-                                 Iflext(Kqq,J,Kgroup))) THEN
-                           K3 = K3 + 1
-                        ELSE
-                           K1 = K1 + 1
-                        END IF
-                        IF (Kqq.NE.5) then
-                            UKnpar = Parext(Kqq,J,Kgroup)
-                            call covData%setUParamValue(Knpar, UKnpar)
-                        end if
-                        IF (Kqq.EQ.5) then
-                            UKnpar =  &
-                           dSQRT(Parext(Kqq,J,Kgroup))
-                           call covData%setUParamValue(Knpar, UKnpar)
-                        end if
-                     END IF
-                  END DO
-               END IF
-            END DO
-         END DO
-      END IF
-    
+      DO K=1,resParData%getNumRext()
+        call resParData%getRextInfo(rextInfo, K)
+        call resParData%getRext(rext, rextInfo)
+        DO Kqq=1,rextInfo%getNrext()
+           Ifl = rextInfo%getIflSammyIndex(Kqq)
+           IF (Ifl.GT.0) THEN
+              Knpar = Knpar + 1
+              IF (covData%isPupedParameter(Ifl)) THEN
+                 K3 = K3 + 1
+              ELSE
+                 K1 = K1 + 1
+              END IF
+              UKnpar =  rext%getSammyValue(Kqq)
+              if (Kqq.eq.5) UKnpar = dSQRT(UKnpar)
+              call covData%setUParamValue(Knpar, UKnpar)
+           END IF
+        END DO
+      END DO
 !C
 !C
 !C ***    RADIUS PARAMETERS
@@ -666,26 +654,23 @@
 !C ----------------------------------------------------------------
 !C
       SUBROUTINE Copy_Jfl (Iflbrd, Ifldet,  &
-           Iflext, Iflmsc, Iflpmc, Iflorr, Iflrpi,  &
+           Iflmsc, Iflpmc, Iflorr, Iflrpi,  &
            Ifludr, Iflnbk, Iflbgf, Ifldtp, Iflbag,  &
                            Jflbrd, Jfldet,  &
-           Jflext, Jflmsc, Jflpmc, Jflorr, Jflrpi,  &
+           Jflmsc, Jflpmc, Jflorr, Jflrpi,  &
            Jfludr, Jflnbk, Jflbgf, Jfldtp, Jflbag)
       use fixedi_m
       use ifwrit_m
       use broad_common_m
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
       DIMENSION Iflbrd(*), Ifldet(*),  &
-         Iflext(Nrext,Ntotc,*),   &
          Iflmsc(*), Iflpmc(4,*), Iflorr(*), Iflrpi(*), Ifludr(*),  &
          Iflnbk(*), Iflbgf(*), Ifldtp(*), Iflbag(*)
       DIMENSION Jflbrd(*),  Jfldet(*),  &
-         Jflext(Nrext,Ntotc,*),   &
          Jflmsc(*), Jflpmc(4,*), Jflorr(*), Jflrpi(*), Jfludr(*),  &
          Jflnbk(*), Jflbgf(*), Jfldtp(*), Jflbag(*)
       CALL Set_Equal (Iflbrd, Jflbrd, Numbrd)
       CALL Set_Equal (Ifldet, Jfldet, Numdet)
-      CALL Set_Equal (Iflext, Jflext, Nrext*Ngroup*Ntotc)
       CALL Set_Equal (Iflmsc, Jflmsc, Nummsc)
       CALL Set_Equal (Iflpmc, Jflpmc, Numpmc*4)
       N = Numorr
diff --git a/sammy/src/new/mnew4.f b/sammy/src/new/mnew4.f
index 71a703362597e9e3f9e0585daac977ccc1757aad..e00f141ffbd8ca10e52beeeb0deaa18173b5f27c 100644
--- a/sammy/src/new/mnew4.f
+++ b/sammy/src/new/mnew4.f
@@ -4,7 +4,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Rparfl (Iflbrd, Delbrd, Bcf, Cf2,
-     *   Ifldet, Deldet, Iflext,
+     *   Ifldet, Deldet,
      *   Iflmsc, Delmsc, Iradms, Iflpmc, Delpmc,
      *   Iflorr, Delorr, Iflrpi, Delrpi, Ifludr, Deludr,
      *   Iflnbk, Delnbk, Iflbgf, Delbgf, Ifldtp, Deldtp,
@@ -40,7 +40,7 @@ C
      *   Prior(*)
         integer::Iflbrd(*),
      *   Iflpmc(*),
-     *   IFldet(*), Iflext(Nrext,Ntotc,*), 
+     *   IFldet(*),
      *   Iflmsc(*), Iradms(*), 
      *   Iflorr(*), Iflrpi(*),
      *   Ifludr(*), Iflnbk(*), 
@@ -84,7 +84,6 @@ C
                 nnrext  = nrext
                 if( nrext.eq.0) nnrext = 1   ! make sure we don't dimension by 0
                call covarianceSetter%setCovarianceExplicit( 
-     *              Iflext, Nnrext,  
      *              Ifldet,
      *              Iflbrd, Iflmsc,
      *              Iflpmc,
@@ -106,7 +105,6 @@ C
             
             ! finally set default values if not set
             call covarianceSetter%setCovarianceDefault(Fudge,             
-     *                            Iflext, Nnrext,
      *                            Ifldet, DelDet,
      *                            Iflbrd, Delbrd,
      *                            Iflmsc, Delmsc,
@@ -144,7 +142,7 @@ C
 C *** CHECK TO BE SURE ALL UNCERTAINTIES ARE GREATER THAN ZERO
       Nzero = 0
       DO I=1,covData%getNumTotalParam()
-         cov = dSqrt(physCov%getCovariance(i,i))   
+         cov = dSqrt(physCov%getCovariance(i,i))
          IF (cov.EQ.0.0d0) THEN
             Nzero = Nzero + 1
             WRITE (6,99999) I
@@ -169,7 +167,6 @@ C     are given as correlations
              nnrext  = nrext
              if( nrext.eq.0) nnrext = 1   ! make sure we don't dimension by 0
              call covarianceSetter%setCovarianceOffExplicit( 
-     *              Iflext, Nnrext,
      *              Ifldet,
      *              Iflbrd, Iflmsc,
      *              Iflpmc,
@@ -200,7 +197,7 @@ C     are given as correlations
 
         ! adjust the ones that are not 
         call OffresConv(.false.)
-        call OffextConv (Iflext, .false.)
+        call OffextConv (.false.)
         call OffmscConv(Iflmsc, .false.)
 
        do i  = 1, covData%getNumTotalParam()
diff --git a/sammy/src/new/mnew6.f b/sammy/src/new/mnew6.f
index 83a894fca25ac16144cb658af514363a3382086e..561c7047d3017f69e7e811f608ef43a0d182588f 100644
--- a/sammy/src/new/mnew6.f
+++ b/sammy/src/new/mnew6.f
@@ -100,19 +100,18 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE OffextConv (Iflext, onlyPups)
+      SUBROUTINE OffextConv (onlyPups)
 C
       use fixedi_m
       use ifwrit_m
       use kzznew_common_m
       use EndfData_common_m
       use ResonanceCovariance_M 
-      use SammySpinGroupInfo_M
+      use SammyRExternalInfo_M
       IMPLICIT NONE
 C
-      Integer:: Iflext(Nrext,Ntotc,*)
       type(ResonanceCovariance)::uCov
-      type(SammySpinGroupInfo)::spinInfo
+      type(SammyRExternalInfo)::rextInfo
       integer::n, m, ipar, jpar
       logical::onlyPups
       real(kind=8)::cov, A, uVal
@@ -120,12 +119,13 @@ C
 
       call covData%getUCovariance(uCov) 
       
-      DO  N=1, resParData%getNumSpinGroups()
-         call resParData%getSpinGroupInfo(spinInfo, N) 
-        
-         DO M = 1,spinInfo%getNumChannels()
-            ! only need to change data for i==5
-            ipar = Iflext(5,M,N)
+      DO  N=1, resParData%getNumRext()
+         call resParData%getRextInfo(rextInfo, N)
+
+
+            ! only need to change data for i==5, since it is the only one
+            ! with u and p parameter differences
+            ipar = rextInfo%getIflSammyIndex(5)
             if (ipar.le.0) cycle
             
             ! skip if we only want to convert pup'ed parameters
@@ -154,7 +154,7 @@ C
                  call uCov%setCovariance(ipar, jpar,cov)
              end do
       
-         END DO
+
       end do
       END
 C
diff --git a/sammy/src/ntg/mntg4.f b/sammy/src/ntg/mntg4.f
index edd0039a97f766273c45ba9424bf966e2f6a7444..6548a90b89e2ecb51b0970712692a2baea462a9d 100644
--- a/sammy/src/ntg/mntg4.f
+++ b/sammy/src/ntg/mntg4.f
@@ -462,6 +462,8 @@ C
          Aaold = Bb
          val1 = val1 + Alfa*Aa
          val2 = val2 + Etaa*Aa*Xnu
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1)   ! derivs + cross
+         call calcData%reserveColumns(Kountr+1, Ndasig+Ndbsig+1) ! derivs + cross
          call calcData%addData(Kountr, 0, 1, val1)
          call calcData%addData(Kountr+1, 0, 1, val2)
          DO Ipar=1,Ndasig + Ndbsig
diff --git a/sammy/src/ntg/mntg5.f b/sammy/src/ntg/mntg5.f
index 75bb258a8c716f5a323b5502e3f448c09770a7fd..95c3b7ab4cef0edda50ee09479d4d1ac4fc6518d 100644
--- a/sammy/src/ntg/mntg5.f
+++ b/sammy/src/ntg/mntg5.f
@@ -110,6 +110,7 @@ C
       W12 = calcData%getData(Kountr-12, 0, 1)
       W13 = calcData%getData(Kountr-13, 0, 1)
       val = (Xnu*W12-W13)*Tosp
+      call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
       call calcData%addData(Kountr, 0, 1, val)
       IF (Ndasig.NE.0) THEN
          DO Ipar=1,Ndasig
@@ -137,9 +138,7 @@ C
       Kountr = Kountr + 1
       if (calcData%getLength().lt.Kountr) then
          ! update cross section (ipar=0) as well as derivatives
-         do Ipar = 0, Ndasig + Ndbsig
-            call calcData%setSharedDataVal(Kountr, Ipar, 0.0d0)
-         end do
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
       end if
       RETURN
       END
@@ -164,6 +163,7 @@ C
       IF (W16.EQ.0.0d0) return
       W15 = calcData%getData(Kountr-15,0,1)
       WK = W15 / W16
+      call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
       call calcData%addData(Kountr,0,1,WK)
       IF (Ndasig.GE.0) THEN
          DO Ipar=1,Ndasig
@@ -178,9 +178,7 @@ C
       Kountr = Kountr + 1
       if (calcData%getLength().lt.Kountr) then
          ! update cross section (ipar=0) as well as derivatives
-         do Ipar = 0, Ndasig + Ndbsig
-            call calcData%setSharedDataVal(Kountr, Ipar, 0.0d0)
-         end do
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
       end if
       RETURN
       END
diff --git a/sammy/src/ntg/mntg6.f b/sammy/src/ntg/mntg6.f
index 34f104271d7b52cd1a75d8f35836328abe1e8d68..ee34daae2ae01771273fa030ab20f9dfeab1b30f 100644
--- a/sammy/src/ntg/mntg6.f
+++ b/sammy/src/ntg/mntg6.f
@@ -152,6 +152,7 @@ C
 C
       IF (Nnnsig.EQ.1) THEN
          val = calcData%getData(Kountr, 0, 1) + Const(2,Kountr)
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
          call calcData%addData(Kountr, 0, 1, val)
          WRITE (21,10400) val
          Kountr = Kountr + 1
@@ -165,16 +166,13 @@ C
       ELSE
          eIp0 = grid%getEnergy(JEquit  , expData)
          val = calcData%getData(Kountr, 0, 1) + Const(2,Kountr)
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
          call calcData%addData(Kountr, 0, 1, val)
          WRITE (21,10200) val, eIp0, Equit
 10200    FORMAT (' RIABS = Resonance integrl Absrptn =', 1P4G14.6)
          Kountr = Kountr + 1
-         if (calcData%getLength().lt.Kountr) then
-            ! update cross section (ipar=0) as well as derivatives
-            do Ipar = 0, Ndasig + Ndbsig
-               call calcData%setSharedDataVal(Kountr, Ipar, 0.0d0)
-            end do
-         end if
+         ! update cross section (ipar=0) as well as derivatives
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
          val = calcData%getData(Kountr, 0, 1) + Const(2,Kountr)
          call calcData%addData(Kountr, 0, 1, val)
          WRITE (21,10300) val, eIp0, Equit
@@ -191,12 +189,8 @@ C
          WRITE (21,10400) val, eIp0, Equit
 10400    FORMAT (' RICAP = Resonance integrl Capture =', 1P4G14.6)
          Kountr = Kountr + 1
-         if (calcData%getLength().lt.Kountr) then
-            ! update cross section (ipar=0) as well as derivatives
-            do Ipar = 0, Ndasig + Ndbsig
-               call calcData%setSharedDataVal(Kountr, Ipar, 0.0d0)
-            end do
-         end if
+         ! update cross section (ipar=0) as well as derivatives
+         call calcData%reserveColumns(Kountr, Ndasig+Ndbsig+1) ! derivs + cross
       END IF
       call grid%destroy()
       RETURN
diff --git a/sammy/src/old/mold0.f b/sammy/src/old/mold0.f
index aa2229dc02052de9cbd6e82a3e92a57a512baeed..146c12124c1def24329c00a9579aac8f6d50edf4 100644
--- a/sammy/src/old/mold0.f
+++ b/sammy/src/old/mold0.f
@@ -57,7 +57,7 @@ C ***    Sub routine Rdcov reads binary file containing information from
 C ***       previous run, including covariance matrices & parameter values
 C ***    Read the COVariance file, extract information
          CALL Rdcov (  A_Iprbrd , I_Iflbrd , 
-     *      A_Iprdet , I_Ifldet , I_Iigrde , A_Iprext , I_Iflext ,
+     *      A_Iprdet , I_Ifldet , I_Iigrde ,
      *      A_Ipolar , I_Iflpol ,
      *      A_Iprmsc , I_Iflmsc , I_Irdmsc , I_Ijkmsc , A_Ietaee ,
      *      A_Iprpmc , I_Iflpmc , I_Isopmc ,
@@ -78,7 +78,6 @@ C ***    Note that call to Rdcovx should not need updating because obsolete
          Nsingl = Nsingl*2
 C ***    Read the very old COVariance file, extract information
          CALL Rdcovx ( A_Iprbrd , I_Iflbrd ,
-     *      A_Iprext , I_Iflext ,
      *      A_Ipolar , I_Iflpol , A_Iprmsc , I_Iflmsc , I_Irdmsc ,
      *      A_Iprpmc , I_Iflpmc , I_Isopmc ,
      *      A_Iprorr , I_Iflorr , A_Icrnch , A_Iedets ,
@@ -211,7 +210,6 @@ C
       IF (Kkrext.EQ.0) Kkrext = 1
       CALL Bet_Pup( A_Iprbrd , I_Iflbrd , A_Iechan ,
      *   A_Iprdet , I_Ifldet ,
-     *   A_Iprext , I_Iflext ,
      *   A_Ipolar , A_Iprmsc , I_Iflmsc , I_Irdmsc ,
      *   A_Iprpmc , I_Iflpmc , A_Iprorr , I_Iflorr ,
      *   A_Iprrpi , I_Iflrpi , A_Iprudr , I_Ifludr ,
@@ -220,7 +218,7 @@ C
      *   Kkrext)
       CALL Rparfl_Pup (I_Iflbrd , A_Idebrd ,
      *   A_Ibcf   , A_Icf2   ,
-     *   I_Ifldet , A_Idedet , I_Iflext ,
+     *   I_Ifldet , A_Idedet ,
      *   A_Iprmsc , I_Iflmsc , A_Idemsc , I_Irdmsc ,
      *   I_Iflpmc , A_Idepmc ,
      *   I_Iflorr , A_Ideorr , I_Iflrpi , A_Iderpi ,
diff --git a/sammy/src/old/mold2.f b/sammy/src/old/mold2.f
index 3affb73b560e95cbb51a793b271079c4ae7e2c6c..545069ff41a57595083440d6a3429f33a64f17a4 100644
--- a/sammy/src/old/mold2.f
+++ b/sammy/src/old/mold2.f
@@ -98,7 +98,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Rdcov ( Parbrd, Iflbrd, 
-     *   Pardet, Ifldet, Igrdet,         Parext, Iflext,
+     *   Pardet, Ifldet, Igrdet,
      *   Polar , Iflpol, Parmsc, Iflmsc, Iradms, Ijkmsc, Etaeee,
      *   Parpmc, Iflpmc, Isopmc,
      *   Parorr, Iflorr, Ecrnch, Endets,
@@ -122,6 +122,7 @@ C
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
       use ReadCovarianceInfo_m
+      use SammyRExternalInfo_M
       use AllocateFunctions_m
       use, intrinsic :: ISO_C_BINDING
 C this is not a common block, this contains functions     
@@ -135,21 +136,25 @@ C this is not a common block, this contains functions
       type(RMatSpinGroup)::rmatSpin
       type(SammyResonanceInfo)::resInfo, resNew
       type(RMatResonance)::resonance, resonanceNew
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
       real(kind=8) :: Dum3
       integer,allocatable,dimension(:)::keeper
       real(kind=8),allocatable,dimension(:)::Dum1, Dum2
       integer,allocatable,dimension(:)::Idiot1, Idiot2
       integer,allocatable,dimension(:,:)::IGrpAssoc
+      integer,allocatable,dimension(:,:,:)::Iflext
+      real(kind=8),allocatable,dimension(:,:,:)::Parext
       type(SammySpinGroupInfo)::spinInfo
       logical(C_BOOL)::reduced, inc
       logical(C_BOOL)::trueEqual
+      integer::irext
       integer::iflagMatch
       real(kind=8)::oldCrfn
 C
 C#      CHARACTER*6 What
       DIMENSION Parbrd(*), Iflbrd(*),
      *   Pardet(*), Ifldet(*), Igrdet(*),
-     *   Parext(Krext,Ntotc,*), Iflext(Krext,Ntotc,*),
      *   Polar(2,*), Iflpol(2,*),
      *   Parmsc(*), Iflmsc(*), Iradms(*), Ijkmsc(*), Etaeee(*),
      *   Parpmc(4,*), Iflpmc(4,*), Isopmc(*),
@@ -163,7 +168,6 @@ C#      CHARACTER*6 What
 C
 C      DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd), 
 c     *   Pardet(Numdet), Ifldet(Numdet), Igrdet(Ngroup),
-C     *   Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup),
 C     *   Polar(2,Nres), Iflpol(2,Nres),
 C     *   Parmsc(Nummsc), Iflmsc(Nummsc), Iradms(Ngroup), Ijkmsc(Nummsc),
 C     *   Parpmc(Numpmc), Iflpmc(Numpmc), Isopmc(Numpmc),
@@ -207,6 +211,8 @@ C *** RESONANCE PARAMETERS
 C
 C *** R-EXTERNAL PARAMETERS
       IF (Numext.NE.0) THEN
+          allocate(Iflext(Nrext, Ntotc, Ngroup))
+          allocate(Parext(Nrext, Ntotc, Ngroup))
 C#         READ (Iu62) What, Num1, Num2
 C     #         IF (What.NE.'Iflext') STOP '[What.NE.Iflext in mold2.f]'
          
@@ -216,6 +222,28 @@ C#         READ (Iu62) What, Num1, Num2
 C#         IF (What.NE.'Parext') STOP '[What.NE.Parext in mold2.f]'
 C#         IF (Num1.NE.Nrext) STOP '[N.NE.Nrext in mold2.f]'
          READ (Iu62) (((Parext(K,M,I),K=1,Nrext),M=1,Ntotc),I=1,Ngroup)
+
+         DO N=1,Ngroup
+            DO I=1,Ntotc
+               if (Iflext(1,I,N).eq.-1) cycle
+               if (resParData%hasRexInfo(N, I)) then
+                  call resParData%getRextInfoByGroup(rextInfo, N, I)
+               else
+                 call resparData%addRext(N, I)
+                 irext = resParData%getNumRext()
+                 call resParData%getRextInfo(rextInfo, irext)
+                 call rextInfo%setNrext(Nrext)
+               end if
+               call resparData%getRext(rext, rextInfo)
+               Do Kqqq = 1, Nrext
+                 call rext%setSammyValue(Kqqq, Parext(Kqqq,I,N))
+                 call rextInfo%setIflSammyIndex(Kqqq,
+     *                                         Iflext(Kqqq,I,N))
+               end do
+            END DO
+         END DO
+         deallocate(iflext)
+         deallocate(Parext)
       END IF
 C
 C *** RADIUS PARAMETERS
diff --git a/sammy/src/old/mold5.f b/sammy/src/old/mold5.f
index 5052b2ccf1e15b8d910d2e920ee2e7d5be936efb..c2830063ac3f95ec0e4a596a8972d355605561e2 100644
--- a/sammy/src/old/mold5.f
+++ b/sammy/src/old/mold5.f
@@ -3,7 +3,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE  Rdcovx ( Parbrd, Iflbrd, 
-     *     Parext, Iflext,
+     *     Iflext,
      *     Polar , Iflpol, Parmsc, Iflmsc, Iradms,
      *     Parpmc, Iflpmc, Isopmc,
      *     Parorr, Iflorr, Ecrnch, Endets,
@@ -35,6 +35,7 @@ C this is not a common block, this contains functions
       use RMatResonanceParam_M
       use ReadCovarianceInfo_m
       use AllocateFunctions_m
+      use SammyRExternalInfo_M
       use, intrinsic :: ISO_C_BINDING
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 
@@ -43,7 +44,6 @@ C this is not a common block, this contains functions
       real(kind=8)  :: dum1
 C
       DIMENSION Parbrd(*), Iflbrd(*),
-     *   Parext(Krext,Ntotc,*), Iflext(Krext,Ntotc,*),
      *   Polar(2,*), Iflpol(2,*), Parmsc(*), Iflmsc(*), Iradms(*),
      *   Parpmc(4,*), Iflpmc(4,*), Isopmc(*),
      *   Parorr(*), Iflorr(*), Ecrnch(*), Endets(*), Sesese(*),
@@ -56,12 +56,16 @@ C
       type(SammySpinGroupInfo)::spinInfo
       type(SammyResonanceInfo)::resInfo, resNew
       type(RMatResonance)::resonance, resonanceNew
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
       logical(C_BOOL)::reduced, inc
       logical(C_BOOL)::trueEqual
       integer,allocatable,dimension(:)::Iflags
       integer,allocatable,dimension(:,:)::IGrpAssoc
+      integer,allocatable,dimension(:,:,:)::Iflext
       integer::iflagMatch
       real(kind=8)::oldCrfn
+      integer::irext
 
       iflagMatch = radFitFlags%matchFitFlag()
 C     
@@ -97,17 +101,36 @@ C *** isotopic abundances etc.
 C
 C *** R-EXTERNAL PARAMETERS
       IF (Numext.NE.0) THEN
+         allocate(Iflext(Nrext, Ntotc, Ngroup))
          READ (Iu62) (((Iflext(K,M,I),K=1,Nrext),M=1,Ntotc),I=1,Ngroup)
          READ (Iu62) (Single(J),J=1,Nrext*Ntotc*Ngroup)
+
          J = 0
-         DO I=1,Ngroup
-            DO M=1,Ntotc
-               DO K=1,Nrext
-                  J = J + 1
-                  Parext(K,M,I) = DBLE(Single(J))
-               END DO
+         DO N=1,Ngroup
+            DO I=1,Ntotc
+               if (Iflext(1,I,N).eq.-1) then
+                  J  = J + Nrext
+                  cycle
+               end if
+
+               if (resParData%hasRexInfo(N, I)) then
+                  call resParData%getRextInfoByGroup(rextInfo, N, I)
+               else
+                 call resparData%addRext(N, I)
+                 irext = resParData%getNumRext()
+                 call resParData%getRextInfo(rextInfo, irext)
+                 call rextInfo%setNrext(Nrext)
+               end if
+               call resparData%getRext(rext, rextInfo)
+               Do Kqqq = 1, Nrext
+                 J = J + 1
+                 call rext%setSammyValue(Kqqq, DBLE(Single(J)))
+                 call rextInfo%setIflSammyIndex(Kqqq,
+     *                                         Iflext(Kqqq,I,N))
+               end do
             END DO
          END DO
+         deallocate(Iflext)
       END IF
 C
 C
diff --git a/sammy/src/old/mold8.f b/sammy/src/old/mold8.f
index 386f089d636e56738fdfba3ecd8da7132212d5cd..b6d8b6e1564783c92111372a09013d9e7310887d 100644
--- a/sammy/src/old/mold8.f
+++ b/sammy/src/old/mold8.f
@@ -3,7 +3,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Rparfl_Pup (Iflbrd, Delbrd,Bcf, Cf2,
-     *   Ifldet, Deldet, Iflext,
+     *   Ifldet, Deldet,
      *   Parmsc, Iflmsc, Delmsc, Iradms, Iflpmc, Delpmc,
      *   Iflorr, Delorr, Iflrpi, Delrpi, Ifludr, Deludr,
      *   Iflnbk, Delnbk, Iflbgf, Delbgf, Ifldtp, Deldtp,
@@ -27,7 +27,7 @@ C
       type(ResonanceCovariance)::physCov, uCov
       logical(C_BOOL)::haveUParam
       DIMENSION Iflbrd(*), Delbrd(*),Bcf(*), Cf2(*),
-     *   IFldet(*), Deldet(*), Iflext(Nrext,Ntotc,*), 
+     *   IFldet(*), Deldet(*),
      *   Iflmsc(*), Delmsc(*), Iradms(*), Iflpmc(4,*), Delpmc(4,*),
      *   Iflorr(*), Delorr(*), Iflrpi(*), Delrpi(*),
      *   Ifludr(*), Deludr(*), Iflnbk(*), Delnbk(*),
@@ -39,7 +39,6 @@ C
 C      DIMENSION Iflbrd(Numbrd), Bcf(Ncf), Cf2(Ncf),
 C     *   Ifleff(Numrad), Deleff(Numrad), Ifltru(Numrad), Deltru(Numrad),
 C     *   IFldet(Numdet), Deldet(Numdet),
-C     *   Iflext(Nrext,Ntotc,Ngroup), 
 C     *   Iflmsc(Nummsc), Delmsc(Nummsc), Iradms(Ngroup),
 C     *   Iflpmc(4,Numpmc), Delpmc(4,Numpmc),
 C     *   Iflorr(Numorr), Delorr(Numorr), Iflrpi(Numrpi), Delrpi(Numrpi),
@@ -59,8 +58,7 @@ C
       call  covarianceSetter%initialize()
       haveUParam = .true.
       call covarianceSetter%setHaveUParam(haveUParam)
-      call covarianceSetter%setCovarianceExplicit( 
-     *             Iflext, Nnrext,               
+      call covarianceSetter%setCovarianceExplicit(         
      *             IflDet,
      *             Iflbrd, Iflmsc,
      *             Iflpmc,
@@ -76,7 +74,6 @@ C
      *               nprior, iprior, jprior, prior,
      *               Bcf, Cf2, fudge)
       call covarianceSetter%setCovarianceDefault(Fudge,             
-     *             Iflext, Nnrext,
      *             Ifldet, deldet,
      *             Iflbrd, delbrd,
      *             Iflmsc, delmsc,
@@ -92,8 +89,7 @@ C
             ! set from explicit user input
              nnrext  = nrext
              if( nrext.eq.0) nnrext = 1   ! make sure we don't dimension by 0
-             call covarianceSetter%setCovarianceOffExplicit( 
-     *              Iflext, Nnrext,  
+             call covarianceSetter%setCovarianceOffExplicit(  
      *              Ifldet,
      *              Iflbrd, Iflmsc,
      *              Iflpmc,
@@ -125,7 +121,7 @@ C
             
       ! adjust the ones that are not 
       call OffresConv(.true.)
-      call OffextConv (Iflext, .true.)
+      call OffextConv (.true.)
       call OffmscConv(Iflmsc, .true.)
       
       RETURN
diff --git a/sammy/src/old/mold9.f b/sammy/src/old/mold9.f
index f7dfdebaae2a5a63df1b7f756bc644f30a68fa38..b7b684a3f812efe005c12d0869bb4c6ceb246467 100644
--- a/sammy/src/old/mold9.f
+++ b/sammy/src/old/mold9.f
@@ -9,7 +9,6 @@ C --------------------------------------------------------------
 C
       SUBROUTINE Bet_Pup (Parbrd, Iflbrd,  Echan ,
      *   Pardet, Ifldet,
-     *   Parext, Iflext,  
      *   Polar , Parmsc, Iflmsc, Iradms, Parpmc, Iflpmc, Parorr,
      *   Iflorr, Parrpi, Iflrpi, Parudr, Ifludr, Parnbk, Iflnbk, Parbgf,
      *   Iflbgf, Pardtp, Ifldtp, Kkrext)
@@ -24,13 +23,14 @@ C
       use SammyResonanceInfo_M
       use SammySpinGroupInfo_M
       use RMatResonanceParam_M
+      use SammyRExternalInfo_M
+
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 C
       EXTERNAL pf
       DIMENSION Parbrd(*), Iflbrd(*),
      *   Echan(Ntotc,*),
      *   Pardet(*), Ifldet(*),
-     *   Parext(Kkrext,Ntotc,*), Iflext(Kkrext,Ntotc,*),
      *   Polar(2,*), Parmsc(*), Iflmsc(*), Iradms(*),
      *   Parpmc(4,*), Iflpmc(4,*), Parorr(*), Iflorr(*),
      *   Parrpi(*), Iflrpi(*), Parudr(*), Ifludr(*),
@@ -39,6 +39,8 @@ C
 C
       type(SammyResonanceInfo)::resInfo
       type(SammySpinGroupInfo)::spinInfo
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
       type(RMatResonance)::resonance
       DATA Zero /0.0d0/, Halfth /5.d-4/
 C
@@ -114,32 +116,22 @@ C ***    First -- resonance parameters
          END DO
       END IF
 C
-      IF (Nfpext.GT.0) THEN
 C ***    R_external parameters
-         DO Kgroup=1,Ngroup
-            call resparData%getSpinGroupInfo(spinInfo, Kgroup)
-            Mmaxc = spinInfo%getNumChannels()
-            DO J=1,Mmaxc
-               IF (Iflext(1,J,Kgroup).GE.0) THEN
-                  DO Kqq=1,Nrext
-                     IF (Iflext(Kqq,J,Kgroup).GT.0) THEN
-                        Knpar = Knpar + 1      
-                        ifl = Iflext(Kqq,J,Kgroup)
-                        keep = covData%getCovIndex(Ifl)
-                        IF (covData%isPupedParameter(ifl)) THEN
-                           K3 = K3 + 1
-                           IF (Kqq.NE.5) Upup =
-     *                        Parext(Kqq,J,Kgroup)
-                           IF (Kqq.EQ.5) Upup =
-     *                        dSQRT(Parext(Kqq,J,Kgroup))
-                           call covData%setUParamValue(keep,Upup)
-                        END IF
-                     END IF
-                  END DO
-               END IF
-            END DO
-         END DO
-      END IF
+      Do K = 1, resParData%getNumRext()
+        call resparData%getRextInfo(rextInfo, K)
+        call resParData%getRext(rext, rextInfo)
+        do J = 1, rextInfo%getNrext()
+           ifl = rextInfo%getIflSammyIndex(J)
+           if (Ifl.le.0) cycle
+           Knpar = Knpar + 1
+           if (.not.covData%isPupedParameter(ifl)) cycle
+           K3 = K3 + 1
+           Upup = rext%getSammyValue(J)
+           if(J.eq.5) Upup = dSqrt(Upup)
+           Keep = covData%getCovIndex(Ifl)
+           call covData%setUParamValue(keep,Upup)
+        end do
+      END DO
 C
 C
 C ***    Radius parameters
diff --git a/sammy/src/par/mpar0.f90 b/sammy/src/par/mpar0.f90
index 9d0380e9f2fc78b8c53d9c3d73ecb832e44fccf7..63610c67371c4858ee0202f463b7a866c3b40edf 100644
--- a/sammy/src/par/mpar0.f90
+++ b/sammy/src/par/mpar0.f90
@@ -100,7 +100,6 @@ module par_m
       CALL Parfil ( A_Iprbrd , I_Iflbrd , A_Isiabn ,             &
                     A_Ispiso , I_Ixciso ,                        &
          A_Iprdet , I_Ifldet , A_Idedet , I_Iigrde ,             &
-         A_Iprext , I_Iflext ,                                   &
          A_Iprmsc , I_Iflmsc , A_Idemsc , I_Irdmsc , I_Ijkmsc ,  &
          A_Iznonu , A_Irnonu , A_Ianonu , A_Ibnonu , A_Ietaee ,  &
          A_Iprpmc , I_Iflpmc , A_Idepmc , I_Isopmc ,             &
@@ -144,9 +143,9 @@ module par_m
 !
       IF (Kpolar.EQ.1.AND. Nres.NE.0) CALL Fixpol (I_Iflpol )
       CALL Fix (I_Iflbrd ,                                      &
-         I_Ifldet , I_Iflext , I_Iflmsc ,                       &
+         I_Ifldet , I_Iflmsc ,                                  &
          I_Irdmsc , I_Iflpmc , I_Iflorr , I_Iflrpi , I_Iflnbk , &
-         I_Iflbgf , I_Ifldtp , I_Iflusd , Nnrext)
+         I_Iflbgf , I_Ifldtp , I_Iflusd)
 ! *** Routine Fix sets Flag = (Parameter Number)
 !
       IF (Kpolar.EQ.1.AND. Nres.NE.0) CALL Flgpol (I_Iflpol )
diff --git a/sammy/src/par/mpar02.f90 b/sammy/src/par/mpar02.f90
index 89bd9ee294a1b3dfc7b443a4bca2e55915b271aa..af66e1e35ec65ac8d44ac4d891904853cf8c00ef 100644
--- a/sammy/src/par/mpar02.f90
+++ b/sammy/src/par/mpar02.f90
@@ -9,7 +9,7 @@ module par2_m
       SUBROUTINE Parfil (Parbrd, Iflbrd, Siabnd,                         &
                          Spniso, Ixciso,                                 &
          Pardet, Ifldet, Deldet, Igrdet,                                 &
-         Parext, Iflext, Parmsc, Iflmsc, Delmsc, Iradms, Ijkmsc,         &
+         Parmsc, Iflmsc, Delmsc, Iradms, Ijkmsc,                         &
          Znonu , Rnonu , Anonu , Bnonu ,                                 &
          Etaeee, Parpmc, Iflpmc, Delpmc, Isopmc,                         &
          Parorr, Iflorr, Delorr, Ecrnch, Endets, Sesese, Eseses, Sigdts, &
@@ -48,7 +48,6 @@ module par2_m
       DIMENSION Parbrd(*), Iflbrd(*), Siabnd(*),                 &
          Spniso(*), Ixciso(*),                                   &
          Pardet(*), Ifldet(*), Deldet(*), Igrdet(*),             &
-         Parext(Nnrext,Ntotc,*), Iflext(Nnrext,Ntotc,*),         &
          Parmsc(*), Iflmsc(*), Delmsc(*), Iradms(*), Ijkmsc(*),  &
          Znonu (*), Rnonu (*), Anonu (*), Bnonu (*), Etaeee(*),  &
          Parpmc(4,*), Iflpmc(4,*), Delpmc(4,*), Isopmc(*),       &
@@ -72,7 +71,6 @@ module par2_m
 !     *   Spniso(Numiso), Ixciso(Numiso),
 !     *   Pardet(Numdet), Ifldet(Numdet),
 !     *                   Deldet(Numdet), Igrdet(Ngroup),
-!     *   Parext(Nrext,Ntotc,Ngroup)    , Iflext(Nrext,Ntotc,Ngroup),
 !     *   Parmsc(Nummsc), Iflmsc(Nummsc), Delmsc(Nummsc),
 !     *   Iradms(Ngroup), Ijkmsc(Nummsc),
 !     *   Anonu (Nonu  ), Rnonu (Nonu  ), Etaeee(Mjetan),
@@ -124,11 +122,11 @@ module par2_m
 !
       ELSE IF (Alfnm1.EQ.Rexter) THEN
 ! ***    alternative to card set 3
-         CALL Readrx (Parext, Iflext, Nnrext)
+         CALL Readrx (Nnrext)
 !
       ELSE IF (Alfnm1.EQ.Extern) THEN
 ! ***    card set 3
-         CALL Readex (Parext, Iflext, Nnrext)
+         CALL Readex (Nnrext)
 !
       ELSE IF (Alfnm1.EQ.Radius .OR. Alfnm1.EQ.Radiii .OR. &
          Alfnm1.EQ.Channe) THEN
diff --git a/sammy/src/par/mpar03.f90 b/sammy/src/par/mpar03.f90
index 7bbec3bc5b339b86f2812fd79525aaf3219ba5d6..164dfb5d671e78fa70bd638261e4547ab2109228 100644
--- a/sammy/src/par/mpar03.f90
+++ b/sammy/src/par/mpar03.f90
@@ -86,31 +86,26 @@ module par3_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Readrx (Parext, Iflext, Nnrext)
+      SUBROUTINE Readrx (Nnrext)
 !
 ! *** alternative to card set 3
 ! *** PURPOSE -- READ R-EXTERNAL PARAMETERS
 !
       use fixedi_m
       use ifwrit_m
+      use SammyRExternalInfo_M
+      use RMatResonanceParam_M
+      use EndfData_common_m, only : resParData
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
-!      DIMENSION Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup)
-      DIMENSION Parext(Nnrext,Ntotc,*), Iflext(Nnrext,Ntotc,*)
       DIMENSION P(7), Js(7)
+      integer::irext
+      type(SammyRExternalInfo) ::rextInfo
+      type(RExternalFunction) :: rext
       DATA Zero /0.0d0/
 !
       K1 = 0
       K3 = 0
-      DO N=1,Ngroup
-         DO I=1,Ntotc
-            DO Kqqq=1,7
-               Parext(Kqqq,I,N) = Zero
-               Iflext(Kqqq,I,N) = 0
-            END DO
-            Iflext(1,I,N) = -1
-         END DO
-      END DO
       N = 0
       Numext = 0
 !
@@ -127,19 +122,36 @@ module par3_m
          END DO
          Js(1) = -1
    60    CONTINUE
+         if( Js(1).ge.0) then
+           call resparData%addRext(Nnn, Nchnn)
+           irext = resParData%getNumRext()
+           call resParData%getRextInfo(rextInfo, irext)
+           call rextInfo%setNrext(7)
+
+           call resparData%getRext(rext, rextInfo)
+           do Kqqq=1,7
+               call rext%setSammyValue(Kqqq, P(Kqqq))
+           end do
+
+           IF (Kgenpd.NE.1) THEN
+              do Kqqq=1,7
+                call rextInfo%setIflSammyIndex(Kqqq, Js(Kqqq))
+              end do
+            end if
+         end if
+
          IF (Js(1).LT.0) THEN
 !           All flags are zero (or -1) if parameters are zero
          ELSE
-            DO Kqqq=1,7
-               Parext(Kqqq,Nchnn,Nnn) = P(Kqqq)
-               IF (Kgenpd.NE.1) THEN
-                  Iflext(Kqqq,Nchnn,Nnn) = Js(Kqqq)
+            DO Kqqq=1,7             
+               IF (Kgenpd.eq.1) THEN
+                  Js(1:7) = 0
                END IF
             END DO
-         END IF
+         END IF         
          DO Kqqq=1,7
-            IF (Iflext(Kqqq,Nchnn,Nnn).EQ.1) K1 = K1 + 1
-            IF (Iflext(Kqqq,Nchnn,Nnn).EQ.3) K3 = K3 + 1
+            IF (Js(Kqqq).EQ.1) K1 = K1 + 1
+            IF (Js(Kqqq).EQ.3) K3 = K3 + 1
          END DO
       GO TO 40
 !
@@ -155,31 +167,26 @@ module par3_m
 !
 ! --------------------------------------------------------------
 !
-      SUBROUTINE Readex (Parext, Iflext, Nnrext)
+      SUBROUTINE Readex (Nnrext)
 !
 ! *** card set 3
 ! *** PURPOSE -- READ EXTERNAL R-MATRIX PARAMETERS
 !
       use fixedi_m
       use ifwrit_m
+      use SammyRExternalInfo_M
+      use RMatResonanceParam_M
+      use EndfData_common_m, only : resParData
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
-!      DIMENSION Parext(Nrext,Ntotc,Ngroup), Iflext(Nrext,Ntotc,Ngroup)
-      DIMENSION Parext(Nnrext,Ntotc,*), Iflext(Nnrext,Ntotc,*)
       DIMENSION P(5), JS(5)
+      integer::irext
+      type(SammyRExternalInfo) ::rextInfo
+      type(RExternalFunction) :: rext
       DATA Zero /0.0d0/
 !
       K1 = 0
       K3 = 0
-      DO N=1,Ngroup
-         DO I=1,Ntotc
-            DO Kqqq=1,5
-               Parext(Kqqq,I,N) = Zero
-               Iflext(Kqqq,I,N) = 0
-            END DO
-            Iflext(1,I,N) = -1
-         END DO
-      END DO
       N = 0
 !
    40 CONTINUE
@@ -192,19 +199,28 @@ module par3_m
          IF (Nchnn.EQ.0) Nchnn = 1
          IF (P(1).EQ.Zero .AND. P(2).EQ.Zero .AND. P(3).EQ.Zero .AND. &
              P(4).EQ.Zero .AND. P(5).EQ.Zero) Js(1) = -1
-         IF (Js(1).LT.0) THEN
-!           All flags are zero (or -1) if parameters are zero
-         ELSE
+
+         if (Js(1).ge.0) then
+            call resparData%addRext(Nnn, Nchnn)
+
+            irext = resParData%getNumRext()
+            call resParData%getRextInfo(rextInfo, irext)
+            call rextInfo%setNrext(5)
+            call resparData%getRext(rext, rextInfo)
             DO Kqqq=1,5
-               Parext(Kqqq,Nchnn,Nnn) = P(Kqqq)
-               IF (Kgenpd.NE.1) THEN
-                  Iflext(Kqqq,Nchnn,Nnn) = Js(Kqqq)
-               END IF
-            END DO
-         END IF
+               call rext%setSammyValue(Kqqq, P(Kqqq))
+            end do
+
+            IF (Kgenpd.NE.1) THEN
+               DO Kqqq=1,5
+                  call rextInfo%setIflSammyIndex(Kqqq, Js(Kqqq))
+               end do
+            end if
+         end if
+
          DO Kqqq=1,5
-            IF (Iflext(Kqqq,Nchnn,Nnn).EQ.1) K1 = K1 + 1
-            IF (Iflext(Kqqq,Nchnn,Nnn).EQ.3) K3 = K3 + 1
+            IF (Js(Kqqq).EQ.1) K1 = K1 + 1
+            IF (Js(Kqqq).EQ.3) K3 = K3 + 1
          END DO
       GO TO 40
 !
diff --git a/sammy/src/par/mpar12.f90 b/sammy/src/par/mpar12.f90
index 45c92aa3299b450d1a37b72f604483881fd83340..c82feb696698e099865f01aedfc8058a5e4e5301 100755
--- a/sammy/src/par/mpar12.f90
+++ b/sammy/src/par/mpar12.f90
@@ -6,22 +6,22 @@ module FixUpParameterData_M
         
 contains
       
-      SUBROUTINE FixCovIndex (  Iflbrd, Ifldet,                                      &
-                                Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,      &
-                                Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext)               
+      SUBROUTINE FixCovIndex (  Iflbrd, Ifldet,                              &
+                                Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,      &
+                                Iflnbk, Iflbgf, Ifldtp, Iflusd)
              integer::Iflbrd(*),                                          &
-             Ifldet(*), Iflext(Nnrext,Ntotc,*),                           &
+             Ifldet(*),                                                   &
              Iflmsc(*), Iradms(*), Iflpmc(4,*), Iflorr(*), Iflrpi(*),     & 
              Iflnbk(*), Iflbgf(*), Ifldtp(*), Iflusd(*)
-             integer::nnrext,i
+             integer::i
         
              type(SetUParameters)::params
              type(SammySpinGroupInfo)::spinInfo
               
              call params%initialize()
              call params%updateFitParameters(Iflbrd, Ifldet,                                     &
-                                            Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,      &
-                                            Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext)
+                                            Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,      &
+                                            Iflnbk, Iflbgf, Ifldtp, Iflusd)
              call params%destroy()           
        end  SUBROUTINE FixCovIndex
 end  module FixUpParameterData_M       
@@ -32,8 +32,8 @@ end  module FixUpParameterData_M
 !C --------------------------------------------------------------
 !C
       SUBROUTINE Fix ( Iflbrd, Ifldet,                    &
-        Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,   &
-        Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext)
+        Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,           &
+        Iflnbk, Iflbgf, Ifldtp, Iflusd)
 !C
 !C *** PURPOSE -- SET ORDINAL NUMBER FOR EACH VARIED PARAMETER
 !C
@@ -43,16 +43,15 @@ end  module FixUpParameterData_M
       IMPLICIT NONE
         
         integer:: Iflbrd(*),                                         &
-        Ifldet(*), Iflext(Nnrext,Ntotc,*),                           &
+        Ifldet(*),                                                   &
         Iflmsc(*), Iradms(*), Iflpmc(4,*), Iflorr(*), Iflrpi(*),     & 
         Iflnbk(6,*), Iflbgf(*), Ifldtp(*), Iflusd(*)
-        integer::nnrext
 
         integer::k1,k3,ipar
         
-       call  FixCovIndex (  Iflbrd, Ifldet,                                      &
-                            Iflext, Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,      &
-                            Iflnbk, Iflbgf, Ifldtp, Iflusd,  Nnrext) 
+       call  FixCovIndex (  Iflbrd, Ifldet,                              &
+                            Iflmsc, Iradms, Iflpmc, Iflorr, Iflrpi,      &
+                            Iflnbk, Iflbgf, Ifldtp, Iflusd)
       K1 = covData%getNumParam()
       K3 = covData%getPupedParam()
       Ipar = covData%getNumTotalParam()
diff --git a/sammy/src/rec/mrec5.f b/sammy/src/rec/mrec5.f
index b56729918dfb338de0eb3a4733bee86e35328714..1b7d400dd8db7da6dcc69385acbaffa705d1929f 100644
--- a/sammy/src/rec/mrec5.f
+++ b/sammy/src/rec/mrec5.f
@@ -101,6 +101,7 @@ C ***      Sig2(2,I) is capture cross section (absorption - fission)
       call expData%initialize()
       call grid%initialize()
       index = 1
+      call grid%reserve(Ndatb*Numcro, 1)
       do i = 1, Ndatb
          do j = 1, Numcro
             call grid%addData(index, 1, Etab2(i))
@@ -115,6 +116,7 @@ C ***      Sig2(2,I) is capture cross section (absorption - fission)
       end if
       if (calcData%getNumberIsotopes().eq.0) then
          call calcData%setUpList(resParData,
+     *       radFitFlags,
      *       resParData%getNumIso())
       end if
       Ksolve = 2
diff --git a/sammy/src/rec/mrec8.f90 b/sammy/src/rec/mrec8.f90
index e738ff0fce083873e35ff61617d0ef953593e4f4..449b8673bbfc7a659012b4fccfe4acc1a3a6d4f3 100755
--- a/sammy/src/rec/mrec8.f90
+++ b/sammy/src/rec/mrec8.f90
@@ -87,6 +87,7 @@ module mrec8_m
   101 CONTINUE
       Npurr = L - 1
       call reallocate_real_data(X, Npurr)
+      call  Energb%reserve(Nemax+Npurr, 1)
       DO N=1,Npurr
          call Energb%addData(Nemax+N, 1, X(N))
       END DO
diff --git a/sammy/src/ref/mrfs0.f b/sammy/src/ref/mrfs0.f
index 3fc76f9a69718c02647d618fb3f801b17bd58e1c..608804d7becb83efee730aa8e92f19679b46fd04 100644
--- a/sammy/src/ref/mrfs0.f
+++ b/sammy/src/ref/mrfs0.f
@@ -55,7 +55,7 @@ C
 C *** collect values needed for parameter file
       Korder = Idimen (1, 1, '1, 1')
       CALL Cnvpar ( A_Iprbrd , I_Iflbrd ,
-     *   A_Iprext , I_Iflext , I_Iflpol , 
+     *   I_Iflpol ,
      *   A_Iprmsc , I_Iflmsc , A_Idemsc , I_Irdmsc ,
      *   A_Iprpmc , I_Iflpmc , A_Idepmc , I_Isopmc ,
      *   A_Iprorr , I_Iflorr , A_Ideorr , A_Icrnch , A_Iedets ,
diff --git a/sammy/src/ref/mrfs2.f b/sammy/src/ref/mrfs2.f
index c17a33dab4c21d25597cd43f2f3548dcef7cf742..112053148dae63dc9a4d2ba2619aff8cef8be707 100644
--- a/sammy/src/ref/mrfs2.f
+++ b/sammy/src/ref/mrfs2.f
@@ -138,11 +138,7 @@ C *** six.one
       call make_I_Iigrde(N)
 C
 C *** seven
-      N = Nrext*Ngroup*Ntotc
       IF (Nrext.EQ.0) Nrext = 1
-      IF (N.EQ.0) N = 1
-      call make_A_Iprext(N)
-      call make_I_Iflext(N)
 C
       RETURN
       END
diff --git a/sammy/src/ref/mrfs4.f b/sammy/src/ref/mrfs4.f
index 5e23a46ae26488bc08cad4176df36f7585c47851..0ec9e41bfb3c59a9a448634f3449691ac3f39a1f 100644
--- a/sammy/src/ref/mrfs4.f
+++ b/sammy/src/ref/mrfs4.f
@@ -3,7 +3,7 @@ C
 C --------------------------------------------------------------
 C
       SUBROUTINE Cnvpar (  Parbrd, Iflbrd,
-     *     Parext, Iflext, Iflpol,
+     *     Iflpol,
      *     Parmsc, Iflmsc, Delmsc, Iradms,
      *     Parpmc, Iflpmc, Delpmc, Isopmc,
      *     Parorr, Iflorr, Delorr, Ecrnch, Endets, Sigdts,
@@ -35,7 +35,6 @@ C
       type(SammyIsoInfo)::isoInfo
       logical(C_BOOL)::reduced, combined
       DIMENSION                  Parbrd(*), Iflbrd(*),
-     *     Parext(Nrext,Ntotc,*), Iflext(Nrext,Ntotc,*),
      *              Iflpol(2,*),
      *     Parmsc(*), Iflmsc(*), Delmsc(*), Iradms(*),
      *     Parpmc(4,*), Iflpmc(4,*), Delpmc(4,*), Isopmc(*),
@@ -48,8 +47,6 @@ C
      *     ParBAG(*), Iflbag(*)
 C
 C      DIMENSION Parbrd(Numbrd), Iflbrd(Numbrd),
-C     *     Parext(Nrext,Ntotc,Ngroup),
-C     *     Iflext(Nrext,Ntotc,Ngroup), 
 C     *     Parmsc(Nummsc), Iflmsc(Nummsc), Delmsc(Nummsc), iradms(Ngroup),
 C     *     Parpmc(4,Numpmc), Iflpmc(4,Numpmc), Delpmc(4,Numpmc),Isopmc(Numpmc),
 C     *     Parorr(Numorr), Iflorr(Numorr),
diff --git a/sammy/src/ref/mwrt0.f b/sammy/src/ref/mwrt0.f
index 2cb31699c757f77572d08fe3779d804581e25b86..185f45a75946c05e7a89b08ecb1ef9b855609aa7 100644
--- a/sammy/src/ref/mwrt0.f
+++ b/sammy/src/ref/mwrt0.f
@@ -50,7 +50,6 @@ C *** Write Parameter file
                CALL Oldord ( A_Iprbrd , I_Iflbrd , A_Idebrd , 
      *            I_Ifexcl ,
      *            A_Iprdet , I_Ifldet , A_Idedet , I_Iigrde ,
-     *            A_Iprext , I_Iflext ,
      *            I_Iflpol ,
      *            A_Iprmsc , I_Iflmsc , A_Idemsc , I_Irdmsc , I_Ijkmsc ,
      *                       A_Ietaee ,
diff --git a/sammy/src/rpt/mrpt.f b/sammy/src/rpt/mrpt.f
index 11b4de81589d0eca7a89267ecab8fb444c1d8b2d..26d927caf13129e1879a102a54f1c832d6ff42e1 100644
--- a/sammy/src/rpt/mrpt.f
+++ b/sammy/src/rpt/mrpt.f
@@ -294,6 +294,7 @@ C
       T = Tup
       Dt = (Tup-Tlow)/(dFLOAT(N-1))
       Ii = 0
+      call grid%reserve(N, 1)
       DO I=1,N
          Ii = Ii + 1
          Tt(Ii) = T - Dt*dFLOAT(I-1)
diff --git a/sammy/src/salmon/DerivativeList.cpp b/sammy/src/salmon/DerivativeList.cpp
index e0e04167a2e34a6bf88feec2a296f2eaaffa695b..1caac597f0a4a841b8117aebfc9f8bc1ad740fcd 100644
--- a/sammy/src/salmon/DerivativeList.cpp
+++ b/sammy/src/salmon/DerivativeList.cpp
@@ -9,7 +9,7 @@
 namespace  sammy {
   void DerivativeList::addGrid(){
       std::unique_ptr<GridData> data = nemesis::make_unique<GridData>();
-      gridData.addGrid(data);
+      gridData.addGrid(data);  // gridData automatically sets notSetReturnsZero
   }
 
   int DerivativeList::getLength() const{
@@ -24,30 +24,35 @@ namespace  sammy {
       return gridData.getGrid(iso)->getLength();
   }
 
-  void DerivativeList::updateRealCol(int col){
-      if (col < (int)realColIndices.size()) return; // already done
+  void DerivativeList::updateRealCol(int col, bool force){
+        if (col < (int)realColIndices.size() && !force) return; // already done
 
-      size_t start = realColIndices.size();
-      for (int c = start; c <= col; c++){
-         if (isSharedColumn(c)){
-             for (size_t i = 0; i < sharedIndices.size(); i++){
-                if ( c == sharedIndices[i].first){
-                     realColIndices.push_back(-1*(i+1));
-                     break;
-
-                 }
-             }
-         }
-         else{
-             int pos = -1;
-             for ( int c = 0; c <= col; c++){
-                  if ( isSharedColumn(c)) continue;
-                  pos++;
-             }
-             realColIndices.push_back(pos+1);
+        size_t start = realColIndices.size();
+        if (force) {
+            start = 0;
+            realColIndices.clear();
         }
-     }
-  }
+        for (int c = start; c <= col; c++){
+           int index = -1;
+           if (isSharedColumn(c)){
+               for (size_t i = 0; i < sharedIndices.size(); i++){
+                  if ( c == sharedIndices[i].first){
+                       index = -1*(i+1);
+
+                   }
+               }
+           }
+           else{
+               int pos = -1;
+               for ( int i = 0; i <= c; i++){
+                    if ( isSharedColumn(i)) continue;
+                    pos++;
+               }
+               index = pos+1;
+          }
+          realColIndices.push_back(index);
+       }
+    }
 
 
   void DerivativeList::addData(int row, int col, int iso, double val){
@@ -56,6 +61,11 @@ namespace  sammy {
          throw std::runtime_error(std::to_string(iso) + " Isotope out of range");
       }
 
+      if (sharedIndices.size() == 0){
+          gridData.getGrid(iso)->addData(row,col, val);
+          return;
+      }
+
       updateRealCol(col);
 
        int ourCol = realColIndices[col];
@@ -75,20 +85,89 @@ namespace  sammy {
        gridData.getGrid(iso)->addData(row,ourCol, val);
   }
 
+  namespace detail{
+     void getMaxColumnData(int & maxShared, int & maxUn, const std::vector<int> & cols){
+         maxShared = maxUn = 0;
+         auto min = std::min_element(cols.begin(), cols.end());
+         int minVal = (*min);
+         if (minVal < 0){
+             maxShared = -1 * minVal;
+         }
+         auto max = std::max_element(cols.begin(), cols.end());
+         maxUn = (*max);
+     }
+  }
+
+  void DerivativeList::reserveColumns(int row, int maxCol){
+      if(maxCol == 0) return;
+
+      if (sharedIndices.size() == 0){
+          for (int iso = 0; iso < gridData.getLength(); iso++){
+              gridData.getGrid(iso)->reserveColumn(row, maxCol);
+          }
+          return;
+      }
+
+      updateRealCol(maxCol-1);
+
+      int maxShared, maxUn;
+      detail::getMaxColumnData(maxShared, maxUn, realColIndices);
+      if (maxShared > 0){
+          sharedData.reserveColumn(row, maxShared);
+      }
+      if (maxUn > 0){
+          for (int iso = 0; iso < gridData.getLength(); iso++){
+              gridData.getGrid(iso)->reserveColumn(row, maxUn);
+          }
+      }
+  }
+
+
+  void DerivativeList::reserve(int maxRow, int maxCol){
+      if(maxCol == 0 || maxRow == 0) return;
+
+      if (sharedIndices.size() == 0){
+          for (int iso = 0; iso < gridData.getLength(); iso++){
+              gridData.getGrid(iso)->reserve(maxRow, maxCol);
+          }
+          return;
+      }
+
+
+      updateRealCol(maxCol-1);
+
+      int maxShared, maxUn;
+      detail::getMaxColumnData(maxShared, maxUn, realColIndices);
+      if (maxShared > 0){
+          sharedData.reserve(maxRow, maxShared);
+      }
+      if (maxUn > 0){
+          for (int iso = 0; iso < gridData.getLength(); iso++){
+              gridData.getGrid(iso)->reserve(maxRow, maxUn);
+          }
+      }
+  }
+
   double DerivativeList::getData(int row, int col, int iso) const{
       // check whether it's a valid isotope
       if (iso < 0 || iso >= gridData.getLength()){
          throw std::runtime_error(std::to_string(iso) + " Isotope out of range");
       }
+
+      if (sharedIndices.size() == 0){
+          return gridData.getGrid(iso)->getData(row,col);
+      }
+
       if (col >= (int)realColIndices.size()){
+           if( notSetReturnsZero) return  0.0;
            throw std::runtime_error(std::to_string(col) + " column out of range");
       }
 
       // if it is a shared column, just get it
-      int ourCol = realColIndices[col];
+      int ourCol = realColIndices[col];      
       if (ourCol < 0){
            ourCol = -1*ourCol - 1;
-           if (sharedIndices[ourCol].second == iso){
+           if (sharedIndices[ourCol].second == iso){ 
                return sharedData.getData(row, ourCol);
            }
            return 0.0;
@@ -131,7 +210,7 @@ namespace  sammy {
           // Therefore the C++ setup get's a chance to reset the
           // isotope consistent with the isotope ID in the
           // resonance data
-          auto it = std::find_if( sharedIndices.begin(), sharedIndices.end(), detail::comp(col));       
+          auto it = std::find_if( sharedIndices.begin(), sharedIndices.end(), detail::comp(col));
           it->second = iso;
           return;
       }
@@ -142,7 +221,9 @@ namespace  sammy {
           throw std::runtime_error("Can't add shared column if we already have data");
       }
       sharedIndices.push_back(std::make_pair(col, iso));
-      updateRealCol(col);
+      bool force = false;
+      if (col < (int)realColIndices.size() ) force = true;
+      updateRealCol(col, force);
   }
 
   void DerivativeList::clear(){
@@ -155,10 +236,10 @@ namespace  sammy {
   }
 
   void DerivativeList::nullify(){
-      sharedData.clearGrid();
+      sharedData.nullify();
 
       for ( int i = 0; i < gridData.getLength(); i++){
-         gridData.getGrid(i)->clearGrid();
+         gridData.getGrid(i)->nullify();
       }
   }
 
@@ -185,8 +266,32 @@ namespace  sammy {
       return -1;
   }
 
+  void DerivativeList::setNotSetReturnsZero(bool empty){
+       notSetReturnsZero = empty;
+       gridData.setNotSetReturnsZero(empty);
+       sharedData.setNotSetReturnsZero(empty);
+  }
+
+  void DerivativeList::setAccumulate(bool add){
+      accumulate = add;
+      gridData.setAccumulate(add);
+      sharedData.setAccumulate(add);
+  }
+
+  void DerivativeListHolder::setNotSetReturnsZero(bool empty){
+       notSetReturnsZero = empty;
+       list[0].setNotSetReturnsZero(empty);
+       list[1].setNotSetReturnsZero(empty);
+  }
+
+  void DerivativeListHolder::setAccumulate(bool add){
+      accumulate = add;
+      list[0].setAccumulate(add);
+      list[1].setAccumulate(add);
+  }
+
   void DerivativeListHolder::addGrid(){
-      list[currentList].addGrid();
+      list[currentList].addGrid();  // list updates notSetReturnsZero internally
   }
 
   int DerivativeListHolder::getLength(bool current) const{
@@ -202,6 +307,20 @@ namespace  sammy {
       return list[c].getLength(iso);
   }
 
+  void DerivativeListHolder::reserveColumns(int row, int maxCol, bool current){
+      int  c = currentList;
+      if( !current) c = parentList;
+
+      list[c].reserveColumns(row, maxCol);
+  }
+
+  void DerivativeListHolder::reserve(int maxRow, int maxCol, bool current){
+      int  c = currentList;
+      if( !current) c = parentList;
+
+      list[c].reserve(maxRow, maxCol);
+  }
+
   void DerivativeListHolder::addData(int row, int col, int iso, double val, bool current){
       int  c = currentList;
       if( !current) c = parentList;
diff --git a/sammy/src/salmon/DerivativeList.h b/sammy/src/salmon/DerivativeList.h
index fbafd20c7c77924a2311524e8c13267adc356289..e1725cd6794aee54c0375463e194dccae6a2823b 100644
--- a/sammy/src/salmon/DerivativeList.h
+++ b/sammy/src/salmon/DerivativeList.h
@@ -47,7 +47,7 @@ namespace sammy{
 */
  class DerivativeList{
   public:
-    DerivativeList(){};
+    DerivativeList():notSetReturnsZero(false),accumulate(false){};
     DerivativeList(const DerivativeList & orig) = delete;
     virtual ~DerivativeList(){}
 
@@ -148,10 +148,47 @@ namespace sammy{
      * a shared column
      */
     int getIsotopeForShared(int col) const;
+
+    /**
+     * Indicate whether getData should return 0 instead of throw if the
+     * corresponding addData was not called.
+     *
+     * This is sometime convenient if calculating derivatives, where
+     * derivatives are only set for  paramters where the matter,
+     * but the array needs to be over all flagged parameters.
+     *
+     * @param empty if true, getData returns 0 if addData was not called
+     */
+    void setNotSetReturnsZero(bool empty);
+
+    /**
+     * Should addData accumulate instead of set
+     * @param add
+     */
+    void setAccumulate(bool add);
+
+    /**
+     * Make sure the indicated row as at least maxCol data.
+     * If not set, additional columns are set to zero
+     *
+     * @param row the row for which to set the data
+     * @param maxCol the maximum number of columns
+     */
+    void reserveColumns(int row, int maxCol);
+
+    /**
+     * Reserve maxRow and maxCol.
+     * If not set, additional rows columns are set to zero
+     *
+     * @param maxRow the maximum number of rows
+     * @param maxCol the maximum number of columns
+     * @return
+     */
+    void reserve(int maxRow, int maxCol);
   private:    
     /* For look-up acceleration set up the linking between columns and
      * isotope to either shared or "normal colum */
-    void updateRealCol(int col);
+    void updateRealCol(int col, bool force = false);
 
     /** the list of "normal" columns */
     GridDataList gridData;
@@ -162,6 +199,10 @@ namespace sammy{
     /** The isotope to link to for shared column */
     std::vector<std::pair<int,int>> sharedIndices;
 
+    bool notSetReturnsZero;
+
+    bool accumulate;
+
     /* For look-up acceleration set up the linking between columns and
      * isotope to either shared or "normal colum */
     std::vector<int> realColIndices;
@@ -184,7 +225,7 @@ namespace sammy{
    */
   class DerivativeListHolder{
     public:
-      DerivativeListHolder():currentList(0),parentList(0){}
+      DerivativeListHolder():currentList(0),parentList(0), notSetReturnsZero(false), accumulate(false){}
       DerivativeListHolder(const DerivativeListHolder & orig) = delete;
       virtual ~DerivativeListHolder(){}
 
@@ -256,7 +297,7 @@ namespace sammy{
 
       /**
        * Set the length of the desired DerivativeList objects to 0
-       * @param current true if using the current grif, false for  the parent grid
+       * @param current true if using the current grid, false for  the parent grid
        */
       void nullify(bool current = true);
 
@@ -282,6 +323,43 @@ namespace sammy{
        * @return isotope index for the shared column
        */
       int getIsotopeForShared(int col) const;
+
+      /**
+       * Indicate whether getData should return 0 instead of throw if the
+       * corresponding addData was not called.
+       *
+       * This is sometime convenient if calculating derivatives, where
+       * derivatives are only set for  paramters where the matter,
+       * but the array needs to be over all flagged parameters.
+       *
+       * @param empty if true, getData returns 0 if addData was not called
+       */
+      void setNotSetReturnsZero(bool empty);
+
+      /**
+       * Should addData accumulate instead of just set
+       * @param add
+       */
+      void setAccumulate(bool add);
+
+      /**
+       * Make sure the indicated row as at least maxCol data.
+       * If not set, additional columns are set to zero
+       *
+       * @param row the row for which to set the data
+       * @param maxCol the maximum number of columns
+       */
+      void reserveColumns(int row, int maxCol, bool current = true);
+
+      /**
+       * Reserve maxRow and maxCol.
+       * If not set, additional rows columns are set to zero
+       *
+       * @param maxRow the maximum number of rows
+       * @param maxCol the maximum number of columns
+       * @return
+       */
+      void reserve(int maxRow, int maxCol, bool current = true);
     private:
        /** Index of the current index in list used to accumulate the broadened data */
        int currentList;
@@ -289,6 +367,10 @@ namespace sammy{
        /** Index of the index to the list containing the  unbroadened data */
        int parentList;
 
+       bool notSetReturnsZero;
+
+       bool accumulate;
+
        /** The two grids to ping-pong between if chaining broadening data */
        DerivativeList list[2];
 
diff --git a/sammy/src/salmon/GridData.cpp b/sammy/src/salmon/GridData.cpp
index 1f7380cdd84d9745933a71e000002c6870b39a5f..940f6591e3bf16a17eeb95e68d841b2117ce2404 100644
--- a/sammy/src/salmon/GridData.cpp
+++ b/sammy/src/salmon/GridData.cpp
@@ -1,11 +1,14 @@
 #include "GridData.h"
 #include "Nemesis/utils/Future.hh"
+#include <algorithm>
 
 namespace sammy{
      GridData::GridData(const GridData & orig):data(orig.data),
                                                dataIndex(orig.dataIndex),
                                                rowOffset(orig.rowOffset),
-                                               rowMax(orig.rowMax){
+                                               rowMax(orig.rowMax),
+                                               notSetReturnsZero(orig.notSetReturnsZero),
+                                               accumulate(orig.accumulate){
 
          if (orig.implicitParCov != nullptr){
              implicitParCov = nemesis::make_unique<endf::ResonanceCovariance>(*(orig.implicitParCov));
@@ -23,6 +26,9 @@ namespace sammy{
          if (row < 0) throw std::runtime_error("row index  " + std::to_string(row) + " out of range in addData");
          if (col < 0) throw std::runtime_error("col index  " + std::to_string(col) + " out of range in addData");
 
+         if (accumulate && val == 0.0) return;
+
+
          if ( row >= getLength() )
          {
             data.resize(row+1);
@@ -31,14 +37,40 @@ namespace sammy{
              data[row].resize(col+1);
          }
 
-         data[row][col] = val;
+
+         if (accumulate) data[row][col] += val;
+         else            data[row][col] = val;
+     }
+
+
+     void GridData::reserve(int maxRow, int maxCol){
+         if (maxRow > (int)data.size()){
+             data.resize(maxRow);
+         }
+
+         for( auto & d : data){
+             if (maxCol > (int)d.size()){
+                 d.resize(maxCol);
+             }
+         }
+     }
+
+     void GridData::reserveColumn(int row, int maxCol){
+         if (row >= (int)data.size()){
+             data.resize(row+1);
+         }
+         if( maxCol  > (int)data[row].size()){
+             data[row].resize(maxCol);
+         }
      }
 
      double GridData::getData(int row, int col) const{
          if ( row < 0 || row >= (int)data.size()) {
+             if (notSetReturnsZero) return 0.0;
              throw std::runtime_error("Row index out of range in GridData::getData: " + std::to_string(row));
          }
          if (col < 0 || col >= (int)data[row].size()){
+             if (notSetReturnsZero) return 0.0;
              throw std::runtime_error("Column index out of range in GridData::getData: " + std::to_string(col));
          }
 
@@ -73,10 +105,31 @@ namespace sammy{
          data.clear();
      }
 
-     GridDataList::GridDataList():auxGridIndex(1), expGridIndex(0){   // normally auxillary grid index is 1, and experimental grid 0
+     void GridData::nullify(){
+         for (auto & d: data){
+             std::fill(d.begin(), d.end(), 0.0);
+         }
+     }
+
+     GridDataList::GridDataList():auxGridIndex(1), expGridIndex(0), notSetReturnsZero(false),accumulate(false){   // normally auxillary grid index is 1, and experimental grid 0
         expCov = std::unique_ptr<endf::ResonanceCovariance>( new endf::ResonanceCovariance());
      }
 
+     void GridDataList::setNotSetReturnsZero(bool empty){
+         notSetReturnsZero = empty;
+         for (auto & g : grids){
+             g->setNotSetReturnsZero(empty);
+         }
+     }
+
+     void GridDataList::setAccumulate(bool add){
+         accumulate = add;
+
+         for (auto & g : grids){
+             g->setAccumulate(add);
+         }
+     }
+
 
      int GridDataList::getLength() const{      
          return (int)grids.size();
@@ -100,6 +153,8 @@ namespace sammy{
      void GridDataList::addGrid(std::unique_ptr<GridData> & grid){
          grids.push_back( std::unique_ptr<GridData>());
          grids[grids.size() -1 ] = std::move(grid);
+         grids[grids.size() -1 ]->setNotSetReturnsZero(notSetReturnsZero);
+         grids[grids.size() -1 ]->setAccumulate(accumulate);
      }
 
      void GridDataList::addExperimentalCov(int row, int col, double cov){
diff --git a/sammy/src/salmon/GridData.h b/sammy/src/salmon/GridData.h
index c4f39383b28b79d546cee64566cd01da11d17ea0..cc9ed05249742fb8a5bb4e7f4d2a833d4a99354b 100644
--- a/sammy/src/salmon/GridData.h
+++ b/sammy/src/salmon/GridData.h
@@ -31,7 +31,7 @@ namespace sammy{
    */
   class GridData {
      public:
-      GridData():dataIndex(-1), rowOffset(0), rowMax(0){}
+      GridData():dataIndex(-1), rowOffset(0), rowMax(0), notSetReturnsZero(false),accumulate(false){}
       GridData(const GridData & orig);
       virtual ~GridData(){}
 
@@ -64,6 +64,30 @@ namespace sammy{
        */
       double getData(int row, int col) const;
 
+      /**
+       * Indicate whether getData should return 0 instead of throw if the
+       * corresponding addData was not called.
+       *
+       * This is sometime convenient if calculating derivatives, where
+       * derivatives are only set for  paramters where the matter,
+       * but the array needs to be over all flagged parameters.
+       *
+       * @param empty if true, getData returns 0 if addData was not called
+       */
+      void setNotSetReturnsZero(bool empty){
+          notSetReturnsZero = empty;
+      }
+
+
+      /**
+       * If true, addData accumulates data instead of set data
+       *
+       * @param add set to true to accumulate data with addData
+       */
+      void setAccumulate(bool add){
+          accumulate = add;
+      }
+
       /**
        * @brief getDataColumn Get the index at which the data start
        * @return  index at which the data start
@@ -101,6 +125,7 @@ namespace sammy{
       int getRowMax() const;
 
        void clearGrid();
+       void nullify();
 
        /**
         * Add a covariance for implicit parameters for
@@ -136,6 +161,15 @@ namespace sammy{
        std::unique_ptr<GridData> & getImplicitDerivs(){          
            return implicitDerivs;
        }
+
+       /**
+        * Reserve (and fill with zero), maxRow and maxCol data
+        *
+        * @param maxRow  the number of rows desired
+        * @param maxCol  the number of columns desired
+        */
+       void reserve(int maxRow, int maxCol);
+       void reserveColumn(int row, int maxCol);
      protected:
 
         std::vector< std::vector<double> > data;
@@ -145,6 +179,9 @@ namespace sammy{
         int rowOffset;
         int rowMax;
 
+        bool notSetReturnsZero;
+        bool accumulate;
+
 
         // arrays for the implicit data covariance
         // covariance for the implicit parameters
@@ -187,6 +224,26 @@ namespace sammy{
        */
       void addGrid(std::unique_ptr<GridData> & grid);
 
+      /**
+       * Indicate whether getData should return 0 instead of throw if the
+       * corresponding addData was not called.
+       *
+       * This is sometime convenient if calculating derivatives, where
+       * derivatives are only set for  paramters where the matter,
+       * but the array needs to be over all flagged parameters.
+       *
+       * @param empty if true, getData returns 0 if addData was not called
+       */
+      void setNotSetReturnsZero(bool empty);
+
+      /**
+       * If true, addData for all grids accumulates data, instead of
+       * just updating them
+       *
+       * @param add  set to true to accumulate in addData
+       */
+      void setAccumulate(bool add);
+
       /**
        * @brief addExperimentalCov Add or set covariance data
        *        Currently I am thinking covariance data are for all grids, and index is starting at grid index 0, gridsize of 1. grid + [0, 1, ..] for
@@ -267,6 +324,9 @@ namespace sammy{
       int auxGridIndex;
 
       int expGridIndex;
+
+      bool notSetReturnsZero;
+      bool accumulate;
   };
 }
 
diff --git a/sammy/src/salmon/interface/cix/DerivativeListHolder.cpp2f.xml b/sammy/src/salmon/interface/cix/DerivativeListHolder.cpp2f.xml
index 74c3fe0e73b95e89305a7ceb5b25005910876442..9293c03a553d54fcc747aa31d9f8275dc80bd22b 100644
--- a/sammy/src/salmon/interface/cix/DerivativeListHolder.cpp2f.xml
+++ b/sammy/src/salmon/interface/cix/DerivativeListHolder.cpp2f.xml
@@ -19,6 +19,16 @@
        <param name="iso" type="int" offset="-1"/>
        <param name="current" type="bool"/>
       </method>
+      <method name="reserveColumns">
+       <param name="row" type="int" offset="-1"/>
+       <param name="maxCol" type="int"/>
+       <param name="current" type="bool"/>
+      </method>
+      <method name="reserve">
+       <param name="maxRow" type="int"/>
+       <param name="maxCol"  type="int"/>
+       <param name="current" type="bool"/>
+      </method>
       <method name="clear"/>
       <method name="nullify">
          <param name="current" type="bool"/>
@@ -28,8 +38,14 @@
          <param name="col" type="int"/>
       </method>
       <method name="addSharedColumn">
-          <param name="col" type="int"/>
-          <param name="iso" type="int" offset="-1"/>
+         <param name="col" type="int"/>
+         <param name="iso" type="int" offset="-1"/>
       </method>
+      <method name="setNotSetReturnsZero">
+          <param name="empty" type="bool"/>
+       </method>
+       <method name="setAccumulate">
+           <param name="add" type="bool"/>
+        </method>
     </class>
 </generate>
diff --git a/sammy/src/salmon/interface/cix/GridData.cpp2f.xml b/sammy/src/salmon/interface/cix/GridData.cpp2f.xml
index 4c659b249c8842b40f4dc89bfecb5ec792a273bf..f479203598e719a90776eedd4a14cf64ece1ea6e 100644
--- a/sammy/src/salmon/interface/cix/GridData.cpp2f.xml
+++ b/sammy/src/salmon/interface/cix/GridData.cpp2f.xml
@@ -26,6 +26,12 @@
          <param name="offset" type="int"/>
       </method>
       <method name="clearGrid"/>
+      <method name="nullify"/>
+
+      <method name="reserve">
+       <param name="row" type="int"/>
+       <param name="col" type="int"/>
+      </method>
 
       <method name="addImplicitDerivs">
          <param name="grid" type="GridData*"/>
@@ -33,7 +39,7 @@
       <method name="getImplicitDerivs" return_type="GridData*"/>
       <method name="addImplicitParCov">
          <param name="cov" type="ResonanceCovariance*"/>
-      </method>
+      </method>      
       <method name="getImplicitParCov" return_type="ResonanceCovariance*"/>
     </class>
 
@@ -53,7 +59,7 @@
       <method name="getExperimentalCov" return_type="double">
          <param name="row" type="int" offset="-1"/>
          <param name="col" type="int" offset="-1"/>
-      </method>
+      </method>    
       <method name="getAuxGridIndex" return_type="int"/>
       <method name="getExpGridIndex" return_type="int"/>
       <method name="setAuxGridIndex">
diff --git a/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.cpp b/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.cpp
index e4edba3b7f6402589d61feed4b769412180889f2..b1b749ac5908f9252dbabcde159e467a27888b87 100644
--- a/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.cpp
+++ b/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.cpp
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Tue Apr 06 18:09:02 EDT 2021
+* Date Generated: Fri Aug 20 14:10:56 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -24,6 +24,16 @@ double DerivativeListHolder_getData(void * DerivativeListHolder_ptr,int * row,in
     return ((DerivativeListHolder*)DerivativeListHolder_ptr)->getData(*row,*col,*iso,*current);
 }
 
+void DerivativeListHolder_reserveColumns(void * DerivativeListHolder_ptr,int * row,int * maxCol,bool * current)
+{
+    ((DerivativeListHolder*)DerivativeListHolder_ptr)->reserveColumns(*row,*maxCol,*current);
+}
+
+void DerivativeListHolder_reserve(void * DerivativeListHolder_ptr,int * maxRow,int * maxCol,bool * current)
+{
+    ((DerivativeListHolder*)DerivativeListHolder_ptr)->reserve(*maxRow,*maxCol,*current);
+}
+
 void DerivativeListHolder_clear(void * DerivativeListHolder_ptr)
 {
     ((DerivativeListHolder*)DerivativeListHolder_ptr)->clear();
@@ -49,6 +59,16 @@ void DerivativeListHolder_addSharedColumn(void * DerivativeListHolder_ptr,int *
     ((DerivativeListHolder*)DerivativeListHolder_ptr)->addSharedColumn(*col,*iso);
 }
 
+void DerivativeListHolder_setNotSetReturnsZero(void * DerivativeListHolder_ptr,bool * empty)
+{
+    ((DerivativeListHolder*)DerivativeListHolder_ptr)->setNotSetReturnsZero(*empty);
+}
+
+void DerivativeListHolder_setAccumulate(void * DerivativeListHolder_ptr,bool * add)
+{
+    ((DerivativeListHolder*)DerivativeListHolder_ptr)->setAccumulate(*add);
+}
+
 void* DerivativeListHolder_initialize()
 {
     return new DerivativeListHolder();
diff --git a/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.h b/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.h
index 4a7cdeaf869030741fd2903351f156b33e8a7eb4..e3e70dc9873d5ddb5b6a0c0f0c5f23dab10b61ea 100644
--- a/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.h
+++ b/sammy/src/salmon/interface/cpp/DerivativeListHolderInterface.h
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Tue Apr 06 18:09:02 EDT 2021
+* Date Generated: Fri Aug 20 14:10:56 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -16,11 +16,15 @@ extern "C" {
 int DerivativeListHolder_getLength(void * DerivativeListHolder_ptr,bool * current);
 void DerivativeListHolder_addData(void * DerivativeListHolder_ptr,int * row,int * col,int * iso,double * val,bool * current);
 double DerivativeListHolder_getData(void * DerivativeListHolder_ptr,int * row,int * col,int * iso,bool * current);
+void DerivativeListHolder_reserveColumns(void * DerivativeListHolder_ptr,int * row,int * maxCol,bool * current);
+void DerivativeListHolder_reserve(void * DerivativeListHolder_ptr,int * maxRow,int * maxCol,bool * current);
 void DerivativeListHolder_clear(void * DerivativeListHolder_ptr);
 void DerivativeListHolder_nullify(void * DerivativeListHolder_ptr,bool * current);
 void DerivativeListHolder_switchGrid(void * DerivativeListHolder_ptr);
 int DerivativeListHolder_getIsotopeForShared(void * DerivativeListHolder_ptr,int * col);
 void DerivativeListHolder_addSharedColumn(void * DerivativeListHolder_ptr,int * col,int * iso);
+void DerivativeListHolder_setNotSetReturnsZero(void * DerivativeListHolder_ptr,bool * empty);
+void DerivativeListHolder_setAccumulate(void * DerivativeListHolder_ptr,bool * add);
 void* DerivativeListHolder_initialize();
 void DerivativeListHolder_destroy(void * DerivativeListHolder_ptr);
 #ifdef __cplusplus
diff --git a/sammy/src/salmon/interface/cpp/GridDataInterface.cpp b/sammy/src/salmon/interface/cpp/GridDataInterface.cpp
index 155b538e09fa6313d46f348d641b932b9c88cd0a..2c18d8328de891c1b7c4dddb13f5cc72fc74a851 100644
--- a/sammy/src/salmon/interface/cpp/GridDataInterface.cpp
+++ b/sammy/src/salmon/interface/cpp/GridDataInterface.cpp
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Thu Jan 07 15:23:53 EST 2021
+* Date Generated: Fri Aug 20 09:26:07 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -59,6 +59,16 @@ void GridData_clearGrid(void * GridData_ptr)
     ((GridData*)GridData_ptr)->clearGrid();
 }
 
+void GridData_nullify(void * GridData_ptr)
+{
+    ((GridData*)GridData_ptr)->nullify();
+}
+
+void GridData_reserve(void * GridData_ptr,int * row,int * col)
+{
+    ((GridData*)GridData_ptr)->reserve(*row,*col);
+}
+
 void GridData_addImplicitDerivs(void * GridData_ptr,GridData* grid)
 {
     std::unique_ptr<GridData> gridPtr(grid);
diff --git a/sammy/src/salmon/interface/cpp/GridDataInterface.h b/sammy/src/salmon/interface/cpp/GridDataInterface.h
index 00f0bac8e67d3dfa4c3d65e5d02179de96c3597a..a85b0ebeaf9df98df25b779308dc0b4fe6df62ee 100644
--- a/sammy/src/salmon/interface/cpp/GridDataInterface.h
+++ b/sammy/src/salmon/interface/cpp/GridDataInterface.h
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Thu Jan 07 15:23:53 EST 2021
+* Date Generated: Fri Aug 20 09:26:07 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -24,6 +24,8 @@ void GridData_setRowOffset(void * GridData_ptr,int * offset);
 int GridData_getRowMax(void * GridData_ptr);
 void GridData_setRowMax(void * GridData_ptr,int * offset);
 void GridData_clearGrid(void * GridData_ptr);
+void GridData_nullify(void * GridData_ptr);
+void GridData_reserve(void * GridData_ptr,int * row,int * col);
 void GridData_addImplicitDerivs(void * GridData_ptr,GridData* grid);
 void* GridData_getImplicitDerivs(void * GridData_ptr);
 void GridData_addImplicitParCov(void * GridData_ptr,endf::ResonanceCovariance* cov);
diff --git a/sammy/src/salmon/interface/fortran/DerivativeListHolder_I.f90 b/sammy/src/salmon/interface/fortran/DerivativeListHolder_I.f90
index 78cd7d2a70da5ad16ac9c59c570c231140bdf5a0..550254f21eb5890744e9fd0579dd2a9e458ff5c2 100644
--- a/sammy/src/salmon/interface/fortran/DerivativeListHolder_I.f90
+++ b/sammy/src/salmon/interface/fortran/DerivativeListHolder_I.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Tue Apr 06 18:09:02 EDT 2021
+!! Date Generated: Fri Aug 20 14:10:56 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -34,6 +34,22 @@ real(C_DOUBLE) function f_DerivativeListHolder_getData(DerivativeListHolder_ptr,
     integer(C_INT) :: iso;
     logical(C_BOOL) :: current;
 end function
+subroutine f_DerivativeListHolder_reserveColumns(DerivativeListHolder_ptr, row,maxCol,current ) BIND(C,name="DerivativeListHolder_reserveColumns")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: DerivativeListHolder_ptr;
+    integer(C_INT) :: row;
+    integer(C_INT) :: maxCol;
+    logical(C_BOOL) :: current;
+end subroutine
+subroutine f_DerivativeListHolder_reserve(DerivativeListHolder_ptr, maxRow,maxCol,current ) BIND(C,name="DerivativeListHolder_reserve")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: DerivativeListHolder_ptr;
+    integer(C_INT) :: maxRow;
+    integer(C_INT) :: maxCol;
+    logical(C_BOOL) :: current;
+end subroutine
 subroutine f_DerivativeListHolder_clear(DerivativeListHolder_ptr ) BIND(C,name="DerivativeListHolder_clear")
     use,intrinsic :: ISO_C_BINDING
     implicit none
@@ -63,6 +79,18 @@ subroutine f_DerivativeListHolder_addSharedColumn(DerivativeListHolder_ptr, col,
     integer(C_INT) :: col;
     integer(C_INT) :: iso;
 end subroutine
+subroutine f_DerivativeListHolder_setNotSetReturnsZero(DerivativeListHolder_ptr, empty ) BIND(C,name="DerivativeListHolder_setNotSetReturnsZero")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: DerivativeListHolder_ptr;
+    logical(C_BOOL) :: empty;
+end subroutine
+subroutine f_DerivativeListHolder_setAccumulate(DerivativeListHolder_ptr, add ) BIND(C,name="DerivativeListHolder_setAccumulate")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: DerivativeListHolder_ptr;
+    logical(C_BOOL) :: add;
+end subroutine
 type(C_PTR) function f_DerivativeListHolder_initialize( )BIND(C,name="DerivativeListHolder_initialize")
     use,intrinsic :: ISO_C_BINDING
     implicit none
diff --git a/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90 b/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90
index 25d69068fc3b3292968e991bc8568782d2ed0002..6b19cf04d176026a61099914ffb4ce155ee89006 100644
--- a/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90
+++ b/sammy/src/salmon/interface/fortran/DerivativeListHolder_M.f90
@@ -18,12 +18,18 @@ type DerivativeListHolder
     procedure, pass(this) :: addDataOld => DerivativeListHolder_addDataOld
     procedure, pass(this) :: getData => DerivativeListHolder_getData
     procedure, pass(this) :: getDataOld => DerivativeListHolder_getDataOld
+    procedure, pass(this) :: reserveColumns => DerivativeListHolder_reserveColumns
+    procedure, pass(this) :: reserveColumnsOld => DerivativeListHolder_reserveColumnsOld
+    procedure, pass(this) :: reserve => DerivativeListHolder_reserve
+    procedure, pass(this) :: reserveOld => DerivativeListHolder_reserveOld
     procedure, pass(this) :: clear => DerivativeListHolder_clear
     procedure, pass(this) :: nullify => DerivativeListHolder_nullify
     procedure, pass(this) :: nullifyOld => DerivativeListHolder_nullifyOld
     procedure, pass(this) :: switchGrid => DerivativeListHolder_switchGrid
     procedure, pass(this) :: getIsotopeForShared => DerivativeListHolder_getIsotopeForShared
     procedure, pass(this) :: addSharedColumn => DerivativeListHolder_addSharedColumn
+    procedure, pass(this) :: setNotSetReturnsZero => DerivativeListHolder_setNotSetReturnsZero
+    procedure, pass(this) :: setAccumulate => DerivativeListHolder_setAccumulate
     procedure, pass(this) :: initialize => DerivativeListHolder_initialize
     procedure, pass(this) :: destroy => DerivativeListHolder_destroy
 end type DerivativeListHolder
@@ -88,6 +94,42 @@ function DerivativeListHolder_getDataOld(this, row, col, iso) result(result2Retu
     current = .false.
     result2Return=f_DerivativeListHolder_getData(this%instance_ptr, row-1,col,iso-1,current)
 end function
+subroutine DerivativeListHolder_reserveColumns(this, row, maxCol)
+    implicit none
+    class(DerivativeListHolder)::this
+    integer(C_INT)::row
+    integer(C_INT)::maxCol
+    logical(C_BOOL)::current
+    current=.true.
+    call f_DerivativeListHolder_reserveColumns(this%instance_ptr, row-1,maxCol,current)
+end subroutine
+subroutine DerivativeListHolder_reserveColumnsOld(this, row, maxCol)
+    implicit none
+    class(DerivativeListHolder)::this
+    integer(C_INT)::row
+    integer(C_INT)::maxCol
+    logical(C_BOOL)::current
+    current=.false.
+    call f_DerivativeListHolder_reserveColumns(this%instance_ptr, row-1,maxCol,current)
+end subroutine
+subroutine DerivativeListHolder_reserve(this, maxRow, maxCol)
+    implicit none
+    class(DerivativeListHolder)::this
+    integer(C_INT)::maxRow
+    integer(C_INT)::maxCol
+    logical(C_BOOL)::current
+    current=.true.
+    call f_DerivativeListHolder_reserve(this%instance_ptr, maxRow,maxCol,current)
+end subroutine
+subroutine DerivativeListHolder_reserveOld(this, maxRow, maxCol)
+    implicit none
+    class(DerivativeListHolder)::this
+    integer(C_INT)::maxRow
+    integer(C_INT)::maxCol
+    logical(C_BOOL)::current
+    current=.false.
+    call f_DerivativeListHolder_reserve(this%instance_ptr, maxRow,maxCol,current)
+end subroutine
 subroutine DerivativeListHolder_clear(this)
     implicit none
     class(DerivativeListHolder)::this
@@ -126,6 +168,18 @@ subroutine DerivativeListHolder_addSharedColumn(this, col, iso)
     integer(C_INT)::iso
     call f_DerivativeListHolder_addSharedColumn(this%instance_ptr, col,iso-1)
 end subroutine
+subroutine DerivativeListHolder_setNotSetReturnsZero(this, empty)
+    implicit none
+    class(DerivativeListHolder)::this
+    logical(C_BOOL)::empty
+    call f_DerivativeListHolder_setNotSetReturnsZero(this%instance_ptr, empty)
+end subroutine
+subroutine DerivativeListHolder_setAccumulate(this, add)
+    implicit none
+    class(DerivativeListHolder)::this
+    logical(C_BOOL)::add
+    call f_DerivativeListHolder_setAccumulate(this%instance_ptr, add)
+end subroutine
 subroutine DerivativeListHolder_initialize(this)
     implicit none
     class(DerivativeListHolder) :: this
diff --git a/sammy/src/salmon/interface/fortran/GridData_I.f90 b/sammy/src/salmon/interface/fortran/GridData_I.f90
index 3b6109be78df2d06809c26f7288302bbd0b36d8d..96ed8dc0c1815a059027a174877de88936025c85 100644
--- a/sammy/src/salmon/interface/fortran/GridData_I.f90
+++ b/sammy/src/salmon/interface/fortran/GridData_I.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Thu Jan 07 15:23:53 EST 2021
+!! Date Generated: Fri Aug 20 09:26:07 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -67,6 +67,18 @@ subroutine f_GridData_clearGrid(GridData_ptr ) BIND(C,name="GridData_clearGrid")
     implicit none
     type(C_PTR), value :: GridData_ptr;
 end subroutine
+subroutine f_GridData_nullify(GridData_ptr ) BIND(C,name="GridData_nullify")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: GridData_ptr;
+end subroutine
+subroutine f_GridData_reserve(GridData_ptr, row,col ) BIND(C,name="GridData_reserve")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: GridData_ptr;
+    integer(C_INT) :: row;
+    integer(C_INT) :: col;
+end subroutine
 subroutine f_GridData_addImplicitDerivs(GridData_ptr, grid ) BIND(C,name="GridData_addImplicitDerivs")
     use,intrinsic :: ISO_C_BINDING
     implicit none
diff --git a/sammy/src/salmon/interface/fortran/GridData_M.f90 b/sammy/src/salmon/interface/fortran/GridData_M.f90
index 040ca2b041372df62ec764b6062f4a94d6583be1..5e0d99d5c3cf3595770c0c93dd72320eadf6f33b 100644
--- a/sammy/src/salmon/interface/fortran/GridData_M.f90
+++ b/sammy/src/salmon/interface/fortran/GridData_M.f90
@@ -2,7 +2,7 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Thu Jan 07 15:23:53 EST 2021
+!! Date Generated: Fri Aug 20 09:26:07 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
@@ -23,6 +23,8 @@ type GridData
     procedure, pass(this) :: getRowMax => GridData_getRowMax
     procedure, pass(this) :: setRowMax => GridData_setRowMax
     procedure, pass(this) :: clearGrid => GridData_clearGrid
+    procedure, pass(this) :: nullify => GridData_nullify
+    procedure, pass(this) :: reserve => GridData_reserve
     procedure, pass(this) :: addImplicitDerivs => GridData_addImplicitDerivs
     procedure, pass(this) :: getImplicitDerivs => GridData_getImplicitDerivs
     procedure, pass(this) :: addImplicitParCov => GridData_addImplicitParCov
@@ -109,6 +111,18 @@ subroutine GridData_clearGrid(this)
     class(GridData)::this
     call f_GridData_clearGrid(this%instance_ptr)
 end subroutine
+subroutine GridData_nullify(this)
+    implicit none
+    class(GridData)::this
+    call f_GridData_nullify(this%instance_ptr)
+end subroutine
+subroutine GridData_reserve(this, row, col)
+    implicit none
+    class(GridData)::this
+    integer(C_INT)::row
+    integer(C_INT)::col
+    call f_GridData_reserve(this%instance_ptr, row,col)
+end subroutine
 subroutine GridData_addImplicitDerivs(this, grid)
     implicit none
     class(GridData)::this
diff --git a/sammy/src/salmon/tests/DerivativeListTest.cpp b/sammy/src/salmon/tests/DerivativeListTest.cpp
index 5759268e9c2ae620e1383b57824ea20859e04f46..a32f41e7d2aeae99eb6f1fb9d1a329d48a1d15fb 100644
--- a/sammy/src/salmon/tests/DerivativeListTest.cpp
+++ b/sammy/src/salmon/tests/DerivativeListTest.cpp
@@ -87,7 +87,6 @@ TEST(LinkedGridDataList, basic_data){
          ASSERT_TRUE(list.isSharedColumn(i));
          ASSERT_TRUE(!list.isSharedColumn(i+1));
      }
-     ASSERT_EQ(0, list.getLength());
 
      // clear clears everything
      list.clear();
@@ -186,6 +185,82 @@ TEST(LinkedGridDataList, copySharedInfo){
      ASSERT_NO_THROW(listCopy.addData(2, 5, 2, 2));
 }
 
+
+TEST(LinkedGridDataList, setToZeroOnEmpty){
+   sammy::DerivativeList list;
+
+   // shared columns are added and repored correctly
+   int j = 0;
+   for (int i = 0; i < 10; i+= 2){
+       list.addSharedColumn(i, j);
+       j++;
+       if (j > 1) j = 0;
+   }
+
+   // add three grids
+   list.addGrid();
+   list.addGrid();
+
+   j = 0;
+   for (int i = 8; i >= 0; i-= 2){
+       for( int  r = 5; r < 10; r++){
+          list.addData(r, i, j, i+r+20);
+          list.addData(r, i+1, 0, i+r+30);
+          list.addData(r, i+1, 1, i+r+40);
+       }
+       j++;
+       if (j > 1) j = 0;
+   }
+   list.addData(5, 40, 0, 40);
+   list.addData(5, 35, 0, 35);
+   ASSERT_NEAR(list.getData(5, 40,0), 40, 1e-5);
+   ASSERT_NEAR(list.getData(5, 35,0), 35, 1e-5);
+
+
+
+   j = 0;
+   for (int i = 0; i < 10; i+= 2){
+       for( int  r = 5; r < 10; r++){
+          ASSERT_NEAR(list.getData(r, i, j), i+r+20, 1e-5);
+          ASSERT_NEAR(list.getData(r, i+1, 0), i+r+30, 1e-5);
+          ASSERT_NEAR(list.getData(r, i+1, 1), i+r+40, 1e-5);
+       }
+       for( int  r = 0; r < 5; r++){
+          ASSERT_THROW(list.getData(r, i, j), std::runtime_error);
+          ASSERT_THROW(list.getData(r,i+1,0), std::runtime_error);
+          ASSERT_THROW(list.getData(r,i+1,1), std::runtime_error);
+       }
+       j++;
+       if (j > 1) j = 0;
+   }
+
+   // now allow zero
+   list.setNotSetReturnsZero(true);
+   j = 0;
+   for (int i = 0; i < 10; i+= 2){
+       for( int  r = 0; r < 5; r++){
+          ASSERT_EQ(list.getData(r, i, j), 0.0);
+          ASSERT_EQ(list.getData(r,i+1,0), 0.0);
+          ASSERT_EQ(list.getData(r,i+1,1), 0.0);
+       }
+       j++;
+       if (j > 1) j = 0;
+   }
+
+   // nullify and test
+   list.nullify();
+   j = 0;
+   for (int i = 0; i < 10; i+= 2){
+       for( int  r = 5; r < 10; r++){
+          ASSERT_EQ(list.getData(r, i, j), 0.0);
+          ASSERT_EQ(list.getData(r,i+1,0), 0.0);
+          ASSERT_EQ(list.getData(r,i+1,1), 0.0);
+       }
+       j++;
+       if (j > 1) j = 0;
+   }
+}
+
 TEST(LinkedGridDataListHolder, updateShared){
     sammy::DerivativeListHolder list;
 
@@ -394,7 +469,7 @@ TEST(LinkedGridDataList, DerivativeListHolder){
          ASSERT_TRUE(list.isSharedColumn(i));
          ASSERT_TRUE(!list.isSharedColumn(i+1));
      }
-     ASSERT_EQ(0, list.getLength());
+     ASSERT_EQ(5, list.getLength());
      ASSERT_EQ(5, list.getLength(false));
 
      list.nullify(false);
@@ -402,8 +477,8 @@ TEST(LinkedGridDataList, DerivativeListHolder){
          ASSERT_TRUE(list.isSharedColumn(i));
          ASSERT_TRUE(!list.isSharedColumn(i+1));
      }
-     ASSERT_EQ(0, list.getLength());
-     ASSERT_EQ(0, list.getLength(false));
+     ASSERT_EQ(5, list.getLength());
+     ASSERT_EQ(5, list.getLength(false));
 
      // clear
      list.clear();
@@ -415,5 +490,76 @@ TEST(LinkedGridDataList, DerivativeListHolder){
      ASSERT_EQ(0, list.getLength(false));
 }
 
+TEST(LinkedGridDataListHolder, setToZeroOnEmpty){
+   sammy::DerivativeListHolder list;
+
+   // shared columns are added and repored correctly
+   int j = 0;
+   for (int i = 0; i < 10; i+= 2){
+       list.addSharedColumn(i, j);
+       j++;
+       if (j > 1) j = 0;
+   }
+
+   // add three grids
+   list.addGrid();
+   list.addGrid();
+
+   for (int ig = 0; ig < 1; ig++){
+       j = 0;
+       for (int i = 0; i < 10; i+= 2){
+           for( int  r = 5; r < 10; r++){
+               list.addData(r, i, j, i+r+20);
+               list.addData(r, i+1, 0, i+r+30);
+               list.addData(r, i+1, 1, i+r+40);
+           }
+           j++;
+           if (j > 1) j = 0;
+       }
+
+       if (ig == 0){
+          j = 0;
+          for (int i = 0; i < 10; i+= 2){
+              for( int  r = 0; r < 5; r++){
+                  ASSERT_THROW(list.getData(r, i, j), std::runtime_error);
+                  ASSERT_THROW(list.getData(r,i+1,0), std::runtime_error);
+                  ASSERT_THROW(list.getData(r,i+1,1), std::runtime_error);
+              }
+             j++;
+             if (j > 1) j = 0;
+          }
+          // now allow zero
+          list.setNotSetReturnsZero(true);
+       }
+
+       j = 0;
+       for (int i = 0; i < 10; i+= 2){
+           for( int  r = 0; r < 5; r++){
+               ASSERT_EQ(list.getData(r, i, j), 0.0);
+               ASSERT_EQ(list.getData(r,i+1,0), 0.0);
+               ASSERT_EQ(list.getData(r,i+1,1), 0.0);
+           }
+           j++;
+           if (j > 1) j = 0;
+       }
+
+       // nullify and test
+       list.nullify();
+       j = 0;
+       for (int i = 0; i < 10; i+= 2){
+           for( int  r = 5; r < 10; r++){
+               ASSERT_EQ(list.getData(r, i, j), 0.0);
+               ASSERT_EQ(list.getData(r,i+1,0), 0.0);
+               ASSERT_EQ(list.getData(r,i+1,1), 0.0);
+           }
+           j++;
+           if (j > 1) j = 0;
+       }
+
+       list.switchGrid();
+   }
+}
+
+
 
 
diff --git a/sammy/src/salmon/tests/GridDataTest.cpp b/sammy/src/salmon/tests/GridDataTest.cpp
index f063f7d4158c6a9feddd9d0fc5520b484bdfb1d7..c8eb9ab26ac61dece1e148d62eea813c4bb304e0 100644
--- a/sammy/src/salmon/tests/GridDataTest.cpp
+++ b/sammy/src/salmon/tests/GridDataTest.cpp
@@ -21,7 +21,7 @@ TEST(GridDataSetter,gridData){
     xx = 1.0;
     for ( int i = 10; i < 20; i++ ){
         for ( int j = 5; j < 20; j++){
-            ASSERT_NEAR(xx, grid.getData(i,j), 1e-3);
+            ASSERT_NEAR(xx, grid.getData(i,j), 1e-5);
             xx += 0.1;
         }
     }
@@ -46,6 +46,14 @@ TEST(GridDataSetter,gridData){
         }
     }
 
+    // now nullify
+    grid.nullify();
+    for ( int i = 10; i < 20; i++ ){
+        for ( int j = 5; j < 20; j++){
+            ASSERT_NEAR(0.0, grid.getData(i,j), 1e-5);
+        }
+    }
+
     // clear all data
     grid.clearGrid();
     for ( int i = 10; i < 20; i++ ){
@@ -55,6 +63,27 @@ TEST(GridDataSetter,gridData){
     }
 
 
+   // and a reserve
+   sammy::GridData gridReserve;
+   gridReserve.reserve(20, 2);
+   for ( int i = 0; i < 20; i++ ){
+       for ( int j = 0; j < 2; j++){
+           ASSERT_NEAR(0.0, gridReserve.getData(i,j), 1e-5);
+           gridReserve.addData(i, j, 1.0);
+       }
+   }
+   gridReserve.reserve(25, 3);
+   for ( int i = 0; i < 20; i++ ){
+       for ( int j = 0; j < 2; j++){
+           ASSERT_NEAR(1.0, gridReserve.getData(i,j), 1e-5);
+       }
+       ASSERT_NEAR(0.0, gridReserve.getData(i,2), 1e-3);
+   }
+   for ( int i = 20; i < 25; i++ ){
+       for ( int j = 0; j < 3; j++){
+           ASSERT_NEAR(0.0, gridReserve.getData(i,j), 1e-5);
+       }
+   }
 }
 
 
@@ -88,7 +117,7 @@ TEST(DataInfo,gridData){
    xx = 1.0;
    for (int i = 0; i < 5; i++){
        for( int j = 0; j < 3; j++){
-           ASSERT_NEAR(xx, gridCopy.getData(i, j), 1e-3);
+           ASSERT_NEAR(xx, gridCopy.getData(i, j), 1e-5);
            xx += 0.1;
        }
    }
@@ -98,6 +127,32 @@ TEST(DataInfo,gridData){
    ASSERT_THROW(grid.addData(1, -5, 4.4), std::runtime_error);
 }
 
+TEST(notSetReturnsZero,gridData){
+   sammy::GridData grid;
+
+   ASSERT_THROW(grid.getData(5,7), std::runtime_error);
+   grid.setNotSetReturnsZero(true);
+   ASSERT_EQ(0.0, grid.getData(5,7));
+
+   grid.addData(5,7, 6.0);
+   ASSERT_NEAR(6.0, grid.getData(5,7), 1e-5);
+   grid.setNotSetReturnsZero(false);
+   ASSERT_NEAR(6.0, grid.getData(5,7), 1e-5);
+
+   ASSERT_THROW(grid.getData(5,8), std::runtime_error);
+
+   // and a copy
+   grid.setNotSetReturnsZero(true);
+   sammy::GridData gridCopy(grid);
+   ASSERT_EQ(0.0, grid.getData(5,8));
+
+   grid.setNotSetReturnsZero(false);
+   sammy::GridData gridCopy2(grid);
+   ASSERT_THROW(grid.getData(5,8), std::runtime_error);
+}
+
+
+
 TEST(GridList, gridDataList){
     sammy::GridDataList list;
 
@@ -127,7 +182,7 @@ TEST(GridList, gridDataList){
 
         for( int j = 0; j < 2; j++){
             ASSERT_NEAR(i+1, grid->getData(j,1), 1e-3);
-            ASSERT_NEAR( i+5, list.getExperimentalCov(i*3, j), 1e-3);
+            ASSERT_NEAR( i+5, list.getExperimentalCov(i*3, j), 1e-5);
         }
     }
 }
@@ -196,4 +251,31 @@ TEST(GridData, getImplicitParCov){
     checkImplictParCov(gridDataCopy.getImplicitParCov());
 }
 
+TEST(notSetReturnsZero,gridDataList){
+   sammy::GridDataList gridList;
+
+   std::unique_ptr<sammy::GridData>  grid = nemesis::make_unique<sammy::GridData>();
+   grid->setNotSetReturnsZero(true);
+   gridList.addGrid(grid);
+
+   ASSERT_THROW(gridList.getGrid(0)->getData(5,7), std::runtime_error);
+
+   gridList.setNotSetReturnsZero(true);
+   ASSERT_EQ(0.0, gridList.getGrid(0)->getData(5,7));
+
+   grid = nemesis::make_unique<sammy::GridData>();
+   grid->setNotSetReturnsZero(false);
+   gridList.addGrid(grid);
+   ASSERT_EQ(0.0, gridList.getGrid(1)->getData(5,7));
+
+   gridList.setNotSetReturnsZero(false);
+   ASSERT_THROW(gridList.getGrid(0)->getData(5,7), std::runtime_error);
+   ASSERT_THROW(gridList.getGrid(1)->getData(5,7), std::runtime_error);
+
+   gridList.setNotSetReturnsZero(true);
+   ASSERT_EQ(0.0, gridList.getGrid(0)->getData(5,7));
+   ASSERT_EQ(0.0, gridList.getGrid(1)->getData(5,7));
+}
+
+
 
diff --git a/sammy/src/smc/msmc0.f b/sammy/src/smc/msmc0.f
index c40bb99ea8ffba5c468870747c1ae41c6c510032..8bb96e973e2179c400480aa97088dc138105f144 100644
--- a/sammy/src/smc/msmc0.f
+++ b/sammy/src/smc/msmc0.f
@@ -51,7 +51,7 @@ C ***    Construct the energy scale
          I2 = 1 + (Eh-El)/De
          if (expData%getLength().gt.0) then
              call expData%getGrid(grid, 1)
-             call grid%clearGrid()
+             call grid%nullify()
          else
              call grid%initialize()
              call expData%addGrid(grid)
@@ -72,7 +72,7 @@ C ***    Read the energy scale from a file
 11100    FORMAT (I6)
          if (expData%getLength().gt.0) then
              call expData%getGrid(grid, 1)
-             call grid%clearGrid()
+             call grid%nullify()
          else
              call grid%initialize()
              call expData%addGrid(grid)
@@ -248,7 +248,7 @@ C *** set energy scale if needed
       IF (Kkkuse.EQ.1) THEN
          if (expData%getLength().gt.0) then
              call expData%getGrid(grid, 1)
-             call grid%clearGrid()
+             call grid%nullify()
          else
              call grid%initialize()
              call expData%addGrid(grid)
diff --git a/sammy/src/ssm/mssm18.f90 b/sammy/src/ssm/mssm18.f90
index 191454a1504ffd4184e669f31e8b46d00c7eb32b..58a9b7d8d6071f720b3120799f71dfaeff03873e 100644
--- a/sammy/src/ssm/mssm18.f90
+++ b/sammy/src/ssm/mssm18.f90
@@ -332,6 +332,7 @@ module ssm_18_m
          Kk = Kk + 1
          IF (dABS(auxGrid%getEnergy(K, expData)-Em).LT.De) THEN
             val = derivs%getData(Kk, 0, 1)
+            call derivs%reserveColumns(Jj, Ndasig+Ndbsig+1) ! derivs + cross
             call derivs%addData(Jj, 0, 1, val)
             Theory(Jj) = val
             IF (Ndasig.GT.0) THEN
@@ -360,6 +361,7 @@ module ssm_18_m
             A = A/D
             B = B/D
             val = derivs%getData(Kk, 0, 1) * B + derivs%getData(Kk-1, 0, 1) * A
+            call derivs%reserveColumns(Jj, Ndasig+Ndbsig+1) ! derivs + cross
             call derivs%addData(Jj, 0, 1, val)
             Theory(Jj) = val
             IF (Ndasig.GT.0) THEN
diff --git a/sammy/src/the/DerivativeHandler.cpp b/sammy/src/the/DerivativeHandler.cpp
index 93b07b70090ed49ae573961bba784c2200327879..cdc52c745bd2a918b3e3165f54e6dcbd8e14778f 100644
--- a/sammy/src/the/DerivativeHandler.cpp
+++ b/sammy/src/the/DerivativeHandler.cpp
@@ -1,8 +1,9 @@
 #include "DerivativeHandler.h"
 
 namespace sammy{
-  void DerivativeHandler::setUpList(SammyRMatrixParameters & params, int num){
-       int numIso = params.getNumIso();
+
+  void DerivativeHandler::setUpList(SammyRMatrixParameters & params, AdjustedRadiusData & radii, int num){
+       int numIso = params.getNumIso();       
        if (numIso < num) numIso = num;
        if (num == 1) numIso = 1; // numIso is sometimes redefined - why oh why       
        if (numIso <= 1) {
@@ -12,29 +13,98 @@ namespace sammy{
 
        // add indices for resonance parameters
        // they are shared across isotopes
-       for ( int ires = 0; ires < params.getNumResonances(); ires++){
+       for ( int ires = 0; ires < params.getNumResonances(); ires++){           
            sammy::SammyResonanceInfo * resInfo = params.getResonanceInfo(ires);
-           if (!resInfo->getIncludeInCalc()) continue;
-           if (!resInfo->hasAnyVariedParams()) continue;
+           bool includeInCalc = true;
+
+           if (!resInfo->getIncludeInCalc()) includeInCalc = false;
+           if (!resInfo->hasAnyVariedParams()) includeInCalc = false;
+
+           int igr = resInfo->getSpinGroupIndex();          
+           sammy::SammySpinGroupInfo *spinInfo = params.getSpinGroupInfo(igr);          
+           if (!spinInfo->getIncludeInCalc()) includeInCalc = false;
 
-           int igr = resInfo->getSpinGroupIndex();
-           sammy::SammySpinGroupInfo *spinInfo = params.getSpinGroupInfo(igr);
-           if (!spinInfo->getIncludeInCalc()) continue;
+           int iso = spinInfo->getIsotopeIndex();
+
+           // this allows legacy SAMMY to work. This shouldn't have been flagged
+           if (!includeInCalc) iso = 0;
+
+           int iflGam = spinInfo->getGammaWidthIndex();
+           if (iflGam > 0){
+               addSharedColumn(iflGam, iso);
+           }
 
            int ifl = resInfo->getEnergyFitOption();
            if (ifl > 0){
-               addSharedColumn(ifl, spinInfo->getIsotopeIndex());
+               addSharedColumn(ifl, iso);
            }
 
            int ichan = spinInfo->getAllChannels();
            for (int ic = 0; ic < ichan; ic++){
                ifl = resInfo->getChannelFitOption(ic);
+               if (ifl == iflGam) continue;
+               if (ifl > 0){                  
+                   addSharedColumn(ifl, iso);
+               }
+           }
+       }
+
+       // r-external
+      for (int iext = 0; iext <  params.getNumRext(); iext++){
+           sammy::SammyRExternalInfo * resInfo = params.getRextInfo(iext);
+           int igr = resInfo->getGrp();
+           sammy::SammySpinGroupInfo * spinInfo = params.getSpinGroupInfo(igr);
+           int iso = spinInfo->getIsotopeIndex();
+
+           for ( int i = 1; i <= 7; i++){
+               int ifl = resInfo->getIflSammyIndex(i);
                if (ifl > 0){
-                   addSharedColumn(ifl, spinInfo->getIsotopeIndex());
+                   addSharedColumn(ifl, iso);
                }
            }
        }
 
+       // radius info
+       int nn = radii.getNumRadInfo();
+       for (int ir = 0; ir < nn; ir++){
+         int iflTrue, iflEff;
+         iflTrue = radii.getTrueFitFlagByIndex(ir);
+         iflEff = radii.getEffFitFlagByIndex(ir);
+         if (radii.trueEqualToEff(ir)) iflTrue = 0;
+         if (radii.hasMatchingRadius()) iflTrue = 0;
+
+         if (iflEff <= 0 && iflTrue <= 0) continue;
+
+
+         if (radii.getNumGroups(ir) == 0) continue;
+         int igr = radii.getGroupIndex(ir, 0); // take istope from first group
+         sammy::SammySpinGroupInfo * spinInfo = params.getSpinGroupInfo(igr);
+         int iso = spinInfo->getIsotopeIndex();
+
+         if (iflTrue > 0){
+             addSharedColumn(iflTrue, iso);
+         }
+         if (iflEff > 0){
+             addSharedColumn(iflEff, iso);
+         }
+       }
+
+       // matching radius, add to first isotope
+       if (nn == 0 || radii.hasMatchingRadius()){
+           int ifl = radii.matchFitFlag();
+           if (ifl > 0){
+               addSharedColumn(ifl, 0);
+           }
+       }
+
+       // abundances
+       for (int iso = 0; iso < params.getNumIso(); iso++){
+          int ifl = params.getIsoInfo(iso)->getFitOption();
+          if (ifl > 0){
+              addSharedColumn(ifl, iso);
+          }
+       }
+
        while ( getGridNumber() < numIso) addGrid();
   }
 
@@ -54,6 +124,11 @@ namespace sammy{
       }
   }
 
+  void DerivativeHandler::reserveColumnsNs(int row, int ns, int maxCol, bool current){
+      int ipos = row * nnsig + ns;
+      reserveColumns(ipos, maxCol, current);
+  }
+
   double DerivativeHandler::getSharedDataVal(int row, int col, bool current) const{
       int posOur = getIsotopeForShared(col);
       if (posOur < 0) posOur = 0;
@@ -120,7 +195,7 @@ namespace sammy{
   }
 
   double DerivativeHandler::getDataNs(int row, int ns, int col, int iso, bool current) const{
-      int ipos = row * nnsig + ns;
+      int ipos = row * nnsig + ns;      
       return getData(ipos, col, iso, current);
   }
 }
diff --git a/sammy/src/the/DerivativeHandler.h b/sammy/src/the/DerivativeHandler.h
index b1d0e711f7855f7db186ee406e4c31b2cdc42600..7ee9d4c18332f2f8f7c8ce5f967a1b2f5ddcd628 100644
--- a/sammy/src/the/DerivativeHandler.h
+++ b/sammy/src/the/DerivativeHandler.h
@@ -3,6 +3,7 @@
 
 #include "salmon/DerivativeList.h"
 #include "endf/SammyRMatrixParameters.h"
+#include "endf/AdjustedRadiusData.h"
 
 namespace sammy{
 
@@ -57,8 +58,8 @@ namespace sammy{
         *
         * @param params the resonance parameter information
         * @param num  the number of isotopes
-        */
-       void setUpList(SammyRMatrixParameters & params, int num=0);
+        */       
+       void setUpList(SammyRMatrixParameters & params, AdjustedRadiusData & radii, int num=0);
 
        /**
         * Set the data for the indicated row to zero
@@ -132,6 +133,16 @@ namespace sammy{
         */
        void setNnsig(int nnsig);
 
+
+       /**
+        * Make sure the indicated row as at least maxCol data.
+        * If not set, additional columns are set to zero
+        *
+        * @param row the row for which to set the data
+        * @param maxCol the maximum number of columns
+        */
+       void reserveColumnsNs(int row, int ns, int maxCol, bool current = true);
+
        /**
         * Same as getSharedDataVal, except return the value for row=((row-1)*getNnnsig() +ns)
         *
diff --git a/sammy/src/the/interface/cix/DerivativeHandler.cpp2f.xml b/sammy/src/the/interface/cix/DerivativeHandler.cpp2f.xml
index 2119ed6fb920d141a3527be6aeabaa41c3f12ecc..25f7abe003a44c139c9a65796fd96050442452b3 100644
--- a/sammy/src/the/interface/cix/DerivativeHandler.cpp2f.xml
+++ b/sammy/src/the/interface/cix/DerivativeHandler.cpp2f.xml
@@ -5,6 +5,7 @@
     <class name="DerivativeHandler" parent="DerivativeListHolder">
       <method name="setUpList">
           <param name="params" type="SammyRMatrixParameters"/>
+          <param name="radii" type="AdjustedRadiusData"/>
           <param name="num" type="int"/>
       </method>
       <method name="setToZero">
@@ -52,6 +53,12 @@
           <param name="value" type="double"/>
           <param name="current" type="bool"/>
       </method>
+      <method name="reserveColumnsNs">
+          <param name="row" type="int" offset="-1"/>
+          <param name="ns" type="int" offset="-1"/>
+          <param name="maxCol" type="int"/>
+          <param name="current" type="bool"/>
+      </method>
       <method name="addDataNs">
           <param name="row" type="int" offset="-1"/>
           <param name="ns" type="int" offset="-1"/>
diff --git a/sammy/src/the/interface/cpp/DerivativeHandlerInterface.cpp b/sammy/src/the/interface/cpp/DerivativeHandlerInterface.cpp
index 054ace3773a40e8148591ef942fddf9a0914fd97..bf20c24393bb31c8cd5a9943f1fb831b5d262e77 100644
--- a/sammy/src/the/interface/cpp/DerivativeHandlerInterface.cpp
+++ b/sammy/src/the/interface/cpp/DerivativeHandlerInterface.cpp
@@ -2,16 +2,16 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Mon Apr 26 18:06:30 EDT 2021
+* Date Generated: Fri Aug 20 14:16:52 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
 #include <string.h>
 #include "DerivativeHandlerInterface.h"
 using namespace sammy;
-void DerivativeHandler_setUpList(void * DerivativeHandler_ptr,SammyRMatrixParameters * params,int * num)
+void DerivativeHandler_setUpList(void * DerivativeHandler_ptr,SammyRMatrixParameters * params,AdjustedRadiusData * radii,int * num)
 {
-    ((DerivativeHandler*)DerivativeHandler_ptr)->setUpList(*params,*num);
+    ((DerivativeHandler*)DerivativeHandler_ptr)->setUpList(*params,*radii,*num);
 }
 
 void DerivativeHandler_setToZero(void * DerivativeHandler_ptr,int * row,int * maxIfl,bool * current)
@@ -64,14 +64,19 @@ void DerivativeHandler_setSharedValNs(void * DerivativeHandler_ptr,int * row,int
     ((DerivativeHandler*)DerivativeHandler_ptr)->setSharedValNs(*row,*ns,*col,*value,*current);
 }
 
-void DerivativeHandler_addDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * index,double * value,bool * current)
+void DerivativeHandler_reserveColumnsNs(void * DerivativeHandler_ptr,int * row,int * ns,int * maxCol,bool * current)
 {
-    ((DerivativeHandler*)DerivativeHandler_ptr)->addDataNs(*row,*ns,*col,*index,*value,*current);
+    ((DerivativeHandler*)DerivativeHandler_ptr)->reserveColumnsNs(*row,*ns,*maxCol,*current);
 }
 
-double DerivativeHandler_getDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * index,bool * current)
+void DerivativeHandler_addDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * iso,double * value,bool * current)
 {
-    return ((DerivativeHandler*)DerivativeHandler_ptr)->getDataNs(*row,*ns,*col,*index,*current);
+    ((DerivativeHandler*)DerivativeHandler_ptr)->addDataNs(*row,*ns,*col,*iso,*value,*current);
+}
+
+double DerivativeHandler_getDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * iso,bool * current)
+{
+    return ((DerivativeHandler*)DerivativeHandler_ptr)->getDataNs(*row,*ns,*col,*iso,*current);
 }
 
 void* DerivativeHandler_initialize()
diff --git a/sammy/src/the/interface/cpp/DerivativeHandlerInterface.h b/sammy/src/the/interface/cpp/DerivativeHandlerInterface.h
index 243e1e5f7308b9f00beb8da7de95bc160973677f..808fde4fc998a72f3d20f30c055ba9ac6f1d5073 100644
--- a/sammy/src/the/interface/cpp/DerivativeHandlerInterface.h
+++ b/sammy/src/the/interface/cpp/DerivativeHandlerInterface.h
@@ -2,7 +2,7 @@
 * This file has been dynamically generated by Class Interface Xml (CIX) 
 * DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 * If changes need to occur, modify the appropriate CIX xml file
-* Date Generated: Mon Apr 26 18:06:30 EDT 2021
+* Date Generated: Fri Aug 20 14:16:51 EDT 2021
 * If any issues are experiences with this generated file that cannot be fixed
 * with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 */
@@ -13,7 +13,7 @@ using namespace sammy;
 #ifdef __cplusplus
 extern "C" {
 #endif
-void DerivativeHandler_setUpList(void * DerivativeHandler_ptr,SammyRMatrixParameters * params,int * num);
+void DerivativeHandler_setUpList(void * DerivativeHandler_ptr,SammyRMatrixParameters * params,AdjustedRadiusData * radii,int * num);
 void DerivativeHandler_setToZero(void * DerivativeHandler_ptr,int * row,int * maxIfl,bool * current);
 double DerivativeHandler_getSharedDataVal(void * DerivativeHandler_ptr,int * row,int * col,bool * current);
 void DerivativeHandler_setSharedDataVal(void * DerivativeHandler_ptr,int * row,int * col,double * value,bool * current);
@@ -24,8 +24,9 @@ int DerivativeHandler_getNnnsig(void * DerivativeHandler_ptr);
 void DerivativeHandler_setNnsig(void * DerivativeHandler_ptr,int * nnsig);
 double DerivativeHandler_getSharedValNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,bool * current);
 void DerivativeHandler_setSharedValNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,double * value,bool * current);
-void DerivativeHandler_addDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * index,double * value,bool * current);
-double DerivativeHandler_getDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * index,bool * current);
+void DerivativeHandler_reserveColumnsNs(void * DerivativeHandler_ptr,int * row,int * ns,int * maxCol,bool * current);
+void DerivativeHandler_addDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * iso,double * value,bool * current);
+double DerivativeHandler_getDataNs(void * DerivativeHandler_ptr,int * row,int * ns,int * col,int * iso,bool * current);
 void* DerivativeHandler_initialize();
 void DerivativeHandler_destroy(void * DerivativeHandler_ptr);
 #ifdef __cplusplus
diff --git a/sammy/src/the/interface/fortran/DerivativeHandler_I.f90 b/sammy/src/the/interface/fortran/DerivativeHandler_I.f90
index 88e3a44670502ab87252aec377c7b1b02c3561c4..00e30e462d882bdb54f1497f88af18803dbdecf4 100644
--- a/sammy/src/the/interface/fortran/DerivativeHandler_I.f90
+++ b/sammy/src/the/interface/fortran/DerivativeHandler_I.f90
@@ -2,18 +2,19 @@
 !! This file has been dynamically generated by Class Interface Xml (CIX) 
 !! DO NOT MODIFY THIS FILE -- CHANGES WILL BE OVERWRITTEN UPON REGENERATION
 !! If changes need to occur, modify the appropriate CIX xml file
-!! Date Generated: Mon Apr 26 18:06:30 EDT 2021
+!! Date Generated: Fri Aug 20 14:16:52 EDT 2021
 !! If any issues are experiences with this generated file that cannot be fixed
 !! with adjustment of the CIX xml file, please contact Robert A. Lefebvre, raq@ornl.gov
 !!/
 module DerivativeHandler_I
 use, intrinsic :: ISO_C_BINDING
 interface
-subroutine f_DerivativeHandler_setUpList(DerivativeHandler_ptr, params,num ) BIND(C,name="DerivativeHandler_setUpList")
+subroutine f_DerivativeHandler_setUpList(DerivativeHandler_ptr, params,radii,num ) BIND(C,name="DerivativeHandler_setUpList")
     use,intrinsic :: ISO_C_BINDING
     implicit none
     type(C_PTR), value :: DerivativeHandler_ptr;
     type(C_PTR), value :: params;
+    type(C_PTR), value :: radii;
     integer(C_INT) :: num;
 end subroutine
 subroutine f_DerivativeHandler_setToZero(DerivativeHandler_ptr, row,maxIfl,current ) BIND(C,name="DerivativeHandler_setToZero")
@@ -92,6 +93,15 @@ subroutine f_DerivativeHandler_setSharedValNs(DerivativeHandler_ptr, row,ns,col,
     real(C_DOUBLE) :: value;
     logical(C_BOOL) :: current;
 end subroutine
+subroutine f_DerivativeHandler_reserveColumnsNs(DerivativeHandler_ptr, row,ns,maxCol,current ) BIND(C,name="DerivativeHandler_reserveColumnsNs")
+    use,intrinsic :: ISO_C_BINDING
+    implicit none
+    type(C_PTR), value :: DerivativeHandler_ptr;
+    integer(C_INT) :: row;
+    integer(C_INT) :: ns;
+    integer(C_INT) :: maxCol;
+    logical(C_BOOL) :: current;
+end subroutine
 subroutine f_DerivativeHandler_addDataNs(DerivativeHandler_ptr, row,ns,col,iso,value,current ) BIND(C,name="DerivativeHandler_addDataNs")
     use,intrinsic :: ISO_C_BINDING
     implicit none
diff --git a/sammy/src/the/interface/fortran/DerivativeHandler_M.f90 b/sammy/src/the/interface/fortran/DerivativeHandler_M.f90
index c220f1d8ff446cab0a472ed7ddd57a5d9a430c72..ac6b94b1f0de63aa555a287a067071ac905bae9e 100644
--- a/sammy/src/the/interface/fortran/DerivativeHandler_M.f90
+++ b/sammy/src/the/interface/fortran/DerivativeHandler_M.f90
@@ -11,6 +11,7 @@ use, intrinsic :: ISO_C_BINDING
 use DerivativeHandler_I
 use DerivativeListHolder_M
 use SammyRMatrixParameters_M
+use AdjustedRadiusData_M
 type , extends(DerivativeListHolder) :: DerivativeHandler
     contains
     procedure, pass(this) :: setUpList => DerivativeHandler_setUpList
@@ -29,6 +30,8 @@ type , extends(DerivativeListHolder) :: DerivativeHandler
     procedure, pass(this) :: getSharedValNsOld => DerivativeHandler_getSharedValNsOld
     procedure, pass(this) :: setSharedValNs => DerivativeHandler_setSharedValNs
     procedure, pass(this) :: setSharedValNsOld => DerivativeHandler_setSharedValNsOld
+    procedure, pass(this) :: reserveColumnsNs => DerivativeHandler_reserveColumnsNs
+    procedure, pass(this) :: reserveColumnsNsOld => DerivativeHandler_reserveColumnsNsOld
     procedure, pass(this) :: addDataNs => DerivativeHandler_addDataNs
     procedure, pass(this) :: addDataNsOld => DerivativeHandler_addDataNsOld
     procedure, pass(this) :: getDataNs => DerivativeHandler_getDataNs
@@ -40,12 +43,13 @@ type , extends(DerivativeListHolder) :: DerivativeHandler
     procedure, pass(this) :: destroy => DerivativeHandler_destroy
 end type DerivativeHandler
 contains
-subroutine DerivativeHandler_setUpList(this, params, num)
+subroutine DerivativeHandler_setUpList(this, params, radii, num)
     implicit none
     class(DerivativeHandler)::this
     class(SammyRMatrixParameters)::params
+    class(AdjustedRadiusData)::radii
     integer(C_INT)::num
-    call f_DerivativeHandler_setUpList(this%instance_ptr, params%instance_ptr,num)
+    call f_DerivativeHandler_setUpList(this%instance_ptr, params%instance_ptr, radii%instance_ptr, num)
 end subroutine
 subroutine DerivativeHandler_setToZero(this, row, maxIfl)
     implicit none
@@ -187,6 +191,26 @@ subroutine DerivativeHandler_setSharedValNsOld(this, row, ns, col, value)
     current=.false.
     call f_DerivativeHandler_setSharedValNs(this%instance_ptr, row-1,ns-1,col,value,current)
 end subroutine
+subroutine DerivativeHandler_reserveColumnsNs(this, row, ns, maxCol)
+    implicit none
+    class(DerivativeHandler)::this
+    integer(C_INT)::row
+    integer(C_INT)::ns
+    integer(C_INT)::maxCol
+    logical(C_BOOL)::current
+    current = .true.
+    call f_DerivativeHandler_reserveColumnsNs(this%instance_ptr, row-1,ns-1,maxCol,current)
+end subroutine
+subroutine DerivativeHandler_reserveColumnsNsOld(this, row, ns, maxCol)
+    implicit none
+    class(DerivativeHandler)::this
+    integer(C_INT)::row
+    integer(C_INT)::ns
+    integer(C_INT)::maxCol
+    logical(C_BOOL)::current
+    current = .false.
+    call f_DerivativeHandler_reserveColumnsNs(this%instance_ptr, row-1,ns-1,maxCol,current)
+end subroutine
 subroutine DerivativeHandler_addDataNs(this, row, ns, col, iso, value)
     implicit none
     class(DerivativeHandler)::this
@@ -264,18 +288,19 @@ subroutine DerivativeHandler_addCalculatedData(this, row, nnsig, ndasig, ndbsig,
    ourIso = iso
    if (ourIso.lt.0) ourIso = 1
    do Jsig = 1,nnsig
+     call this%reserveColumnsNs(row, Jsig, Ndasig+Ndbsig)
      call this%addDataNs(row, Jsig, 0, ourIso, Sigx(Jsig))
      DO Iipar=1,Ndasig
         isop = -1   ! indicate the shared value is to be set
         if (iso.ge.0) then
            isop = this%getIsotopeForShared(Iipar)
            if (isop.le.0) isop = 1  ! for one-isotope problems we don't use shared column
-        end if
+        end if       
         if (iso.eq.isop) then
             call this%setSharedValNs(row, Jsig, Iipar,  Dasigx(jsig,Iipar))
         end if
      end do
-     DO Iipar=1,Ndbsig
+     DO Iipar=1,Ndbsig        
          call this%addDataNs(row, Jsig, Iipar + Ndasig, ourIso, Dbsigx(Jsig,Iipar))
      end do   
    end do
@@ -297,7 +322,7 @@ subroutine DerivativeHandler_getCalculatedData(this, row, nnsig, ndasig, ndbsig,
       DO Iipar=0,Ndasig + Ndbsig
          sharedIso = this%getIsotopeForShared(Iipar)
          if (sharedIso.le.0) sharedIso = 1
-         if (iso.gt.0)  sharedIso = iso
+         if (iso.gt.0)  sharedIso = iso        
          val = this%getDataNs(row, Jsig, Iipar, sharedIso)
          if (Iipar.eq.0) then
              Sigx(Jsig) = val
@@ -325,7 +350,7 @@ subroutine DerivativeHandler_getCalculatedDataOld(this, row, nnsig, ndasig, ndbs
       DO Iipar=0,Ndasig + Ndbsig
          sharedIso = this%getIsotopeForShared(Iipar)
          if (sharedIso.le.0) sharedIso = 1
-         if (iso.gt.0)  sharedIso = iso
+         if (iso.gt.0)  sharedIso = iso         
          val = this%getDataNsOld(row, Jsig, Iipar, sharedIso)
          if (Iipar.eq.0) then
              Sigx(Jsig) = val
diff --git a/sammy/src/xct/mxct0.f90 b/sammy/src/xct/mxct0.f90
index eca02d705f40db881e5f694506bb24446e69d428..f68ced6bf968c037d0cdfec72fa6647700292715 100644
--- a/sammy/src/xct/mxct0.f90
+++ b/sammy/src/xct/mxct0.f90
@@ -142,12 +142,8 @@ module xct_m
 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <
       IF (Ksolve.NE.2 .OR. covData%getPupedParam().GT.0) THEN
          Ks_Res = 0
-         ng = resParData%getNumSpinGroups()
-         call allocate_integer_data(I_Inpxdr, Ng)
          Krext = Nrext
          IF (Nrext.EQ.0) Krext = 1
-         CALL Ppar (  I_Iflext, I_Inpxdr, Krext)
-! ***    Sbroutine Ppar Sets  Npxdr
       ELSE
          Ks_Res = 2
       END IF
diff --git a/sammy/src/xct/mxct01.f90 b/sammy/src/xct/mxct01.f90
index f0bf01639967f675dc03e92df6e270c8f70d8a4f..07d9d7300edee34280b390900643002c6363871d 100755
--- a/sammy/src/xct/mxct01.f90
+++ b/sammy/src/xct/mxct01.f90
@@ -2,43 +2,6 @@
 module xct1_m
    contains
 !
-! --------------------------------------------------------------
-!
-      SUBROUTINE Ppar (Iflext, Npxdr, Krext)
-!
-! *** Purpose --
-! *** and Npxdr(K) = number of varied external parameters in group K
-!
-      use fixedi_m
-      use ifwrit_m
-      use EndfData_common_m
-      use SammyResonanceInfo_M
-      IMPLICIT DOUBLE PRECISION (a-h,o-z)
-!
-      type(SammyResonanceInfo)::resInfo
-      type(SammySpinGroupInfo)::spinInfo
-      DIMENSION Iflext(Krext,Ntotc,*), Npxdr(*)
-!
-!      DIMENSION Iflext(.,.,Ngroup)
-!
-!
-      CALL Zero_Integer (Npxdr, resParData%getNumSpinGroups())
-!
-      IF (Nfpext.GT.0) THEN
-         DO Igr=1,resParData%getNumSpinGroups()
-            call resparData%getSpinGroupInfo(spinInfo, igr) 
-            N = spinInfo%getNumChannels()
-            DO J=1,N
-               IF (Iflext(1,J,Igr).NE.-1) Npxdr(Igr) = 1
-            END DO
-         END DO
-      END IF
-!
-      RETURN
-!
-!
-      END
-!
 !
 ! --------------------------------------------------------------
 !
diff --git a/sammy/src/xct/mxct02.f90 b/sammy/src/xct/mxct02.f90
index 22aa1f17a4c1fd36164cd3acda468b329ce9baf5..96969d90f0cd51f49125c180c6af38a64bc3fbd3 100644
--- a/sammy/src/xct/mxct02.f90
+++ b/sammy/src/xct/mxct02.f90
@@ -99,7 +99,7 @@ module xct2_m
             call derivs%addSharedColumn(Iipar, 1)
          end do
       end if
-      call  derivs%setUpList(resParData, Iq_Iso)
+      call  derivs%setUpList(resParData, radFitFlags, Iq_Iso)
 
       IF (Iw.EQ.1.or.Ksitmp.gt.0) THEN
          call derivsSelf%nullify()
@@ -109,7 +109,7 @@ module xct2_m
                 call derivsSelf%addSharedColumn(Iipar, 1)
             end do
          end if
-         call  derivsSelf%setUpList(resParData, Iq_Iso)
+         call  derivsSelf%setUpList(resParData, radFitFlags, Iq_Iso)
       end if
 
       CALL Zero_Integer (Isopar, Ndasig)
diff --git a/sammy/src/xct/mxct03.f90 b/sammy/src/xct/mxct03.f90
index dd2197ba03fd15868932b556250d29af0d87fdea..c712c626d0874fda7944301ae8f615f85ea42b4a 100644
--- a/sammy/src/xct/mxct03.f90
+++ b/sammy/src/xct/mxct03.f90
@@ -59,7 +59,7 @@ module xct3_m
            A_Ibound , A_Iechan , I_Ifcros ,  &
            A_Iprmsc , I_Iflmsc , I_Ijkmsc , A_Izke   , &
            A_Izeta  ,                                  &
-           I_Inpxdr , A_Icrss  , A_Ideriv ,            &
+           A_Icrss  , A_Ideriv ,            &
            A_Icrssx , A_Idervx , A_Iprer  , A_Iprei  , A_Ixdrcp , &
            I_Indrcp , Nnndrc, 0, Kount_Helmut)
 !
@@ -149,7 +149,6 @@ module xct3_m
                         I_Ifcros ,  &
                         A_Iprmsc , I_Iflmsc , I_Ijkmsc , A_Izke  , &
                         A_Izeta  ,                                 &
-                        I_Inpxdr ,                                 &
                         A_Icrsnd , A_Ideriv , A_Icrxnd , A_Idervx , &
                         A_Iprer  , A_Iprei  , A_Ixdrcp , I_Indrcp , &
                         Nnndrc, 0, Kount_Helmut)
diff --git a/sammy/src/xct/mxct04.f90 b/sammy/src/xct/mxct04.f90
index 457aba5b320280998a93905ee63d9b6022107419..79388415cbb7b053a9ce9bcc398bdced5377c074 100644
--- a/sammy/src/xct/mxct04.f90
+++ b/sammy/src/xct/mxct04.f90
@@ -78,7 +78,7 @@ module xct4_m
            A_Ibound , A_Iechan , I_Ifcros , &
            A_Iprmsc , I_Iflmsc , I_Ijkmsc , A_Izke   , &
            A_Izeta  ,                                  &
-           I_Inpxdr , A_Icrss  , A_Ideriv ,            &
+           A_Icrss  , A_Ideriv ,                       &
            A_Icrssx , A_Idervx , A_Iprer  , A_Iprei  , A_Ixdrcp , &
            I_Indrcp , Nnndrc, Ipoten, Kount_Helmut)
 !
diff --git a/sammy/src/xct/mxct06.f b/sammy/src/xct/mxct06.f
index 28a3e0ab3f8e23bac9d9a022fa763ed536c4a0cc..f2f984304734fdd01321294b2cca5297f294663d 100644
--- a/sammy/src/xct/mxct06.f
+++ b/sammy/src/xct/mxct06.f
@@ -6,7 +6,7 @@ C
      *   Jfexcl, Bound  , Echan  ,
      *   Jfcros, Parmsc, Jflmsc , Jjkmsc , Zke   ,
      *   Zeta  ,
-     *   Npxdr , Crss  , Deriv , Crssx , Derivx , Prer   , Prei  ,
+     *   Crss  , Deriv , Crssx , Derivx , Prer   , Prei  ,
      *   Xdrcpt, Ndrcpt, Nnndrc, Ipoten, Kount_Helmut)
 C
 C *** PURPOSE -- Form the cross sections Crss(Isigma,Igroup) and the
@@ -26,6 +26,7 @@ C
       use EndfData_common_m
       use SammySpinGroupInfo_M
       use SammyResonanceInfo_M
+      use SammyRExternalInfo_M
       use ifsubs_common
       use par_parameter_names_common_m
       use templc_common_m, only : I_Inotu
@@ -39,7 +40,7 @@ C
      *                      Crssx, Derivx, Prer, Prei, Xdrcpt
       real(8), intent(out):: Crss, Deriv
       integer(4), intent(in):: Jfexcl, Jfcros, Jflmsc, Jjkmsc,
-     *                         Npxdr, Ndrcpt,
+     *                         Ndrcpt,
      *                         Nnndrc, Ipoten, Kount_Helmut
 
       real(8):: Zero, Dgoj
@@ -48,7 +49,7 @@ C
 C
       DIMENSION Jfexcl(Ntotc,*),
      *   Bound(Ntotc,*), Echan(Ntotc,*),
-     *   Jfcros(*), Npxdr(*),
+     *   Jfcros(*),
      *   Parmsc(*), Jflmsc(*), Jjkmsc(*),
      *   Crss(Ncrsss,*), Deriv(Ncrsss,Nnpar,*), Crssx(2,Ntotc,Ntotc,*),
      *   Derivx(2,Ntotc,Ntotc,Nnpar,*), Zke(Ntotc,*),
@@ -58,7 +59,6 @@ C
 C      DIMENSION
 C     *   Jfexcl(Ntotc,Ngroup), Bound(Ntotc,Ngroup),
 C     *   Echan(Ntotc,Ngroup), Jfcros(Ncrsss),
-C     *   Npxdr(Ngroup),
 C     *   Crss(Ncrsss,Ngroup), Deriv(Ncrsss,Nnpar,Ngroup),
 C     *   Crssx(2,Ntotc,Ntotc,Ngroup), Derivx(2,Ntotc,Ntotc,Nnpar,Ngroup),
 C     *   Zke(Ntotc,Ngroup),
@@ -66,7 +66,8 @@ C     *   Prer(Ntriag,Ngroup), Prei(Ntriag,Ngroup)
 C
       type(SammySpinGroupInfo)::spinInfo
       type(SammyResonanceInfo)::resInfo
-      integer::M,iflabund
+      type(SammyRExternalInfo)::rextInfo
+      integer::M,iflabund, j
       logical::needDeriv,ifcap
       DATA Zero /0.0d0/
 C
@@ -114,7 +115,20 @@ C
 C
             Nnnn = N
             Npx = 0          
-            IF (Ks_Res.NE.2) Npx = Npxdr(N)
+            IF (Ks_Res.NE.2) then
+               DO I = 1, Ntotnn
+                  if (resparData%hasRexInfo(N, I))then
+                     call resparData%getRextInfoByGroup(rextInfo, N, I)
+                     do j = 1, rextInfo%getNrext()
+                       if(rextInfo%getIflSammyIndex(j).gt.0) then
+                           Npx = 1
+                           exit
+                        end if
+                     end do
+                  end if
+                  if (Npx.eq.1) exit
+               end do
+            end if
             Nn2 = Ntotnn*(Ntotnn+1)
             Nn = Nn2/2
 C
@@ -126,7 +140,7 @@ C ***       Set R-Matrix and other necessary arrays
             Nentnn = spinInfo%getNumEntryChannels()
             Nextnn = spinInfo%getNumExitChannels()
             CALL Setr (Nentnn, Ntotnn, N,
-     *         Bound(:,N), Echan(:,N), A_Iprext , I_Iflext ,
+     *         Bound(:,N), Echan(:,N),
      *         A_Isinsq , A_Isinph, A_Idphi, A_Icscs,
      *         A_Iss, A_Icc , Zke(:,N), Zeta(:,N),
      *         A_Ialphr, A_Ialphi, I_Inot, A_Idpdr, A_Idsdr,
@@ -211,7 +225,7 @@ C ***                (via energy-denominator portion of R-matrix)
 C
                IF (Npx.NE.0 .AND. Ifext.EQ.0) THEN
 C ***             Find deriv of cross sections with respect to R-ext pars
-                  CALL Derext (Jfexcl(:,N), Jfcros,A_Iprext , I_Iflext ,
+                  CALL Derext (Jfexcl(:,N), Jfcros,
      *               Deriv(:,:,N), Derivx(:,:,:,:,N), A_Itr, A_Itx,
      *               Dgoj, Ntotnn, Nentnn, Krext)
                END IF
diff --git a/sammy/src/xct/mxct07.f90 b/sammy/src/xct/mxct07.f90
index bbc8d391de2d1b6ed76d352b0c59cdd962bcbc56..c02e1d930d64285fae37b645bbcd23886079ca99 100644
--- a/sammy/src/xct/mxct07.f90
+++ b/sammy/src/xct/mxct07.f90
@@ -5,7 +5,7 @@ module xct7_m
 ! --------------------------------------------------------------
 !
       SUBROUTINE Setr (Nent, Ntot, Igr, Bound, Echan, &
-        Parext, Iflext, Sinsqr, Sin2ph, Dphi, Cscs, Sinphi, &
+        Sinsqr, Sin2ph, Dphi, Cscs, Sinphi, &
         Cosphi, Zke, Zeta, Alphar, Alphai, Not, Dpdr, Dsdr, Rmat, &
         Ymat, Rootp, Elinvr, Elinvi, Psmall, Krext, Lrmat, Min, Max, &
         Ipoten)
@@ -26,10 +26,10 @@ module xct7_m
       use EndfData_common_m
       use SammyResonanceInfo_M
       use RMatResonanceParam_M
+
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 !
       DIMENSION Bound(*), Echan(*), &
-         Parext(Krext,Ntotc,*), Iflext(Krext,Ntotc,*),  &
          Sinsqr(*), Sin2ph(*), Dphi(*), Cscs(2,*), Zke(*), &
          Zeta(*), Alphar(*), Alphai(*), Not(*), Dpdr(*), &
          Dsdr(*), Rmat(2,*), Ymat(2,*), Rootp(*), Elinvr(*), &
@@ -45,11 +45,14 @@ module xct7_m
       type(RMatParticlePair)::pair
       type(sammy_LogarithmicDerivativeCWF) :: cwf_solver ! CWF solver interface
       REAL(selected_real_kind(14)) :: tmp_holder
+      logical::hasRext
+      type(SammyRExternalInfo)::rextInfo
+      type(RExternalFunction)::rext
+      real(kind=8)::Parext(7)
       double precision, parameter :: Big = 1.0E30
 !
 !      DIMENSION Bound(Ntotc),
-!     *   Echan(Ntotc), Parext(Nrext,Ntotc,Ngroup),
-!     *   Iflext(Nrext,Ntotc,Ngroup), 
+!     *   Echan(Ntotc),
 !     *   Zke(Ntotc), Zeta(Ntotc), Alphar(Nres), Alphai(Nres),
 !     *   Not(Nres), Dpdr(Ntotc), Dsdr(Ntotc), Rmat(2,Ntriag),
 !     *   Ymat(2,Ntriag), Rootp(Ntotc), Elinvr(Ntotc), Elinvi(Ntotc),
@@ -68,21 +71,30 @@ module xct7_m
       Aloge = Zero
       KL = 0
       DO K=1,Ntot
-         IF (Numext.NE.0 .AND. Iflext(1,K,Nnnn).NE.-1) Aloge &
-            = dLOG( (Parext(2,K,Nnnn)-Su)/(Su-Parext(1,K,Nnnn)) )
+         hasRext = resParData%hasRexInfo(Nnnn, K)
+         Parext = 0.0d0
+         IF (hasRext) then
+           call resparData%getRextInfoByGroup(rextInfo, Nnnn, K)
+           call resparData%getRext(rext, rextInfo)
+           DO J = 1, rextInfo%getNrext()
+             Parext(J) = rext%getSammyValue(J)
+           end do
+           Aloge &
+            = dLOG( (Parext(2)-Su)/(Su-Parext(1)) )
+         end if
          DO L=1,K
             KL = KL + 1
             Rmat(1,KL) = Zero
             Rmat(2,KL) = Zero
-            IF (L.EQ.K .AND. Numext.NE.0 .AND. Iflext(1,K,Nnnn).NE.-1) &
+            IF (L.EQ.K .AND. hasRext) &
                THEN
-               Rmat(1,KL) =   Parext(3,K,Nnnn) &
-                            + Parext(4,K,Nnnn)*Su &
-                            - Parext(5,K,Nnnn)*Aloge
+               Rmat(1,KL) =   Parext(3) &
+                            + Parext(4)*Su &
+                            - Parext(5)*Aloge
                IF (Nrext.EQ.7) Rmat(1,KL) = Rmat(1,KL) &
-                  + Parext(7,K,Nnnn)*Su**2 - Parext(6,K,Nnnn)* &
-                        (  Parext(2,K,Nnnn) - Parext(1,K,Nnnn)  ) &
-                  - Parext(6,K,Nnnn)*Aloge*Su
+                  + Parext(7)*Su**2 - Parext(6)* &
+                        (  Parext(2) - Parext(1)  ) &
+                  - Parext(6)*Aloge*Su
             END IF
          END DO
       END DO
diff --git a/sammy/src/xct/mxct12.f b/sammy/src/xct/mxct12.f
index a9b6c4c7625616cc7b29e34332157f6f6b7ef693..8a8b6c95f8dc1d9c7540538dffdfea4c6c4d8b99 100644
--- a/sammy/src/xct/mxct12.f
+++ b/sammy/src/xct/mxct12.f
@@ -2,19 +2,25 @@ C
 C
 C --------------------------------------------------------------
 C
-      SUBROUTINE Derext (If_Excl, Ifcros, Parext, Iflext, Deriv, Derivx,
+      SUBROUTINE Derext (If_Excl, Ifcros, Deriv, Derivx,
      *   Tr, Tx, Dgoj, Ntot, Nent, Krext)
 C
       use fixedi_m
       use ifwrit_m
       use varyr_common_m
+      use SammyRExternalInfo_M
+      use RMatResonanceParam_M
+      use EndfData_common_m, only : resParData
       IMPLICIT DOUBLE PRECISION (a-h,o-z)
 C
-      DIMENSION If_Excl(*), Ifcros(*), Parext(Krext,Ntotc,*),
-     *   Iflext(Krext,Ntotc,*), Deriv(Ncrsss,*),
+      DIMENSION If_Excl(*), Ifcros(*),
+     *   Deriv(Ncrsss,*),
      *   Derivx(2,Ntotc,Ntotc,*), Tr(Ncrsss,*), Tx(2,Ntriag,*)
-C      DIMENSION If_Excl(*), Ifcros(Ncrsss), Parext(Nrext,Ntotc,Ngroup),
-C     *   Iflext(Nrext,Ntotc,Ngroup), Deriv(Ncrsss,Ndasig+ndbsig),
+       type(SammyRExternalInfo)::rextInfo
+       real(kind=8)::Parext(7)
+       type(RExternalFunction)::rext
+C      DIMENSION If_Excl(*), Ifcros(Ncrsss),
+C     *   Deriv(Ncrsss,Ndasig+ndbsig),
 C     *   Derivx(2,Ntotc,Ntotc,nap), Tr(Ncrsss,Nn), Tx(2,Ntriag,Ntriag)
 C
        DATA Two /2.0d0/
@@ -24,41 +30,47 @@ C
          Ij = 0
          DO I=1,Ntot
             Ij = Ij + I
-          IF (Iflext(1,I,Nnnn).NE.-1) THEN
+          Parext = 0.0d0
+          IF (resparData%hasRexInfo(Nnnn, I)) THEN
+            call resparData%getRextInfoByGroup(rextInfo, Nnnn, I)
+            call resParData%getRext(rext, rextInfo)
+            DO J = 1, rextInfo%getNrext()
+              Parext(J) = rext%getSammyValue(J)
+            end do
 C ***       note that Tr = 1/2 times partial (sigma) wrt (re R),
 C ***          ergo need to multiply by 2 here
             A = Two*Dgoj
-            IF (Iflext(1,I,Nnnn).NE.0) THEN
+            IF (rextInfo%getIflSammyIndex(1).NE.0) THEN
                Jstart = Jstart + 1
                DO M=1,Ncrsss
                   IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
      *               If_Excl(M-2+Nent).EQ.Kaptur) ) THEN
                      IF (Nrext.EQ.5) Deriv(M,Jstart) =
-     *                  -Tr(M,Ij)*A*(Parext(5,I,Nnnn))/
-     *                           (Su-Parext(1,I,Nnnn))
+     *                  -Tr(M,Ij)*A*(Parext(5))/
+     *                           (Su-Parext(1))
                      IF (Nrext.EQ.7) Deriv(M,Jstart) = - Tr(M,Ij)*A* 
-     *                  (Parext(5,I,Nnnn)+
-     *                   Parext(6,I,Nnnn)*Parext(1,I,Nnnn))
-     *                              / (Su-Parext(1,I,Nnnn))
+     *                  (Parext(5)+
+     *                   Parext(6)*Parext(1))
+     *                              / (Su-Parext(1))
                   END IF
                END DO
             END IF
-            IF (Iflext(2,I,Nnnn).NE.0) THEN
+            IF (rextInfo%getIflSammyIndex(2).NE.0) THEN
                Jstart = Jstart + 1
                DO M=1,Ncrsss
                   IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
      *               If_Excl(M-2+Nent).EQ.Kaptur) ) THEN
                      IF (Nrext.EQ.5) Deriv(M,Jstart) =
-     *                  - Tr(M,Ij)*A*(Parext(5,I,Nnnn))/
-     *                               (Parext(2,I,Nnnn)-Su)
+     *                  - Tr(M,Ij)*A*(Parext(5))/
+     *                               (Parext(2)-Su)
                      IF (Nrext.EQ.7) Deriv(M,Jstart) = - Tr(M,Ij)*A* 
-     *                  (Parext(5,I,Nnnn)+
-     *                   Parext(6,I,Nnnn)*Parext(2,I,Nnnn))
-     *                                 / (Parext(2,I,Nnnn)-Su)
+     *                  (Parext(5)+
+     *                   Parext(6)*Parext(2))
+     *                                 / (Parext(2)-Su)
                   END IF
                END DO
             END IF
-            IF (Iflext(3,I,Nnnn).NE.0) THEN
+            IF (rextInfo%getIflSammyIndex(3).NE.0) THEN
                Jstart = Jstart + 1
                DO M=1,Ncrsss
                   IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
@@ -67,7 +79,7 @@ C ***          ergo need to multiply by 2 here
                   END IF
                END DO
             END IF
-            IF (Iflext(4,I,Nnnn).NE.0) THEN
+            IF (rextInfo%getIflSammyIndex(4).NE.0) THEN
                Jstart = Jstart + 1
                DO M=1,Ncrsss
                   IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
@@ -76,34 +88,34 @@ C ***          ergo need to multiply by 2 here
                   END IF
                END DO
             END IF
-            IF (Iflext(5,I,Nnnn).NE.0) THEN
+            IF (rextInfo%getIflSammyIndex(5).NE.0) THEN
                Jstart = Jstart + 1
                DO M=1,Ncrsss
                   IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
      *               If_Excl(M-2+Nent).EQ.Kaptur) ) THEN
                      Deriv(M,Jstart) = -2.0D0*Tr(M,Ij)*
-     *               A*dSQRT(Parext(5,I,Nnnn))*
-     *                  dLOG( (Parext(2,I,Nnnn)-Su)/
-     *                     (Su-Parext(1,I,Nnnn)) )
+     *               A*dSQRT(Parext(5))*
+     *                  dLOG( (Parext(2)-Su)/
+     *                     (Su-Parext(1)) )
 C ***                Remember that the u-parameter is the 
 C ***                   square root of Parext(5)
                   END IF
                END DO
             END IF
-            IF (Nrext.GT.5) THEN
-               IF (Iflext(6,I,Nnnn).NE.0) THEN
+            IF (rextInfo%getNrext().GT.5) THEN
+               IF (rextInfo%getIflSammyIndex(6).NE.0) THEN
                   Jstart = Jstart + 1
                   DO M=1,Ncrsss
                      IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
      *                  If_Excl(M-2+Nent).EQ.Kaptur) ) THEN
                         Deriv(M,Jstart) = - Tr(M,Ij)*A*
-     *                     ( (Parext(2,I,Nnnn)-Parext(1,I,Nnnn)) +
-     *                     Su*dLOG( (Parext(2,I,Nnnn)-Su)/
-     *                           (Su-Parext(1,I,Nnnn)) ) )
+     *                     ( (Parext(2)-Parext(1)) +
+     *                     Su*dLOG( (Parext(2)-Su)/
+     *                           (Su-Parext(1)) ) )
                      END IF
                   END DO
                END IF
-               IF (Iflext(7,I,Nnnn).NE.0) THEN
+               IF (rextInfo%getIflSammyIndex(7).NE.0) THEN
                   Jstart = Jstart + 1
                   DO M=1,Ncrsss
                      IF (Ifcros(M).NE.0 .AND. (M.LE.2 .OR.
@@ -126,6 +138,7 @@ C
             Ij = Ij + Ichan
             Jstart = Jstartx
             DO Nchan=1,Ntot
+               Parext = 0.0d0
                IF (If_Stay (Nchan, Ifdif, Nent, If_Excl(Nchan), Kaptur)
      *            .EQ.0) THEN
                   DO Nchanx=1,Nent
@@ -134,47 +147,53 @@ C
                      ELSE
                         Kl = (Nchanx*(Nchanx-1))/2 + Nchan
                      END IF
-                     IF (Iflext(1,Ichan,Nnnn).NE.-1) THEN
-                        IF (Iflext(1,Ichan,Nnnn).NE.0) THEN
+                     IF (resparData%hasRexInfo(Nnnn, Ichan)) THEN
+                        call resparData%getRextInfoByGroup(rextInfo,
+     *                               Nnnn, Ichan)
+                        call resParData%getRext(rext, rextInfo)
+                        DO J = 1, rextInfo%getNrext()
+                          Parext(J) = rext%getSammyValue(J)
+                        end do
+                        IF (rextInfo%getIflSammyIndex(1).NE.0) THEN
                            Jstart = Jstart + 1
                            IF (Nrext.EQ.5) THEN
-                              A = -Parext(5,Ichan,Nnnn)/
-     *                             (Su-Parext(1,Ichan,Nnnn))
+                              A = -Parext(5)/
+     *                             (Su-Parext(1))
                            ELSE
-                              A = - (Parext(5,Ichan,Nnnn) +
-     *                           Parext(6,Ichan,Nnnn)*
-     *                           Parext(1,Ichan,Nnnn))
-     *                           /(Su-Parext(1,Ichan,Nnnn))
+                              A = - (Parext(5) +
+     *                           Parext(6)*
+     *                           Parext(1))
+     *                           /(Su-Parext(1))
                            END IF
                            Derivx(1,Nchanx,Nchan,Jstart) = Tx(1,Ij,KL)*A
      *                        + Derivx(1,Nchanx,Nchan,Jstart)
                            Derivx(2,Nchanx,Nchan,Jstart) = Tx(2,Ij,KL)*A
      *                        + Derivx(2,Nchanx,Nchan,Jstart)
                         END IF
-                        IF (Iflext(2,Ichan,Nnnn).NE.0) THEN
+                        IF (rextInfo%getIflSammyIndex(2).NE.0) THEN
                            Jstart = Jstart + 1
                            IF (Nrext.EQ.5) THEN
-                              A = - Parext(5,Ichan,Nnnn)/
-     *                             (Parext(2,Ichan,Nnnn)-Su)
+                              A = - Parext(5)/
+     *                             (Parext(2)-Su)
                            ELSE
-                              A = - (Parext(5,Ichan,Nnnn)+
-     *                           Parext(6,Ichan,Nnnn)*
-     *                           Parext(2,Ichan,Nnnn))
-     *                           / (Parext(2,Ichan,Nnnn)-Su)
+                              A = - (Parext(5)+
+     *                           Parext(6)*
+     *                           Parext(2))
+     *                           / (Parext(2)-Su)
                            END IF
                            Derivx(1,Nchanx,Nchan,Jstart) = Tx(1,Ij,KL)*A
      *                        + Derivx(1,Nchanx,Nchan,Jstart)
                            Derivx(2,Nchanx,Nchan,Jstart) = Tx(2,Ij,KL)*A
      *                        + Derivx(2,Nchanx,Nchan,Jstart)
                         END IF
-                        IF (Iflext(3,Ichan,Nnnn).NE.0) THEN
+                        IF (rextInfo%getIflSammyIndex(3).NE.0) THEN
                            Jstart = Jstart + 1
                            Derivx(1,Nchanx,Nchan,Jstart) = Tx(1,Ij,KL) +
      *                        Derivx(1,Nchanx,Nchan,Jstart)
                            Derivx(2,Nchanx,Nchan,Jstart) = Tx(2,Ij,KL) +
      *                        Derivx(2,Nchanx,Nchan,Jstart)
                         END IF
-                        IF (Iflext(4,Ichan,Nnnn).NE.0) THEN
+                        IF (rextInfo%getIflSammyIndex(4).NE.0) THEN
                            Jstart = Jstart + 1
                            Derivx(1,Nchanx,Nchan,Jstart) =
      *                        Tx(1,Ij,KL)*Su +
@@ -183,23 +202,23 @@ C
      *                        Tx(2,Ij,KL)*Su +
      *                        Derivx(2,Nchanx,Nchan,Jstart)
                         END IF
-                        IF (Iflext(5,Ichan,Nnnn).NE.0) THEN
+                        IF (rextInfo%getIflSammyIndex(5).NE.0) THEN
                            Jstart = Jstart + 1
-                           A = - Two*DSQRT(Parext(5,Ichan,Nnnn))*
-     *                        dLOG((Parext(2,Ichan,Nnnn)-Su)/
-     *                        (Su-Parext(1,Ichan,Nnnn)))
+                           A = - Two*DSQRT(Parext(5))*
+     *                        dLOG((Parext(2)-Su)/
+     *                        (Su-Parext(1)))
                            Derivx(1,Nchanx,Nchan,Jstart) = Tx(1,Ij,KL)*A
      *                        + Derivx(1,Nchanx,Nchan,Jstart)
                            Derivx(2,Nchanx,Nchan,Jstart) = Tx(2,Ij,KL)*A
      *                        + Derivx(2,Nchanx,Nchan,Jstart)
                         END IF
-                        IF (Nrext.GT.5) THEN
-                           IF (Iflext(6,Ichan,Nnnn).NE.0) THEN
+                        IF (rextInfo%getNrext().GT.5) THEN
+                           IF (rextInfo%getIflSammyIndex(6).NE.0) THEN
                               Jstart = Jstart + 1
-                              A = - ((Parext(2,Ichan,Nnnn)-
-     *                           Parext(1,Ichan,Nnnn)) -
-     *                           Su*dLOG((Parext(2,Ichan,Nnnn)-Su)/
-     *                           (Su-Parext(1,Ichan,Nnnn))) )
+                              A = - ((Parext(2)-
+     *                           Parext(1)) -
+     *                           Su*dLOG((Parext(2)-Su)/
+     *                           (Su-Parext(1))) )
                               Derivx(1,Nchanx,Nchan,Jstart) =
      *                           Tx(1,Ij,KL)*A
      *                           + Derivx(1,Nchanx,Nchan,Jstart)
@@ -207,7 +226,7 @@ C
      *                           Tx(2,Ij,KL)*A
      *                           + Derivx(2,Nchanx,Nchan,Jstart)
                            END IF
-                           IF (Iflext(7,Ichan,Nnnn).NE.0) THEN
+                           IF (rextInfo%getIflSammyIndex(7).NE.0) THEN
                               Jstart = Jstart + 1
                               A = Su**2
                               Derivx(1,Nchanx,Nchan,Jstart) =